Capítulo 7: Agentes — Encapsulando la Inteligencia
En el capítulo anterior construiste un chat con tools. El modelo llama herramientas, el SDK las ejecuta automáticamente, el modelo genera respuesta. Todo funciona.
Pero hay un problema práctico: cada vez que quieres usar esa configuración, tienes que repetir todo:
Si tienes múltiples endpoints que usan el mismo "asistente", estás duplicando código. Si cambias el system prompt, tienes que actualizarlo en varios lugares.
ToolLoopAgent resuelve esto: encapsula modelo, instrucciones y herramientas en un objeto reutilizable.
Código Primero
Define una vez, usa en cualquier parte.
¿Qué es un Agente?
Un agente tiene tres componentes:
- LLM — Procesa entrada y decide qué hacer
- Herramientas — Extienden capacidades más allá del texto
- Loop — Ejecuta herramientas hasta completar la tarea
ToolLoopAgent maneja los tres automáticamente. El loop continúa hasta que:
- El modelo genera texto sin llamar tools (tarea completa)
- Un tool requiere aprobación (
needsApproval) - Se alcanza el límite de pasos (default: 20)
- Un tool no tiene función
execute
Parámetros del Constructor
El cambio de system a instructions
En AI SDK v6, el parámetro se renombró:
| v5 | v6 |
|---|---|
system: '...' | instructions: '...' |
Esto refleja mejor el propósito: son instrucciones para el agente, no configuración del sistema.
Métodos: generate y stream
generate() — Ejecución Completa
El objeto de retorno incluye:
text— Respuesta final del agentesteps— Array con cada paso ejecutadofinishReason— Por qué terminó ('stop', 'tool-calls', etc.)
stream() — Respuesta en Tiempo Real
Para APIs web:
Control de Loop: stopWhen
Por defecto, el agente ejecuta hasta 20 pasos. Personaliza con stopWhen:
Límite de pasos
Parar en tool específico
Múltiples condiciones
Condición personalizada
Control de presupuesto
prepareStep: Modificación Dinámica
prepareStep se ejecuta antes de cada paso. Permite modificar configuración sobre la marcha.
Cambiar modelo según complejidad
Limitar herramientas por fase
Gestión de contexto largo
Inspeccionando los Pasos
Después de generate(), puedes ver exactamente qué hizo el agente:
Output típico:
Tipado con InferAgentUIMessage
Para type-safety completo en el frontend:
Caso Práctico: Agente de Cobranza
Uso:
Resumen
| Concepto | Qué aprendiste |
|---|---|
ToolLoopAgent | Encapsula modelo, instrucciones y tools en objeto reutilizable |
instructions | Prompt de sistema (antes system) |
generate() | Ejecuta y retorna resultado completo |
stream() | Ejecuta con respuesta en tiempo real |
stopWhen | Condiciones de parada (default: 20 pasos) |
stepCountIs(n) | Para después de n pasos |
hasToolCall(name) | Para cuando se llama un tool específico |
prepareStep | Modifica configuración antes de cada paso |
onStepFinish | Callback después de cada paso |
onFinish | Callback al completar |
InferAgentUIMessage | Infiere tipos para frontend |
¿Cuándo usar ToolLoopAgent?
| Usa funciones core (streamText) | Usa ToolLoopAgent |
|---|---|
| Configuración única | Configuración reutilizada |
| Control muy específico | Comportamiento estándar |
| Integración con código existente | Nuevo desarrollo |
El agente es una abstracción de conveniencia. Por debajo usa las mismas funciones core. Si necesitas control total, siempre puedes usar generateText o streamText directamente.
En el próximo capítulo exploraremos Embeddings y RAG: cómo darle a tu agente acceso a documentos y bases de conocimiento para respuestas más precisas y contextuales.
¿Ya compraste el libro?
Si compraste el libro y no encuentras tu email de descarga, ingresa tu email y te enviamos un nuevo enlace.
