Saltar al contenido principal

Referencia del protocolo

Este documento describe la superficie A2A 1.0 expuesta por el servidor iac-code y el comportamiento del cliente de Fase 1 usado por iac-code a2a-client call. Para opciones exactas de CLI, consulta la referencia de comandos.

Resumen del ciclo de vida

Una interacción A2A típica sigue este flujo:

GET Agent Card -> SendMessage or SendStreamingMessage -> GetTask / follow-up / CancelTask
  1. Descubrir — Obtén /.well-known/agent-card.json.
  2. Enviar — Envía un mensaje de texto al endpoint JSON-RPC en /.
  3. Transmitir — Recibe payloads Task, Message y TaskStatusUpdateEvent.
  4. Continuar — Envía un mensaje de seguimiento con el mismo contextId.
  5. Cancelar o consultar — Usa CancelTask, GetTask o ListTasks.

Agent Card

La Agent Card está disponible en:

GET /.well-known/agent-card.json

Campos importantes:

CampoValorSignificado
nameiac-codeNombre del agente
supportedInterfaces[0].protocolBindingJSONRPCEnlace de transporte
supportedInterfaces[0].protocolVersion1.0Versión del protocolo A2A
supportedInterfaces[0].urlhttp://<host>:<port>/Endpoint JSON-RPC
capabilities.streamingtrueSoporta actualizaciones de tareas en streaming
capabilities.pushNotificationsfalse o truetrue cuando push-notifications: true está configurado
capabilities.extendedAgentCardtrueLos llamadores autenticados pueden solicitar detalles extendidos del runtime
capabilities.extensionsurn:iac-code:a2a:artifact-metadata:v1Namespace opcional de metadatos de iac-code para estado de herramientas y metadatos de artefactos almacenados
defaultInputModestipos MIME text, JSON, YAML, image, audio y binaryModos MIME de entrada aceptados
defaultOutputModes["text/plain"]Solo salida de texto

Las respuestas de Agent Card incluyen Cache-Control: public, max-age=60, ETag y Last-Modified. Los clientes pueden enviar If-None-Match y recibir 304 Not Modified cuando la tarjeta no ha cambiado.

Skills anunciadas:

Skill IDPropósito
iac_generationGenerar plantillas Alibaba Cloud ROS y Terraform a partir de lenguaje natural
iac_reviewInspeccionar plantillas IaC y sugerir correcciones
aliyun_ros_operationsAyudar con flujos de trabajo de stacks de Alibaba Cloud ROS
terraform_ros_conversionAyudar en la conversión de Terraform a ROS usando recursos de skills integrados

Cuando la autenticación está habilitada, la Agent Card anuncia los esquemas de seguridad configurados:

EsquemaCuándo se anuncia
bearerAuthtoken o IACCODE_A2A_HTTP_TOKEN está establecido
basicAuthEl usuario y la contraseña de Basic están establecidos
apiKeyAuthapi-key o IACCODE_A2A_API_KEY está establecido

Rutas

RutaMétodoDescripción
/healthGETDevuelve {"status":"healthy"}
/.well-known/agent-card.jsonGETDevuelve la Agent Card
/POSTManeja solicitudes A2A JSON-RPC
Rutas RESTmixtoLas rutas REST del SDK de A2A registradas por create_rest_routes

Cliente de Fase 1 y notas de transporte

El transporte interoperable predeterminado de Fase 1 es JSON-RPC sobre HTTP. El modo HTTP también anuncia HTTP+JSON para las rutas REST del SDK.

El servidor también tiene transportes opcionales para stdio, sockets Unix, WebSocket, gRPC oficial, envoltorio gRPC JSON-RPC y Redis Streams. stdio, sockets Unix, WebSocket, gRPC JSON-RPC y Redis Streams son transportes JSON-RPC personalizados. gRPC oficial se anuncia como grpc y requiere dependencias gRPC opcionales.

El cliente integrado usa el descubrimiento de Agent Card (GET /.well-known/agent-card.json) antes de las llamadas de mensaje, selecciona el primer supportedInterfaces[].url ejecutable anunciado y luego envía solicitudes JSON-RPC con A2A-Version: 1.0 y nombres de métodos A2A 1.0 como SendMessage.

push-notifications: true habilita los métodos de configuración de notificaciones push de A2A y la entrega de estados terminales.

