OpenAdapt

OpenAdaptAIMIT活跃维护

把人工操作 EHR、支付门户等桌面或网页流程录成可本地回放的确定性程序,无需调用模型,每步校验结果,不匹配就停。

For EHRs, payer portals, and any app your team clicks through. A person or an agent shows the task; OpenAdapt turns it into a local program that repeats the steps with no model calls, checks each save, and stops when something doesn't match.

openadapt-flow-v2.7.0发布于 2026-11-09 19:09 UTC1,869star +3 / 7 天280fork同步于 2026-11-10 11:46 UTC

怎么上手

由 README 提炼,执行前请确认
uvx --python 3.12 openadapt quickstart --break-it
硬件要求按 README 说明

README 未说明显存或 GPU 要求;quickstart 只需本机 Python 3.10–3.12(uvx 可自动获取 3.12),桌面录制需另装对应操作系统适配器。

下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

把一次人工或智能体操作编译成本地可重复执行的程序,零模型调用并校验每次保存

把人工操作 EHR、支付门户等桌面或网页流程录成可本地回放的确定性程序,无需调用模型,每步校验结果,不匹配就停。

核心能力

  • 录制一次操作后编译成程序,运行时不再调用模型
  • 每次保存前确认目标记录,保存后从系统回读校验
  • 不匹配时立即停止并返回结果,不猜测继续
  • 支持 Web、Windows、macOS、Linux 及远程桌面后端
  • 提供 MCP 服务,把编译好的工作流暴露为单个工具调用

容易踩的坑

