DEV M2 · Production-Grade Prompting, Agents & Tool Use — Resumen de estudio

Curso 2 de 5 · 29 pantallas, 10 secciones, 9 checkpoints, ~209 min

"Escribir código que usa Claude es distinto de usar Claude para escribir código." Cada tema corresponde a un fallo que no aparece en desarrollo y cuesta caro en producción.


1. Prompting craft: diagnostica antes de re-promptear

El tipo de fallo indica qué técnica falta:

ObservasFaltaPor qué funciona
Forma incorrecta (frase en vez de etiqueta, prosa en vez de JSON)Output constraintControla la forma independientemente del contenido
El contenido deriva, cambia el tono o el alcance crece con los turnosSystem prompt (más específico)Contrato de comportamiento que se mantiene en cada turno
Entiende la tarea pero inventa la estructuraFew-shot examplesMuestra el patrón en vez de describirlo
Funciona en lo probado y falla en una varianteConstraint (o ejemplo) que cubra esa varianteCierra el hueco que tus pruebas no expusieron

Las 4 técnicas:

Regla: nombra el fallo → añade una técnica → vuelve a correr. Si el prompt crece en cada pasada, te estás saltando el diagnóstico. Tras 3 re-prompts fallidos, para y diagnostica.

⚠️ Watch out (6 pasadas): cada versión fue más larga y ninguna añadió el output constraint. En la pasada 5 el prompt verboso producía >2,000 caracteres por llamada (el modelo calibra la longitud de su respuesta según el input) y subió la latencia sin ganar precisión. El arreglo fue un JSON schema + 2 ejemplos → {"category": "billing"} siempre.

Structured outputs (control desde la API, no desde el prompt)

Costos y límites:

Checkpoint 1 (prompt de extracción): el defecto era la falta de output constraint. Fix: devolver solo un JSON con category (billing|technical|escalation), urgency (low|medium|high|critical) y summary (una oración), sin otro texto.


2. Extended thinking

TareaDecisión
Razonamiento de varios pasos (matemáticas, lógica multi-hop, planear acciones dependientes)Activarlo, con el effort acorde
Clasificación, conversión de formato, extracción, respuestas cortasApagado
Loops agentic que planean varias tool callsActivarlo y presupuestar el paso de planeación

Regla de carry-back: en loops con tools, cada thinking block (y cada redacted thinking block) se devuelve a la API sin cambios. Lleva una firma: si lo editas, resumes o quitas, la API rechaza el request. ¿Te preocupa el contexto acumulado? Usa context engineering, no edites bloques.

Checkpoint 2:


3. Tool use y diseño de schemas

El loop (Claude NO ejecuta las tools):

  1. Defines el schema.
  2. Envías el mensaje con las tools.
  3. Claude responde con un bloque tool_use (nombre, id, input) y stop_reason: tool_use.
  4. Tu código ejecuta la tool. El modelo no tiene estado: haces un request nuevo con el historial + el resultado.
  5. Devuelves un tool_result con el mismo id.
  6. Claude continúa (otra tool o end_turn).

Bloques:

Anatomía del schema:

DecisiónCómo
Dependencia entre subtareasSi una depende de otra → turnos separados. Si son independientes → Claude emite varios tool_use en un turno (los modelos actuales paralelizan por defecto). disable_parallel_tool_use fuerza una por turno
Campos requiredSolo si la llamada no tiene sentido sin ellos (si marcas todo como required, Claude inventa valores)
Campos opcionalesCon defaults; la ausencia también comunica algo
Longitud de la descripción3–4 oraciones: qué hace, cuándo usarla, qué devuelve, ejemplos si el formato importa
Parámetros que se solapanLenguaje que distinga el dominio o el trigger. Si nada logra separarlas → fusiónalas en una tool con un parámetro type

MCP como alternativa a escribir schemas

⚠️ Watch out: search_docs ("find information about the product") y get_context_summary ("retrieve relevant information from the session") son lo mismo para Claude. Fix: una oración de "cuándo NO" en ambas.

Checkpoint 3: B. El tool_result usa toolu_02 y el tool_use era toolu_01; hay que corregir el id. El fallo está después de elegir bien la tool, así que no es la descripción ni el required.


4. Streaming

EventoQué hace tu handler
message_startPrepara un array de contenido vacío
content_block_startAbre un slot en ese índice (tipo text, tool_use o thinking; el tool_use trae nombre e id, todavía sin input)
content_block_deltaAñade el fragmento. El input de la tool llega como JSON parcial: no lo parsees todavía
content_block_stopCierra el bloque. Primer momento en que el JSON del tool_use es parseable
message_deltaRegistra stop_reason y el uso final
message_stopMensaje completo; trátalo como una respuesta no-stream

Reglas:

⚠️ Watch out: "el read loop terminó" no equivale a "el mensaje está completo". Un corte de red guardó un tool_use con JSON truncado y el error apareció en el reintento. Si ves un error de tool use en un retry, revisa si el turno anterior vino de un stream.

Checkpoint 4 (fix): if stop_seen: messages.append(...); si no, raise StreamInterruptedError (descartar y reintentar).


5. Context engineering

