ready-ai
Open-source browser automation engine that drives Chrome over raw CDP (no WebDriver, no Playwright relay) and returns verifiable workflows: every step declares actions, expectations and extractions, and every result is a structured, sanitized object — not a screenshot dump.
import asyncio
from ready_ai import ReadyAI, Flow, FlowStep, FlowAction, FlowAssertion
flow = Flow(
name="login-smoke",
url="https://app.example.com/login",
steps=[
FlowStep(
name="Sign in",
actions=[
FlowAction(action="type", selector="#email", text="user@example.com"),
FlowAction(action="type", selector="#password", text="s3cret"),
FlowAction(action="click", selector="button[type=submit]"),
],
asserts=[FlowAssertion(type="url_contains", expected="/dashboard")],
),
],
)
ai = ReadyAI()
result = ai.run_sync(flow)
print(result.status) # passed | failed | paused | cancelled | error
60 seconds to first green run: pip install -e ".[dev]", export one LLM key, run the snippet above against your staging URL.
Why this engine
- Verifiable by construction. Steps carry
actions+asserts+extract;RunResultreports per-step status, attempts and failure reasons. A step that only "looks right" but asserts nothing fails loudly. - Effect policy fails closed. Flows declare
observe/navigate/interactiveceilings; anything above the ceiling is rejected at validation time, before Chrome even launches. - Secrets never serialize. Profiles are allowlist references resolved at runtime. URLs with embedded credentials are rejected. Typed text is masked at the report boundary.
- Deterministic where it matters. Stable flows compile to direct CDP execution; the LLM acts at authoring time and on drift — never as a per-step tax on a healthy flow (see
ENGINE-ROADMAP.md, Fase 3).
Precision benchmark
Precision here means: the same flow passes 50/50 on a clean tree and fails loudly (never silently green) on a mutated one.
| Signal | Status |
|---|---|
Verifiable outcomes (RunResult per-step status/asserts/extract) |
✅ shipped (v0.1.0) |
| Semantic locators with safe-action fallback | ✅ shipped (v0.1.0) |
Multi-causal healing gate (2 channels must agree, else DRIFT_SUSPECTED) |
✅ shipped (v0.1.0) |
| Local E2E matrix: SPA, Shadow DOM, cross-origin iframe, pop-up, redirect, download, dialog, CDP drop | ✅ shipped (v0.2.0) |
Effect policy + confirmation gates (ceilings, idempotency, pending_confirmation) |
✅ shipped (v0.3.0) |
| Explicit tab/session contexts, allowlisted upload, verified download, explicit dialogs | ✅ shipped (v0.3.0) |
Human checkpoint (await_human pause/resume) + persistent profiles, temp cleanup |
✅ shipped (v0.3.0) |
| Zero-token replay: manifest compile + drift gate + bounded fallback + before/after cost | ✅ shipped (v0.4.0) |
| Sanitized flight recorder on terminal failure (bundle correlated to run/step, no secrets or response bodies) | ✅ shipped (v0.5.0) |
| Mutation scorecard (detection rate / false-positive rate per channel, single vs gated) | ✅ shipped (v0.5.0) |
Public async-first SDK (run/start/resume, ordered events, cooperative cancel, typed exceptions) |
✅ shipped (v0.6.0) |
Distribution contract (py.typed, strict mypy gate, wheel install smoke in CI) |
✅ shipped (v0.6.0) |
Known limits today: OAuth/SSO auto-login (human checkpoint only, by design), heavy multi-app SSO chains — Fase 2 closed; replay shipped in v0.4.0, diagnosis + measured healing in v0.5.0.
What this is / is not
- Is: a Python-first automation engine (
ready_aiSDK) + CLI + FastAPI service for background runs, batch and deploy webhooks. - Is not: a docs generator (generation is one consumer of the engine, kept as an example), a hosted product, a dashboard, or a recorder that needs a human to click first.
Quickstart
Prerequisites: Python >=3.10, Chrome/Chromium/Brave, one model key (OPENAI_API_KEY or ANTHROPIC_API_KEY). Non-default Chrome path: export CHROME_PATH="/path/to/chrome".
pip install -e ".[dev]"
export OPENAI_API_KEY="your-key-here"
SDK (recommended for automation):
import asyncio
from ready_ai import ReadyAI, Flow, FlowStep, FlowAction, BrowserOptions
flow = Flow(url="https://app.example.com", steps=[FlowStep(
actions=[FlowAction(action="observe")],
)])
ai = ReadyAI(profiles={"qa": "./cookies.json"})
async def main():
result = await ai.run(flow, browser=BrowserOptions(profile="qa"))
print(result.status, result.run_id)
asyncio.run(main())
The SDK is async-first: run()/start() stream ordered RunEvents and
support cooperative cancellation; run_sync() is the synchronous
entrypoint; resume(run_id) continues a paused human checkpoint. The
full surface — ReadyAI, Flow*/Run* models, RunEvent, and the
typed exception taxonomy — ships py.typed and is strict-mypy clean;
src.* internals are not public (see the versioning policy in
CHANGELOG.md).
CLI (flows and docs consumers):
ready-ai run --goal "Smoke the checkout" --url "https://app.example.com" --headless
ready-ai batch --config example-batch.yaml
ready-ai api --port 8000 --host 127.0.0.1
Zero-token replay (flows and SDK consumers):
ready-ai run-flow --config flow.yaml --emit-manifest
ready-ai run-flow --config flow.yaml --replay-manifest ./output/<run-id>_replay_manifest.json
Authenticated runs: prefer a cookies JSON array file (--cookies-file, profiles={...}); username/password auto-login exists for simple forms only. Never commit .env, cookies, or generated output.
Architecture & roadmap
docs/ARCHITECTURE.md— engine map: CDP layer, agent loop, executor, policies, SDK boundary.ENGINE-ROADMAP.md— pivot plan: 5 phases, expected outcome per phase, release train v0.2.0–v0.6.0.CHANGELOG.md— per-release notes.- Consumer docs (
docs/API.md,docs/BATCH.md,docs/WEBHOOK.md,docs/CI-CD.md,docs/VERSIONING.md,docs/NOTIFICATIONS.md) describe the API/batch/webhook surfaces.
Development
python3 -m pytest -q
ruff check src/ tests/ main.py ready_ai/ examples/
python -m mypy
CI runs lint, strict mypy and pytest across Python 3.10–3.12, plus a
wheel build installed into a clean venv. See CONTRIBUTING.md and SECURITY.md.
Metadata
Release files for ready-ai 0.8.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| ready_ai-0.8.0.tar.gz | 372.0 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ready_ai-0.8.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 613.4 kB
Release files / ready_ai-0.8.0.tar.gz
| Download URL | ready_ai-0.8.0.tar.gz |
|---|---|
| Size | 372.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
08c949729bed5a8583272340527921e96e4e5858004e5d0ddc2b57fb0852be1f
|
|
BLAKE2b-256 checksum How to use checksums |
d376bd528c87a2d8733f943dd72d17aadff36253b06b6d4d7483dbb58f8cae4f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logRelease files / ready_ai-0.8.0-py3-none-any.whl
| Download URL | ready_ai-0.8.0-py3-none-any.whl |
|---|---|
| Size | 241.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e9b44d881fd04895fff7b2da50b77cc2d13f23b6dfbb4e4b5db24c69f8254903
|
|
BLAKE2b-256 checksum How to use checksums |
4627b2d973166d10dccc314485292855236078d64d2a2d91de1520b2e7d3f90c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logSecurity for ready-ai 0.8.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for ready_ai-0.8.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.