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
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 and choose which skills and fields to expose.

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

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