# Constructor de flujos de trabajo


# Constructor de flujos de trabajo

El **Constructor de flujos de trabajo** es un editor visual, basado en nodos, para **flujos de llamada guionizados**. Mientras que el agente abierto deja que el modelo decida qué decir a continuación, un flujo de trabajo le da al agente un camino determinista — una secuencia de pasos que hablan, preguntan, ramifican, llaman a herramientas y enrutan la conversación. Úsalo cuando una llamada necesite seguir un guion definido: calificar un cliente potencial, reservar una cita, clasificar una incidencia de soporte o recopilar una encuesta. Lo abres desde la pestaña **Herramientas** en el constructor de agentes en **/agent/setup**, con el botón **Abrir Constructor de flujos de trabajo**.

Un flujo de trabajo pertenece a un único agente. En el momento de la llamada, un **supervisor** observa la conversación, decide qué **intención** está expresando la persona que llama y ejecuta los **pasos** de esa intención en orden. Las funciones que el agente puede usar dentro de los pasos son exactamente las que has vinculado en la [pestaña Herramientas](./tools-mcp) — el flujo de trabajo no puede alcanzar una herramienta que no hayas concedido.

## Cómo está estructurado un flujo de trabajo

![El Workflow Builder](/img/screenshots/portal/workflow-builder.png)
*El Workflow Builder: diseña flujos de llamada deterministas en un lienzo de nodos estilo n8n, con un prompt de supervisor opcional.*

Un flujo de trabajo tiene tres niveles anidados:

- **Grafo** — un flujo de trabajo por agente. Lleva un **prompt de supervisor** opcional (instrucciones personalizadas para el supervisor de IA que enruta las intenciones). Hasta que creas el grafo, el constructor muestra una pantalla única **Crear grafo de flujo de trabajo** con el campo del prompt de supervisor.
- **Intenciones** — las ramas de la conversación. Cada intención tiene un **nombre visible**, un **nombre interno**, una **descripción** (que se muestra al modelo supervisor para que pueda emparejar la intención), una lista de **frases desencadenantes**, un conmutador de **intención predeterminada** y una **respuesta de reserva** opcional que se usa si todos sus pasos fallan. El supervisor elige la intención cuya descripción y frases desencadenantes encajan mejor con lo que dijo la persona que llama.
- **Pasos** — las acciones ordenadas dentro de una intención. Los pasos se ejecutan de arriba abajo de forma predeterminada, y cada paso tiene un tipo que decide qué hace.

En el lienzo esto se lee como un nodo verde de **Inicio** que fluye hacia un nodo de **Intención** por cada rama, con los nodos de **Paso** de esa intención apilados debajo. Un minimapa, controles de zoom y un fondo punteado te ayudan a navegar por flujos más grandes.

:::info[Las intenciones son cómo enruta el supervisor]

El supervisor compara lo que dice la persona que llama con la **descripción** y las **frases desencadenantes** de cada intención, así que escribe las descripciones como si informaras a un colega ("El usuario quiere reservar o programar una cita") y añade algunas frases desencadenantes naturales. Marca una intención como **predeterminada** para captar las conversaciones que no encajen claramente con ninguna otra.

:::

## Tipos de paso

Añade un paso con **Añadir paso** (tras seleccionar una intención o uno de sus pasos), lo que abre el selector de nodos. El selector agrupa los tipos de paso en **Conversación**, **Lógica**, **Integraciones** y **Control de llamada**. Hay trece tipos:

- **Mensaje** — el bot dice una frase a la persona que llama.
- **Pregunta** — el bot pregunta algo y almacena la respuesta en una **variable**. Eliges un **tipo de validación** (Cualquiera, Número, Email, Fecha, Sí / No o Teléfono) y un **mensaje de repregunta** que se usa cuando la respuesta no supera la validación.
- **Condición** — ramifica el flujo. Eliges un **campo** (una variable de sesión), un **operador** (igual a, distinto de, contiene, no contiene, mayor que, menor que, coincide con regex, está vacío, no está vacío) y un **valor**, y luego enrutas **Si es verdadero** y **Si es falso** a pasos específicos.
- **Llamada a herramienta** — llama a una función **integrada** o **personalizada** vinculada al agente. Seleccionas el tipo de herramienta, la función y un **mapeo de entrada** opcional (JSON) que asigna las entradas del paso a variables de sesión.
- **Cita** — ejecuta un subflujo de reserva de citas contra una función de reserva, con su propio mapeo de entrada.
- **Webhook** — realiza una solicitud HTTP a una URL externa. Defines el **método** (GET, POST, PUT, PATCH, DELETE), la **URL**, **cabeceras** opcionales (JSON), una **plantilla de cuerpo** y una variable en la que **guardar la respuesta**.
- **Transferencia** — pasa la llamada a otro **número de teléfono o cola**, con un mensaje opcional anunciado antes de la transferencia. Consulta [Llamadas y telefonía](./calling-telephony) para saber cómo se comportan las transferencias de llamada de principio a fin.
- **Finalizar llamada** — cuelga, diciendo opcionalmente primero un **mensaje de despedida**.
- **Retardo** — espera en silencio un número determinado de segundos (1–60) antes de continuar.
- **Establecer variable** — almacena un valor (texto estático o una referencia a otra variable) en una variable de sesión.
- **Enviar notificación** — envía un mensaje **SMS**, **email** o **WhatsApp** usando una plantilla con nombre y un mapeo de variables (JSON).
- **Respuesta estática** — dice un bloque de texto fijo. Este es un nodo heredado; prefiere **Mensaje** para los flujos nuevos.
- **Reproducir audio** — reproduce un archivo de audio (una URL pública de WAV o MP3) a la persona que llama.

