Deploy API: A2A Server
A2A protocol endpoints for agent-to-agent communication
A2A API
A2A (Agent-to-Agent) protocol endpoints for agents deployed via A2A(agent).get_router().
Base URL + Playground
# Start A2A server
from praisonaiagents import Agent
from praisonaiagents.a2a import A2A
import uvicorn
agent = Agent(instructions="You are a helpful assistant")
app = A2A(agent).get_router()
uvicorn.run(app, host="0.0.0.0", port=8000)Base URL: http://localhost:8000
Endpoints
GET /.well-known/agent.json
Retrieve the Agent Card for discovery.
ParamField
noneNo parameters required.
curl http://localhost:8000/.well-known/agent.jsonimport requests
response = requests.get("http://localhost:8000/.well-known/agent.json")
agent_card = response.json()
print(f"Agent: {agent_card['name']}")
print(f"URL: {agent_card['url']}")
print(f"Skills: {[s['name'] for s in agent_card['skills']]}")const response = await fetch("http://localhost:8000/.well-known/agent.json");
const agentCard = await response.json();
console.log(`Agent: ${agentCard.name}`);
console.log(`URL: ${agentCard.url}`);Response:
{
"name": "Assistant",
"description": "Helpful AI Assistant",
"url": "http://localhost:8000/a2a",
"version": "1.0.0",
"capabilities": {
"streaming": true,
"pushNotifications": false,
"stateTransitionHistory": false
},
"skills": [
{
"id": "chat",
"name": "Chat",
"description": "General conversation"
}
]
}GET /status
Check server status.
ParamField
noneNo parameters required.
curl http://localhost:8000/statusimport requests
response = requests.get("http://localhost:8000/status")
status = response.json()
print(f"Status: {status['status']}")
print(f"Agent: {status['name']}")Response:
{
"status": "ok",
"name": "Assistant",
"version": "1.0.0"
}POST /a2a
Send JSON-RPC messages to the agent.
ParamField
stringJSON-RPC version (must be “2.0”)
ParamField
stringA2A method name (message/send)
ParamField
stringRequest ID
ParamField
stringMessage role (“user”)
ParamField
arrayMessage parts array
curl -X POST http://localhost:8000/a2a \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "message/send",
"id": "request-123",
"params": {
"message": {
"role": "user",
"parts": [
{"type": "text", "text": "Hello, agent!"}
]
}
}
}'import requests
message = {
"jsonrpc": "2.0",
"method": "message/send",
"id": "request-123",
"params": {
"message": {
"role": "user",
"parts": [{"type": "text", "text": "Hello, agent!"}]
}
}
}
response = requests.post("http://localhost:8000/a2a", json=message)
result = response.json()["result"]
print(f"Agent: {result['message']['parts'][0]['text']}")const message = {
jsonrpc: "2.0",
method: "message/send",
id: "request-123",
params: {
message: {
role: "user",
parts: [{ type: "text", text: "Hello, agent!" }]
}
}
};
const response = await fetch("http://localhost:8000/a2a", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(message)
});
const { result } = await response.json();
console.log(`Agent: ${result.message.parts[0].text}`);Response:
{
"jsonrpc": "2.0",
"id": "request-123",
"result": {
"message": {
"role": "agent",
"parts": [
{"type": "text", "text": "Hello! How can I help you today?"}
]
}
}
}Message Part Types
| Type | Fields | Description |
|---|---|---|
text | text | Plain text content |
file | uri, mimeType | File attachment |
Errors
A2A errors follow JSON-RPC 2.0 format:
{
"jsonrpc": "2.0",
"id": "request-123",
"error": {
"code": -32600,
"message": "Invalid request"
}
}| Code | Message |
|---|---|
-32700 | Parse error |
-32600 | Invalid request |
-32601 | Method not found |
-32602 | Invalid params |
-32603 | Internal error |
Related
- A2A Server – Deploy agents as A2A server
- AGUI API – AG-UI protocol endpoints
- Agents API – HTTP REST endpoints