A2A Protocol
Cómo llamar a Claix con A2A
Endpoint
https://claix.dev/a2aClaix es un agente Agent-to-Agent (A2A). Otro agente, un orquestador o un script le envía un mensaje JSON-RPC 2.0 y Claix responde con una tarea: extraer un documento, listar schemas, preguntar a un documento persistido, etc.
No hace falta MCP ni reescribir las llamadas REST. Usas la misma API key. El flujo siempre es el mismo: descubrir el agente, autenticarte, enviar message/send y leer el resultado en la tarea.
1. Descubre el agente
Antes de enviar trabajo, descarga la Agent Card. Es un JSON público (sin API key) que dice quién es Claix, dónde hay que llamar y qué skills existen.
| Método | URL | Para qué |
|---|---|---|
| GET | /.well-known/agent.json | Agent Card. Sin autenticación. |
| GET | /.well-known/agent-card.json | La misma card (ruta alternativa). |
| POST | /a2a | Todas las llamadas JSON-RPC. Requiere API key. |
Descarga la card:
curl -sS "https://claix.dev/.well-known/agent.json"
También está en https://claix.dev/.well-known/agent-card.json. En el JSON fíjate en:
url/supportedInterfaces: la URL a la que debes hacerPOST(https://claix.dev/a2a).skills: lista de habilidades. Cada una tieneid, nombre, descripción y ejemplos de payload.capabilities.pushNotifications:true. Las tareas largas avisan a un webhook; no hay streaming SSE.
Si usas un cliente o inspector A2A, conéctalo al origen https://claix.dev (no a /a2a) para que resuelva solo la card en /.well-known/.
2. Autenticación
Cada POST /a2a lleva la misma API key que el resto de Claix. La Agent Card no.
Opción recomendada:
x-api-key: <TU_API_KEY>
Alternativa:
Authorization: Bearer <TU_API_KEY>
Con una de las dos basta. Sin clave o con clave inválida: HTTP 401 y JSON-RPC -32001. Límite: 60 peticiones por minuto por API key (HTTP 429, cabecera Retry-After).
3. Anatomía de una llamada
Todas las operaciones van al mismo sitio: POST https://claix.dev/a2a, Content-Type: application/json. El cuerpo es un sobre JSON-RPC 2.0:
{
"jsonrpc": "2.0",
"id": 1,
"method": "message/send",
"params": {
"message": { }
}
}Campos del sobre:
| Campo | Qué poner |
|---|---|
| jsonrpc | Siempre "2.0". |
| id | Identificador tuyo de la petición (número o string). Te lo devolvemos en la respuesta para correlacionar. |
| method | Para crear trabajo: "message/send". |
| params.message | El mensaje A2A (siguiente tabla). |
Dentro de params.message:
| Campo | Obligatorio | Qué poner |
|---|---|---|
| role | Sí | "user". |
| messageId | Sí | Un id único de este mensaje (tú lo eliges). |
| kind | Sí | "message". |
| parts | Sí | Array con al menos una parte: DataPart (JSON) o TextPart (texto). |
| contextId | No | Id del hilo. Reutilízalo en mensajes siguientes del mismo diálogo. |
Hay dos formas de pedir trabajo. Si ya sabes la skill y los parámetros, envía un DataPart. Si solo tienes una instrucción en lenguaje natural, envía un TextPart.
4. Llamada estructurada (DataPart)
Es la forma más predecible. Una parte kind: "data" con un objeto JSON que incluye "skill" (el id de la Agent Card) y el resto de campos que esa skill espera.
Ejemplo mínimo — listar schemas:
curl -X POST "https://claix.dev/a2a" \
-H "Content-Type: application/json" \
-H "x-api-key: <TU_API_KEY>" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "message/send",
"params": {
"message": {
"role": "user",
"messageId": "msg-list-schemas",
"kind": "message",
"parts": [
{ "kind": "data", "data": { "skill": "list-schemas" } }
]
}
}
}'Ejemplo con archivo — extraer un PDF. En A2A no hay multipart: el archivo va en file_base64 (Base64 o data URL) o en file_path (URL https pública).
{
"jsonrpc": "2.0",
"id": 1,
"method": "message/send",
"params": {
"message": {
"role": "user",
"messageId": "msg-extract-pdf",
"kind": "message",
"parts": [
{
"kind": "data",
"data": {
"skill": "extract-pdf",
"schema_id": "<uuid-de-tu-schema>",
"file_base64": "JVBERi0xLjQK..."
}
}
]
}
}
}Si falta un dato que puedes completar (por ejemplo el schema o el archivo), la tarea queda en input-required en lugar de fallar. Envía otro message/send en el mismo contextId con el campo que falta. Si el id de skill no existe o un parámetro tiene un formato inválido, recibes JSON-RPC -32602 (Invalid params) sin crear la tarea.
5. Llamada en lenguaje natural (TextPart)
Si aún no tienes los parámetros tipados, envía texto. Claix interpreta la petición, elige la skill y rellena los argumentos.
{
"jsonrpc": "2.0",
"id": 1,
"method": "message/send",
"params": {
"message": {
"role": "user",
"messageId": "msg-nl",
"kind": "message",
"parts": [
{
"kind": "text",
"text": "Lista mis schemas y dime cuál uso para extraer facturas PDF."
}
]
}
}
}Úsalo para explorar o para agentes que hablan en lenguaje natural. Cuando ya conozcas skill y los campos, prefiere un DataPart: es más estable y no depende de cómo se formule la frase.
6. Cómo leer la respuesta
Una llamada correcta no devuelve el JSON de negocio en la raíz. El result es una Task A2A. El dato útil está en artifacts.
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"id": "<taskId>",
"contextId": "<contextId>",
"status": { "state": "completed" },
"artifacts": [
{
"name": "list-schemas-result",
"parts": [
{
"kind": "data",
"data": { "success": true, "schemas": [] }
}
]
}
]
}
}Guarda result.id (la tarea) y result.contextId (el hilo). Mira result.status.state:
| state | Qué significa | Qué hacer |
|---|---|---|
| completed | Terminó en esta respuesta. | Lee artifacts[].parts[].data. |
| working | Sigue en curso (tareas largas: extracciones, Modo agente, query-space…). | No cierres el hilo. Espera el webhook de push o consulta con tasks/get. |
| input-required | Falta un dato que puedes aportar. | Reenvía message/send con el campo pedido, mismo contextId. |
| failed | La operación no se pudo completar. | Lee el mensaje de estado / artefacto de error. |
| canceled | Cancelaste la tarea. | Nada más; crea otra si hace falta. |
Para consultar una tarea ya creada:
{
"jsonrpc": "2.0",
"id": 2,
"method": "tasks/get",
"params": { "id": "<taskId>" }
}Para cancelarla: method: "tasks/cancel" con el mismo params.id.
7. Errores de protocolo
Si el sobre JSON-RPC o la autenticación fallan, no hay Task. Recibes error:
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32602,
"message": "Invalid params: schema_id — …"
}
}| HTTP | code | Cuándo |
|---|---|---|
| 401 | -32001 | Falta la API key o no es válida. |
| 429 | -32000 | Has superado 60 peticiones/minuto. Mira Retry-After. |
| 400 | -32602 | Skill desconocida o parámetro con formato inválido. |
8. Tareas largas y push
Extraer un PDF, usar Modo agente o preguntar a un espacio con muchos documentos no espera en la conexión HTTP. La primera respuesta suele llegar con status.state: "working". No uses SSE: streaming está desactivado.
Registra un webhook A2A para recibir la Task final (completed o failed) con el artefacto. Puedes enviarlo junto al mensaje:
{
"jsonrpc": "2.0",
"id": 1,
"method": "message/send",
"params": {
"message": {
"role": "user",
"messageId": "msg-extract-pdf",
"kind": "message",
"parts": [
{
"kind": "data",
"data": {
"skill": "extract-pdf",
"schema_id": "<uuid>",
"file_base64": "JVBERi0xLjQK..."
}
}
]
},
"configuration": {
"pushNotificationConfig": {
"url": "https://tu-agente.ejemplo/a2a/push",
"token": "opcional-para-autenticar-el-webhook"
}
}
}
}O registrarlo después, cuando ya tengas el taskId:
{
"jsonrpc": "2.0",
"id": 3,
"method": "tasks/pushNotificationConfig/set",
"params": {
"id": "<taskId>",
"pushNotificationConfig": {
"url": "https://tu-agente.ejemplo/a2a/push"
}
}
}Claix hará POST a esa URL con la Task cuando termine. Tu endpoint debe aceptar el payload A2A de notificación.
9. Cómo mantener el hilo
Cada Task trae un contextId. Es el identificador del diálogo entre tu agente y Claix. Si omites el campo, Claix asigna uno nuevo. Si lo reutilizas en el siguiente message/send, sigues la misma conversación (por ejemplo: listar schemas → extraer con el schema_id que te acaba de devolver).
{
"jsonrpc": "2.0",
"id": 4,
"method": "message/send",
"params": {
"message": {
"role": "user",
"messageId": "msg-follow-up",
"contextId": "el-mismo-contextId-de-antes",
"kind": "message",
"parts": [
{
"kind": "text",
"text": "Usa ese schema y extrae el PDF que te paso ahora."
}
]
}
}
}Un contextId nuevo = conversación nueva. El mismo valor = mismo hilo. No lo mezcles entre cuentas o agentes distintos.
10. Skills disponibles
El DataPart debe llevar "skill": "<id>". Los ids y un resumen salen de la Agent Card; esta tabla es la misma lista:
| Skill | Qué hace |
|---|---|
| extract-excel | Convert an Excel or CSV file to JSON using a schema |
| convert-json-to-excel | Convert JSON documents to an Excel file |
| extract-pdf | Extract structured data from a PDF using a schema |
| extract-doc | Extract structured data from a text document using a schema |
| extract-img | Extract structured data from an image using a schema |
| extract-txt | Extract structured data from plain text, HTML, or XML using a schema |
| extract-audio | Extract structured data from spoken audio using a schema |
| get-document | Return the raw content of a persisted document |
| query-document | Answer questions about a persisted document |
| query-space | Answer questions across every document in a knowledge space |
| create-space | Create a knowledge space for the API key account |
| delete-space | Delete a knowledge space |
| delete-document | Delete a persisted document |
| agent-extract-excel | Excel/CSV to JSON with Agent Mode reasoning |
| agent-extract-pdf | PDF to JSON with Agent Mode reasoning |
| agent-extract-doc | Document to JSON with Agent Mode reasoning |
| agent-extract-img | Image to JSON with Agent Mode reasoning |
| agent-extract-txt | Text/HTML/XML to JSON with Agent Mode reasoning |
| agent-extract-audio | Audio to JSON with Agent Mode reasoning |
| list-schemas | List every schema for the API key account |
| create-schema | Create a schema for the API key account |
| delete-schema | Delete a schema from the API key account |
Los ejemplos de cada skill (campos JSON concretos) están en la Agent Card, en skills[].examples.
11. Métodos JSON-RPC y clientes
| Método | Uso |
|---|---|
| message/send | Crear o continuar una tarea. |
| tasks/get | Consultar el estado y los artefactos de una tarea. |
| tasks/cancel | Cancelar una tarea en curso. |
| tasks/pushNotificationConfig/set | Registrar el webhook para el resultado de una tarea larga. |
No hay message/stream. Las tareas largas no dejan la conexión HTTP abierta.
- SDK TypeScript:
@a2a-js/sdk - Inspector: a2aproject/a2a-inspector contra
https://claix.dev - Cualquier cliente JSON-RPC A2A 0.3 / 1.0 con push notifications
MCP sigue en https://claix.dev/mcp. REST sigue en las rutas de la API. Son interfaces distintas; elige una por integración.