Sentience is a verification layer that sits between your agent and side effects — deterministic checks, audit artifacts, and explainable outcomes.
3B local model running a real checkout flow. Every action is gated by explicit verification — leadership can see who approved the outcome.
Attach Sentience Debugger to any agent with a Playwright Page or CDP backend. Keep your loop. Add accountability.
Join early teams building accountable agents. Choose your path →
Success Rate
100% (5/5 Runs)
Model
Qwen 2.5 (3B)
Cost
$0.008 / run (7 steps)
Structured semantic geometry: elements, bounding boxes, ordinality, visibility
Deterministic click, type, scroll with smart waits — no brittle selectors
Jest-style assertions — pass or fail, no ambiguity
Traces, screenshots, and recordings — replay and debug any run
Engineers who need reliable, deterministic, debuggable agent runs (not “click → wait → hope”).
Make step outcomes verifiable and runs reproducible.
Control variance, cost, and compliance with bounded perception.
Deterministic failure semantics with trace + artifact evidence.
Keep your agent loop. Attach Sentience Debugger for verification, traces, and artifacts.
Attach once to a Playwright Page (or a CDP backend), then add checks whenever your agent takes an action.
tracer = Tracer(run_id="run-123", sink=JsonlTraceSink("trace.jsonl"))
dbg = SentienceDebugger.attach(page, tracer=tracer) # page: Playwright Page
await agent.step() # your agent/framework
await dbg.snapshot(use_api=False)
await dbg.check(...).eventually()Get the current page → verify outcomes
Keep browser-use as the driver. Add Sentience Debugger checks after actions and inspect traces when something fails.
Use deps/page → verify & retry deterministically
Keep your typed agent. Attach Debugger to the same page stored in deps and use `.eventually()` for stability-aware verification.
Tool executes → Debugger verifies
Keep your planner/graph. Attach Debugger to the same Playwright page and use verification results to branch, retry, or stop.
Run reproducible demos with a 3B local model and deterministic assertions.
"Open the top Show HN post"
Ordinal reasoning ("first/top") without screenshots.
"SPA login + profile verification"
State-aware assertions (enabled/disabled/value) on a modern SPA.
"Search → open result → add to cart"
JS-heavy stress test. Structure-first navigation.
Your agent either completed the task or it didn't. Sentience tells you which.
Sentience complements your agent stack. AI agent acts. Playwright executes. Sentience verifies.
Structured snapshots + assertions + trace replay (see benchmarks)
*Internal benchmarks on common public pages. See methodology.
snap = await snapshot(browser)
button = find(snap, 'role=button text~"Submit"')
assert_(snap, "form submitted", check="text~Confirmed")
Powerful for known pages, but selectors break when layouts change. Sentience adds semantic targeting on top.
Great for understanding, inconsistent for clicking. In our tests, vision-only approaches were flaky on interactive tasks. Structure-first is more reliable; vision works as fallback.
Excellent for content extraction. Sentience is for when agents need to interact — click, type, verify.
Explore the SDK with interactive examples or test the API directly
Apply a permission policy, run agent steps with lifecycle hooks, trace tool calls, and verify a real download deterministically.
1# Verification-first runtime demo (Agent acts; Sentience asserts)
2from sentience import SentienceBrowser, PermissionPolicy, SentienceAgent
3from sentience.llm_provider import OpenAIProvider
4from sentience.agent_runtime import AgentRuntime
5from sentience.tools import ToolRegistry, ToolContext, register_default_tools
6from sentience.verification import exists, download_completed
7from sentience.tracing import Tracer, JsonlTraceSink
8
9# Tracing (local JSONL; upload optional)
10tracer = Tracer(run_id="demo-run", sink=JsonlTraceSink("trace.jsonl"))
11
12# Startup permission policy avoids non-DOM browser permission bubbles
13policy = PermissionPolicy(
14 default="clear",
15 auto_grant=["geolocation"],
16 geolocation={"latitude": 37.7749, "longitude": -122.4194},
17)
18
19browser = SentienceBrowser(
20 api_key="sk_live_...",
21 allowed_domains=["example.com"],
22 permission_policy=policy,
23)
24browser.start()
25
26llm = OpenAIProvider(api_key="sk_openai_...", model="gpt-4o-mini")
27agent = SentienceAgent(browser, llm, tracer=tracer)
28runtime = AgentRuntime(browser, browser.page, tracer)
29
30# Typed, traceable tools (includes evaluate_js + permission tools)
31registry = ToolRegistry()
32register_default_tools(registry, runtime)
33ctx = ToolContext(runtime)
34
35def on_start(ctx): print("hook start:", ctx.goal)
36def on_end(ctx): print("hook end:", ctx.success, ctx.outcome)
37
38browser.page.goto("https://example.com/billing")
39
40# Small introspection (bounded output; no DOM dump)
41title = await registry.execute("evaluate_js", {"code": "document.title"}, ctx=ctx)
42
43# Act with lifecycle hooks
44agent.act("Sign in if needed", on_step_start=on_start, on_step_end=on_end)
45
46# Verify + download (assert what happened, not what you hope happened)
47runtime.begin_step("Download invoice and verify")
48await runtime.snapshot(limit=60)
49runtime.assert_(exists("role=button text~'Download invoice'"), "has_download_button", required=True)
50
51agent.act("Click 'Download invoice PDF'", on_step_start=on_start, on_step_end=on_end)
52
53await runtime.snapshot()
54await runtime.check(download_completed("invoice"), label="invoice_downloaded", required=True).eventually(timeout_s=10)
55
56print("PASS ✓ invoice_downloaded")
57await tracer.close(upload=False)
58browser.close()Verify outcomes deterministically — assert what happened, not what you hope happened
Rendered DOM after hydration with confidence scoring — enables deterministic verification
Retry verification (not actions) with confidence gating — explainable failures with reason codes
Studio acts as your trust engine — record, replay, and inspect every agent action
Complete execution traces with screenshots, elements, and timing data
Step through executions frame-by-frame to understand agent behavior
Visual debugging shows exactly what went wrong and why
1 credit = 1 SDK snapshot
1 snapshot = 1 agent perception step. Each snapshot returns execution-ready elements with visibility, occlusion, and semantic ranking — optimized for reliable agent actions. Learn more →
Enterprise-grade reliability meets developer-first simplicity
Transform verbose HTML into efficient geometry data
Lightning-fast processing for real-time AI agents
Semantic geometry for stable, intention-level actions
Install via pip or npm, start building in minutes
Loading pricing information...
Build agents that verify their own work. Structure-first snapshots. Assertions that mean something.
1from sentience import SentienceBrowser, snapshot, find, click, type_text, expect
2
3# Initialize browser with API key
4browser = SentienceBrowser(api_key="sk_live_...")
5browser.start()
6
7# Navigate and take a stability-aware snapshot (rendered DOM, not HTML)
8browser.page.goto("https://example.com/login")
9snap = snapshot(browser, limit=60)
10
11# Jest-style assertions from the snapshot response (diagnostics)
12assert snap.diagnostics and snap.diagnostics.confidence >= 0.80, (
13 f"DOM unstable: confidence={getattr(snap.diagnostics, 'confidence', None)} "
14 f"reasons={getattr(snap.diagnostics, 'reasons', None)}"
15)
16assert not (snap.diagnostics and snap.diagnostics.captcha and snap.diagnostics.captcha.detected), (
17 "Blocked by CAPTCHA — escalate or switch strategy"
18)
19
20# Find elements semantically (role/text), act, then verify deterministically
21email = find(snap, "role=textbox text~'email'")
22type_text(browser, email.id, "user@example.com")
23
24password = find(snap, "role=textbox text~'password'")
25type_text(browser, password.id, "secure_password")
26
27submit = find(snap, "role=button text~'sign in'")
28click(browser, submit.id)
29
30# Jest-style assertion on the post-action state
31expect(browser, "role=heading text~'Dashboard'").to_be_visible(timeout=10)
32print("PASS ✓ login_verified")
33browser.close()Find elements by role and text, not CSS selectors
Deterministic selector resolution for reproducible actions
Validated through real-world demos on complex sites
Join 2,000+ AI developers getting exclusive tips, cost-saving strategies, and early access to new features. No spam, just value.
We respect your privacy. Unsubscribe anytime with one click.