La firma de Agent Card usa la utilidad de firma del SDK de A2A y emite campos JWS estándar AgentCardSignature. El modo de clave simétrica usa HS256; la verificación puede seleccionar un secreto configurado por kid del encabezado protegido, un JWKS local de clave octet o una URL JWKS remota. La firma asimétrica del lado del servidor y la rotación automática de claves no están implementadas en la Fase 1.

Para la lista canónica de comportamientos no soportados en Fase 1, consulta Protocolo A2A.

Backends de entrega de notificaciones push

iac-code a2a --config a2a-server.yml soporta dos colas de entrega push:

  • push-queue: local-file almacena trabajos debajo del directorio de persistencia A2A y está pensado para uso local de un solo nodo.
  • push-queue: redis-streams almacena trabajos en Redis Streams y coordina workers mediante un grupo de consumidores de Redis.

La entrega push respaldada por Redis requiere el extra opcional a2a-redis y es al menos una vez. Los receptores de callback deben manejar actualizaciones de tareas de forma idempotente porque un trabajo puede entregarse de nuevo después de fallos de workers, expiración de leases, reconexiones o carreras de reintento.

Opciones comunes de Redis:

push-notifications: true
push-queue: redis-streams
push-redis-url: redis://localhost:6379/0
push-stream: iac-code:a2a:push
push-retry-key: iac-code:a2a:push:retry
push-dead-stream: iac-code:a2a:push:dead
push-consumer-group: iac-code-push
push-consumer-name: worker-1
push-lease-timeout-ms: 300000

Las URL de callback se validan antes de almacenarlas y nuevamente antes del despacho. El validador predeterminado rechaza URL que no sean HTTP(S), nombres de host localhost y direcciones IP literales privadas/locales. Los receptores de callback aun así deben aplicar su propia política de autenticación e idempotencia.

Métodos JSON-RPC

SendMessage

Ejecuta un turno de mensaje A2A sin streaming. La respuesta contiene una tarea o mensaje después de que el turno se haya completado.

Solicitud

{
"jsonrpc": "2.0",
"id": "1",
"method": "SendMessage",
"params": {
"message": {
"messageId": "msg-1",
"role": "ROLE_USER",
"parts": [{"text": "Create a VPC with two vSwitches."}],
"metadata": {
"iac_code": {"cwd": "/absolute/path/to/project"}
}
},
"configuration": {
"acceptedOutputModes": ["text/plain"]
}
}
}

Campos de mensaje requeridos

CampoTipoRequeridoDescripción
messageIdstringID de mensaje de cliente único
rolestringUsa ROLE_USER para entrada de usuario
partsarrayPartes similares a texto, datos JSON, texto sin procesar, URL de archivo local o partes multimodales acotadas
metadata.iac_code.cwdstringRecomendadoRuta absoluta del espacio de trabajo; si se omite, toma por defecto el directorio del proceso del servidor

metadata.iac_code.cwd debe ser un directorio absoluto existente cuando se proporciona. Debe estar dentro de una raíz de espacio de trabajo permitida. De forma predeterminada, las raíces permitidas son el directorio del proceso del servidor y el directorio temporal del sistema; IACCODE_A2A_ALLOWED_CWDS puede proporcionar una lista permitida separada por rutas del sistema operativo.

Categorías de entrada soportadas:

CategoríaForma aceptadaLímites y comportamiento
Partes similares a textotext con text/plain, JSON, Markdown, YAML o tipos MIME de texto extra configuradosSe agregan directamente al prompt
Partes de datos JSONdata con application/jsonSerializadas como JSON compacto; máximo 1 MiB inline
Partes de texto sin procesarraw con un tipo MIME similar a textoDeben ser UTF-8 válido; máximo 1 MiB inline
URL de archivos de texto localesurl con file://... y tipo MIME similar a textoEl archivo debe existir dentro de cwd y de las raíces permitidas; máximo 1 MiB
Partes multimodales raw/data/fileimage, audio o tipos MIME multimodales configuradosConvertidas en un manifiesto de prompt con nombre de archivo, tipo de medio, tamaño en bytes, hash y origen; raw/data máximo 5 MiB, URL de archivo máximo 25 MiB

La ingesta de URL HTTP(S) remotas no está soportada. Las partes de URL de archivo deben usar URL locales file:// y permanecer dentro del espacio de trabajo permitido.

SendStreamingMessage

Ejecuta un turno de mensaje A2A en streaming. El cuerpo de la solicitud tiene la misma forma que SendMessage, pero el servidor transmite respuestas JSON-RPC como Server-Sent Events.