EstrategiaQué haceCuándoQué pierdes
Pruning (rewind)Vuelve a un mensaje anterior y descarta lo posteriorTras un camino improductivo o mucho debuggingLo aprendido en ese tramo
Compaction (/compact; server-side en la API, en beta; o un resumen manual)Resume el historialCerca del techo, misma tareaDetalles que el resumen omita
Clearing (/clear; sesión nueva)Contexto vacíoTarea totalmente distintaTodo (lo persistente va en CLAUDE.md)
Subagent handoffContexto aislado y solo devuelve un resumenSubtarea autocontenida, exploraciónLos pasos intermedios

⚠️ Watch out: presupuesto de 40k tokens fijado por el equipo. Los tool outputs pasaron de ~800 a ~3,200 tokens y el tope llegó en el turno 8: elegía tools equivocadas. Un desbordamiento de contexto parece un fallo de selección de tools. Mide con los inputs más grandes antes de lanzar; poda y compacta de forma proactiva.

Checkpoint 5: B. Podar los resultados de fetch_policy_document y compactar antes del turno 5 (los turnos 1–4 correctos descartan un problema de schema; max_tokens controla la salida, no la lectura).


6. Construcción de agentes

3 caminos para cablearlo (el patrón es el mismo):

CaminoQuién corre el loopOjo con
Raw Messages API loopTu código, todoMantienes contexto, paralelismo, retries y salida
Agent SDKEl SDK, en tu proceso (tú ejecutas las tools)Define settingSources explícitamente (p. ej. ["user","project","local"] como el CLI, o [] aislado); de eso depende que carguen CLAUDE.md y Skills
Claude Managed Agents (beta pública, header managed-agents-2026-04-01)Anthropic (loop + sandbox); tú envías eventos y recibes SSESesiones con estado guardadas en el servidor → no elegibles para ZDR ni para BAA de HIPAA

4 pasos del loop:

  1. Registrar tools.
  2. System prompt acotado a la tarea.
  3. Manejar el loop de tool use (todos los tool_use de un turno se resuelven juntos).
  4. Exit conditions explícitas, que no dependan de que Claude decida parar.

Checklist: tools registradas · prompt acotado · loop implementado · punto de HITL definido · salida definida.

HITL:

Over-tooling (lo más común; la selección empeora al crecer el set de tools) vs under-tooling. Empieza con el mínimo.

Restricciones reguladas (definen endpoint, credenciales y logs antes del diseño):

⚠️ Watch out: un agente de configs bajó un rate limit "válido" según validate_config y la app del cliente se cayó. Faltaba el estado "cambio propuesto" antes de "write confirmado". Pregunta en el diseño: ¿qué es lo peor si write_file corre sin un humano?

Checkpoint 6 (respuesta modelo):


7. Memoria del agente

AlcanceQué persisteCostoCuándoQué pierdes
In-contextSolo dentro de la sesiónLos tokens crecen con cada turnoSesiones cortasTodo al terminar
External storageBase de datos, se lee al iniciarLatencia + lógica de lectura y escrituraContinuidad entre sesiones, usuarios o instanciasNada (pagas latencia y complejidad)
SummarizedResumen inyectado al inicioMenos tokensAgentes conversacionales largosLo que el resumen no guardó
StatelessNadaCeroJobs independientesTodo el contexto previo

⚠️ Watch out: en la sesión 4 el historial in-context superaba 40k tokens antes de la primera tool call. Desarrollo = una sesión larga; producción = muchas cortas acumuladas.

Checkpoint 7: soporte por 2 semanas = external storage · formateador independiente = stateless · asistente de código de horas sin continuidad = in-context.


8. Tarea acumulativa de debug (4 bugs, 4 capas)

  1. Schema: descripción "Gets data." → Claude no la distingue. Fix: intención + exclusión ("…por customer ID. No usar para historial de pedidos").
  2. Streaming: commit antes de message_stop y se quita el thinking block → turno parcial y firma rota. Fix: conservar todos los bloques, if stop_seen → append; si no, raise.
  3. Contexto: solo se añade el tool_result, sin el turno del asistente con el tool_use. Fix: se resuelve al arreglar el 2 (el turno completo se añade antes).
  4. Memoria: se concatenan todas las transcripciones previas en contexto. Fix: external storage + inyectar solo un resumen al inicio.

9. Multimodal y batch

EnvíoCuándo
Inline base64Imagen de un solo uso
URLYa hospedada, pública y estable (nada con auth ni URLs firmadas que expiran)
Files API (beta; no disponible en Bedrock ni Vertex)Se reutiliza entre requests o turnos, o es grande. Subes una vez y usas el file_id

⚠️ Watch out: "dividí la lista en chunks y hago un loop" no es batching: son las mismas llamadas síncronas y los mismos rate limits.

Checkpoint 8: diagrama en cada request = Files API · captura de un solo uso = inline base64 · 5,000 respuestas = Batches API.


Para recordar (8 takeaways)

  1. El tipo de fallo indica la técnica que falta. Si el prompt no alcanza, usa structured outputs.
  2. Razonamiento solo donde cambia la respuesta; los thinking blocks vuelven sin cambios.
  3. Que un stream termine no significa que el mensaje esté completo.
  4. Una tool equivocada casi siempre se debe a la descripción (añade la cláusula de exclusión). Con MCP, controla el costo de contexto.
  5. El contexto es un presupuesto fijo; los outputs de tools lo gastan más rápido que nada.
  6. Workflow vs agent decide el costo; el HITL va en el diseño.
  7. La memoria depende de la forma de la sesión. Los Skills llevan instrucciones bajo demanda.
  8. Calcula el costo multimodal antes; un loop síncrono no es batch.