A2A Agent Card
LiteLLM can proxy A2A-compatible agents, exposing them to your clients through LiteLLM with virtual keys, team scoping, observability, and a unified agent card.
This page documents which A2A agent card fields LiteLLM supports today, how invocation works, and what to expect from the proxied agent card served at /a2a/{agent_id}/.well-known/agent.json.
For provider-specific setup, see:
Agent card supportโ
The fields below mirror the A2A v1.0 specification (ยง4.4 Agent Discovery Objects). A โ means the field is present in the agent card LiteLLM serves to clients; a โ means the field is not.
AgentCard (ยง4.4.1)โ
| Field | Supported |
|---|---|
name | โ |
description | โ |
supportedInterfaces | โ |
provider | โ |
version | โ |
documentationUrl | โ |
capabilities | โ |
securitySchemes | โ |
securityRequirements | โ |
defaultInputModes | โ |
defaultOutputModes | โ |
skills | โ |
signatures | โ |
iconUrl | โ |
AgentProvider (ยง4.4.2)โ
| Field | Supported |
|---|---|
url | โ |
organization | โ |
AgentCapabilities (ยง4.4.3)โ
| Field | Supported |
|---|---|
streaming | โ |
pushNotifications | โ |
extensions | โ |
extendedAgentCard | โ |
AgentExtension (ยง4.4.4)โ
| Field | Supported |
|---|---|
uri | โ |
description | โ |
required | โ |
params | โ |
AgentSkill (ยง4.4.5)โ
| Field | Supported |
|---|---|
id | โ |
name | โ |
description | โ |
tags | โ |
examples | โ |
inputModes | โ |
outputModes | โ |
securityRequirements | โ |
AgentInterface (ยง4.4.6)โ
| Field | Supported |
|---|---|
url | โ |
protocolBinding | โ |
tenant | โ |
protocolVersion | โ |
AgentCardSignature (ยง4.4.7)โ
| Field | Supported |
|---|---|
protected | โ |
signature | โ |
header | โ |
How A2A on LiteLLM worksโ
When you register an A2A agent in LiteLLM:
-
You provide a base URL (and, for some providers, an assistant identifier).
-
LiteLLM fetches the upstream agent card from the agent's
/.well-known/agent-card.json(or the provider-specific equivalent). -
You review the parsed card in the LiteLLM UI and choose which skills and fields to expose.
-
LiteLLM saves the curated card and serves it at:
GET /a2a/{agent_id}/.well-known/agent.json -
Clients invoke the agent at:
POST /a2a/{agent_id}using A2A JSON-RPC 2.0 (see Supported A2A methods below).
Supported A2A methodsโ
All methods below are accepted on POST /a2a/{agent_id} (and POST /a2a/{agent_id}/message/send for message/send). LiteLLM also accepts the PascalCase aliases from the A2A SDK (for example GetTask โ tasks/get).
| Method | Supported | How LiteLLM handles it |
|---|---|---|
message/send | โ | Routed through LiteLLM A2A SDK (asend_message) โ logging, guardrails, cost tracking |
message/stream | โ | Routed through LiteLLM streaming handler โ NDJSON/SSE response |
tasks/get | โ | JSON-RPC forwarded to the agent's agent_card_params.url |
tasks/list | โ | JSON-RPC forwarded to upstream |
tasks/cancel | โ | JSON-RPC forwarded to upstream |
tasks/resubscribe | โ | JSON-RPC forwarded to upstream (streaming/SSE) |
tasks/pushNotificationConfig/set | โ | JSON-RPC forwarded to upstream |
tasks/pushNotificationConfig/get | โ | JSON-RPC forwarded to upstream |
tasks/pushNotificationConfig/list | โ | JSON-RPC forwarded to upstream |
tasks/pushNotificationConfig/delete | โ | JSON-RPC forwarded to upstream |
agent/getAuthenticatedExtendedCard | โ | JSON-RPC forwarded to upstream; result.url rewritten to the proxy |
PascalCase aliases (SDK)โ
| SDK / alias name | Wire method |
|---|---|
GetTask | tasks/get |
ListTasks | tasks/list |
CancelTask | tasks/cancel |
SubscribeToTask | tasks/resubscribe |
CreateTaskPushNotificationConfig | tasks/pushNotificationConfig/set |
GetTaskPushNotificationConfig | tasks/pushNotificationConfig/get |
ListTaskPushNotificationConfigs | tasks/pushNotificationConfig/list |
DeleteTaskPushNotificationConfig | tasks/pushNotificationConfig/delete |
GetExtendedAgentCard | agent/getAuthenticatedExtendedCard |
Requirementsโ
- Task and push-notification methods require
agent_card_params.urlpointing at a real A2A JSON-RPC server. LiteLLM forwards the request body unchanged (aside from auth headers). - Completion-bridge-only agents (for example LangGraph/Bedrock AgentCore with
custom_llm_providerand nourl) supportmessage/sendandmessage/streamonly. Task APIs return an error if no upstream URL is configured. message/send/message/streamonly: LiteLLM may strip LiteLLM-specific keys fromparams(for exampleguardrails). Task methodparamsare forwarded as-is so A2A fields likeidare preserved.
Example: two-step task flowโ
curl -X POST "http://localhost:4000/a2a/my-agent" \
-H "Authorization: Bearer sk-1234" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": "r1",
"method": "message/send",
"params": {
"message": {
"kind": "message",
"role": "user",
"messageId": "m1",
"parts": [{"kind": "text", "text": "Hello"}]
}
}
}'
Use result.id from the response as the task id:
curl -X POST "http://localhost:4000/a2a/my-agent" \
-H "Authorization: Bearer sk-1234" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": "r2",
"method": "tasks/get",
"params": {"id": "<task-id-from-step-1>"}
}'
Skill routingโ
Clients invoke a specific skill by including skillId in the message metadata:
{
"jsonrpc": "2.0",
"id": "req-1",
"method": "message/send",
"params": {
"message": {
"messageId": "msg-001",
"role": "user",
"parts": [{"kind": "text", "text": "..."}],
"metadata": {"skillId": "triage_ticket"}
}
}
}
LiteLLM forwards the entire message envelope, including metadata, to the upstream agent unchanged. The upstream agent is responsible for reading skillId and routing internally.
Editing the agent cardโ
You can edit supported fields from the agent detail page in the LiteLLM UI. Use the Re-sync from upstream button to pick up new skills or capabilities the upstream agent has added since registration; it shows a diff and lets you accept changes selectively.