Saltar al contenido principal

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.

Prompt vs Workflow

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.

Deshacer / Rehacer (v2.8) — el editor mantiene un historial de hasta 20 pasos, así puedes retroceder un movimiento erróneo (o rehacerlo) sin reconstruir. Eliminar un nodo pide confirmación primero (v2.8), para que no pierdas un paso por un clic accidental.

Construir como workflow (v3.0)

No tienes que empezar desde un lienzo en blanco. El punto de entrada "build as workflow" aprovisiona un workflow para el agente y te lleva directamente al constructor — una sola acción crea el workflow y abre el editor, listo para añadir nodos.

Guardar y estados

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.

El grafo conduce la persona

Cuando un grafo gobierna una llamada, el prompt del nodo activo se superpone al prompt base del agente (el del tab Model). El grafo es dueño de la personalidad y la tarea de cada etapa, mientras que las instrucciones base del agente se mantienen como cimiento.

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).

Quién habla primero

Por defecto, un subagent abre su turno hablando — saluda o hace su primera pregunta en cuanto toma el control. Dos interruptores cambian eso:

  • Wait for the caller (don't speak first) — el subagent permanece en silencio al entrar y solo responde una vez que el llamante dice algo. Activa esto cuando el subagent es la primera parada de la llamada y quieres que el llamante empiece (un «¿Hola?» de verdad) en lugar de que abra el agente — o a mitad de llamada, cuando el paso anterior ya lo dijo todo y el subagent solo debe escuchar la respuesta.
  • Silent step (don't speak) — el subagent nunca habla. Lee la conversación hasta el momento, decide un resultado y devuelve el control directamente. Úsalo como un enrutador invisible: «lee lo que pidió el llamante y decide a qué departamento corresponde» — sin pronunciar palabra, solo una decisión sobre la que ramifica el grafo.

Allowed result values

Normalmente un subagent termina con el valor que haya juzgado apropiado. Si vas a ramificar sobre ese resultado con aristas Condition, fíjalo en su lugar a una lista cerrada de valores permitidos:

  • Lista cada valor permitido bajo Allowed result values (p. ej. sales, support, billing).
  • El subagent debe terminar con exactamente uno de ellos — no puede inventarse uno nuevo.
  • Empareja cada valor con una arista Condition (result is "sales" → …) para un ruteo limpio y predecible.

Esta es la forma fiable de hacer que un subagent decida y enrute: el resultado tiene garantizado coincidir con una de tus ramas.

Salir de un subagent por ruteo

Un subagent devuelve un único resultado cuando termina. Cablea lo que pasa a continuación con aristas Condition o Always sobre ese resultado — la salida de un subagent no usa aristas «AI decides». Por eso Allowed result values + aristas Condition es el patrón recomendado para un subagent de ruteo.

Message

El nodo Message 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 Message 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. Max silence (v2.8) — un tope por pregunta de cuánto esperar a que el llamante responda antes de avanzar. Fíjalo por cada nodo Gather input, así una pregunta rápida de sí/no puede expirar antes que una que pide al llamante leer un número de cuenta largo.

Ú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.

Tokens en Tool

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».

Knowledge (RAG)

El nodo Knowledge (RAG) es una variante del nodo Tool enfocada en la recuperación desde una base de conocimiento. Eliges una de las bases de conocimiento del agente, escribes una consulta de búsqueda (con {{tokens}} si quieres) y el nodo ejecuta la búsqueda como un paso del grafo.

Úsalo cuando quieras que el workflow consulte algo antes de que hable un nodo Agent — p. ej. recuperar el pedido más reciente del cliente para que el siguiente nodo Agent pueda mencionarlo sin tener que preguntar. El contenido recuperado queda en una variable que puedes inyectar en prompts y mensajes.

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:

TriggerQuién decideCuándo dispara
AI decidesLa IACuando la conversación lo hace el siguiente paso natural. La IA recibe una «herramienta de transición» que puede llamar.
ConditionEl runtimeCuando una variable matchea una regla que escribiste. Se evalúa antes de que la IA responda.
AlwaysEl runtimeIncondicionalmente — 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 is more than 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:

OperadorSignificadoEjemplo
ismatch exacto (case-insensitive para texto)intent is "billing"
is notno matcheastatus is not "active"
containsmatch de substring (case-insensitive)feedback contains "broken"
is more thannumérico >lead_score is more than 7
is less thannumérico <wait_minutes is 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 is true
- Any:
- tier is gold
- tier is premium
Las variables ausentes nunca matchean

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 is "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: Message → Update state → Message → 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.
Prioridad entre triggers

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.

Orden de ramas

Cuando salen varias aristas del mismo nodo, el editor te permite fijar una prioridad arrastrando las filas hacia arriba o hacia abajo. Las ramas de menor prioridad se comprueban primero. Esto solo importa cuando dos ramas podrían dispararse en el mismo turno — típicamente dos aristas Condition con reglas que se solapan. Gana la primera rama que matchee.

Contexto a llevar — cuánto recuerda el siguiente agente

Cada arista tiene un ajuste Carry context que controla cuánto del transcript de la conversación ve el siguiente nodo:

  • Transcript completo (por defecto) — el siguiente agente ve todo lo dicho hasta ahora.
  • Solo resumen — la plataforma resume la conversación previa y le pasa un resumen corto al siguiente agente.
  • Nada — el siguiente agente arranca de cero, sin transcript previo.

Usa Solo resumen cuando hagas handoff a un agente especialista que no necesita cada palabra — ahorra tokens y mantiene al nuevo agente enfocado. Usa Nada para ramas donde la persona del nuevo agente debe sentirse separada (p. ej. una encuesta de satisfacción al final de la llamada).


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».

Variables de llamada integradas

Algunas variables se rellenan por ti al inicio mismo de cada llamada — no las declaras ni las fijas, simplemente están ahí para leerlas:

VariableQué contiene
{{call_from}}El número de teléfono del llamante
{{call_to}}El número marcado (tu número)
{{call_direction}}inbound u outbound

Como existen desde el primer momento, puedes ramificar sobre ellas en el primer nodo — por ejemplo, una Condition sobre call_from para saludar por su nombre a un VIP conocido, enrutar por código de país o enviar números desconocidos por una ruta de verificación antes de que pase cualquier otra cosa.

Cómo se fijan las variables

FuenteEjemplo
Valores por defecto (declarados en el panel Variables)escalated = false fijado antes de empezar la llamada
Gather inputLa respuesta hablada del llamante se captura en la variable del nodo
Update stateEscribes un valor (literal o compuesto con {{tokens}}) directamente
Resultado de Tool / IntegrationLa 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 SubagentLo 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 Message, 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}}.

Los tokens desconocidos permanecen visibles

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) → Message "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ónQué pasa
Llamada a Tool / Integration fallaEl 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 arrancaLa desviación se cancela, el agente padre se queda en línea, y se habla una breve línea de fallo.
{{missing_variable}} en textoSe deja literal en la salida — fácil de detectar en test calls.
Nodo Sub-workflowActualmente pasa de largo sin hacer nada. No te apoyes en él aún.
Step budget agotadoDesví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.