Workflows
Un workflow es un mapa visual de lo que tu agente debe hacer paso a paso — quién habla primero, qué preguntar, cuándo ramificar, cuándo transferir la llamada y cuándo pasársela a otro agente. Lo construyes en un lienzo colocando nodos y conectándolos.
Usa un workflow cuando un solo prompt no basta — cuando la llamada tiene etapas claras («primero cualificar, luego recopilar detalles, después reservar o transferir»), cuando necesitas ruteo determinista según las respuestas del llamante (no «la IA suele hacerlo bien») o cuando un agente debería pasar una parte del trabajo a un especialista.
Un prompt es una instrucción larga. El agente la lee una vez y la usa durante toda la llamada. Un workflow son muchas instrucciones pequeñas, una por nodo, con transiciones explícitas entre ellas. El grafo dirige la llamada — el agente de cada nodo solo es dueño de su porción.
Si tu agente ya funciona bien con un solo prompt, no necesitas un workflow. Recurre a los workflows cuando empieces a añadir reglas «si X entonces Y» al prompt y dejen de funcionar de forma fiable.
El editor
El editor de workflows vive en su propia pestaña en la página del agente. Ves un lienzo con un nodo Start y un nodo End por defecto. Añades nodos desde la barra de herramientas, los arrastras al lienzo y los conectas con aristas.
El panel derecho cambia según lo que selecciones:
- Clic en un nodo — abre su panel de ajustes (prompt, campos, variables de extracción, etc.).
- Clic en una arista — abre los ajustes de su trigger (AI decides / Condition / Always).
- El panel Variables (botón de la barra) lista cada variable del workflow con salto en un clic al nodo que la fija o lee.
Ejecuta una Test Call en navegador directamente desde el editor — una luciérnaga luminosa sigue la posición en vivo para que veas exactamente qué nodo está activo en cada momento.
Los workflows tienen tres estados:
- Draft — editable, aún no en vivo. Usa Test Call para probarlo.
- Active — en vivo para llamadas reales. El agente usa este workflow desde la siguiente llamada.
- Template — plantilla reutilizable, nunca enlazada directamente a un agente. Puedes instanciarla sobre varios agentes.
Nodos
Cada nodo es un paso en la conversación. Diferentes tipos de nodo hacen cosas diferentes — algunos hablan, otros escuchan, otros enrutan, otros ejecutan herramientas.
Agent
El nodo Agent es el corazón de una etapa del workflow. Cuando el grafo llega a un nodo Agent, ese agente toma la palabra y dirige la conversación hasta que algo desencadene una transición.
Configuras la personalidad y tarea del nodo Agent directamente en el lienzo (el tab Prompt se abre al hacer clic en el nodo) — este es el prompt para esa porción de la conversación, no para toda la llamada. También puedes adjuntar bases de conocimiento y herramientas por nodo.
Greeting — la línea de apertura. Si este es el nodo de entrada (la primera parada tras Start), esto es lo primero que oye el llamante.
Cuando un grafo gobierna una llamada, el prompt principal del agente (el del tab Model) se sustituye por el prompt del nodo activo. Esto es intencionado — el grafo es dueño de la personalidad y tarea por etapa, no un único prompt fijo compitiendo.
Subagent
Un subagent es un ayudante que corre inline — toma la conversación para una tarea concreta y luego devuelve el resultado a quien lo invocó.
Los subagents van bien cuando una pieza de trabajo es reutilizable o se siente distinta: «verificar la identidad del llamante», «recopilar dirección de envío», «cualificar un lead con el método SPIN». El agente padre llama al subagent, el subagent hace lo suyo y reporta un resultado, el padre retoma donde lo dejó.
Los nodos Subagent tienen los mismos tabs que un nodo Agent (Prompt, Knowledge, Tools, Actions) — el editor crea automáticamente un agente backing oculto para ti. No ves a este agente oculto en tu lista principal y no cuenta contra el límite de agentes de tu plan.
Return variable — el campo donde guardar el resultado del subagent (p. ej. identity_verified, lead_score).
Message (Say)
El nodo Say dice una línea fija, sin turno de IA, sin improvisación. Úsalo para transiciones («Un momento, le transfiero…»), avisos legales obligatorios o confirmaciones predefinidas donde las palabras importan.
Text — qué decir. Soporta tokens {{variable}} para inyectar valores capturados, p. ej. "Gracias {{first_name}}, le he reservado para las {{appointment_time}}."
Un nodo Say consume el turno — el agente no añadirá nada encima.
Gather Input
Un nodo Gather Input hace una pregunta y captura la respuesta del llamante en una variable.
Prompt — la pregunta a hacer. Soporta {{tokens}}.
Variable — el nombre del campo donde guardar la respuesta.
Úsalo siempre que necesites un valor concreto antes de continuar — email, número de cuenta, número de personas, categoría del problema. El siguiente turno del llamante se convierte en el valor; puedes ramificar sobre él con una arista Condition justo después.
Update State
Un nodo Update State escribe uno o varios valores en las variables del workflow sin hablar ni preguntar. Úsalo para pre-establecer valores por defecto, marcar flags de progreso o componer valores desde pasos anteriores.
Variable / Value — un par clave-valor. More variables (optional) — pares clave-valor adicionales.
Tanto las claves como los valores soportan {{tokens}}, así puedes componer nuevos valores desde los existentes.
Condition
El nodo Condition es un nodo solo-de-ruteo — no habla, no pregunta, simplemente envía la llamada por la rama saliente que matchee.
La condición en sí vive en cada arista saliente, no en el nodo — ver aristas Condition abajo.
Usa un nodo Condition cuando quieras un punto claro de «fan-out» en tu grafo: muchas ramas que dependen del valor de una variable. Comparado con poner condiciones en las aristas de nodos Agent, un nodo Condition dedicado hace la lógica de ruteo visualmente obvia.
Tool
El nodo Tool ejecuta una de las herramientas conectadas del agente como paso del grafo — sin que la IA opine sobre llamarla. Úsalo cuando quieras un hecho, no una conversación: «busca este cliente», «comprueba stock», «GET del tiempo actual».
Puedes:
- Elegir una de las herramientas existentes del agente (consulta de calendario, búsqueda en base de conocimiento, acción específica de una integración), o
- Configurar una llamada HTTP inline directamente en el nodo (URL, método, cabeceras, parámetros, body).
La respuesta de la herramienta queda disponible para todos los nodos posteriores. Si la respuesta es un objeto JSON, cada campo de primer nivel se convierte en su propia variable — una respuesta como {"is_known": true, "tier": "gold"} escribe tanto is_known como tier para que ramifiques sobre ellas.
Cada campo de texto en el nodo Tool — URL, valores de cabecera, body — soporta {{tokens}}. Mete una variable en el path de una URL, en una cabecera o en el body sin escribir código.
Si una llamada a herramienta falla (error HTTP, timeout, red), el nodo loguea el fallo y el grafo sigue — sin los datos. Planifica tus condiciones posteriores para manejar el caso «sin valor».
Integration
El nodo Integration es una variante enfocada de Tool, para servicios externos conectados — Google Calendar, Outlook, HubSpot. Eliges el proveedor y la acción específica (p. ej. check_availability, create_event), pones los parámetros, y el nodo llama a la integración deterministicamente.
Si la integración no está conectada en este agente, el nodo pasa sin hacer nada — tu grafo continúa. Comprueba condiciones posteriores para el caso «no se ejecutó».
Phone Transfer
El nodo Phone Transfer transfiere la llamada (warm transfer) a un número telefónico externo. Tras una transferencia exitosa, la llamada ha salido de tu workflow — tu agente ya no está en línea.
Number — destino en formato internacional con + al inicio (p. ej. +15551234567). Soporta {{tokens}} para que el destino pueda venir de un paso anterior (p. ej. la respuesta a «¿con qué oficina le conectamos?»).
Si la transferencia no se completa (número inválido, sin respuesta, conexión telefónica no configurada), el grafo retrocede y el agente actual sigue en línea. La conversación continúa con normalidad — el agente puede disculparse y probar otro camino.
End Call
El nodo End Call cierra — el agente dice el cierre configurado y luego cuelga. Úsalo como terminus limpio para ramas «todo hecho» o para la rama «no podemos ayudar, lo sentimos» desde una Condition difícil.
No requiere configuración más allá de una arista entrante.
Reusar un workflow (Sub-workflow)
El nodo Sub-workflow está reservado para embeber otro workflow como sub-grafo. Este nodo está en el editor pero aún no está totalmente cableado — el grafo pasa por él sin hacer nada. No te apoyes en él para llamadas de producción. Lo activaremos cuando publiquemos los sub-grafos reutilizables.
Aristas (Conexiones)
Conectas un nodo con el siguiente mediante una arista. El trigger de la arista decide cuándo se dispara la transición.
Hay tres triggers:
| Trigger | Quién decide | Cuándo dispara |
|---|---|---|
| AI decides | La IA | Cuando la conversación lo hace el siguiente paso natural. La IA recibe una «herramienta de transición» que puede llamar. |
| Condition | El runtime | Cuando una variable matchea una regla que escribiste. Se evalúa antes de que la IA responda. |
| Always | El runtime | Incondicionalmente — en cuanto el nodo origen termina. Sin input del llamante, sin IA. |
AI decides (basado en intención)
Usa AI decides cuando solo la IA puede decidir cuándo cambiar — «si el llamante pregunta por precios, transfiere al agente de ventas», «si suena a queja, ejecuta el subagent de disculpas».
Escribes una breve descripción de intención en la arista (p. ej. «El llamante pregunta por precios o quiere hacer upgrade»). La IA la ve como una herramienta etiquetada con esa intención y decide si llamarla según la conversación. Si hay varias aristas AI-decides, la IA elige como mucho una por turno.
Condition (ramificación determinista)
Usa Condition cuando quieras que el grafo — no la IA — decida según un hecho conocido: «si lead_score > 7, manda al cierre; si no, terminar educadamente».
Las Conditions se evalúan antes de que la IA responda, así que siempre ganan a la IA en ese turno. La IA no puede sobrescribir una condición que matchea.
Puedes construir una condición con estos operadores:
| Operador | Significado | Ejemplo |
|---|---|---|
| equals | match exacto (case-insensitive para texto) | intent equals "billing" |
| not equals | no matchea | status not equals "active" |
| contains | match de substring (case-insensitive) | feedback contains "broken" |
| greater than | numérico > | lead_score greater than 7 |
| less than | numérico < | wait_minutes less than 5 |
También puedes combinar cláusulas con All (todas deben matchear — AND) o Any (al menos una debe matchear — OR), y anidarlas. Una regla como «el llamante es conocido y su tier es gold o premium» se vuelve:
All:
- is_known equals true
- Any:
- tier equals gold
- tier equals premium
Si referencias una variable que aún no se ha fijado (p. ej. la IA nunca la recopiló), las condiciones sobre ella siempre fallan — no dan error, simplemente no matchean. Así loyalty_tier equals "gold" devuelve falso si loyalty_tier nunca se fijó. Diseña tus ramas para manejar esto — habitualmente con una rama else (ver abajo).
Rama else — cuando ninguna condición matchea
Si tienes varias aristas Condition saliendo de un nodo y ninguna matchea, la llamada cae a la arista no-Condition de menor prioridad (Always o una arista AI-decides). Si no hay fallback en absoluto, la IA recupera el control y puede seguir libremente.
Patrón común: varias Conditions para los caminos conocidos, más una arista Always a un catch-all (decir algo, luego End Call o transferir).
Always (auto-advance)
Usa Always cuando el siguiente paso es incondicional — sin decisión, sin input del llamante. Dos usos naturales:
- Encadenar pasos: SAY → UPDATE_STATE → SAY → TOOL → Condition. Cada paso termina y la arista Always avanza inmediatamente.
- Auto-avanzar tras que el agente termine de hablar: un nodo Agent con una arista Always saliente significa «en cuanto la IA pare de hablar, avanza» — sin necesidad de que el llamante responda. Útil para flujos tipo monólogo como un agente presentador que entrega y pasa a la siguiente sección.
Condition y Always (las deterministas) siempre ganan a AI decides. Si una Condition matchea, las herramientas de transición de la IA se ignoran en ese turno. Eso te permite escribir reglas que la IA no puede saltarse.
Variables
Las variables son la memoria del workflow. La mayoría de cosas en un workflow son o fijar una variable o leer una.
Declarar variables
El panel Variables (botón de la barra) muestra cada variable del workflow con los pasos que la fijan o leen. Clic en una variable para saltar a un setter; es la forma más rápida de encontrar dónde algo va mal.
Puedes declarar una variable con un valor por defecto en el panel — útil para flags como escalated=false que necesitan existir desde el inicio para que tus condiciones no fallen silenciosamente por «falta».
Cómo se fijan las variables
| Fuente | Ejemplo |
|---|---|
| Valores por defecto (declarados en el panel Variables) | escalated = false fijado antes de empezar la llamada |
| Gather Input | La respuesta hablada del llamante se captura en la variable del nodo |
| Update State | Escribes un valor (literal o compuesto con {{tokens}}) directamente |
| Resultado de Tool / Integration | La respuesta entera se guarda bajo el nombre del nodo; si la respuesta es un objeto JSON, cada campo de primer nivel también se vuelve su propia variable |
| Return de Subagent | Lo que el subagent finaliza se guarda en la variable de retorno del nodo subagent |
Leer variables — {{tokens}}
Donde puedas escribir texto en un nodo — prompt de Agent, texto de Say, prompt de Gather, URL/body/cabeceras de Tool, número de Phone Transfer, valor de Update State, valores de condición — puedes meter {{variable}} y se sustituirá en runtime.
Los paths con punto también funcionan para datos anidados — p. ej. si una respuesta de Tool fue {"customer": {"name": "Anna", "tier": "gold"}}, puedes leer {{customer.name}} o {{customer.tier}}.
Si un token referencia una variable que no existe, el texto literal {{name}} se deja tal cual (no se blanquea). Es intencionado — hace que templates rotos sean fáciles de detectar en una test call, en lugar de tragárselos en silencio.
Patrones comunes
Cualificar → Ramificar → Rutear
Start
└─ Agent (greeting + qualify)
└─ Gather Input (intent)
└─ Condition: intent == "sales" → Agent (sales)
└─ Condition: intent == "support" → Subagent (triage)
└─ Always (catch-all) → Say "Let me connect you" → Phone Transfer
Buscar → Personalizar
Start
└─ Tool (CRM lookup, writes is_known, name, tier)
└─ Condition: is_known == true → Agent (warm greeting with {{name}})
└─ Always (else) → Agent (cold greeting)
Ayudante reutilizable (side-trip Subagent)
Agent (main conversation)
└─ AI decides: "Caller mentions an address" → Subagent (address collector)
└─ on finish: result = full_address
└─ Agent continues with {{full_address}}
Qué está bloqueado durante una llamada con workflow
Algunos valores por defecto cambian cuando un grafo gobierna la llamada:
- El idioma está bloqueado al que use el primer agente del workflow. La IA no puede cambiar de idioma a mitad de llamada. Esto previene que el modelo derive al idioma equivocado en un turno ruidoso.
- El prompt principal del agente se sustituye por el prompt del nodo activo. Es la regla «el grafo es dueño de la persona» — ver warning bajo Agent.
- El primer mensaje viene del greeting del nodo de entrada, no del campo «Begin Message» del agente.
Seguridad anti-loop — Step Budget
Cada workflow tiene un número máximo de transiciones por llamada (por defecto 25). Cada vez que el grafo cambia a un nuevo nodo, el contador baja en uno. Cuando llega a cero, el workflow deja de saltar entre nodos para prevenir loops descontrolados.
Puedes elegir un nodo de fallback para este caso (típicamente un Phone Transfer o End Call) — la llamada se desvía ahí en cuanto se agota el presupuesto. Si no, la IA recupera el control y el grafo efectivamente se congela el resto de la llamada.
Rara vez necesitas pensar en esto — es una red de seguridad para grafos que accidentalmente loopean. Si lo alcanzas en uso normal, probablemente tienes un ciclo en alguna parte.
Pruebas
El botón Test Call del editor abre una llamada en navegador con el draft actual del workflow. Mientras corre, una luciérnaga brillante se mueve entre los nodos del lienzo para que veas exactamente dónde está la llamada. El editor se bloquea durante una test call para evitar que los cambios desincronicen el estado en vivo.
Usa Test Call para verificar:
- Tus condiciones matchean los valores que esperas (mira si la luciérnaga salta una rama que creías que dispararía).
- Tus tokens se sustituyen bien (escucha por
{{name}}colgado si un valor no se había fijado). - Los fallos de tool degradan elegantemente (tu ruta fallback dispara de verdad).
Fallos a conocer
| Situación | Qué pasa |
|---|---|
| Llamada a Tool / Integration falla | El grafo sigue sin los datos. Tus condiciones posteriores deberían manejar la variable ausente. |
| Phone Transfer falla (número inválido, sin respuesta, conexión telefónica ausente) | El grafo retrocede, el agente actual se queda en línea, y la conversación continúa con normalidad. |
| Subagent no arranca | La desviación se cancela, el agente padre se queda en línea, y se habla una breve línea de fallo. |
{{missing_variable}} en texto | Se deja literal en la salida — fácil de detectar en test calls. |
| Nodo Sub-workflow | Actualmente pasa de largo sin hacer nada. No te apoyes en él aún. |
| Step budget agotado | Desvía al nodo de fallback si hay uno fijado, si no la IA recupera el control. |
Cuándo NO usar un Workflow
Los workflows son potentes pero no son la respuesta correcta para cada agente. Quédate con un solo prompt cuando:
- La conversación es abierta («responder a preguntas del llamante sobre nuestros productos»).
- No tienes lógica de ramificación clara — la mayoría de decisiones son juicios que la IA maneja bien.
- Solo escribirías un nodo Agent y un End Call — eso es solo un prompt con pasos extra.
Recurre a un workflow cuando:
- Puedes esquematizar la llamada como un diagrama de flujo con tres o más etapas distintas.
- Necesitas al menos una ramificación determinista sobre una variable (una Condition).
- Quieres reutilizar un trozo de conversación entre varios agentes (un subagent).
- Ya estás apilando reglas «si el llamante dice X entonces hace Y» en un prompt y no son fiables.