En Flujos del panel puedes diseñar visualmente un disparador y sus pasos, conectar ramas y consultar su JSON. El modo básico utiliza reglas y acciones; los modos IA e híbrido requieren al menos una tarea de IA. Guarda el borrador y publica una versión para que el disparador la utilice.
Estructura
{
"trigger": { "type": "keyword", "config": { "keywords": ["factura rechazada"], "extract": { "invoice_id": "(FE-?\\d+)" } } },
"steps": [
{ "id": "s1", "type": "tool_call", "tool": "lookup_invoice", "input_map": { "invoice_id": "{{context.invoice_id}}" } },
{ "id": "s2", "type": "branch", "condition": "{{s1.output.status}} == 'rejected'", "then": "s3", "else": "s4" },
{ "id": "s3", "type": "send_message", "template": "Tu factura fue rechazada por: {{s1.output.reason}}" },
{ "id": "s4", "type": "escalate_to_human", "queue": "default" }
]
}
Disparadores
| Tipo | Cuándo corre | Contexto disponible |
|---|---|---|
conversation_started |
Al abrir una conversación en el widget. | context.page_context |
keyword |
Cuando el mensaje del usuario contiene alguna de las keywords (sin llamar al modelo). extract aplica expresiones regulares al mensaje y guarda los grupos en context. |
context.message, valores extraídos |
ticket_status_changed |
Al cambiar el estado de un ticket. | context.ticket |
webhook |
Al recibir un POST en la URL del flujo con su token. | El cuerpo del POST como context |
whatsapp_selection |
Al recibir el ID configurado de un botón Meta/Twilio o una fila de lista Meta. | context.inbound.selection |
whatsapp_location |
Al recibir una ubicación autenticada por WhatsApp. | context.inbound.location |
Tipos de paso
| Tipo | Campos | Efecto |
|---|---|---|
tool_call |
tool, input_map |
Llama una acción configurada y guarda su salida en <id>.output. |
branch |
condition, then, else |
Salta al paso indicado según la condición. |
send_message |
template |
Envía un mensaje al usuario en la conversación. |
escalate_to_human |
queue |
Pasa la conversación a la bandeja. |
update_ticket |
status, priority, assigned_user_id |
Actualiza el ticket vinculado. |
wait |
minutes |
Pausa el flujo y lo reanuda después. |
Tras un send_message el motor continúa con el siguiente paso de la lista; un camino que deba terminar ahí debe cerrar con el último paso o con una rama.
Interpolación
{{...}} accede a context, contact, conversation y a las salidas de pasos previos ({{s1.output.reason}}). Las condiciones admiten ==, !=, >, >=, <, <=, contains, exists, y se combinan con and / or. No se ejecuta código: es un parser propio de comparaciones.
Modo de prueba
Desde el panel puedes ejecutar el flujo con un contexto de ejemplo en dry run: las acciones que lo soportan reciben la cabecera X-Dry-Run: 1 y las demás se simulan. Cada ejecución, real o de prueba, deja un registro paso a paso en el historial del flujo.
Límites
Los flujos activos cuentan contra el límite del plan (Pro: 10; Corporate: ilimitados). Un flujo se detiene tras 50 pasos para evitar bucles.