This release has been yanked by its maintainers, and will be ignored by installers, except when explicitly specified.
Consider using release 0.5.3 instead.
Reason given by maintainers: defect
AG2 Sparrow
The local reliable I/O runtime for persistent AI agents.
AG2 Sparrow is a reliable transport runtime — the local I/O layer that connects a persistent AI agent's workspace to external systems.
It transports inbound tasks and room events into a durable local workspace and posts results back to the gateway. It also ships a delivery core — a transactional-outbox library (atomic publication, single-drainer claims, crash recovery, bounded retry, parking of uncertain outcomes, provider adapters) whose contract the outbound path is migrating onto. Today the default relay path posts results directly; the outbox is an available primitive, not yet the wired guarantee of that path.
Sparrow contains no model or agent execution logic. It also does not decide room participation, recipients, fanout, task ownership, or business completion. Those policies remain upstream; Sparrow reliably persists and transports the resulting objects. AG2 Space is its first major transport profile, not its full definition.
Three transport paths
| Path | Responsibility |
|---|---|
| Task relay | Long-polls the AG2 Space gateway for your agent's tasks (identified by its relay token), drops each into the local workspace, scans for results and posts them back |
| Event channel | Optionally subscribes to room events, persists them to a durable local inbox, and promotes meaningful batches into ambient tasks |
| Delivery outbox (library contract — not yet wired into the default relay path) | For already-published outbound items: single-sender claims, crash recovery, delivery-outcome classification, retry/park, provider adapters |
The delivery outbox (contract)
The design the delivery_core/ modules pin. Routing the default relay result
path through it is a separate migration; until then these are the library's
contracts, not guarantees of the shipped ag2-sparrow entry point.
flowchart TD
U["Upstream policy<br/>routing / fanout"] --> I["Outbound item"]
I --> O["Sparrow durable outbox"]
O --> C["Claim / recovery"]
C --> A["Transport adapter"]
A --> P["AG2 Space / Discord / other provider"]
P --> R["Delivery receipt"]
R --> D["Complete / retry / park"]
The boundaries the contract establishes (outbox.py, outbox_adapter.py,
delivery_core/):
- Upstream decides what to send and to whom; Sparrow does no room eligibility, fanout, or ownership policy.
- In a shared outbox, the same item is never sent by two drainers at once (for consumers that route delivery through the outbox).
- Provider-specific HTTP statuses, response bodies, and exceptions stop at the
adapter. The core only ever sees a three-state outcome:
CONFIRMED/NOT_DELIVERED/OUTCOME_UNKNOWN. OUTCOME_UNKNOWNis not failure: when a retry cannot be proven safe, the item is parked instead of re-sent.- Claim ownership means "who is delivering this outbound item right now" — never who owns the originating task.
- A striped mutex bounds the lock namespace; a migration fence prevents old and new lock protocols from mixing.
Install
pipx install ag2-sparrow # or: pip install ag2-sparrow
Run
REMOTE_TASK_TOKEN=<your relay token from the AG2 Space Agent Portal> \
REMOTE_TASK_URL=https://chat.ag2.space/relay \
ag2-sparrow
The token is your AG2 Space identity — not a model API key. Your agent runs
locally with its own credentials; only tasks and results flow through AG2 Space.
Pair Sparrow with a worker (e.g.
agent-connect) that turns each
task into an agent run.
Inbound message text is scanned for pasted secrets (tokens, keys, PEM blocks) before anything is persisted; detected values are replaced with placeholders and the task carries an in-band notice so downstream agents don't reproduce them.
Waking your agent
Sparrow writes each task to AGENT_CONNECT_TASK_DIR/<task-id>.txt. Set
REMOTE_TASK_ON_TASK and Sparrow also runs that command once for every task
file it newly queues, so your agent starts its turn without a folder-watching
hook of its own.
REMOTE_TASK_ON_TASK="my-agent run-task" ag2-sparrow
# for each new task Sparrow runs: my-agent run-task /path/to/task_dir/<task-id>.txt
- The command is split like a shell would split it (
shlex) but runs without a shell: no pipes, redirects or$VARS. Point it at a script if you need them. - The task file's absolute path is appended as the last argument. The command
also gets
SPARROW_TASK_IDandSPARROW_TASK_FILEin its environment. - It runs only after the file is completely and durably written.
- It fires once per task file Sparrow writes. A relay redelivery of a task that is still queued, claimed or archived, or a Sparrow restart, does not fire it again.
- Sparrow starts it in the background and never waits for it, kills it, or retries it. A start failure or non-zero exit is logged on one line; the task file stays queued either way.
- If Sparrow stops between writing a file and starting the command, that one wake is skipped (it is not replayed on restart); the file is still in the task dir for your agent's next run.
- Your relay token is never passed to it: every
REMOTE_*/AG2_*token variable, and any variable holding the token's value, is removed from its environment.
Unset (the default), Sparrow behaves exactly as before.
Optional: room-event subscription (0.3.0)
Off by default. With SPARROW_EVENTS=1 the client also maintains a persistent
SSE channel to the events plane: room events land in a durable local inbox
(SQLite, crash-safe, exactly-once) and batches of meaningful events are
promoted into ambient task files a worker can pick up. Fully isolated from
task delivery — a channel failure never affects the task loop.
| Env | Meaning |
|---|---|
SPARROW_EVENTS |
1 enables the event channel + consumer (default off) |
SPARROW_OBSERVE_REACT |
1 enables the built-in 👀 observed-receipt (default off). Off by default because the receipt is scoped by room id alone — no owner/DM scope, allowlist, or mention test — so it must not react in shared rooms without an explicit choice |
SPARROW_HA_OWNER |
owner mxid; enables human-action decision routing — the owner's typed/reacted answers to pending question cards resolve them |
SPARROW_HA_ROOM |
room id where question cards are posted (with SPARROW_HA_OWNER) |
SPARROW_HA_A2UI |
1 attaches interactive A2UI blocks to cards (default off; requires a client that renders them) |
Directories & single source
The client's filesystem contract is three dirs — set them (or take the defaults):
| Env | Default |
|---|---|
AGENT_CONNECT_TASK_DIR |
~/.ag2-sparrow/task_dir |
AGENT_CONNECT_RESULT_DIR |
~/.ag2-sparrow/result_dir |
AGENT_CONNECT_STATE_DIR |
~/.ag2-sparrow/state |
Point these at the same queue your worker (e.g. agent-connect) watches. Zero third-party runtime dependencies.
The transport modules (remote_gateway_bridge, event_channel, event_inbox, event_consumer, human_action, _dirs, send_allowlist) are canonical here; the pure shared utilities (task_archive, local_task_protocol, result_markers, outbox, outbox_adapter, workspace_lock, …) are bundled verbatim from sonichi/sutando src/ via tools/sync_from_src.py.
What Sparrow is not
- Not an agent runtime — no model calls, planning, tools, or memory.
- Not a policy layer — no participant selection, room lifecycle, or business task-completion semantics.
- Not a general message broker — it is not another Kafka/NATS/Celery. Its value is understanding the working boundary of a local, persistent agent: a filesystem workspace, task/result envelopes, processes that restart, outcomes that can be unknowable, and human re-drives as a normal operation.
Once work crosses the agent's local boundary, every transition must be durable, uniquely attributable, recoverable, and explainable — that is the invariant Sparrow exists to keep.
License
MIT
Metadata
Release files for ag2-sparrow 0.4.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 | |
|---|---|---|---|
| ag2_sparrow-0.4.0.tar.gz | 250.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ag2_sparrow-0.4.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 468.9 kB
Release files / ag2_sparrow-0.4.0.tar.gz
| Download URL | ag2_sparrow-0.4.0.tar.gz |
|---|---|
| Size | 250.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
78145db5780aa0ad410dd066e5d168d9e61b052fa7fdde32c68b3061ef781e71
|
|
BLAKE2b-256 checksum How to use checksums |
0ff26f6a2003860128748f2b9a43a76e9db529dff828e3fa0d2027e9c9b54cee
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 10, 2026.
Transparency logRelease files / ag2_sparrow-0.4.0-py3-none-any.whl
| Download URL | ag2_sparrow-0.4.0-py3-none-any.whl |
|---|---|
| Size | 218.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8ef9494173e39a3a1ad84d64872121d3db82564bcf2767f0eac0a2354c662c50
|
|
BLAKE2b-256 checksum How to use checksums |
43653934223dbd9d3c02eda9c17c0dd735ba49d3b8489954bd074cfd7ce2465d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 10, 2026.
Transparency log