Capítulo 6: Protocolo de Invocación

6.1 Descripción General

El Invocation Protocol define cómo los consumidores de skills invocan remotamente los skills descubiertos. El protocolo adopta un modelo de invocación asíncrono que soporta consultas de estado y recuperación de resultados.

6.2 Flujo de Invocación

Modelo de Invocación en Tres Pasos

PasoMétodo HTTPEndpointDescripción
1. Iniciar invocaciónPOST{invocation_endpoint}Enviar solicitud, retornar ID de ejecución
2. Consultar estadoGET{status_url}/{execution_id}Consultar estado de ejecución
3. Obtener resultadoGET{result_url}/{execution_id}Obtener resultado de ejecución

Secuencia de Invocación

Consumidor                              Proveedor
  │                                      │
  │── POST /invoke ──────────────────────→│
  │   {caller, skill_id, inputs}         │
  │                                      │
  │←── 202 Accepted ────────────────────│
  │   {execution_id, status: "accepted"} │
  │                                      │
  │── GET /status/{execution_id} ───────→│
  │←── {status: "completed"} ───────────│
  │                                      │
  │── GET /result/{execution_id} ───────→│
  │←── {output: {...}} ─────────────────│
  │                                      │

6.3 Formato de Solicitud

{
  "caller": {
    "id": "ifay-instance-001",
    "type": "ifay",
    "credentials": { "api_key": "sk-xxxxx" }
  },
  "skill_id": "com.example.translate-v1",
  "inputs": { "text": "Hello, world!", "target_language": "zh-CN" },
  "context": { "trace_id": "trace-abc-123", "priority": "normal", "timeout_ms": 30000 }
}

Campos de la Solicitud

CampoTipoObligatorioDescripción
callerobjectInformación de identidad del invocador
caller.idstringIdentificador único del invocador
caller.typestringTipo de invocador (ifay/service/user)
caller.credentialsobjectNoCredenciales de autenticación
skill_idstringID del skill objetivo
inputsobjectParámetros de entrada (pares clave-valor)
contextobjectNoContexto de invocación
context.timeout_msnumberNoDuración del timeout (milisegundos)

6.4 Formato de Respuesta

{
  "execution_id": "exec-789-xyz",
  "status": "completed",
  "skill_id": "com.example.translate-v1",
  "output": { "translated_text": "你好,世界!", "confidence": 0.98 },
  "timestamps": { "created_at": "2025-03-20T14:30:00Z", "completed_at": "2025-03-20T14:30:02Z" }
}

Enumeración de Estados de Ejecución

EstadoDescripción
acceptedSolicitud recibida, esperando ejecución
runningEn ejecución
completedEjecución completada exitosamente
failedEjecución fallida
timeoutEjecución expirada

6.5 Flujo de Autenticación

Antes de la invocación, el consumidor verifica el campo auth en el Skill Descriptor:

Consumidor                              Proveedor
  │                                      │
  │── Leer descriptor.auth ──→           │
  │   auth.type == "api_key"? → Header   │
  │   auth.type == "oauth2"? → Token     │
  │   auth.type == "none"? → Directo     │
  │── POST /invoke (con credenciales) ──→│
  │                                      │

6.6 Timeout y Reintento

Cuando la ejecución del skill excede el timeout_ms configurado:

{
  "execution_id": "exec-789-xyz",
  "status": "timeout",
  "error": {
    "code": "EXECUTION_TIMEOUT",
    "message": "Skill execution exceeded the configured timeout of 30000ms",
    "retry": { "suggested_delay_ms": 5000, "max_attempts": 3 }
  }
}

Estrategia de Reintento

  • Las respuestas de timeout incluyen retraso de reintento sugerido y máximo de intentos
  • Los consumidores deben implementar estrategias de reintento con backoff exponencial
  • Para endpoints inalcanzables, se recomienda backoff exponencial (retraso inicial × 2^n)