Codex A2A runtime adapter
Project description
codex-a2a
Expose Codex through A2A.
codex-a2a adds an A2A runtime layer to the local Codex runtime, with
auth, streaming, session continuity, interrupt handling, a built-in
outbound A2A client, and a clear deployment boundary.
What This Is
- An A2A adapter service for the local Codex runtime, with inbound runtime exposure plus outbound peer calling.
- It supports both roles in one process: serving as an A2A Server and hosting
an embedded A2A Client for
a2a_calland CLI-driven peer calls.
Architecture
flowchart TD
External["A2A Clients / a2a-client-hub / Gateways"]
subgraph Adapter["codex-a2a Runtime"]
Ingress["Inbound A2A Surface\nHTTP+JSON + JSON-RPC"]
Codex["Codex Runtime / Executor"]
Outbound["Embedded A2A Client\nCLI call + a2a_call"]
end
subgraph Peers["Peer A2A Services"]
PeerA2A["Peer A2A Agent"]
PeerRuntime["Peer Runtime"]
PeerA2A --> PeerRuntime
end
External -->|message/send,\nmessage:stream| Ingress
Ingress -->|task execution| Codex
Codex -->|stream events / tool results| Ingress
Codex -->|a2a_call tool| Outbound
Outbound -->|message/send,\nmessage:stream| PeerA2A
PeerA2A -->|task / stream result| Outbound
Quick Start
Install the released CLI with uv tool:
uv tool install codex-a2a
Upgrade later with:
uv tool upgrade codex-a2a
Install an exact release with:
uv tool install "codex-a2a==<version>"
Before starting the runtime:
- Install and verify the local
codexCLI itself. - Configure Codex with a working provider/model setup and any required credentials.
codex-a2adoes not provision Codex providers, login state, or API keys for you.- Startup fails fast if the local
codexruntime is missing or cannot initialize.
Self-start the released CLI against a workspace root:
export A2A_BEARER_TOKEN="$(python -c 'import secrets; print(secrets.token_hex(24))')"
A2A_HOST=127.0.0.1 \
A2A_PORT=8000 \
A2A_PUBLIC_URL=http://127.0.0.1:8000 \
CODEX_WORKSPACE_ROOT=/abs/path/to/workspace codex-a2a
Agent Card: http://127.0.0.1:8000/.well-known/agent-card.json
Capabilities
- A2A HTTP+JSON endpoints such as
/v1/message:sendand/v1/message:stream - A2A JSON-RPC support on
POST / - Embedded client access through
codex-a2a call - Autonomous outbound peer calls through the
a2a_calltool - SSE streaming with normalized
text,reasoning, andtool_callblocks - Session continuity and session query extensions
- Interrupt lifecycle mapping and callback validation
- Transport selection, Agent Card discovery, timeout control, and bearer-token auth for outbound A2A calls
- Payload logging controls, secret-handling guardrails, and released-CLI startup / source-based runtime paths
Detailed protocol contracts, examples, and extension docs live in Usage Guide.
Peering Node / Outbound Access
codex-a2a supports a "Peering Node" architecture where one process can both
expose an inbound A2A surface and call peer A2A services outbound.
CLI Client
Call another A2A agent directly from the command line:
codex-a2a call http://other-agent:8000 "How are you?" --token your-outbound-token
Outbound Agent Calls
The server can autonomously execute a2a_call(url, message) tool calls emitted
by the Codex runtime. Results are fetched through A2A and returned back into
the local execution flow as tool results.
For authenticated peers, configure A2A_CLIENT_BEARER_TOKEN for server-side
outbound calls. CLI calls can continue using --token or
A2A_CLIENT_BEARER_TOKEN.
Server-side outbound client settings are wired through runtime config:
A2A_CLIENT_TIMEOUT_SECONDS,
A2A_CLIENT_CARD_FETCH_TIMEOUT_SECONDS,
A2A_CLIENT_USE_CLIENT_PREFERENCE,
A2A_CLIENT_BEARER_TOKEN, and
A2A_CLIENT_SUPPORTED_TRANSPORTS.
When To Use It
Use this project when:
- you want to keep Codex as the runtime
- you need A2A transports and Agent Card discovery
- you want a thin service boundary instead of building your own adapter
- you want inbound serving and outbound peer access in one deployable unit
Look elsewhere if:
- you need hard multi-tenant isolation inside one shared runtime
- you want this project to manage your process supervisor or host bootstrap
- you want a general client integration layer rather than a runtime adapter
Recommended Client Side
If you want a broader application-facing client integration layer, prefer a2a-client-hub.
It is a better place for higher-level client concerns such as A2A consumption,
upstream adapter normalization, and application-facing integration, while
codex-a2a stays focused on the runtime boundary around Codex plus embedded
peer calling.
Deployment Boundary
This repository improves the service boundary around Codex, but it does not turn Codex into a hardened multi-tenant platform.
A2A_BEARER_TOKENprotects the inbound A2A surface.- Provider auth and default model configuration remain on the Codex side.
- Use
A2A_CLIENT_BEARER_TOKENfor server-side outbound peer calls initiated bya2a_call. - One deployed instance should be treated as a single-tenant trust boundary.
- For mutually untrusted tenants, run separate instances with isolated users, workspaces, credentials, and ports.
Read before deployment:
Release Model
Released versions are published to PyPI and mapped to Git tags / GitHub Releases.
- create a PR from the working branch
- merge into
mainafter human review - create a
v*tag only from a commit already contained inmain - let the tag trigger PyPI and GitHub Release publication
This repository does not publish directly from an unmerged feature branch.
Further Reading
- Usage Guide Configuration, API contracts, client examples, streaming/session/interrupt details.
- Architecture Guide System structure, boundaries, and request flow.
- Compatibility Guide Supported Python/runtime surface, extension stability, and ecosystem-facing compatibility expectations.
- Security Policy Threat model, deployment caveats, and vulnerability disclosure guidance.
Development
For contributor workflow and helper scripts, see Contributing Guide
and Scripts Reference. Maintainers can regenerate optional
upstream Codex reference snapshots locally with scripts/sync_codex_docs.sh.
License
Apache License 2.0. See LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file codex_a2a-0.4.0.tar.gz.
File metadata
- Download URL: codex_a2a-0.4.0.tar.gz
- Upload date:
- Size: 224.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
566c8501fae1de87635eac469c5a1413ac837322bb127bd0311b806ae63b7149
|
|
| MD5 |
7581323eddc410c9f9cb04b1d06a05c5
|
|
| BLAKE2b-256 |
8115c640f945b65d94d84a621722b7c7ddd68d948b37a2f5989da779da20e44c
|
Provenance
The following attestation bundles were made for codex_a2a-0.4.0.tar.gz:
Publisher:
publish.yml on liujuanjuan1984/codex-a2a
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
codex_a2a-0.4.0.tar.gz -
Subject digest:
566c8501fae1de87635eac469c5a1413ac837322bb127bd0311b806ae63b7149 - Sigstore transparency entry: 1185078540
- Sigstore integration time:
-
Permalink:
liujuanjuan1984/codex-a2a@9fc4398a98ba1c28e84c58e55b3658522d03e1c1 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/liujuanjuan1984
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@9fc4398a98ba1c28e84c58e55b3658522d03e1c1 -
Trigger Event:
push
-
Statement type:
File details
Details for the file codex_a2a-0.4.0-py3-none-any.whl.
File metadata
- Download URL: codex_a2a-0.4.0-py3-none-any.whl
- Upload date:
- Size: 107.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aad8cb7497528d9ce0e69c6e7d88ffc090c53c6f5005670b313ccd8be8c783b7
|
|
| MD5 |
e1ff1c2980b2510ab1e3eee5a6630bc6
|
|
| BLAKE2b-256 |
0067ff4a4b3238f6f568f3c8c764fdcc3f4cdd73a2e992969200960bbdaab637
|
Provenance
The following attestation bundles were made for codex_a2a-0.4.0-py3-none-any.whl:
Publisher:
publish.yml on liujuanjuan1984/codex-a2a
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
codex_a2a-0.4.0-py3-none-any.whl -
Subject digest:
aad8cb7497528d9ce0e69c6e7d88ffc090c53c6f5005670b313ccd8be8c783b7 - Sigstore transparency entry: 1185078544
- Sigstore integration time:
-
Permalink:
liujuanjuan1984/codex-a2a@9fc4398a98ba1c28e84c58e55b3658522d03e1c1 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/liujuanjuan1984
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@9fc4398a98ba1c28e84c58e55b3658522d03e1c1 -
Trigger Event:
push
-
Statement type: