Why architecture matters here
A2A message architecture matters because cross-vendor interoperability requires strict structure. Missing fields break integrations; unversioned methods surprise consumers; unsigned messages allow impersonation.
Cost is small — structured metadata is bytes.
Reliability comes from idempotency + signatures + audit. Retries safe; disputes resolvable.
The architecture: every field explained
Walk the diagram top to bottom.
Sender agent. Produces a request message on behalf of user.
JSON-RPC 2.0 envelope. id + jsonrpc + method + params. Standard.
Recipient agent. Consumes; validates; responds with id + result or error.
Method versioning. methods include version (e.g., translate.v2). Capability check first.
Trace context. W3C traceparent propagated in message headers or params.
Signature. Sender signs message; recipient verifies against agent card's public key.
Idempotency key. Client-supplied unique key; server dedupes retries.
Cost + budget. Request includes budget hint; response includes cost consumed.
Error format. code (retryable/non-retryable), message, data. Clients route by class.
Audit trail. Both parties log message ID + hash + parties + outcome.
End-to-end message flow
Trace a message. Sender agent creates request: ``` { "jsonrpc": "2.0", "id": "req-abc123", "method": "translate.v2", "params": { "text": "Hello", "target_lang": "de" }, "meta": { "trace_id": "0af7651916cd43dd8448eb211c80319c", "signature": "0x…", "idempotency_key": "user-42-session-xyz-1", "budget_usd": 0.10 } } ``` Recipient verifies signature against sender's agent card public key. Extracts trace context; attaches to spans. Checks idempotency key: if already processed, return prior result.
Runs translation. Consumes $0.02.
Returns: ``` { "jsonrpc": "2.0", "id": "req-abc123", "result": { "translated": "Hallo", "cost_usd": 0.02 } } ``` Both parties log. Audit consistent.
Error scenario: translation service down. Returns error with code: ``` { "jsonrpc": "2.0", "id": "req-abc123", "error": { "code": "SERVICE_UNAVAILABLE", "retryable": true, "message": "translation service temporarily down" } } ``` Sender knows to retry with backoff.