A2A Protocol

Agent-to-Agent

Descubre la Agent Card, envía message/send con un DataPart o TextPart y lee el resultado de la tarea.

A2A Protocol

Cómo llamar a Claix con A2A

Endpoint

A2Ahttps://claix.dev/a2a

Claix 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étodoURLPara qué
GET/.well-known/agent.jsonAgent Card. Sin autenticación.
GET/.well-known/agent-card.jsonLa misma card (ruta alternativa).
POST/a2aTodas 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 hacer POST (https://claix.dev/a2a).
  • skills: lista de habilidades. Cada una tiene id, 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:

CampoQué poner
jsonrpcSiempre "2.0".
idIdentificador tuyo de la petición (número o string). Te lo devolvemos en la respuesta para correlacionar.
methodPara crear trabajo: "message/send".
params.messageEl mensaje A2A (siguiente tabla).

Dentro de params.message:

CampoObligatorioQué poner
roleSí"user".
messageIdSíUn id único de este mensaje (tú lo eliges).
kindSí"message".
partsSíArray con al menos una parte: DataPart (JSON) o TextPart (texto).
contextIdNoId 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:

stateQué significaQué hacer
completedTerminó en esta respuesta.Lee artifacts[].parts[].data.
workingSigue en curso (tareas largas: extracciones, Modo agente, query-space…).No cierres el hilo. Espera el webhook de push o consulta con tasks/get.
input-requiredFalta un dato que puedes aportar.Reenvía message/send con el campo pedido, mismo contextId.
failedLa operación no se pudo completar.Lee el mensaje de estado / artefacto de error.
canceledCancelaste 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 — …"
  }
}
HTTPcodeCuándo
401-32001Falta la API key o no es válida.
429-32000Has superado 60 peticiones/minuto. Mira Retry-After.
400-32602Skill 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:

SkillQué hace
extract-excelConvert an Excel or CSV file to JSON using a schema
convert-json-to-excelConvert JSON documents to an Excel file
extract-pdfExtract structured data from a PDF using a schema
extract-docExtract structured data from a text document using a schema
extract-imgExtract structured data from an image using a schema
extract-txtExtract structured data from plain text, HTML, or XML using a schema
extract-audioExtract structured data from spoken audio using a schema
get-documentReturn the raw content of a persisted document
query-documentAnswer questions about a persisted document
query-spaceAnswer questions across every document in a knowledge space
create-spaceCreate a knowledge space for the API key account
delete-spaceDelete a knowledge space
delete-documentDelete a persisted document
agent-extract-excelExcel/CSV to JSON with Agent Mode reasoning
agent-extract-pdfPDF to JSON with Agent Mode reasoning
agent-extract-docDocument to JSON with Agent Mode reasoning
agent-extract-imgImage to JSON with Agent Mode reasoning
agent-extract-txtText/HTML/XML to JSON with Agent Mode reasoning
agent-extract-audioAudio to JSON with Agent Mode reasoning
list-schemasList every schema for the API key account
create-schemaCreate a schema for the API key account
delete-schemaDelete 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étodoUso
message/sendCrear o continuar una tarea.
tasks/getConsultar el estado y los artefactos de una tarea.
tasks/cancelCancelar una tarea en curso.
tasks/pushNotificationConfig/setRegistrar 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.

Ejemplos de petición

curl -sS "https://claix.dev/.well-known/agent.json"