replay 会直接执行包括不可撤销保存在内的所有录制动作,务必指向测试或预发环境而非生产数据;桌面应用录制需额外安装 capture 与对应系统适配器(如 openadapt[capture,windows]);agent serve 默认非 production 模式只能列出工作流不能运行,需加 --mode production --bundles 才能执行自有工作流。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本openadapt-flow-v2.7.0
  1. openadapt-flow-v2.7.0openadapt-flow 2.7.0最新正式版2026-11-09 · 2026-11-09 19:09 UTC

    Flow adds openadapt wrap, which turns one agent task into a compiled program that replays with new inputs and no model calls. It also teaches writes in the browser and on desktop apps under a signed authorization, and checks more of what a write changed. Verification still refuses a write when the record or its outcome cannot be established.

    Upgrade notes

    • No command falls back to the demo app on its own. replay needs a target: --url, backend.url in --config, or --demo-app to serve the bundled MockMed (the tutorial and quickstart commands pass it; --drift needs it). --demo-app with an attached browser is refused. The variant router's first-screen probe captures nothing without a URL. qualify accept's break-it check no longer runs every workflow's oracle against MockMed: it builds the lie from the workflow itself (a store that did not change, and a screen showing the workflow's own success text and every value the run typed). The reference Execute worker refuses, before running anything, an admission whose target_url it cannot drive.
    • Every command-line parser rejects abbreviated long options. Spell each option in full: run --permission no longer selects --permission-trust.
    • Paged REST and FHIR reads must declare an immutable-snapshot contract and completeness. A read that does not declare records_complete (or that returns a missing or changing snapshot token, duplicate identities or mixed identity domains) is indeterminate, not confirmed.
    • FHIR reads refuse query parameters in configured searches, requests, effective URLs and self links, because a capped or filtered result cannot establish a complete read-back. A collection bundle is accepted only with a total equal to its entry count. Standard searchset paging is unchanged.
    • A workflow recorded with locale, date-order and keyboard-layout facts refuses replay on a computer whose facts differ or cannot be read. Workflows recorded before this release carry no such binding and are not checked.
    • Identity bands are stricter. A recorded token that carries a digit (an id, date, age or count) must match the live band raw, label and hint words no longer count toward coverage, and a band with no identity-bearing token abstains. Some same-name rows that verified before now refuse.
    • SQLite rows are hashed with each cell's storage class, so a value that changes from integer to text (or similar) changes the row hash. A connection with type converters is refused.
    • All database watch routes in one shadow configuration must share the same frame.database settings.

    Features

    • openadapt wrap (and python -m openadapt_flow.wrap.cli) runs one operator-configured, parameterized task. The first call for a task runs the agent once, checks the saved record independently, compiles the run and admits it; later calls replay the admitted program with new inputs and no model calls. --serve exposes the task as a local stdio MCP tool whose input schema is exactly the task's declared parameters. A request ID makes a repeated or interrupted call return the original run instead of sending the write again. A failed or uncertain replay is held until a person approves a repair through the normal signed admission and canaries. Model spend and run time are capped before each model call (--max-cost-usd, --max-run-seconds), and the run reports its usage.
    • The model never sees the task's own identity or inputs. Where a listing or screenshot shows a value bound to the task (a declared on_screen identity string or a task input), it is sent as a typed placeholder such as ⟦task.identity_1⟧ or ⟦task.note⟧: in text, and as a labelled box in the redacted screenshot. Before, the scrubber redacted the task's own patient name and MRN, and Claude stopped at read-back because it could not tell the task's row from any other. Unbound personal data is still redacted generically. The agent
  2. openadapt-desktop-v0.28.1OpenAdapt Desktop 0.28.12026-11-08 · 2026-11-08 08:29 UTC
    查看更新说明

    OpenAdapt Desktop 0.28.1: the PyPI package and the native installers.

    Signing in this release

    • macOS: ad-hoc signed, not notarized. macOS asks you to confirm the first time you open it (System Settings > Privacy & Security).
    • Windows: unsigned. SmartScreen warns before install; choose More info > Run anyway.
    • Linux: no package signature; the GitHub attestation covers the exact DEB and AppImage bytes.

    Verify any download against SHA256SUMS and its GitHub attestation with verify-openadapt-native-release.py, using this release's openadapt-desktop-channel.json.

    Native Release Candidates

    OpenAdapt Desktop native packages are unadmitted candidates for the installed authoring, teaching, and local-pairing companion. They bundle and start the Python sidecar, connect the Tauri/React cockpit to it over local JSON-lines IPC, and register the openadapt:// operating-system handler. The handler accepts only the fixed openadapt://connect action and forwards it to the sidecar's strict, transactional pairing flow.

    The canonical compiler and governed runtime remain in openadapt-flow. Each native installer freezes the exact openadapt-flow[browser,console]==2.4.1 runtime and its playwright==1.61.0 browser automation dependency into the Desktop sidecar. The console extra is what lets an installed application serve the attended decision console the mobile decision portal relays; the browser extra carries the frozen Playwright driver. Compile, replay, run, and teach therefore work without a separate Python, openadapt-flow, or playwright installation on PATH. Desktop starts with no browser download. The first browser workflow downloads the Chromium revision pinned by the bundled Playwright runtime unless an approved browser cache is pre-provisioned; native desktop, RDP, and Citrix workflows never enter that setup path.

    The mobile decision portal shows the current phone interface, one-use pairing flow, local evidence boundary, hosted outbound lane, runner revalidation, and typed result contract.

    Desktop keeps separately licensed media and vision components outside its MIT installer. On first use, it downloads the exact release-reviewed component for the current platform, verifies the pinned URL, byte count, and SHA-256, installs it into a versioned local cache, and re-verifies every extracted file before loading it. This applies to the managed FFmpeg 8.1.2 runtime used for capture encoding and the RapidOCR 1.4.4/OpenCV 5.0.0.93 runtime used for visual resolution. A partial or drifted download is never activated; rerunning the operation retries it. Enterprise images can pre-provision the same exact cache without changing the runtime contract. Developer ID builds carry the narrow macOS library-validation entitlement required to load that independently signed, hash-verified OpenCV extension; the manifest and full-file cache audit remain the admission boundary.

    Each Desktop version is one immutable openadapt-desktop-vX.Y.Z release in the OpenAdapt monorepo. It carries the Python wheel and sdist (the same bytes as on PyPI), these native installers, and the release's own attested channel. The native version comes from package.json, src-tauri/Cargo.toml, and src-tauri/tauri.conf.json, with matching entries in both lockfiles; a Desktop release pull request sets them and the Python version together (scripts/prepare_release.py). When it merges, the Desktop release workflow builds and smoke-tests every package, attests the exact bytes, attaches everything to a draft, publishes the wheel and sdist to PyPI, and publishes the draft once. If any build fails, nothing is published. OpenAdapt's releases are immutable, so a published release is never edited; a newer release supersedes an older one by version. This transaction doesn't change the admission-driven Production channel. The release policy is in [RELEASES.md](https://github.com/OpenAdaptAI/Open

  3. openadapt-desktop-v0.28.0OpenAdapt Desktop 0.28.02026-11-07 · 2026-11-07 03:15 UTC
    查看更新说明

    OpenAdapt Desktop 0.28.0: the PyPI package and the native installers.

    Signing in this release

    • macOS: ad-hoc signed, not notarized. macOS asks you to confirm the first time you open it (System Settings > Privacy & Security).
    • Windows: unsigned. SmartScreen warns before install; choose More info > Run anyway.
    • Linux: no package signature; the GitHub attestation covers the exact DEB and AppImage bytes.

    Verify any download against SHA256SUMS and its GitHub attestation with verify-openadapt-native-release.py, using this release's openadapt-desktop-channel.json.

    Native Release Candidates

    OpenAdapt Desktop native packages are unadmitted candidates for the installed authoring, teaching, and local-pairing companion. They bundle and start the Python sidecar, connect the Tauri/React cockpit to it over local JSON-lines IPC, and register the openadapt:// operating-system handler. The handler accepts only the fixed openadapt://connect action and forwards it to the sidecar's strict, transactional pairing flow.

    The canonical compiler and governed runtime remain in openadapt-flow. Each native installer freezes the exact openadapt-flow[browser,console]==2.4.1 runtime and its playwright==1.61.0 browser automation dependency into the Desktop sidecar. The console extra is what lets an installed application serve the attended decision console the mobile decision portal relays; the browser extra carries the frozen Playwright driver. Compile, replay, run, and teach therefore work without a separate Python, openadapt-flow, or playwright installation on PATH. Desktop starts with no browser download. The first browser workflow downloads the Chromium revision pinned by the bundled Playwright runtime unless an approved browser cache is pre-provisioned; native desktop, RDP, and Citrix workflows never enter that setup path.

    The mobile decision portal shows the current phone interface, one-use pairing flow, local evidence boundary, hosted outbound lane, runner revalidation, and typed result contract.

    Desktop keeps separately licensed media and vision components outside its MIT installer. On first use, it downloads the exact release-reviewed component for the current platform, verifies the pinned URL, byte count, and SHA-256, installs it into a versioned local cache, and re-verifies every extracted file before loading it. This applies to the managed FFmpeg 8.1.2 runtime used for capture encoding and the RapidOCR 1.4.4/OpenCV 5.0.0.93 runtime used for visual resolution. A partial or drifted download is never activated; rerunning the operation retries it. Enterprise images can pre-provision the same exact cache without changing the runtime contract. Developer ID builds carry the narrow macOS library-validation entitlement required to load that independently signed, hash-verified OpenCV extension; the manifest and full-file cache audit remain the admission boundary.

    Each Desktop version is one immutable openadapt-desktop-vX.Y.Z release in the OpenAdapt monorepo. It carries the Python wheel and sdist (the same bytes as on PyPI), these native installers, and the release's own attested channel. The native version comes from package.json, src-tauri/Cargo.toml, and src-tauri/tauri.conf.json, with matching entries in both lockfiles; a Desktop release pull request sets them and the Python version together (scripts/prepare_release.py). When it merges, the Desktop release workflow builds and smoke-tests every package, attests the exact bytes, attaches everything to a draft, publishes the wheel and sdist to PyPI, and publishes the draft once. If any build fails, nothing is published. OpenAdapt's releases are immutable, so a published release is never edited; a newer release supersedes an older one by version. This transaction doesn't change the admission-driven Production channel. The release policy is in [RELEASES.md](https://github.com/OpenAdaptAI/Open

  4. openadapt-desktop-v0.27.0OpenAdapt Desktop 0.27.02026-11-06 · 2026-11-06 15:27 UTC
    查看更新说明

    OpenAdapt Desktop 0.27.0: the PyPI package and the native installers.

    Signing in this release

    • macOS: ad-hoc signed, not notarized. macOS asks you to confirm the first time you open it (System Settings > Privacy & Security).
    • Windows: unsigned. SmartScreen warns before install; choose More info > Run anyway.
    • Linux: no package signature; the GitHub attestation covers the exact DEB and AppImage bytes.

    Verify any download against SHA256SUMS and its GitHub attestation with verify-openadapt-native-release.py, using this release's openadapt-desktop-channel.json.

    Native Release Candidates

    OpenAdapt Desktop native packages are unadmitted candidates for the installed authoring, teaching, and local-pairing companion. They bundle and start the Python sidecar, connect the Tauri/React cockpit to it over local JSON-lines IPC, and register the openadapt:// operating-system handler. The handler accepts only the fixed openadapt://connect action and forwards it to the sidecar's strict, transactional pairing flow.

    The canonical compiler and governed runtime remain in openadapt-flow. Each native installer freezes the exact openadapt-flow[browser,console]==2.4.1 runtime and its playwright==1.61.0 browser automation dependency into the Desktop sidecar. The console extra is what lets an installed application serve the attended decision console the mobile decision portal relays; the browser extra carries the frozen Playwright driver. Compile, replay, run, and teach therefore work without a separate Python, openadapt-flow, or playwright installation on PATH. Desktop starts with no browser download. The first browser workflow downloads the Chromium revision pinned by the bundled Playwright runtime unless an approved browser cache is pre-provisioned; native desktop, RDP, and Citrix workflows never enter that setup path.

    The mobile decision portal shows the current phone interface, one-use pairing flow, local evidence boundary, hosted outbound lane, runner revalidation, and typed result contract.

    Desktop keeps separately licensed media and vision components outside its MIT installer. On first use, it downloads the exact release-reviewed component for the current platform, verifies the pinned URL, byte count, and SHA-256, installs it into a versioned local cache, and re-verifies every extracted file before loading it. This applies to the managed FFmpeg 8.1.2 runtime used for capture encoding and the RapidOCR 1.4.4/OpenCV 5.0.0.93 runtime used for visual resolution. A partial or drifted download is never activated; rerunning the operation retries it. Enterprise images can pre-provision the same exact cache without changing the runtime contract. Developer ID builds carry the narrow macOS library-validation entitlement required to load that independently signed, hash-verified OpenCV extension; the manifest and full-file cache audit remain the admission boundary.

    Each Desktop version is one immutable openadapt-desktop-vX.Y.Z release in the OpenAdapt monorepo. It carries the Python wheel and sdist (the same bytes as on PyPI), these native installers, and the release's own attested channel. The native version comes from package.json, src-tauri/Cargo.toml, and src-tauri/tauri.conf.json, with matching entries in both lockfiles; a Desktop release pull request sets them and the Python version together (scripts/prepare_release.py). When it merges, the Desktop release workflow builds and smoke-tests every package, attests the exact bytes, attaches everything to a draft, publishes the wheel and sdist to PyPI, and publishes the draft once. If any build fails, nothing is published. OpenAdapt's releases are immutable, so a published release is never edited; a newer release supersedes an older one by version. This transaction doesn't change the admission-driven Production channel. The release policy is in [RELEASES.md](https://github.com/OpenAdaptAI/Open

  5. v1.20.02026-11-05 · 2026-11-05 05:01 UTC
    查看更新说明

    Requirements

    • Require openadapt-flow>=2.6.0,<3.0.0 in the base install and every Flow extra. openadapt doctor and openadapt deploy report older Flow releases as unsupported. This supplies the persistent owed-recheck API used by ledger listing.

    Features

    • openadapt verify ledger list shows provisional confirmed writes whose rechecks are still owed, with their due time and actor. Owed rechecks remain visible after the server restarts and disappear when the recheck completes. An empty ledger reports that no held writes, open writes or owed rechecks remain.
    • The platform manifest and compatibility report select published component releases, including Desktop 0.25.1.

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    OpenAdapt

    Give your agent a program, not a mouse.

    The open-source, verified execution layer for computer-use agents.

    CI Packages CI PyPI Python 3.10–3.12 License: MIT Discord

    What it can do · Documentation · Quickstart · Live demo · Website · Get updates · Discord

    A computer-use agent looks at the screen and chooses every click again, on every run. OpenAdapt lets your agent, or a person, do a task once in a web, Windows, macOS, Linux or remote-desktop app. It compiles that run into a program, and your agent calls the program as one tool. The program runs with no model calls and sends no screenshots anywhere. It confirms the right record before each save, reads the save back from the system of record after it, and returns a plain outcome. When anything doesn't match, it stops and tells your agent instead of guessing.

    Measured on OpenEMR and openIMIS

    One new-patient referral in a test copy of OpenEMR, the open-source EHR whose 7.0 release is ONC-certified, timed from a fresh browser through sign-in, the entry and the saved record read back (median):

    Who does the entryTime per referralSaved correctlyModel cost
    Agent alone (Claude Sonnet 5.5 computer use)██████████████████ 36.5 s62 of 63about $0.08
    OpenAdapt program, screen steps███████████ 22.5 s18 of 18$0
    OpenAdapt program, API step██ 3.3 s18 of 18$0

    The API step replaces the program's 41 screen steps with the one form submission the app itself sends, then reads the record back. In both program rows a possible-duplicate referral stopped without saving, as it should. Both program rows ran on 19 Oct on one copy of the app, interleaved, with the approval gate off; the benchmark harness admitted the API step. The agent row is the 14 to 15 Oct timing study, on its own copy of the app. SCOREBOARD.md has every run.

    On a test copy of openIMIS, the open-source insurance and claims system that runs Nepal's national health insurance scheme, the compiled program entered 149 synthetic claims with no model calls: 148 read back correct and none were saved wrong (SCOREBOARD.md).

    A screen can't show a save that went wrong behind it. On a test copy of OpenEMR, with faults injected in its database (a field blanked, a value changed, a duplicate chart, a chart removed, another chart deleted or edited), the agent claimed success on all 30 bad saves. Reading the record back caught 25 of the 30 and confirmed all 5 clean saves, with no false alarms. On MockMed, a test app that shows a save as done before its server answers, the agent also claimed all 30 bad saves, and the read-back caught all 30 (details below).

    One harness, three modes

    ModeWhat happensModel calls
    ExploreYour agent, or a person, does the task once while OpenAdapt records every action. The save is read back before anything compiles.Your agent's, on your own key
    RunThe compiled program repeats the task with new inputs. It checks the record before each save and reads it back after.None
    RepairWhen the app changes, the run stops before saving. An agent shows the fix, the program tries it up to the save without saving, and a person approves it.Only when something changed, on your own key

    Why the read-back matters

    A success screen is not proof of a save. We injected 8 kinds of bad save into a test app (a save that never landed, landed partly, landed twice, went to the wrong record, or changed another record), 9 runs each, alongside clean runs. Each check below was asked whether those 72 bad saves had succeeded:

    How the save was checkedBad saves reported as saved
    The app's "Saved" message on screen54 of 72
    A read of the record over the app's REST API9 of 72 (all writes to a table it didn't read)
    A read of every table in the database0 of 72

    EFFECT_E2E.md has the fault set, the method and the raw results.

    An agent working alone can't see these faults either. Claude Sonnet 5.5, using computer use, did a task on a test app whose server broke the save in 6 ways, 5 times each. The agent reported all 30 bad saves as done. Given the agent's run, openadapt-flow verify-run read each record back: it flagged all 30 and confirmed all 10 clean saves, with no false alarms. The test app shows "saved" before the server answers, so the screen gave the agent nothing to notice. That gap is what the read-back closes. SCOREBOARD.md has the method, the raw runs and the cost.

    Try it in one command

    uvx --python 3.12 openadapt quickstart --break-it
    

    No account or API key. uv fetches Python 3.12 if you need it; with Python 3.10 to 3.12 already installed, python -m pip install --upgrade openadapt then openadapt quickstart --break-it does the same.

    What it shows

    The command runs a synthetic clinic task twice on your computer. The first run saves an entry and confirms it through the app's read-only API. For the second run, the test server is set up to reject the save, so it never reaches the record. This is the output from openadapt 1.17.0, with the break-it lines in the current wording:

    [1/5] Record the demonstration against a real persistence boundary
    [2/5] Compile and propose a fixture-specific effect contract
    [3/5] Certify against the clinical-write policy
    [4/5] Admit and execute under the standard profile
          VERIFIED in 5.6s; 0 model calls; the system of record holds 1 record(s)
    [5/5] Emit the local run receipt
    ...
    --- break-it: the same certified bundle, with the save set to fail ---
    
      Injected fault:      'optimistic' -- the server rejects the write
      On screen:           every on-screen check passed, including the saved message
      The verifier found:  1/2 declared effect(s) REFUTED by an independent
                           read of the system of record, which holds 0 record(s)
      The engine did:      HALTED at the consequential step instead of claiming
                           success (transaction: RECONCILIATION_REQUIRED, billable: no)
      Result:              Check the record. A save may have gone through. A person checks the record before anything is retried.
    

    The quickstart tutorial walks through every line.

    Build with it

    Compile your agent's run

    Your agent (Claude or OpenAI computer use, or your own loop, on your own model key) does the task once while OpenAdapt records it. A person reviews and admits the draft program, or a registered agent admits it under a policy a person signed. After that, the program runs instead of the agent.

    from openadapt_flow.jit import compile_agent
    
    jit = compile_agent(my_agent, task=task, app=app, verifier=verifier,
                        policy="clinical-write", cache_dir="jit-cache", model_key=key)
    jit.run(note="Follow up in two weeks")    # the agent does it; a DRAFT is saved
    # a person reviews, runs the canary, and admits the draft
    jit.run(note="Recheck knee in ten days")  # the program runs: 0 model calls, save read back
    

    Compile a computer-use agent's run has the full example. The same path takes an agent's run through the web, Windows, macOS, Linux, RDP and Citrix backends.

    Call programs from your agent

    claude mcp add openadapt -- uvx --python 3.12 openadapt-agent serve
    

    Each compiled workflow becomes one tool call. The agent decides what to enter; OpenAdapt makes the entry, checks it, and returns an outcome instead of the agent driving the screen. With no bundles, the server offers a synthetic sandbox workflow that returns every outcome. To serve your own workflows, run openadapt agent serve --mode production --bundles ./bundles; without --mode production the agent can list them but not run them. openadapt-agent emit-skill <bundle> writes an Agent Skill for one workflow, and openadapt flow verify-run judges a write made by any agent or script against the system of record. Connect an agent covers other clients.

    Record a task by hand

    python -m pip install --upgrade openadapt
    openadapt flow record --url https://staging.your-app.example --out rec
    openadapt flow compile rec --out bundle --name my-first-workflow
    openadapt flow replay bundle --url https://staging.your-app.example --run-dir run
    

    replay drives the app at --url and performs every recorded action, including saves you can't undo. It doesn't ask first and doesn't check the saved record. Point it at a test or staging copy, never at production data.

    A program that writes to a real system also needs record checks, a deployment file, certification, qualification, and an admission; then openadapt flow run runs it. By default each save waits for a person to approve it in OpenAdapt Desktop or on a paired phone. Your first workflow walks through it. Several recordings of the same task can become one program with branches and loops (openadapt flow induce).

    To record a desktop app, install the recorder and your operating system's adapter, for example python -m pip install "openadapt[capture,windows]", or use OpenAdapt Desktop.

    Judge or train any agent

    openadapt flow verify-run judges a write made by any agent or script against the system of record. openadapt-flow serve-reward turns the same check into a reward for training or evaluating computer-use agents (REWARD_WORKER.md).

    An agent alone, and an OpenAdapt program

    The same referral task on a local OpenEMR 8.0.0.3 test copy with synthetic patients, 62 timed runs each (14 and 15 October 2026), judged by the same database read-back:

    Claude computer-use agentOpenAdapt program
    Model callsOn every step of every run0
    Screenshots sent to a modelThroughout every run0
    Model cost per referralAbout $0.08 at list price$0
    Path through the appChosen again each runThe same compiled steps
    Median time36.5 s29.7 s
    Referrals saved correctly62 of 6362 of 63

    The program drove every page, as the agent does. The API step compiled from the recording's network traffic removes those page steps: 3.3 s per referral, in the table at the top. Every result is published. OpenAdapt isn't affiliated with the OpenEMR project.

    Every backend

    Record, compile and run take every surface; the evidence differs by surface (BACKEND_PARITY.md). Self-repair is qualified on browser runs (benchmark/auto_repair) and end to end on native macOS AX (#1715). Outside a browser it runs with repair.session (#1717), and native and pixel backends admit its new clicks by element identity (#1709). Teaching the fix for a halted run and rollback are tested on browser runs. Where the app exposes its structure, OpenAdapt uses it; on remote desktops it works from pixels.

    SurfaceWhat OpenAdapt readsValidated on
    Web appsThe screen, plus the page's DOMOpenEMR, Odoo and openIMIS test copies; CI runs in-tree apps on every build
    Windows appsThe screen, plus UI Automation3 of 3 saves in a WinForms test app
    macOS appsThe screen, plus Accessibility3 of 3 saves in TextEdit
    Linux apps (X11)The screen, plus AT-SPIRecording and an AT-SPI read in CI; backend actions are unit-tested
    Remote desktop (RDP)The screen105 runs through the stock Remote Desktop client on a real AVC444 session: 55 saves confirmed in the database, 0 wrong-record saves, 40 false stops
    CitrixThe screenA Citrix stand-in app with no DOM: 3 healthy runs, 3 stops on drift

    Each application on each surface needs its own qualification. Surfaces and Limits have the details.

    How it works

    flowchart LR
        S["Record, or let an agent do it once"] --> C["Compile"] --> Q["Certify and qualify"] --> A["Admit"] --> R["Run with checks"]
        R -.->|"stopped: approve a fix"| C
    

    For each step the compiler uses the most reliable layer the app offers: page structure first (DOM, Windows UI Automation, macOS Accessibility, Linux AT-SPI), a direct API call where one is bound, and pixels (template, text and layout matching) only where nothing else exists, such as a remote desktop. Qualification runs the program against normal and fault cases before an admission lets that exact version run. At each save the program checks that the right record is on screen, makes the entry, and reads the record back.

    How it compares

    Computer-use agentAgent with a replay cacheTraditional RPAOpenAdapt
    How you define the taskA goal in plain languageOne agent runA script or flow built in a designerA person's recording or an agent's run
    What runs each timeA model chooses each step from the screenThe recorded steps; the agent takes over on a missThe fixed scriptA compiled program you can read
    Model calls per runAt least one per stepNone on a hit; the agent's calls on a missNoneNone with default settings
    When the screen changesThe model tries to adaptThe agent improvises liveA selector stops matching, or matches the wrong controlThe run stops before saving; a fix is proposed and a person approves it
    Right record?The model judges from the screenUsually only that the screen looks as recordedWhatever the developer scriptedChecked before every save
    Did the save land?The model judges from the screenThe screenWhatever the developer scriptedRead back from the system of record
    Strongest forNew or changing tasksRepeated tasks where a wrong save is cheapStable processes with a team to maintain the scriptsThe same entry many times, where a wrong save is costly

    What it can do

    • Learns from any successful run, a person's demonstration or a computer-use agent's verified run, and compiles it into a program that runs with no calls to a hosted AI model.
    • Uses the most reliable layer the app allows: page structure (DOM, UI Automation, Accessibility), direct API calls where one is bound, and pixels only for remote desktops.
    • Builds branching programs from several demonstrations, repeated halts and background runs, and routes each item to the right verified variant.
    • Works across surfaces: web, Windows, macOS, Linux and RDP backends, chained in one workflow.
    • Confirms the right record before every write and reads the saved record back from the system of record, never just the screen.
    • Stops instead of guessing, never retries an uncertain save, and says what changed before a stop.
    • Binds each approval to exactly what will be saved, with one-tap answers on a paired phone.
    • Repairs itself when the app changes, probing a fix up to the save and asking a person to approve it (qualified on browser runs and end to end on native macOS).
    • Works as a safety layer under any agent: MCP tools, a guarded save, Agent Skills and a CLI.
    • Runs locally: no calls to a hosted AI model on healthy runs, patient data redacted, signed receipts.

    CAPABILITIES.md has the evidence and code for each.

    What your agent gets back

    You seetransaction_outcomeAn agent getsWhat happens next
    Done and checkedVERIFIEDdoneNothing. Only this result gets a shareable receipt.
    Stopped before savingHALTED_BEFORE_EFFECTneeds_reviewFix the cause, or show the program the fix, and run again.
    Check the recordRECONCILIATION_REQUIREDnot_sure_if_savedA save may have gone through. A person checks the record before anything is retried.
    Finished, not checkedCOMPLETED_UNVERIFIEDnot_sure_if_savedFine for testing; not a production success.
    Saved, waiting for its checkSAVED_AWAITING_CHECKnot_sure_if_savedThe save's check is a later report (a claim acknowledgment, an export). Don't rerun it. openadapt-flow deferred settle counts it as done only when the report confirms it.
    Didn't runREJECTED_POLICY, CANCELED, FAILED_PLATFORMdid_not_runFix the gate or the environment and run again.

    The console's last line can read HALTED for both the second and third rows. transaction_outcome in report.json tells them apart, so base every rerun on it. Run outcomes lists every value.

    When to use something else

    • The app has an API for the task. Call the API.
    • Every task is new. Use a computer-use agent. OpenAdapt pays off when the same entry repeats.
    • There's no way to read the record back. The record check needs read access to the system of record: an API, the database, FHIR, or a separate signed-in session. Without one, a run can only end as finished but not checked.

    Packages

    pip install openadapt installs the openadapt command, the engine, and the MCP server. The product packages live in this repository:

    Package (PyPI)What it isSource
    openadaptThe openadapt commandopenadapt/
    openadapt-flowThe engine: record, compile, check, qualify, run, repairpackages/flow/
    openadapt-agentThe MCP server and Agent Skillspackages/agent/
    openadapt-typesShared request, result, and receipt modelspackages/types/
    openadapt-captureThe desktop recorder: openadapt[capture]packages/capture/
    openadapt-privacyFinds and redacts personal and health data: openadapt[privacy]packages/privacy/
    openadapt-desktopOpenAdapt Desktop (download)packages/desktop/
    openadapt-trayMenu-bar and system-tray controls and status for OpenAdapt Desktoppackages/tray/

    Each package installs only what it imports. For example, pip install openadapt-privacy doesn't install the engine or the desktop app. CI checks each package's install size and dependency list (install weight).

    Research on GUI agents lives in separate repositories: openadapt-evals (benchmarks) and openadapt-ml (model training). The packages map has the full list.

    Security and procurement

    Screens, typed values, and recordings stay on the computer or runner that runs OpenAdapt. The shareable receipt and the Cloud dashboard hold counts, digests, and closed values. A sanitized copy leaves only after a person approves it, and screenshots go to a model host only if you turn on model grounding. Security & procurement covers data handling, deployment boundaries, evidence, subprocessors, and release integrity. Plans are on the pricing page.

    The block below is generated from the signed public lifecycle record.

    The signed ledger has seven active target admissions. Their evidence class is remote-safe-synthetic, not MockMed production_acceptance. They remain valid until revoked; there's no expiry date. pip install openadapt is the admitted runtime (launcher 1.16.0, Flow 1.35.1). Desktop's admitted artifact is the 0.16.0 wheel. Native Mac DMGs stay ad-hoc signed 0.15.0; don't treat those as admitted. A Production run still needs a workflow admission for the exact compiled bundle, application, and environment. Check the live signed Production record.

    Earlier versions

    The pre-1.0 version (v0.46.0) is frozen under legacy/. docs/LEGACY_FREEZE.md explains how to install it and how to migrate.

    Contributing

    Launcher, engine, MCP server, and contract changes all belong in this repository; engine changes go in packages/flow/. Contribution guide · Issues · Discussions · Report a vulnerability · Code signing policy

    Maintained by OpenAdaptAI under the MIT License.