{
"jsonrpc": "2.0",
"id": "2",
"method": "SendStreamingMessage",
"params": {
"message": {
"messageId": "msg-2",
"role": "ROLE_USER",
"parts": [{"text": "Review this ROS template."}],
"metadata": {
"iac_code": {"cwd": "/absolute/path/to/project"}
}
},
"configuration": {
"acceptedOutputModes": ["text/plain"]
}
}
}

GetTask

Devuelve la tarea A2A guardada por ID. Usa historyLength para limitar el historial devuelto sin mutar el historial de tarea almacenado. Omítelo para recibir el historial predeterminado actual del servidor.

{
"jsonrpc": "2.0",
"id": "3",
"method": "GetTask",
"params": {
"id": "task-id",
"historyLength": 10
}
}

ListTasks

Devuelve las tareas conocidas visibles para el llamador autenticado. Los resultados se ordenan por marca de tiempo de estado descendente y luego por ID de tarea descendente para un orden estable. El servidor soporta contextId, status, pageSize, pageToken, historyLength e includeArtifacts.

{
"jsonrpc": "2.0",
"id": "4",
"method": "ListTasks",
"params": {
"contextId": "ctx-id",
"status": "TASK_STATE_WORKING",
"pageSize": 20,
"includeArtifacts": false
}
}

nextPageToken se devuelve cuando hay otra página disponible. includeArtifacts toma por defecto false, por lo que las respuestas de listado omiten los artefactos de tarea salvo que se soliciten explícitamente.

CancelTask

Solicita la cancelación de una tarea en ejecución.

{
"jsonrpc": "2.0",
"id": "5",
"method": "CancelTask",
"params": {
"id": "task-id"
}
}

Si la tarea está activa, el servidor cancela el turno de agente en ejecución y emite un estado de tarea cancelado. Si la tarea existe pero no está en ejecución, el servidor devuelve el TaskNotCancelableError estándar de A2A.

SubscribeToTask

Se suscribe a un stream de actualizaciones de una tarea activa cuando el transporte del cliente lo soporta.

{
"jsonrpc": "2.0",
"id": "6",
"method": "SubscribeToTask",
"params": {
"id": "task-id"
}
}

Para tareas activas, el stream comienza con el Task actual, luego emite eventos de tarea posteriores y se cierra cuando termina el turno activo. Suscribirse a una tarea completada, fallida, cancelada o que requiere entrada devuelve un error de estilo tarea no encontrada en lugar de esperar indefinidamente. Para turnos nuevos, prefiere SendStreamingMessage; inicia la ejecución y transmite la respuesta en una solicitud.

Métodos de configuración de notificaciones push

Cuando el servidor inicia con push-notifications: true, soporta:

MétodoPropósito
CreateTaskPushNotificationConfigAlmacenar una configuración de callback para una tarea
GetTaskPushNotificationConfigObtener una configuración de callback
ListTaskPushNotificationConfigsListar configuraciones de callback de una tarea
DeleteTaskPushNotificationConfigEliminar una configuración de callback

Ejemplo de solicitud de creación:

{
"jsonrpc": "2.0",
"id": "7",
"method": "CreateTaskPushNotificationConfig",
"params": {
"taskId": "task-id",
"id": "webhook-1",
"url": "https://hooks.example.com/a2a",
"token": "notification-token",
"authentication": {
"scheme": "bearer",
"credentials": "callback-token"
}
}
}

El servidor cifra los tokens de notificación almacenados y las credenciales de autenticación de callback cuando el keyring push local está disponible.

GetExtendedAgentCard

Los clientes autenticados pueden solicitar la Agent Card extendida:

{
"jsonrpc": "2.0",
"id": "8",
"method": "GetExtendedAgentCard",
"params": {}
}

La tarjeta extendida incluye la tarjeta pública más detalles autenticados del runtime.

Comportamiento de tareas y contextos

iac-code asigna contextos A2A a runtimes internos de agente:

ConceptoComportamiento
contextId omitidoEl SDK/servidor genera un nuevo ID de contexto
Mismo contextIdReutiliza la misma sesión interna de iac-code y el estado de conversación
Mismo contextId, distinto cwdRechazado como un espacio de trabajo diferente
Mismo contextId, mensaje concurrenteRechazado con Task is already working.
Valores de contextId diferentesPueden ejecutarse concurrentemente
Contexto inactivoExpulsado de memoria después del timeout de inactividad configurado

Los IDs de tarea y contexto no deben estar vacíos, pueden tener como máximo 128 caracteres y solo pueden contener letras, dígitos, _, ., : o -.

