Inicio

¿Qué son los Agent Workflows?

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:

  1. Leer cada mensaje
  2. Entender qué quiere el cliente
  3. Verificar si tienes los ingredientes
  4. Calcular el precio total
  5. Estimar el tiempo de preparación
  6. Responder al cliente
  7. 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?

  1. Creamos un agente funcional usando agent() sin clases
  2. Definimos herramientas puras con tool() que no tienen efectos secundarios
  3. Usamos streaming en tiempo real con runStream() para respuestas fluidas
  4. Aplicamos lógica de negocio a través del prompt del sistema
  5. 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

  1. Agregar herramienta de día que detecte el día de la semana
  2. Crear herramienta de promociones para lunes y viernes
  3. Implementar herramienta de festivos que detecte días especiales

Nivel 2: Intermedio

  1. Crear herramienta de horarios que verifique si está abierto
  2. Agregar herramienta de clima (simulada) para promociones especiales
  3. Implementar sistema de puntos con herramienta de cálculo

Nivel 3: Avanzado

  1. Integrar base de datos real (SQLite o JSON)
  2. Crear agentes especializados (pedidos vs consultas)
  3. 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.