Metadatos reintentables y resultados parciales
errorCategory, isRetryable, attempted_query y parciales.
Metadatos reintentables y resultados parciales es una lección gratuita de Claude Architect en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Claude Architect, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Claude Architect incluye 4 lecciones en total.
Por qué importa la estructura del error
Cuando falla una herramienta o un servidor MCP, el modelo debe decidir qué hacer a continuación. Un estado genérico como "Operation failed" no le proporciona nada sobre lo que razonar, por lo que la única opción segura es abortar o adivinar.
Un error estructurado convierte un callejón sin salida en una decisión: ¿debemos reintentar, esquivar el fallo o escalarlo a una persona? En esta lección aprenderá los cuatro campos de metadatos que lo hacen posible: errorCategory, isRetryable, attempted_query y partial_results.
La marca isError
Todo error estructurado de MCP comienza con un booleano: isError: true. Esta es la señal inequívoca de que el resultado de la herramienta es un fallo, no un dato.
Sin ella, el modelo podría tratar un mensaje de error como una respuesta legítima y resumir tranquilamente el fallo como si fuera un resultado. La marca es la puerta que activa toda la lógica de recuperación posterior.
tool_result = {
"isError": True,
"errorCategory": "transient",
"isRetryable": True,
"message": "Upstream timeout contacting orders DB",
"attempted_query": "SELECT * FROM orders WHERE id='A-2291'",
"partial_results": []
}errorCategory: cuatro categorías
errorCategory clasifica por qué falló la llamada para que el modelo pueda enrutarla de forma inteligente. Las cuatro categorías estándar son:
- transient — un fallo temporal (tiempo de espera agotado, límite de solicitudes). Probablemente convenga reintentarlo.
- validation — la entrada tenía un formato incorrecto. Corrija la solicitud; no reintente a ciegas.
- business — una regla del dominio lo impidió (por ejemplo, el pedido ya se ha enviado).
- permission — el autor de la llamada no está autorizado. Reintentar no ayudará; escale el caso o vuelva a autenticarse.
La categoría orienta la estrategia; no toma la decisión por sí sola.
isRetryable: la indicación de acción
isRetryable indica explícitamente, con un sí o un no, si reintentar podría llegar a funcionar. Funciona junto con la categoría, pero codifica una señal más precisa.
Un tiempo de espera agotado transient suele tener isRetryable: true. Un error de validation tiene isRetryable: false: reintentar con la misma entrada incorrecta solo volverá a fallar. Y lo que es crucial: esto permite que el subagente recupere localmente los fallos transitorios en lugar de propagar cada contratiempo al coordinador.
if result.get("isError"):
if result["isRetryable"] and attempt < max_attempts:
attempt += 1
continue # recover locally in the subagent
else:
escalate(result) # non-recoverable: pass it up with contextNo confunda un fallo con un resultado vacío
Una distinción sutil, pero fundamental para el examen: un FALLO de acceso no es lo mismo que un resultado VACÍO válido.
isError: true+transient→ la consulta no pudo ejecutarse. Considere reintentarlo.isError: false+ lista vacía → la consulta se ejecutó correctamente y realmente no hay coincidencias. Reintentar no sirve de nada y desperdicia recursos.
Los errores genéricos difuminan esta diferencia. Los metadatos estructurados mantienen claramente separado "no pude consultar" de "consulté y no hay nada".
attempted_query: hacer posible el reintento
attempted_query registra exactamente lo que la herramienta intentó hacer: la instrucción SQL, la llamada a la API o la cadena de búsqueda. Esto cumple dos funciones:
- Permite al modelo reintentar con información de retorno: enviar la intención original junto con el error para poder formar una consulta corregida.
- Aporta proveniencia: conserva una trazabilidad entre cada afirmación y su fuente, con constancia de lo que se solicitó realmente.
Recuerde: reintentar con información de retorno corrige errores de formato o estructurales. Si la información simplemente no está en la fuente, ninguna cantidad de nuevas consultas será útil.
{
"isError": True,
"errorCategory": "validation",
"isRetryable": True,
"message": "Unknown column 'order_no'; did you mean 'order_id'?",
"attempted_query": "SELECT * FROM orders WHERE order_no='A-2291'",
"partial_results": []
}partial_results: no descarte los datos útiles
Cuando una operación de varios pasos o fuentes falla a mitad de camino, el trabajo realizado antes del fallo sigue teniendo valor. partial_results permite conservarlo.
Imagine un subagente de investigación que consultó cinco fuentes y la quinta agotó el tiempo de espera. Devolver los cuatro resultados correctos junto con el error permite al coordinador continuar, en lugar de descartar todo porque falló una parte. Nunca aborte todo el flujo de trabajo por un solo fallo.
{
"isError": True,
"errorCategory": "transient",
"isRetryable": True,
"message": "Source 5 (vendor API) timed out after 4 of 5 sources",
"attempted_query": "fetch pricing from [s1..s5]",
"partial_results": [
{"source": "s1", "price": 19.0},
{"source": "s2", "price": 21.5},
{"source": "s3", "price": 18.9},
{"source": "s4", "price": 20.0}
]
}Recupere localmente y escale con contexto
Los metadatos permiten aplicar una estrategia clara de dos niveles en los sistemas de tipo concentrador y satélites:
- Recupere localmente los fallos transitorios dentro del subagente: reintente discretamente los casos con
isRetryable. - Escale los fallos no recuperables al coordinador, incluyendo todo el contexto estructurado: tipo de fallo, consulta intentada y cualquier resultado parcial.
El coordinador gestiona los errores y el enrutamiento. Pero solo puede enrutar bien si el subagente le entrega una señal estructurada en lugar de una excepción sin información o silencio.
Diseño del esquema de errores
Si define el error como una salida estructurada, aplique cuidadosamente las reglas del esquema. Marque un campo como obligatorio solo si siempre está presente. partial_results suele estar vacío o ausente cuando se produce un fallo grave; no lo marque como obligatorio, o el modelo podría inventar entradas para satisfacer el esquema.
Para errorCategory, use un enum con un valor "other" y un campo de texto libre para los detalles. Así mantiene limpia la clasificación actual y permite ampliarla para modos de fallo que aún no haya encontrado.
error_schema = {
"type": "object",
"properties": {
"isError": {"type": "boolean"},
"errorCategory": {
"enum": ["transient", "validation",
"business", "permission", "other"]
},
"categoryDetail": {"type": "string"},
"isRetryable": {"type": "boolean"},
"attempted_query": {"type": "string"},
"partial_results": {"type": "array"}
},
"required": ["isError", "errorCategory", "isRetryable"]
}Ganchos para los fallos que cuestan dinero
Los metadatos guían probabilísticamente al modelo (~90 %). Cuando un fallo tiene consecuencias financieras, legales o de seguridad, eso no es suficiente.
Use un hook de PostToolUse para interceptar el resultado de la herramienta antes de que el modelo lo vea y aplicar la política de forma determinista (100 %). Por ejemplo: si errorCategory es permission en una herramienta de reembolsos, bloquee cualquier reintento y fuerce el escalamiento; no deje que el prompt determine si se comporta correctamente.
# PostToolUse hook: deterministic guard on structured errors
def post_tool_use(result):
if result.get("isError") and \
result["errorCategory"] == "permission":
return block_and_escalate(
reason=result["message"],
attempted=result["attempted_query"])
return resultAntipatrón: supresión silenciosa
Lo peor que puede hacer con un fallo es ocultarlo. Hay que evitar dos modos de fallo:
- Supresión silenciosa: ocultar el error y devolver un resultado vacío o inventado. Ahora el modelo no puede distinguir entre un "no hay coincidencias" real y una consulta averiada.
- Abortar todo el flujo de trabajo por un solo componente fallido: se descartan todos los resultados parciales.
Los errores estructurados solucionan ambos problemas: hacen visible el fallo y conservan lo que funcionó.
Comprobación rápida: enrutar un fallo parcial
Aplique lo aprendido a un escenario multiagente real.
Repaso: el conjunto de herramientas de recuperación
Los errores estructurados convierten los fallos en decisiones que se pueden enrutar:
- isError — la puerta que activa la lógica de recuperación.
- errorCategory — transient / validation / business / permission (+ "other") establece la estrategia.
- isRetryable — la indicación explícita de reintento; permite recuperar localmente los fallos transitorios.
- attempted_query — permite reintentar con información de retorno y mantener la proveniencia (no ayuda si la información realmente no existe).
- partial_results — conserva los datos útiles; nunca aborte todo el flujo de trabajo por un solo fallo.
Marque como obligatorios solo los campos que siempre estén presentes, proteja los fallos financieros, legales o de seguridad con hooks deterministas y nunca suprima los errores silenciosamente. Eso es gestión de errores al nivel de un arquitecto.
Aprende Python con un tutor de IA — gratis
Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.
- Cursos
- 26
- Lecciones
- 104
Preguntas frecuentes
¿La lección «Metadatos reintentables y resultados parciales» es gratis?
Sí — el texto completo de «Metadatos reintentables y resultados parciales» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Claude Architect, actualiza a CoddyKit PRO. El curso de Claude Architect incluye 4 lecciones en total.
¿Qué aprenderé en «Metadatos reintentables y resultados parciales»?
errorCategory, isRetryable, attempted_query y parciales. Practicas Claude Architect con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Claude Architect?
No se requiere experiencia previa. Claude Architect en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Metadatos reintentables y resultados parciales»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Claude Architect?
Sí. Cada lección de Claude Architect incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- El indicador isError
- Categorías de errores
- Metadatos reintentables y resultados parciales
- Antipatrón: mensajes de error genéricos