Validacion y retry con error feedback especifico; distinguir recuperable de no recuperable; max 2-3 intentos y luego escalar.
Cuando una extracción tipada falla la validación (Pydantic / JSON Schema), no se reintenta a ciegas: se hace retry-with-error-feedback. La nueva llamada incluye el documento original, la extracción que falló y el error específico que produjo la validación, con la instrucción de corregir solo lo que el error señala. Se permiten máximo 2-3 intentos. La distinción clave es entre errores recuperables (formato, tipo, campo mal estructurado) y no recuperables (el dato simplemente no existe en la fuente).
extract → validate → (si error) extract+feedback → validate.needs_human_review con la cadena de errores acumulados.max_retries: es ajustar el schema/prompt o normalizar en post-process.def is_recoverable(error_str):
# recuperable = formato/tipo (reintentar con feedback);
# no recuperable = dato ausente en la fuente (escalar, NO inventar)
return any(k in error_str.lower() for k in ["format", "type", "invalid", "malformed"])
def extract_with_retry(client, doc, schema, max_retries=2):
errors = [] # cadena de errores, no solo el último
extraction = None
for attempt in range(max_retries + 1):
feedback = (
f"Intento previo falló: {errors[-1]}\n"
f"Output previo: {extraction}\n"
"Corrige SOLO lo que el error señala."
) if errors else ""
resp = client.messages.create(
tools=[schema],
tool_choice={"type": "tool", "name": schema["name"]},
messages=[{"role": "user", "content": doc + feedback}],
)
extraction = resp.tool_use.input
try:
validate(extraction, schema)
return {**extraction, "attempts": attempt + 1}
except ValidationError as e:
errors.append(str(e))
if not is_recoverable(str(e)): # no recuperable → escalar de inmediato
return {**(extraction or {}), "needs_human_review": True,
"error_chain": errors, "classification": "non-recoverable"}
return {**(extraction or {}), "needs_human_review": True, "error_chain": errors}for _ in range(5):
ext = extract(doc)
try:
validate(ext)
return ext
except Exception:
continue # mismo prompt, sin feedback: ruido puro
# ...y aceptar una salida fallida en silencio downstreamMismo prompt cinco veces sin feedback específico, más aceptar la salida fallida sin marcarla.
max_retries se agota (needs_human_review).katas-provenance-preservationkatas-confidence-stratified-samplingkatas-false-positive-criteriakatas-multipass-prompt-chainingCapas del packet, cargables bajo demanda (disciplina ICM: una capa por vez, nunca todas juntas): knowledge/ cuerpo de conocimiento · prompts/ prompts listos · examples/ salida de ejemplo · agents/ subagentes del packet · templates/ plantilla de output.
e8f986b
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.