Cada paso se configura en el **panel de la derecha** que se abre al seleccionar un nodo. El panel muestra solo los campos relevantes para el tipo de ese paso, además del nombre del paso y un selector de tipo.

:::tip[Las variables conectan tus pasos entre sí]

Un paso de **Pregunta** o **Establecer variable** almacena su resultado bajo un nombre que tú eliges. Refiérete a él más adelante — en un Mensaje, el campo de una Condición, el cuerpo de un Webhook o el mapeo de una notificación — con la sintaxis de llaves como `{variable_name}`. Así es como un flujo recuerda lo que dijo la persona que llama y lo lleva adelante a través de los pasos.

:::

## Ramificación y enrutamiento

Los pasos no tienen que ejecutarse en línea recta:

- Un paso de **Condición** expone salidas **True** y **False**. Conecta cada una a un paso de destino (o déjala en **Continuar en orden**) para ramificar según el valor de una variable.
- Cualquier otro tipo de paso tiene enrutamiento **Si tiene éxito** y **Si falla**. De forma predeterminada, un paso continúa con el siguiente en orden; configura estos para saltar a otro lugar — por ejemplo, enruta una Llamada a herramienta fallida a un mensaje de recuperación.

Puedes configurar el enrutamiento de dos maneras: elige el paso de destino en el panel de configuración o **arrastra una conexión** en el lienzo desde el conector de salida de un paso (el conector verde **OK** / **TRUE** o el conector rojo **FAIL** / **FALSE**) hasta otro paso. Las conexiones dibujadas en el lienzo se guardan en el flujo de trabajo de inmediato.

## Construir y guardar

El constructor conserva los cambios a medida que los haces, en lugar de en un único gran guardado:

- **Añadir intención** crea una nueva rama; haz clic en ella para rellenar su nombre, descripción y frases desencadenantes, y luego **Guardar cambios** en el panel.
- **Añadir paso** inserta un paso del tipo que elijas; configúralo en el panel y **Guardar cambios**.
- Los galones arriba / abajo de un nodo **reordenan** intenciones y pasos; eliminar un nodo (mediante su icono de papelera o la tecla Supr) pide confirmación primero.
- El botón **Guardar** de la barra de herramientas almacena el **prompt de supervisor**; un punto ámbar marca las ediciones del prompt sin guardar.

## Empezar desde una plantilla

En lugar de construir desde cero, el botón **Plantillas** ofrece flujos listos para usar que puedes cargar y luego editar: **Calificación de clientes potenciales**, **Reserva de citas**, **Atención al cliente**, **Encuesta NPS**, **Recordatorio de pago** y **Incorporación de clientes**. Cada uno incorpora una intención completa con sus pasos, incluyendo preguntas, condiciones y mensajes de despedida. Aplicar una plantilla **añade** a tu flujo de trabajo existente en lugar de reemplazarlo, de modo que puedas combinar varias o recortar lo que no necesites.

## Importar funciones desde una especificación OpenAPI

El botón **Importar API** convierte una API existente en funciones de agente que puedes llamar desde pasos de **Llamada a herramienta**. Proporciona una especificación **OpenAPI / Swagger** — por URL o pegándola (OpenAPI 2.0 o 3.x, JSON o YAML) — y el importador analiza las operaciones. Elige las operaciones que quieres, confirma la URL base, y genera **funciones personalizadas** para ellas. Esas funciones aparecen luego en la lista de funciones para los pasos de Llamada a herramienta y en la pestaña Herramientas.

:::info[El catálogo de funciones se gestiona en otro lugar]

Un paso de Llamada a herramienta solo puede usar funciones ya disponibles para el agente — las funciones integradas y cualquier función personalizada vinculada en la [pestaña Herramientas](./tools-mcp), incluidas las generadas por el importador de OpenAPI. Si la función que quieres no aparece en la lista, añádela primero en la pestaña Herramientas.

:::

## Próximos pasos

- [Vincula funciones y conecta servidores MCP (pestaña Herramientas)](./tools-mcp)
- [Configura las transferencias de llamada y la telefonía](./calling-telephony)
- [Crea tu primer agente](./create-agent)
- [Volver a la visión general de agentes](./overview)
