Skip to main content

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)โ€‹

FieldSupported
protocolVersionโœ…
nameโœ…
descriptionโœ…
supportedInterfacesโœ…
providerโœ…
versionโœ…
documentationUrlโœ…
capabilitiesโœ…
securitySchemesโœ…
securityRequirementsโœ…
defaultInputModesโœ…
defaultOutputModesโœ…
skillsโœ…
signaturesโŒ
iconUrlโœ…

AgentProvider (ยง4.4.2)โ€‹

FieldSupported
urlโœ…
organizationโœ…

AgentCapabilities (ยง4.4.3)โ€‹

FieldSupported
streamingโœ…
pushNotificationsโŒ
extensionsโŒ
extendedAgentCardโŒ

AgentExtension (ยง4.4.4)โ€‹

FieldSupported
uriโŒ
descriptionโŒ
requiredโŒ
paramsโŒ

AgentSkill (ยง4.4.5)โ€‹

FieldSupported
idโœ…
nameโœ…
descriptionโœ…
tagsโœ…
examplesโœ…
inputModesโœ…
outputModesโœ…
securityRequirementsโŒ

AgentInterface (ยง4.4.6)โ€‹

FieldSupported
urlโœ…
protocolBindingโœ…
tenantโŒ
protocolVersionโœ…

AgentCardSignature (ยง4.4.7)โ€‹

FieldSupported
protectedโŒ
signatureโŒ
headerโŒ

How A2A on LiteLLM worksโ€‹

When you register an A2A agent in LiteLLM:

  1. You provide a base URL (and, for some providers, an assistant identifier).

  2. LiteLLM fetches the upstream agent card from the agent's /.well-known/agent-card.json (or the provider-specific equivalent).

  3. You review the parsed card in the LiteLLM UI, choose which skills and fields to expose, and pick a Protocol Version (1.0 or 0.3) for clients.

  4. LiteLLM saves the curated card and serves it at:

    GET /a2a/{agent_id}/.well-known/agent.json
  5. Clients invoke the agent at:

    POST /a2a/{agent_id}

    using A2A JSON-RPC 2.0 (see Supported A2A methods below).

Protocol versioningโ€‹

LiteLLM converts upstream agent responses to the protocolVersion pinned on each agent. Clients always see the version you choose, regardless of what the upstream agent speaks natively.

protocolVersionServed to clients
"1.0" (default on new cards)Protobuf JSON envelopes โ€” result.message, stream statusUpdate / artifactUpdate
"0.3"Legacy kind-discriminated JSON โ€” result.kind == "message"

Set this in the agent card UI or in agent_card_params at registration. Unsupported values are rejected with HTTP 400.

Completion-bridge agents (LangGraph, Bedrock AgentCore, etc.) do not need extra provider config โ€” pin protocolVersion only if your client expects a specific wire format.

See Protocol versioning for client negotiation when protocolVersion is not pinned.

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).

MethodSupportedHow 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 nameWire method
SendMessagemessage/send
SendStreamingMessagemessage/stream
GetTasktasks/get
ListTaskstasks/list
CancelTasktasks/cancel
SubscribeToTasktasks/resubscribe
CreateTaskPushNotificationConfigtasks/pushNotificationConfig/set
GetTaskPushNotificationConfigtasks/pushNotificationConfig/get
ListTaskPushNotificationConfigstasks/pushNotificationConfig/list
DeleteTaskPushNotificationConfigtasks/pushNotificationConfig/delete
GetExtendedAgentCardagent/getAuthenticatedExtendedCard

Requirementsโ€‹

  • Task and push-notification methods require agent_card_params.url pointing 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_provider and no url) support message/send and message/stream only. Task APIs return an error if no upstream URL is configured.
  • message/send / message/stream only: LiteLLM may strip LiteLLM-specific keys from params (for example guardrails). Task method params are forwarded as-is so A2A fields like id are preserved.

Example: two-step task flowโ€‹

1. Send a message (0.3 wire format โ€” pin protocolVersion: 0.3)
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:

2. Poll task status
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.