Capítulo 1: ¿Qué son los Agent Workflows?
Imagínate que tienes una taquería y cada día recibes decenas de pedidos por WhatsApp. Tienes que:
- Leer cada mensaje
- Entender qué quiere el cliente
- Verificar si tienes los ingredientes
- Calcular el precio total
- Estimar el tiempo de preparación
- Responder al cliente
- Actualizar tu inventario
¿Te suena familiar? Es exactamente el tipo de proceso repetitivo que los Agent Workflows pueden automatizar completamente.
Pero no solo eso. Los Agent Workflows pueden manejar procesos mucho más complejos: desde gestionar las calificaciones de una escuela hasta coordinar las ventas en un mercado. Son como tener un empleado digital súper eficiente que nunca se cansa y siempre sigue los procedimientos correctos.
Definición simple
Un Agent Workflow en LlamaIndex TypeScript es una función inteligente que puede:
- Entender instrucciones complejas usando IA
- Tomar decisiones basadas en datos
- Ejecutar tareas paso a paso de forma funcional
- Comunicarse con sistemas externos
- Procesar información en tiempo real con streaming
El enfoque funcional de LlamaIndex
A diferencia de otros frameworks que usan clases complejas, LlamaIndex TypeScript usa programación funcional pura:
1. Agentes como funciones
1import { agent } from "llamaindex"; 2 3const saludoAgent = agent({ 4 tools: [herramientaSaludo], 5 systemPrompt: "Eres un asistente amigable de taquería", 6}); 7
2. Streaming en tiempo real
1const stream = await saludoAgent.runStream({ 2 message: "Hola, soy María González, cliente frecuente", 3}); 4 5for await (const chunk of stream) { 6 console.log(chunk.delta); // Respuesta en tiempo real 7} 8
3. Herramientas como funciones puras
1import { tool } from "llamaindex"; 2 3const verificarCliente = tool( 4 async ({ nombre }: { nombre: string }) => { 5 // Lógica pura sin efectos secundarios 6 return clientesDB.find((c) => c.nombre === nombre); 7 }, 8 { 9 name: "verificar_cliente", 10 description: "Verifica si un cliente existe en la base de datos", 11 } 12); 13
Tu primer workflow: Sistema de saludo inteligente
Empecemos con algo súper simple pero poderoso. Un agente que saluda a los clientes de manera personalizada:
1import { agent, tool } from "llamaindex"; 2 3// Base de datos simulada de clientes 4const clientesDB = [ 5 { nombre: "María González", esVIP: true, compras: 15 }, 6 { nombre: "Carlos López", esVIP: false, compras: 5 }, 7 { nombre: "Ana García", esVIP: false, compras: 0 }, 8]; 9 10// Herramienta para verificar cliente 11const verificarCliente = tool( 12 async ({ nombre }: { nombre: string }) => { 13 const cliente = clientesDB.find((c) => 14 c.nombre.toLowerCase().includes(nombre.toLowerCase()) 15 ); 16 17 if (!cliente) { 18 return { tipo: "nuevo", compras: 0, esVIP: false }; 19 } 20 21 return { 22 tipo: 23 cliente.compras >= 10 24 ? "vip" 25 : cliente.compras > 0 26 ? "frecuente" 27 : "nuevo", 28 compras: cliente.compras, 29 esVIP: cliente.esVIP, 30 }; 31 }, 32 { 33 name: "verificar_cliente", 34 description: "Verifica el tipo de cliente y su historial de compras", 35 } 36); 37 38// Herramienta para obtener hora actual 39const obtenerHora = tool( 40 async () => { 41 const ahora = new Date(); 42 const hora = ahora.toLocaleTimeString("es-MX", { 43 hour: "2-digit", 44 minute: "2-digit", 45 }); 46 47 const horaNum = ahora.getHours(); 48 let saludoTiempo = ""; 49 if (horaNum < 12) saludoTiempo = "Buenos días"; 50 else if (horaNum < 18) saludoTiempo = "Buenas tardes"; 51 else saludoTiempo = "Buenas noches"; 52 53 return { hora, saludoTiempo }; 54 }, 55 { 56 name: "obtener_hora", 57 description: "Obtiene la hora actual y el saludo apropiado", 58 } 59); 60 61// Crear el agente de saludo 62const saludoAgent = agent({ 63 tools: [verificarCliente, obtenerHora], 64 systemPrompt: ` 65 Eres un asistente amigable de la Taquería "El Buen Sabor". 66 67 Tu trabajo es saludar a los clientes de manera personalizada: 68 69 1. Usa la herramienta verificar_cliente para conocer el tipo de cliente 70 2. Usa obtener_hora para saber qué saludo usar según la hora 71 3. Personaliza el mensaje según el tipo de cliente: 72 - NUEVO: Saludo de bienvenida, ofrece conocer especialidades 73 - FRECUENTE: Saludo de agradecimiento, pregunta si quiere "lo de siempre" 74 - VIP: Saludo especial, menciona promociones VIP 75 76 Siempre sé cálido, usa emojis apropiados y habla de manera amigable. 77 Termina preguntando "¿En qué te puedo ayudar?" 78 `, 79}); 80
Cómo usarlo
1async function ejemplosSaludo() { 2 // Cliente nuevo 3 console.log("=== Cliente Nuevo ==="); 4 const stream1 = await saludoAgent.runStream({ 5 message: "Hola, soy Ana García", 6 }); 7 8 for await (const chunk of stream1) { 9 process.stdout.write(chunk.delta); 10 } 11 12 console.log("\n\n=== Cliente Frecuente ==="); 13 const stream2 = await saludoAgent.runStream({ 14 message: "Buenos días, soy Carlos López", 15 }); 16 17 for await (const chunk of stream2) { 18 process.stdout.write(chunk.delta); 19 } 20 21 console.log("\n\n=== Cliente VIP ==="); 22 const stream3 = await saludoAgent.runStream({ 23 message: "Hola, soy María González", 24 }); 25 26 for await (const chunk of stream3) { 27 process.stdout.write(chunk.delta); 28 } 29} 30
Resultado esperado
=== Cliente Nuevo ===
¡Buenos días Ana García! 👋 ¡Bienvenida a la Taquería "El Buen Sabor"!
Es un placer atenderte por primera vez. Somos una taquería familiar con más de 20 años sirviendo los mejores tacos de la colonia.
📋 ¿Te gustaría conocer nuestras especialidades? Tenemos tacos de pastor, carnitas, suadero y nuestras famosas quesadillas de flor de calabaza.
Son las 10:30. ¿En qué te puedo ayudar?
=== Cliente Frecuente ===
¡Buenos días Carlos López! 😊 ¡Qué gusto verte de nuevo!
Gracias por tu preferencia, ya eres parte de la familia de "El Buen Sabor".
¿Lo de siempre? ¿O te gustaría probar nuestra especialidad del día?
Son las 10:30. ¿En qué te puedo ayudar?
=== Cliente VIP ===
¡Buenos días María González! 🌟 ¡Qué honor tenerte aquí de nuevo!
Como cliente VIP de la casa, tienes acceso a nuestras promociones especiales. Hoy tenemos 20% de descuento en combos y bebidas gratis con pedidos mayores a $150.
🎁 Además, como siempre, tu pedido tiene prioridad en la preparación.
Son las 10:30. ¿En qué te puedo ayudar?
¿Qué acabamos de hacer?
- Creamos un agente funcional usando
agent()sin clases - Definimos herramientas puras con
tool()que no tienen efectos secundarios - Usamos streaming en tiempo real con
runStream()para respuestas fluidas - Aplicamos lógica de negocio a través del prompt del sistema
- Generamos respuestas contextuales basadas en datos reales
La arquitectura funcional
Flujo de datos funcional
Mensaje → Agente → Herramientas → IA → Stream de respuesta
Composición de funciones
- Agente: Función principal que orquesta todo
- Herramientas: Funciones puras que procesan datos
- Stream: Función generadora que produce respuestas en tiempo real
Sin estado mutable
- No hay clases ni objetos con estado
- Cada función recibe inputs y produce outputs
- Los datos fluyen de manera inmutable
Beneficios del enfoque funcional
🔧 Simplicidad extrema
No hay clases complejas, decoradores raros, o jerarquías confusas. Solo funciones simples y claras.
🔄 Composición natural
Puedes combinar agentes y herramientas como bloques de LEGO. Todo se compone de manera natural.
🧪 Testing trivial
Las funciones puras son súper fáciles de probar. Mismo input = mismo output, siempre.
📈 Escalabilidad real
Agregar funcionalidad es agregar más herramientas. No hay que modificar clases existentes.
🛡️ Manejo de errores simple
Los errores se propagan naturalmente a través de las funciones sin complejidad adicional.
📊 Streaming nativo
El streaming está integrado desde el diseño. Respuestas en tiempo real sin configuración extra.
🔀 Flexibilidad total
Puedes usar el mismo agente para diferentes canales (WhatsApp, web, API) sin cambios.
⚡ Performance optimizado
Sin overhead de clases u objetos. Solo funciones ejecutándose eficientemente.
Casos de uso reales
🌮 Sector Alimentario
Taquería "El Buen Sabor"
1const taqueriaAgent = agent({ 2 tools: [procesarPedido, verificarInventario, calcularPrecio], 3 systemPrompt: "Eres el asistente de pedidos de una taquería mexicana...", 4}); 5
Restaurante familiar
1const restauranteAgent = agent({ 2 tools: [manejarReservaciones, consultarMenu, aplicarPromociones], 3 systemPrompt: "Ayudas a gestionar reservaciones y pedidos...", 4}); 5
🏪 Comercio Local
Tienda de abarrotes "Doña Carmen"
1const tiendaAgent = agent({ 2 tools: [consultarProductos, calcularEntrega, manejarCredito], 3 systemPrompt: "Eres el asistente de una tienda de abarrotes...", 4}); 5
🎓 Sector Educativo
Escuela Primaria "Benito Juárez"
1const escuelaAgent = agent({ 2 tools: [calcularCalificaciones, generarReportes, enviarAvisos], 3 systemPrompt: "Ayudas a gestionar información académica...", 4}); 5
🏥 Servicios de Salud
Consultorio médico
1const consultorioAgent = agent({ 2 tools: [agendarCitas, enviarRecordatorios, organizarExpedientes], 3 systemPrompt: "Asistes en la gestión de un consultorio médico...", 4}); 5
Conceptos clave para recordar
Agent = Función inteligente
Como un empleado digital que puede razonar y tomar decisiones.
Tool = Función pura
Como una herramienta específica que hace una tarea concreta.
Stream = Respuesta en tiempo real
Como una conversación fluida donde ves las respuestas conforme se generan.
Prompt = Instrucciones claras
Como el manual de trabajo que le das a tu empleado digital.
Lo que viene
En el siguiente capítulo, crearemos tu primer agente realmente complejo: un sistema para procesar pedidos de taquería que incluye:
- Procesamiento de lenguaje natural para entender pedidos
- Validación de inventario en tiempo real
- Cálculo automático de precios y tiempos
- Streaming de confirmaciones
- Integración con WhatsApp (simulada)
¡Prepárate para ver la magia funcional en acción!
Ejercicio práctico: Mejora el agente
Ahora que entiendes el enfoque funcional, intenta expandir nuestro agente de saludo:
Nivel 1: Básico
- Agregar herramienta de día que detecte el día de la semana
- Crear herramienta de promociones para lunes y viernes
- Implementar herramienta de festivos que detecte días especiales
Nivel 2: Intermedio
- Crear herramienta de horarios que verifique si está abierto
- Agregar herramienta de clima (simulada) para promociones especiales
- Implementar sistema de puntos con herramienta de cálculo
Nivel 3: Avanzado
- Integrar base de datos real (SQLite o JSON)
- Crear agentes especializados (pedidos vs consultas)
- Implementar cola de atención para horarios ocupados
Pista para empezar
1const promocionesHoy = tool( 2 async () => { 3 const hoy = new Date().getDay(); // 0 = domingo, 1 = lunes, etc. 4 5 const promociones = { 6 1: "Lunes de tacos: 2x1 en tacos de pastor", 7 5: "Viernes de bebidas: 2x1 en aguas frescas", 8 }; 9 10 return promociones[hoy] || "No hay promociones especiales hoy"; 11 }, 12 { 13 name: "promociones_hoy", 14 description: "Obtiene las promociones activas del día actual", 15 } 16); 17
¿Te sientes listo?
Si lograste crear al menos una herramienta nueva, estás preparado para el siguiente capítulo. Si no, no te preocupes: en el Capítulo 2 construiremos un sistema completo desde cero, paso a paso.
Reflexión final
Los Agent Workflows funcionales no son solo una herramienta técnica; son una forma elegante y simple de pensar sobre la automatización inteligente. Cada proceso en tu negocio puede convertirse en un agente que:
- Libera tu tiempo para tareas más importantes
- Reduce errores humanos con lógica consistente
- Mejora la experiencia de tus clientes con respuestas inteligentes
- Escala tu negocio sin complejidad técnica
En el siguiente capítulo, pondremos estos conceptos en práctica con un ejemplo real y completo que podrás usar inmediatamente en tu propio negocio.
