Workflows
Un workflow est une carte visuelle de ce que votre agent doit faire étape par étape — qui parle en premier, quoi demander, quand brancher, quand transférer l'appel et quand le passer à un autre agent. Vous le construisez sur un canvas en posant des nœuds et en les reliant.
Utilisez un workflow quand un seul prompt ne suffit pas — quand l'appel a des étapes claires (« qualifier d'abord, recueillir les détails, puis réserver ou transférer »), quand vous avez besoin d'un routage déterministe selon les réponses de l'appelant (pas « l'IA s'en sortira »), ou quand un agent devrait passer une partie du travail à un spécialiste.
Un prompt est une longue instruction. L'agent la lit une fois et l'utilise tout au long de l'appel. Un workflow est plusieurs petites instructions, une par nœud, avec des transitions explicites entre elles. Le graphe pilote l'appel — l'agent de chaque nœud n'est responsable que de son segment.
Si votre agent fonctionne déjà bien avec un seul prompt, vous n'avez pas besoin d'un workflow. Tournez-vous vers les workflows quand vous commencez à empiler des règles « si X alors Y » dans le prompt et qu'elles deviennent peu fiables.
L'éditeur
L'éditeur de workflow vit dans son propre onglet sur la page de l'agent. Vous voyez un canvas avec un nœud Start et un nœud End par défaut. Vous ajoutez des nœuds depuis la barre d'outils, les glissez sur le canvas et les reliez avec des arêtes.
Le panneau de droite change selon ce que vous sélectionnez :
- Clic sur un nœud — ouvre son panneau de réglages (prompt, champs, variables d'extraction, etc.).
- Clic sur une arête — ouvre les réglages de son trigger (AI decides / Condition / Always).
- Le panneau Variables (bouton de la barre) liste chaque variable du workflow avec un saut en un clic vers le nœud qui la définit ou la lit.
Lancez un Test Call dans le navigateur directement depuis l'éditeur — une luciole lumineuse suit la position en direct pour que vous voyiez exactement quel nœud est actif à chaque instant.
Les workflows ont trois états :
- Draft — éditable, pas encore en production. Utilisez Test Call pour le tester.
- Active — en production pour de vrais appels. L'agent utilise ce workflow dès le prochain appel.
- Template — gabarit réutilisable, jamais lié directement à un agent. Vous pouvez l'instancier sur plusieurs agents.
Nœuds
Chaque nœud est une étape de la conversation. Des types de nœuds différents font des choses différentes — certains parlent, d'autres écoutent, d'autres routent, d'autres exécutent des outils.
Agent
Le nœud Agent est le cœur d'une étape du workflow. Quand le graphe atteint un nœud Agent, cet agent prend la parole et conduit la conversation jusqu'à ce qu'un événement déclenche une transition.
Vous configurez la personnalité et la tâche du nœud Agent directement sur le canvas (l'onglet Prompt s'ouvre au clic sur le nœud) — c'est le prompt pour cette portion de la conversation, pas pour tout l'appel. Vous pouvez aussi attacher des bases de connaissances et des outils par nœud.
Greeting — la ligne d'ouverture. Si c'est le nœud d'entrée (le premier arrêt après Start), c'est la première chose qu'entend l'appelant.
Quand un graphe gouverne un appel, le prompt principal de l'agent (celui de l'onglet Model) est remplacé par le prompt du nœud actif. C'est voulu — le graphe est propriétaire de la personnalité et de la tâche par étape, et non un seul prompt fixe en compétition.
Subagent
Un subagent est un assistant qui tourne inline — il prend la conversation pour une tâche spécifique puis renvoie le résultat à celui qui l'a appelé.
Les subagents conviennent bien quand un bloc de travail est réutilisable ou se sent distinct : « vérifier l'identité de l'appelant », « recueillir l'adresse de livraison », « qualifier un lead avec la méthode SPIN ». L'agent parent appelle le subagent, le subagent fait son boulot et rapporte un résultat, le parent reprend là où il en était.
Les nœuds Subagent ont les mêmes onglets qu'un nœud Agent (Prompt, Knowledge, Tools, Actions) — l'éditeur crée automatiquement un agent backing caché pour vous. Vous ne voyez pas cet agent caché dans votre liste principale et il ne compte pas dans la limite d'agents de votre plan.
Return variable — le champ où stocker le résultat du subagent (par ex. identity_verified, lead_score).
Message (Say)
Le nœud Say dit une ligne fixe — pas de tour IA, pas d'improvisation. Utilisez-le pour des transitions (« Un instant, je vous transfère… »), des mentions légales obligatoires ou des confirmations prédéfinies où les mots comptent.
Text — quoi dire. Supporte les tokens {{variable}} pour injecter des valeurs capturées, par ex. "Merci {{first_name}}, je vous ai réservé pour {{appointment_time}}."
Un nœud Say consomme le tour — l'agent n'ajoutera rien par-dessus.
Gather Input
Un nœud Gather Input pose une question et capture la réponse de l'appelant dans une variable.
Prompt — la question à poser. Supporte les {{tokens}}.
Variable — le nom du champ où stocker la réponse.
Utilisez-le chaque fois que vous avez besoin d'une valeur concrète avant de continuer — email, numéro de compte, nombre de personnes, catégorie de problème. Le prochain tour de l'appelant devient la valeur ; vous pouvez brancher dessus avec une arête Condition juste après.
Update State
Un nœud Update State écrit une ou plusieurs valeurs dans les variables du workflow sans parler ni demander. Utilisez-le pour pré-fixer des valeurs par défaut, marquer des flags de progrès ou composer des valeurs à partir d'étapes précédentes.
Variable / Value — une paire clé-valeur. More variables (optional) — paires clé-valeur additionnelles.
Les clés comme les valeurs supportent les {{tokens}}, donc vous pouvez composer de nouvelles valeurs à partir des existantes.
Condition
Le nœud Condition est un nœud purement de routage — il ne parle pas, ne demande pas, il envoie simplement l'appel sur la branche sortante qui matche.
La condition elle-même vit sur chaque arête sortante, pas sur le nœud — voir arêtes Condition ci-dessous.
Utilisez un nœud Condition quand vous voulez un point clair de « fan-out » dans votre graphe : plusieurs branches qui dépendent de la valeur d'une variable. Comparé à mettre des conditions sur les arêtes des nœuds Agent, un nœud Condition dédié rend la logique de routage visuellement évidente.
Tool
Le nœud Tool exécute un des outils connectés de l'agent en tant qu'étape du graphe — sans que l'IA ait son mot à dire sur l'appel. Utilisez-le quand vous voulez un fait, pas une conversation : « cherche ce client », « vérifie le stock », « GET la météo actuelle ».
Vous pouvez :
- Choisir l'un des outils existants de l'agent (consultation de calendrier, recherche dans une base de connaissances, action spécifique à une intégration), ou
- Configurer un appel HTTP inline directement dans le nœud (URL, méthode, en-têtes, paramètres, body).
La réponse de l'outil devient disponible pour tous les nœuds en aval. Si la réponse est un objet JSON, chaque champ de premier niveau devient sa propre variable — une réponse comme {"is_known": true, "tier": "gold"} écrit à la fois is_known et tier pour que vous branchiez dessus.
Chaque champ texte du nœud Tool — URL, valeurs d'en-têtes, body — supporte les {{tokens}}. Glissez une variable dans un path d'URL, un en-tête ou un body sans écrire de code.
Si un appel d'outil échoue (erreur HTTP, timeout, réseau), le nœud logue l'échec et le graphe continue — sans les données. Prévoyez vos conditions en aval pour gérer le cas « pas de valeur ».
Integration
Le nœud Integration est une variante focalisée de Tool, pour les services externes connectés — Google Calendar, Outlook, HubSpot. Vous choisissez le fournisseur et l'action spécifique (par ex. check_availability, create_event), vous donnez les paramètres, et le nœud appelle l'intégration de façon déterministe.
Si l'intégration n'est pas connectée sur cet agent, le nœud passe sans rien faire — votre graphe continue. Vérifiez les conditions en aval pour le cas « n'a pas tourné ».
Phone Transfer
Le nœud Phone Transfer transfère l'appel (warm transfer) vers un numéro de téléphone externe. Après un transfert réussi, l'appel a quitté votre workflow — votre agent n'est plus en ligne.
Number — destination au format international avec un + en tête (par ex. +15551234567). Supporte les {{tokens}} pour que la destination puisse venir d'une étape précédente (par ex. la réponse à « avec quel bureau souhaitez-vous être mis en relation ? »).
Si le transfert n'aboutit pas (numéro invalide, pas de réponse, connexion téléphonique non configurée), le graphe recule et l'agent actuel reste en ligne. La conversation continue normalement — l'agent peut s'excuser et essayer un autre chemin.
End Call
Le nœud End Call ferme — l'agent dit la phrase de clôture configurée puis raccroche. Utilisez-le comme terminus propre pour les branches « tout est fait » ou pour la branche « on ne peut pas aider, désolé » depuis une Condition difficile.
Aucune configuration nécessaire au-delà d'une arête entrante.
Réutiliser un workflow (Sub-workflow)
Le nœud Sub-workflow est réservé pour embarquer un autre workflow comme sous-graphe. Ce nœud est dans l'éditeur mais n'est pas encore complètement câblé — le graphe le traverse sans rien faire. Ne comptez pas dessus pour les appels en production. Nous l'activerons quand nous livrerons les sous-graphes réutilisables.
Arêtes (Connexions)
Vous connectez un nœud au suivant via une arête. Le trigger de l'arête décide quand la transition se déclenche.
Il y a trois triggers :
| Trigger | Qui décide | Quand ça se déclenche |
|---|---|---|
| AI decides | L'IA | Quand la conversation en fait la prochaine étape naturelle. L'IA reçoit un « outil de transition » qu'elle peut appeler. |
| Condition | Le runtime | Quand une variable matche une règle que vous avez écrite. Évalué avant que l'IA ne réponde. |
| Always | Le runtime | Inconditionnellement — dès que le nœud source termine. Pas d'input de l'appelant, pas d'IA. |
AI decides (basé sur l'intention)
Utilisez AI decides quand seule l'IA peut décider quand basculer — « si l'appelant pose une question sur les tarifs, transfère à l'agent ventes », « si ça ressemble à une plainte, lance le subagent excuses ».
Vous écrivez une brève description d'intention sur l'arête (par ex. « L'appelant pose des questions sur les tarifs ou veut faire un upgrade »). L'IA la voit comme un outil étiqueté avec cette intention et décide s'il faut l'appeler en fonction de la conversation. Si plusieurs arêtes AI-decides sont présentes, l'IA en choisit au plus une par tour.
Condition (branchement déterministe)
Utilisez Condition quand vous voulez que le graphe — pas l'IA — décide selon un fait connu : « si lead_score > 7, envoie au closer ; sinon, termine poliment ».
Les Conditions sont évaluées avant que l'IA ne réponde, donc elles l'emportent toujours sur l'IA pour ce tour. L'IA ne peut pas surcharger une condition qui matche.
Vous pouvez construire une condition avec ces opérateurs :
| Opérateur | Signification | Exemple |
|---|---|---|
| equals | match exact (insensible à la casse pour le texte) | intent equals "billing" |
| not equals | ne matche pas | status not equals "active" |
| contains | match de sous-chaîne (insensible à la casse) | feedback contains "broken" |
| greater than | numérique > | lead_score greater than 7 |
| less than | numérique < | wait_minutes less than 5 |
Vous pouvez aussi combiner les clauses avec All (toutes doivent matcher — AND) ou Any (au moins une doit matcher — OR), et les imbriquer. Une règle comme « l'appelant est connu et son tier est gold ou premium » devient :
All:
- is_known equals true
- Any:
- tier equals gold
- tier equals premium
Si vous référencez une variable qui n'a pas encore été fixée (par ex. l'IA ne l'a jamais collectée), les conditions dessus échouent toujours — pas d'erreur, ça ne matche simplement pas. Donc loyalty_tier equals "gold" retourne faux si loyalty_tier n'a jamais été fixée. Concevez vos branches pour gérer ça — typiquement avec une branche else (voir ci-dessous).
Branche else — quand aucune condition ne matche
Si vous avez plusieurs arêtes Condition sortant d'un nœud et qu'aucune ne matche, l'appel tombe sur l'arête non-Condition de plus basse priorité (Always ou une arête AI-decides). S'il n'y a pas du tout de fallback, l'IA reprend le contrôle et peut continuer librement.
Pattern courant : plusieurs Conditions pour les chemins connus, plus une arête Always vers un catch-all (dire quelque chose, puis End Call ou transférer).
Always (auto-advance)
Utilisez Always quand l'étape suivante est inconditionnelle — pas de décision, pas d'input appelant. Deux usages naturels :
- Chaîner des étapes : SAY → UPDATE_STATE → SAY → TOOL → Condition. Chaque étape termine et l'arête Always avance immédiatement.
- Auto-avancer après que l'agent a fini de parler : un nœud Agent avec une arête Always sortante signifie « dès que l'IA s'arrête de parler, avance » — pas besoin que l'appelant réponde. Utile pour des flux de type monologue, comme un agent présentateur qui livre puis passe à la section suivante.
Condition et Always (les déterministes) l'emportent toujours sur AI decides. Si une Condition matche, les outils de transition de l'IA sont ignorés pour ce tour. Cela vous permet d'écrire des règles que l'IA ne peut pas contourner.
Variables
Les variables sont la mémoire du workflow. La plupart des choses dans un workflow sont soit fixer une variable, soit en lire une.
Déclarer les variables
Le panneau Variables (bouton de la barre) montre chaque variable du workflow avec les étapes qui la fixent ou la lisent. Cliquez sur une variable pour sauter vers un setter ; c'est le moyen le plus rapide de trouver où quelque chose dérape.
Vous pouvez déclarer une variable avec une valeur par défaut dans le panneau — utile pour des flags comme escalated=false qui doivent exister dès le départ pour que vos conditions ne ratent pas silencieusement par « absence ».
Comment les variables se fixent
| Source | Exemple |
|---|---|
| Valeurs par défaut (déclarées dans le panneau Variables) | escalated = false fixé avant le début de l'appel |
| Gather Input | La réponse parlée de l'appelant est capturée dans la variable du nœud |
| Update State | Vous écrivez une valeur (littérale ou composée avec {{tokens}}) directement |
| Résultat Tool / Integration | La réponse entière est stockée sous le nom du nœud ; si la réponse est un objet JSON, chaque champ de premier niveau devient aussi sa propre variable |
| Return de Subagent | Ce que le subagent termine est stocké dans la variable de retour du nœud subagent |
Lire les variables — {{tokens}}
Partout où vous pouvez écrire du texte dans un nœud — prompt d'Agent, texte de Say, prompt de Gather, URL/body/headers de Tool, numéro de Phone Transfer, valeur de Update State, valeurs de condition — vous pouvez glisser {{variable}} et ça sera substitué au runtime.
Les paths pointés marchent aussi pour les données imbriquées — par ex. si une réponse de Tool était {"customer": {"name": "Anna", "tier": "gold"}}, vous pouvez lire {{customer.name}} ou {{customer.tier}}.
Si un token référence une variable qui n'existe pas, le texte littéral {{name}} est laissé tel quel (pas mis à blanc). C'est intentionnel — ça rend les templates cassés faciles à repérer en test call, plutôt que de les avaler silencieusement.
Patterns courants
Qualifier → Brancher → Router
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
Rechercher → Personnaliser
Start
└─ Tool (CRM lookup, writes is_known, name, tier)
└─ Condition: is_known == true → Agent (warm greeting with {{name}})
└─ Always (else) → Agent (cold greeting)
Helper réutilisable (Subagent side-trip)
Agent (main conversation)
└─ AI decides: "Caller mentions an address" → Subagent (address collector)
└─ on finish: result = full_address
└─ Agent continues with {{full_address}}
Ce qui est verrouillé pendant un appel piloté par workflow
Certaines valeurs par défaut changent quand un graphe gouverne l'appel :
- La langue est verrouillée sur celle utilisée par le premier agent du workflow. L'IA ne peut pas changer de langue en cours d'appel. Cela évite que le modèle dérive vers la mauvaise langue sur un tour bruité.
- Le prompt principal de l'agent est remplacé par le prompt du nœud actif. C'est la règle « le graphe possède la persona » — voir warning sous Agent.
- Le premier message vient du greeting du nœud d'entrée, pas du champ « Begin Message » de l'agent.
Sécurité anti-boucle — Step Budget
Chaque workflow a un nombre maximum de transitions par appel (par défaut 25). Chaque fois que le graphe bascule vers un nouveau nœud, le compteur baisse de un. Quand il atteint zéro, le workflow arrête de sauter entre les nœuds pour empêcher les boucles incontrôlées.
Vous pouvez choisir un nœud de fallback pour ce cas (typiquement un Phone Transfer ou End Call) — l'appel y est dévié une fois le budget épuisé. Sinon, l'IA reprend le contrôle et le graphe gèle effectivement pour le reste de l'appel.
Vous avez rarement besoin d'y penser — c'est un filet de sécurité pour les graphes qui bouclent par accident. Si vous l'atteignez en usage normal, vous avez probablement un cycle quelque part.
Tester
Le bouton Test Call de l'éditeur ouvre un appel navigateur avec le draft actuel du workflow. Pendant qu'il tourne, une luciole lumineuse se déplace entre les nœuds du canvas pour que vous voyiez exactement où en est l'appel. L'éditeur est verrouillé pendant un test call pour empêcher les modifications de désynchroniser l'état en direct.
Utilisez Test Call pour vérifier :
- Vos conditions matchent les valeurs que vous attendez (regardez si la luciole saute une branche que vous pensiez voir se déclencher).
- Vos tokens sont substitués correctement (écoutez un
{{name}}resté en l'air si une valeur n'a pas été fixée). - Les échecs d'outil dégradent proprement (votre route fallback se déclenche bien).
Échecs à connaître
| Situation | Ce qui se passe |
|---|---|
| Appel Tool / Integration échoue | Le graphe continue sans les données. Vos conditions en aval doivent gérer la variable absente. |
| Phone Transfer échoue (numéro invalide, pas de réponse, connexion téléphonique absente) | Le graphe recule, l'agent actuel reste en ligne, et la conversation continue normalement. |
| Subagent ne démarre pas | La parenthèse est annulée, l'agent parent reste, et une courte ligne d'échec est dite. |
{{missing_variable}} dans le texte | Laissé littéral dans la sortie — facile à repérer en test calls. |
| Nœud Sub-workflow | Actuellement traversé sans rien faire. Ne comptez pas dessus pour l'instant. |
| Step budget épuisé | Dévie vers le nœud de fallback s'il est fixé, sinon l'IA reprend le contrôle. |
Quand NE PAS utiliser un Workflow
Les workflows sont puissants mais ne sont pas la bonne réponse pour chaque agent. Restez sur un seul prompt quand :
- La conversation est ouverte (« répondre aux questions de l'appelant sur nos produits »).
- Vous n'avez pas de logique de branchement claire — la plupart des décisions sont des jugements que l'IA gère bien.
- Vous n'écririez qu'un nœud Agent et un End Call — c'est juste un prompt avec des étapes en plus.
Tournez-vous vers un workflow quand :
- Vous pouvez esquisser l'appel comme un organigramme avec trois étapes distinctes ou plus.
- Vous avez besoin d'au moins un branchement déterministe sur une variable (une Condition).
- Vous voulez réutiliser un bloc de conversation sur plusieurs agents (un subagent).
- Vous empilez déjà des règles « si l'appelant dit X alors fait Y » dans un prompt et elles ne sont pas fiables.