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

bash
# 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 none

No parameters required.

curl
curl http://localhost:8000/.well-known/agent.json
Python
import 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']]}")
JavaScript
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:

json
{
  "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 none

No parameters required.

curl
curl http://localhost:8000/status
Python
import requests

response = requests.get("http://localhost:8000/status")
status = response.json()
print(f"Status: {status['status']}")
print(f"Agent: {status['name']}")

Response:

json
{
  "status": "ok",
  "name": "Assistant",
  "version": "1.0.0"
}

POST /a2a

Send JSON-RPC messages to the agent.

ParamField string

JSON-RPC version (must be “2.0”)

ParamField string

A2A method name (message/send)

ParamField string

Request ID

ParamField string

Message role (“user”)

ParamField array

Message parts array

curl
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!"}
        ]
      }
    }
  }'
Python
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']}")
JavaScript
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:

json
{
  "jsonrpc": "2.0",
  "id": "request-123",
  "result": {
    "message": {
      "role": "agent",
      "parts": [
        {"type": "text", "text": "Hello! How can I help you today?"}
      ]
    }
  }
}

Message Part Types

TypeFieldsDescription
texttextPlain text content
fileuri, mimeTypeFile attachment

Errors

A2A errors follow JSON-RPC 2.0 format:

json
{
  "jsonrpc": "2.0",
  "id": "request-123",
  "error": {
    "code": -32600,
    "message": "Invalid request"
  }
}
CodeMessage
-32700Parse error
-32600Invalid request
-32601Method not found
-32602Invalid params
-32603Internal error

Related