Estados de tarea

EstadoSignificado
TASK_STATE_SUBMITTEDLa tarea fue aceptada
TASK_STATE_WORKINGiac-code está ejecutando el turno del agente
TASK_STATE_INPUT_REQUIREDEl turno se completó y el agente está listo para entrada de seguimiento
TASK_STATE_CANCELEDSe solicitó y aplicó la cancelación
TASK_STATE_FAILEDLa tarea falló en validación o ejecución

iac-code usa TASK_STATE_INPUT_REQUIRED como estado completado normal porque el contexto queda disponible para mensajes de seguimiento.

Actualizaciones en streaming

Durante la ejecución, iac-code emite actualizaciones TaskStatusUpdateEvent.

El texto del asistente se entrega como un mensaje de estado:

{
"statusUpdate": {
"taskId": "task-1",
"contextId": "ctx-1",
"status": {
"state": "TASK_STATE_WORKING",
"message": {
"role": "ROLE_AGENT",
"parts": [{"text": "Here is the ROS template..."}]
}
}
}
}

Los detalles de herramientas y uso se entregan mediante metadata.iac_code:

Ruta de metadatosDescripción
iac_code.tool.statusstarted, input_delta, input_complete, completed o failed
iac_code.tool.toolUseIdID estable de uso de herramienta para correlacionar eventos de herramienta
iac_code.tool.nameNombre de la herramienta cuando está disponible
iac_code.tool.inputEntrada completada de la herramienta, truncada a 4000 caracteres por campo
iac_code.tool.resultResultado de la herramienta, truncado a 4000 caracteres por campo
iac_code.permission.autoApprovedfalse cuando una solicitud de permiso de herramienta fue rechazada por el modo servidor A2A
iac_code.thinking.typeraw_thinking cuando raw-thinking está habilitado en thinking-exposure
iac_code.thinking.textChunk bruto de razonamiento del provider, truncado a 4000 caracteres, emitido solo para configuraciones de confianza que habilitan raw-thinking
iac_code.usage.inputTokensRecuento de tokens de entrada del turno
iac_code.usage.outputTokensRecuento de tokens de salida del turno
iac_code.usage.totalTokensRecuento total de tokens del turno

Cuando un resultado de herramienta incluye un payload de artefacto de texto soportado, el servidor almacena el payload localmente, emite un TaskArtifactUpdateEvent estándar y registra el artefacto en el campo artifacts de la tarea. La parte de artefacto usa una URL file:// más metadatos como mediaType, byteSize y sha256; el contenido original del artefacto no se duplica dentro de los metadatos de herramienta.

Extensiones

La Agent Card anuncia la extensión opcional de metadatos de artefactos de iac-code:

urn:iac-code:a2a:artifact-metadata:v1

Esta extensión identifica el namespace metadata.iac_code usado para progreso de herramientas, decisiones de permisos, uso de tokens y metadatos de artefactos locales. Si el servidor está configurado con alguna extensión requerida, los clientes deben incluir su URI en el encabezado A2A-Extensions. Las extensiones requeridas ausentes devuelven el ExtensionSupportRequiredError estándar de A2A.

Cuando thinking-exposure habilita uno o más tipos de señal, la Agent Card también anuncia:

urn:iac-code:a2a:thinking-exposure:v1

Los params de la extensión incluyen enabledTypes, como ["tool_trace", "raw_thinking"]. Esta es una extensión de metadatos de iac-code, no un tipo de evento de streaming central de A2A.

Manejo de errores

EscenarioResultado
Entrada de texto vacíaTASK_STATE_FAILED con A2A server currently accepts text input only.
Tipo de medio no soportadoError de validación o error estándar de tipo de contenido de A2A, según dónde el SDK rechace la solicitud
Parte de URL remotaError de validación porque las partes de URL deben usar URL locales file://
URL de archivo fuera del espacio de trabajo permitidoError de validación
Extensión A2A requerida ausenteExtensionSupportRequiredError estándar de A2A
Metadatos de espacio de trabajo no válidosTASK_STATE_FAILED con un mensaje de espacio de trabajo no válido
Autenticación ausente o no válidaHTTP 401 con {"error":"Unauthorized"}
Dependencias del servidor A2A ausentesLa CLI sale con una pista de instalación para el extra a2a
Credenciales de proveedor ausentesError de autenticación saneado
Error inesperado de runtimeError interno saneado

El servidor evita devolver rutas locales, secretos y detalles del proveedor en mensajes de error inesperados.