Sentience is a verification layer that sits between your agent and side effects — deterministic checks, audit artifacts, and explainable outcomes.

Verification layerAudit trailsDeterministic gatesHuman escalationWorks with Playwright + CDP

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 →

Verify actions
Audit artifacts
Reconstruct decisions
Gate risky actions
Human escalation

How It Works: Snapshot → Act → Verify → Artifact

Step 1

Snapshot

Structured semantic geometry: elements, bounding boxes, ordinality, visibility

Step 2

Act

Deterministic click, type, scroll with smart waits — no brittle selectors

Step 3

Verify

Jest-style assertions — pass or fail, no ambiguity

Step 4

Artifact

Traces, screenshots, and recordings — replay and debug any run

Who It's For

Engineers who need reliable, deterministic, debuggable agent runs (not “click → wait → hope”).

Agent engineers

Make step outcomes verifiable and runs reproducible.

Infra / platform teams

Control variance, cost, and compliance with bounded perception.

Researchers / evals

Deterministic failure semantics with trace + artifact evidence.

Integrate with Your Framework

Keep your agent loop. Attach Sentience Debugger for verification, traces, and artifacts.

Universal pattern: agent acts, Debugger verifies

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()

browser-use

Get the current page → verify outcomes

Keep browser-use as the driver. Add Sentience Debugger checks after actions and inspect traces when something fails.

CDP backendAssertions

PydanticAI

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.

Playwright PageTraces

LangChain / LangGraph

Tool executes → Debugger verifies

Keep your planner/graph. Attach Debugger to the same Playwright page and use verification results to branch, retry, or stop.

Dynamic checksEventually

Try a real browser agent (no vision)

Run reproducible demos with a 3B local model and deterministic assertions.

Hacker News

"Open the top Show HN post"

Ordinal reasoning ("first/top") without screenshots.

OrdinalityToken savings

Local Llama Land

"SPA login + profile verification"

State-aware assertions (enabled/disabled/value) on a modern SPA.

AssertionsNo sleeps

Amazon

"Search → open result → add to cart"

JS-heavy stress test. Structure-first navigation.

Stress testVision optional
~50%fewer tokens per step3Blocal model viableJest-styleassertions

Assertions, Not Vibes

Your agent either completed the task or it didn't. Sentience tells you which.

agent_test.py
# Assert the search completed
assert_(
snap, "results visible",
check="role=list items>0"
)
# Assert we're done
assert_done(
snap, "checkout complete",
expected="Order confirmed"
)
FAILRun #1
AssertionError: "results visible"
Expected: role=list items>0
Found: 0 items (page loading)
→ Trace saved: studio.sentience.dev/trace/abc123
PASSRun #2 (with wait)
✓ "results visible" — 12 items found
✓ "checkout complete" — Order #7821 confirmed
2 assertions passed in 1.2s

The Verification Layer

Sentience complements your agent stack. AI agent acts. Playwright executes. Sentience verifies.

Sentience SDK

Structured snapshots + assertions + trace replay (see benchmarks)

~1k
Tokens/step*
<1s
Snapshot latency
Pass/Fail
Clear outcomes

*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")

How does this compare to other approaches?
⚠️

CSS Selectors (Playwright alone)

Powerful for known pages, but selectors break when layouts change. Sentience adds semantic targeting on top.

⚠️

Vision Models (GPT-4V, Claude)

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.

📖

Read-Only Tools (Firecrawl, Jina)

Excellent for content extraction. Sentience is for when agents need to interact — click, type, verify.

Tested on production sites:

Google Search: Consistent success with semantic snapshots
Amazon: Multi-step cart flow completed reliably
Hacker News: Ordinal tasks ("click 3rd item") work first try

Try It Live

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()

✓ Jest-Style Assertions

Verify outcomes deterministically — assert what happened, not what you hope happened

📸 Stability-Aware Snapshots

Rendered DOM after hydration with confidence scoring — enables deterministic verification

↻ Bounded Retries

Retry verification (not actions) with confidence gating — explainable failures with reason codes

Why Sentience is production-safe

Studio acts as your trust engine — record, replay, and inspect every agent action

Every step is recorded

Complete execution traces with screenshots, elements, and timing data

Every action is replayable

Step through executions frame-by-frame to understand agent behavior

Every failure is inspectable

Visual debugging shows exactly what went wrong and why

Simple, Credit-Based Pricing

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 →

100 free credits
No credit card required
No per-seat pricing
Pay for usage, not licenses
No retry tax
Reliable first-time execution
View full pricing
See all tiers & features

Built for Production

Enterprise-grade reliability meets developer-first simplicity

~90% Token Reduction

Transform verbose HTML into efficient geometry data

Standard HTML15,234 tokens
Sentience API1,523 tokens

Sub-Second Response

Lightning-fast processing for real-time AI agents

Processing time<347ms
Average response time across 10,000+ API calls

Visual Grounding

Semantic geometry for stable, intention-level actions

SDK-First Interface

Install via pip or npm, start building in minutes

# Python SDK
snap = snapshot(browser)
btn = find(snap, role="button", text~="Submit")
click(browser, btn.id)

Loading pricing information...

A Few Lines of Code. Clear Pass/Fail.

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()

Semantic Queries

Find elements by role and text, not CSS selectors

Deterministic

Deterministic selector resolution for reproducible actions

Production Ready

Validated through real-world demos on complex sites

Don't Miss Out on AI Agent Innovations

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.