Files
cleveragents-core/docs/api/a2a.md
T
freemo 108d87e1bb
CI / lint (push) Failing after 35s
CI / build (push) Successful in 37s
CI / security (push) Failing after 48s
CI / typecheck (push) Failing after 50s
CI / quality (push) Successful in 55s
CI / coverage (push) Has been skipped
CI / helm (push) Successful in 27s
CI / unit_tests (push) Failing after 2m20s
CI / docker (push) Has been skipped
CI / e2e_tests (push) Failing after 15m33s
CI / integration_tests (push) Failing after 21m26s
CI / status-check (push) Failing after 1s
CI / benchmark-regression (push) Has been skipped
CI / benchmark-publish (push) Has been cancelled
docs: update CHANGELOG and A2A API docs for recent merged PRs
Add CHANGELOG [Unreleased] entries for 6 recently merged commits:
- feat(tui): shell danger detection patterns (#1003)
- fix(a2a): JSON-RPC 2.0 wire format compliance — BREAKING field rename (#1501)
- fix(cli): disallow mixing legacy and v3 plan workflows (#1577)
- fix(cli): actor add rich output missing panels
- fix(infra): E2E suite centralized database initialization (#1023)
- ci(pipeline): parallelized static analysis jobs

Update docs/api/a2a.md to reflect JSON-RPC 2.0 field name changes:
A2aRequest.operation → method, A2aResponse.data → result, etc.
2026-04-03 02:43:00 +00:00

137 lines
3.8 KiB
Markdown

# `cleveragents.a2a` — Agent-to-Agent Protocol
The `a2a` package implements the Agent-to-Agent (A2A) protocol boundary.
In **local mode** the `A2aLocalFacade` maps A2A operation names to direct
Python method calls on application services — no serialization, no network.
In **server mode** stub transports raise `A2aNotAvailableError` until the
concrete HTTP transport is wired in.
See [ADR-026](../adr/ADR-026-agent-client-protocol.md) and
[ADR-047](../adr/ADR-047-acp-standard-adoption.md) for design rationale.
---
## Core Classes
### `A2aLocalFacade`
```python
class A2aLocalFacade:
async def dispatch(self, request: A2aRequest) -> A2aResponse: ...
```
Routes A2A requests to live application services. Supported operations:
| Operation | Description |
|-----------|-------------|
| `session.create` | Create a new conversation session |
| `session.close` | Close an existing session |
| `plan.create` | Create a new plan |
| `plan.execute` | Execute a plan |
| `plan.status` | Query plan status |
| `plan.diff` | Retrieve plan diff |
| `plan.apply` | Apply a plan |
| `registry.list_tools` | List available tools |
| `registry.list_resources` | List available resources |
| `event.subscribe` | Subscribe to event stream |
```python
from cleveragents.a2a import A2aLocalFacade, A2aRequest
facade = A2aLocalFacade(container)
response = await facade.dispatch(
A2aRequest(method="session.create", params={"actor": "openai/gpt-4o"})
)
```
---
### `A2aRequest` / `A2aResponse`
> **Breaking change (v3.7.0+):** Fields were renamed to comply with the
> [JSON-RPC 2.0](https://www.jsonrpc.org/specification) wire format.
> See the [CHANGELOG](../../CHANGELOG.md) for the migration table.
```python
class A2aRequest(BaseModel):
jsonrpc: Literal["2.0"] = "2.0" # was: a2a_version
id: str | None = None # was: request_id
method: str # was: operation
params: dict[str, Any] = {}
class A2aResponse(BaseModel):
jsonrpc: Literal["2.0"] = "2.0" # was: a2a_version
id: str | None = None # was: request_id
result: Any | None = None # was: data (success path)
error: A2aErrorDetail | None = None
# result and error are mutually exclusive (enforced by validator)
```
Usage example (updated for JSON-RPC 2.0 field names):
```python
from cleveragents.a2a import A2aLocalFacade, A2aRequest
facade = A2aLocalFacade(container)
response = await facade.dispatch(
A2aRequest(method="session.create", params={"actor": "openai/gpt-4o"})
)
if response.result is not None:
session_id = response.result["session_id"]
elif response.error is not None:
raise RuntimeError(response.error.message)
```
---
### `A2aEventQueue`
Async event queue for subscribing to plan and session events.
```python
queue = A2aEventQueue()
async for event in queue.subscribe("plan-42"):
print(event.type, event.payload)
```
Call `queue.close()` on shutdown to release resources.
---
### `A2aVersionNegotiator`
Negotiates the A2A protocol version between client and server.
---
## Error Types
| Exception | Description |
|-----------|-------------|
| `A2aError` | Base A2A exception |
| `A2aNotAvailableError` | Operation not available in current mode |
| `A2aOperationNotFoundError` | Unknown operation name |
| `A2aVersionMismatchError` | Incompatible protocol versions |
---
## Server Client Stubs
`ServerClient`, `RemoteExecutionClient`, and `AuthClient` are protocol
interfaces for server-mode operation. `StubServerClient`,
`StubRemoteExecutionClient`, and `StubAuthClient` raise
`A2aNotAvailableError` for all methods until server mode is fully
implemented.
---
## Server Connection
```python
from cleveragents.a2a import ServerConnectionConfig
config = ServerConnectionConfig(url="https://my-server.example.com", token="...")
```
Validates URL format and token presence.