Guías

Errores

Un error de herramienta es un resultado con isError: true y el problema en el primer bloque de texto. Ramifica por su code.

El servidor informa de una llamada fallida como un resultado, no como un error JSON-RPC. El resultado lleva isError: true y el problema RFC 9457 de la API REST como JSON en content[0].text. No lleva structuredContent: la especificación exige que structuredContent coincida con el outputSchema de la herramienta, y un error no lo cumple.

Un resultado 429
{
  "isError": true,
  "content": [
    {
      "type": "text",
      "text": "{\"type\":\"https://docs.filmo.io/errors/rate_limited\",\"title\":\"Rate limit exceeded\",\"status\":429,\"code\":\"rate_limited\",\"detail\":\"Rate limit exceeded: retry in 17 seconds\",\"requestId\":\"req_…\",\"retryAfter\":17,\"meta\":{\"rateLimit\":{\"limit\":120,\"remaining\":0,\"reset\":17}}}"
    }
  ]
}

El problema incluye type, title, status, code, detail, requestId y, cuando corresponden, errors[], requiredScope, requiredAddon y retryAfter. Una llamada con clave de idempotencia también devuelve meta.idempotencyKey dentro del problema. Cita requestId cuando pidas ayuda. Es el mismo documento de problema que devuelve la API REST: consulta Errores.

Una petición mal formada, un método desconocido o una herramienta desconocida es un error JSON-RPC con un código como -32600, -32601, -32602 o -32700, y su mensaje está en inglés. Una llamada sin credencial no es JSON-RPC: es un HTTP 401 con un cuerpo de problema. Consulta la referencia del protocolo.

Client.callTool del SDK de TypeScript y call_tool del SDK de Python devuelven el resultado; ninguno lanza una excepción por un error de herramienta. Comprueba isError y analiza el primer bloque de texto. Solo los fallos de protocolo, como una herramienta desconocida o un timeout, lanzan excepción.

const result = await client.callTool({ name, arguments: args });
if (result.isError) {
  const text = (result.content as { type: string; text?: string }[]).find((c) => c.type === "text")?.text ?? "{}";
  const problem = JSON.parse(text); // { code, status, detail, requestId, retryAfter?, requiredScope? }
  if (problem.code === "rate_limited") await sleep(problem.retryAfter * 1000);
}

En los paquetes 2.x el campo es is_error en Python y el transporte se construye de otra forma; el contrato del servidor es el mismo. Consulta Construir tu propio cliente.

CódigoEstadoQué hacer
unauthorized401Envía una credencial. Los códigos api_key_* indican por qué una clave no es válida: revocada, caducada o su propietario ya no es administrador.
insufficient_scope403A la clave o a la conexión le falta requiredScope. Mira más abajo.
validation_error400Corrige los campos indicados en errors[] y vuelve a llamar.
not_found404El registro no existe en esta cuenta.
conflict409Lee errors[0].code para saber la causa; vuelve a leer el registro antes de reintentar.
precondition_failed412El registro cambió desde que lo leíste. Vuelve a leerlo.
idempotency_key_reused422Esa clave se usó con argumentos distintos. Usa una clave nueva.
rate_limited429Espera retryAfter segundos.
addon_required402La cuenta necesita el add-on indicado en requiredAddon.
service_unavailable503La función está desactivada para la cuenta; reintentar no sirve de nada.

Una herramienta que necesita un permiso (scope) que la conexión no tiene devuelve insufficient_scope con requiredScope. El servidor no responde con un 403 que pida al cliente ampliar sus permisos, así que ningún cliente añade el permiso por sí solo. Para añadir uno, elimina el conector y vuelve a añadirlo, y marca el permiso en la pantalla de consentimiento. Con una clave, crea otra clave con el permiso.

Se aplica la tabla de decisión de la API REST. Un resultado te indica que es una repetición con meta.idempotentReplay: true.

EstadoIdempotency-KeyIdempotent-Replay: trueQué hacer
409 conflict · in_progressSíNoerrors[0].code es in_progress: otra petición con la misma Idempotency-Key sigue en curso. Espera y reintenta con la misma clave (espera exponencial, hasta 3 veces): recibirás su respuesta guardada cuando termine.
409 conflict · lock_timeout—Noerrors[0].code es lock_timeout: otra escritura condicional retuvo el recurso más de 5 s. Reintenta con la misma clave y espera exponencial, hasta 3 veces; si persiste, vuelve a leer el recurso.
409 conflict · invalid_state——errors[0].code es invalid_state: el estado del recurso impide la operación (una violación de unicidad, una línea de un lote atómico). No reintentes: esperar no lo arregla nunca. Vuelve a leer el recurso y decide según su estado actual.
409 contact_in_use · address_in_use · insufficient_stock——No reintentes. errors[] dice qué bloquea la operación: corrígelo primero.
412 precondition_failed——Vuelve a leer el recurso, rehaz tu cambio sobre él y envía el ETag nuevo.
422 idempotency_key_reusedSí—Es un fallo del cliente: la clave se usó con otro cuerpo. Usa una clave nueva solo si de verdad es otra operación.
429 rate_limited——Espera los segundos de Retry-After y reintenta con la misma clave.
500 internal_errorSíSíPara. El fallo ocurrió después del commit y se guarda y se repite durante 24 h con esa clave: lee el recurso para ver dónde quedó.
500 internal_errorSíNoReintenta con espera exponencial y la misma clave.
500 internal_errorNo—Lee antes de reintentar una escritura: sin clave nada te protege de un duplicado.
503 service_unavailable——No reintentes: la función está desactivada en la cuenta.
207 (returnOrderLineItems con atomic: false)Sí—Las líneas que fallaron no se devolvieron y el resto sí. Reenvía solo las fallidas con una clave nueva; repetir la clave devolvería el mismo 207.
413 · 502 · 504 (no es application/problem+json)Sí—Respuesta de la plataforma, no de la API: decide por el estado y reintenta con la misma clave. Un 413 no se arregla reintentando (el cuerpo es demasiado grande).
Cualquier 4xx de validación——Corrige la petición y reenvíala; nunca en bucle.
401 · 402 · 403 (clave, propietario o plan)——No reintentes: reenviar la misma petición vuelve a fallar. Actúa sobre la clave, su propietario o el plan: usa una clave válida con el permiso adecuado, pide a un administrador el permiso que falta o contrata el add-on.

Cada código de error tiene su propia página en la pestaña de la API REST, con cuándo ocurre y qué hacer.

  • Guías

    Escrituras seguras

    Un asistente que puede escribir también puede escribir lo equivocado. Decide qué herramientas necesitan a una persona, reintenta sin duplicar y sabe qué pone en marcha una escritura.

  • Referencia

    Referencia del protocolo

    Lo que necesita un cliente para hablar con el servidor sin uno hecho.

¿Te ha resultado útil esta página?