Référence des nœuds de séquence vocale
Avertissement : les séquences vocales sont en préversion. Les étapes, les données d'entrée et le format de définition des séquences peuvent changer de manière incompatible avec les séquences et requêtes API existantes.
Utilisez cette référence pour écrire le sequence.definition que vous envoyez avec Créer un appel. Bird exécute une définition en ligne une seule fois sans la sauvegarder. Pour conserver une séquence, construisez-la dans l'éditeur du tableau de bord.
Définition
| Champ | Valeur |
|---|---|
schema_version | 1. |
expression_environment | "bird.cel.v1". |
nodes | Tableau d'objets de nœud. L'ordre du tableau n'a aucun effet sur l'exécution. |
settings | Omettez-le ou envoyez {}. Un objet non vide échoue avec unsupported_contract ; une valeur qui n’est pas un objet échoue avec invalid_envelope. |
presentation | Disposition et libellés facultatifs de l'éditeur. N'affecte pas l'exécution, mais compte dans les limites de taille. |
Chaque nœud possède ces champs :
| Champ | Valeur |
|---|---|
id | Unique dans la définition. Commence par une lettre minuscule, puis lettres minuscules, chiffres ou _, jusqu'à 64 caractères. |
type | Un type de nœud de cette page, par exemple voice.say. |
type_version | 1 pour chaque type de nœud de cette page, sauf 3 pour voice.dial. |
config | Configuration qui fixe la forme du nœud, comme les résultats déclarés. Utilisez {} quand le nœud n'en a pas. |
input | Valeurs que le nœud utilise lors de son exécution. Utilisez {} quand le nœud n'en a pas. |
connections | Correspondance entre un nom de résultat et { "node_id": "<target>", "port": "input" }. |
Les connexions ne doivent pas former de boucle, et chaque nœud doit être accessible depuis une entrée. Un résultat absent de connections est non connecté. Les résultats non connectés terminent l'exécution normalement, sauf indication contraire du nœud.
Valeurs et expressions
La plupart des champs acceptent des JSON littéraux. Les champs marqués binds acceptent aussi $expr ou $template ; les champs marqués expr acceptent aussi $expr uniquement :
{"$expr": "trigger.data.customer_name"}renvoie une valeur typée.{"$template": ["Hello ", {"$expr": "trigger.data.customer_name"}, "."]}renvoie du texte. Les templates sont des tableaux ;{{name}}reste du texte littéral.
Les expressions utilisent CEL et peuvent lire ces valeurs :
| Valeur | Contenu |
|---|---|
trigger.data | Les données d'entrée, correspondant au data_schema de l'entrée. |
trigger.node_id | L'identifiant de l'entrée qui a démarré cette visite. |
trigger.type | Le type de l’entrée qui a démarré cette visite, par exemple trigger.start_call. |
steps.<id>.output | Sortie d'un nœud précédent terminé dans cette visite. |
variables.<key> | Valeurs enregistrées par un nœud data.set dans cette visite. |
execution.id, execution.started_at | L'identifiant de l'exécution et son heure de début. Utilisez string(execution.started_at) dans la synthèse vocale. |
execution.call | Le id de l'appel, session_id, et les parties d'origine orig et dest, chacune pouvant être null. |
Vérifiez les valeurs optionnelles avant de les lire, par exemple has(trigger.data.name) ? trigger.data.name : 'caller'. La macro has est disponible ; map, filter, all, exists et exists_one ne le sont pas.
Entrée
trigger.start_call
Point de départ d'un appel. entry_node_id dans la requête Create Call désigne ce nœud.
| Champ | Valeur |
|---|---|
config.data_schema | Schéma d'objet JSON Schema (draft 2020-12) optionnel pour trigger_data. Seul $ref local est pris en charge. Sans ce schéma, l'entrée n'accepte que {}. |
| Résultat | event. |
Les données d'entrée sont limitées à 16 Kio.
Parole et audio
voice.say
| Champ | Valeur |
|---|---|
input.text | Requis, binds. Texte à prononcer, 160 octets maximum. |
input.language | Requis. Code de langue vocale, par exemple en. |
| Résultat | next. |
voice.play
| Champ | Valeur |
|---|---|
input.asset_id | Obligatoire. ID d'un asset audio disponible dans cet espace de travail. Un asset indisponible peut faire échouer l'appel lors de l'exécution de l'étape. |
| Résultat | next. |
voice.tone
| Champ | Valeur |
|---|---|
input.frequency_hz | Requis. 100 à 3000. |
input.duration_ms | Requis. 1 à 10000. |
| Résultat | next. |
logic.pause
Attend avec l'appel connecté.
| Champ | Valeur |
|---|---|
input.duration_ms | Requis. 1 à 60000. |
| Résultat | next. |
Saisie au clavier
voice.gather
Joue des invites, qu'une pression de touche interrompt, et collecte les chiffres saisis au clavier.
| Champ | Valeur |
|---|---|
input.prompts | Obligatoire. Jusqu'à 4 invites. Chacune est {"type": "say", "text", "language"}, {"type": "play", "asset_id"}, {"type": "tone", "frequency_hz", "duration_ms"} ou {"type": "pause", "duration_ms"}, avec les mêmes limites que le nœud correspondant. Les durées de tonalité et de pause combinées ne dépassent pas 60 000 ms. text d'invite accepte les binds. |
input.max_digits | Obligatoire. 1 à 32. |
input.timeout_seconds | Obligatoire. Secondes d'attente avant la première touche, 1 à 10. |
input.inter_digit_timeout_seconds | Obligatoire. Secondes d'attente entre les touches, 1 à 5. |
input.finish_on_key | Requis. Un parmi 0–9, *, #, A–D qui met fin à la saisie, ou null. |
input.matches | Requis. Correspondance entre un nom de résultat et les chiffres exacts qui le sélectionnent, par exemple {"hours": "1"}. Les noms et les chiffres doivent être uniques. Un nom ne peut pas être input, timeout ou fallback. Les chiffres font au plus max_digits de long et ne peuvent pas contenir finish_on_key. |
input.private | Optionnel, par défaut false. Quand true, les étapes suivantes ne peuvent pas lire les chiffres, et ceux-ci sont exclus de la trace. |
| Résultats | Chaque nom dans matches, timeout quand aucune touche n'est pressée, et fallback pour toute autre saisie. |
| Sortie | digits et reason : initial_timeout, max_digits, finish_key ou inter_digit_timeout. |
Logique et données
logic.branch
Vérifie les conditions dans l'ordre et suit la première qui est vraie.
| Champ | Valeur |
|---|---|
config.cases | Obligatoire. Au moins un {"port": "<name>", "when": {"$expr": "<boolean>"}}. |
config.default_port | Obligatoire. Nom du résultat quand aucun cas n'est vrai. |
| Résultats | Chaque port dans cases, et default_port. |
| Sortie | branch : le nom du résultat sélectionné. |
data.set
Enregistre des valeurs pour les étapes suivantes de la même visite.
| Champ | Valeur |
|---|---|
input | Objet de valeurs, dont chacune accepte un bind. Chaque clé devient variables.<key>. Chaque valeur est calculée à partir des variables telles qu'elles étaient avant ce nœud. |
| Résultat | next. |
| Sortie | L'objet enregistré. |
Appels et transferts
voice.dial
Appelle un numéro de téléphone ou un numéro sur l'un des trunks SIP entrants de votre espace de travail, ou fait sonner un groupe de sonnerie, puis le connecte à l'appel en cours. Utilisez type_version 3.
| Champ | Valeur |
|---|---|
input.type | Obligatoire. pstn pour appeler un numéro de téléphone, sip_trunk pour appeler un numéro via l'un de vos trunks SIP entrants, ou ring_group pour faire sonner les membres en ligne d'un groupe de sonnerie. |
input.pstn | Obligatoire quand type vaut pstn, omis sinon. Objet avec dest et orig facultatif. |
input.sip_trunk | Obligatoire quand type vaut sip_trunk, omis sinon. Objet avec trunk_id, dest et orig facultatif. |
input.ring_group | Obligatoire quand type vaut ring_group, omis sinon. Objet avec ring_group_id. |
trunk_id | Obligatoire dans sip_trunk. ID d'un trunk SIP entrant de votre espace de travail, par exemple spt_01jzj6c0p4f8b3x2m9k7q5r1tw. Valeur littérale uniquement. |
ring_group_id | Obligatoire dans ring_group. ID d'un groupe de sonnerie de votre espace de travail, y compris son groupe par défaut, par exemple vrg_01jzj6c0p4f8b3x2m9k7q5r1tw. Valeur littérale uniquement. |
dest | Obligatoire, binds. Pour pstn, le numéro E.164 à appeler, par exemple +12025550123. Pour sip_trunk, un numéro, une extension ou un nom, par exemple 1001 : de 1 à 64 lettres, chiffres et +*._-. Le routage entrant du trunk achemine l'appel comme s'il était arrivé pour cette valeur. |
orig | Facultatif, binds. Si vous omettez la propriété orig, l'appel présente le numéro Bird composé lors d'un appel entrant ou le numéro d'origine lors d'un appel sortant. Pour pstn, utilisez un identifiant d'appelant de l'espace de travail ou le numéro E.164 valide de l'appelant entrant. Les numéros des appelants entrants sont envoyés sans signature et peuvent être filtrés par l'opérateur destinataire. Pour sip_trunk, il accepte les mêmes valeurs que dest, par exemple sales. |
input.timeout_seconds | Obligatoire pour pstn et sip_trunk, omis pour ring_group, expr. Secondes d'attente d'une réponse, basculement entre passerelles du trunk compris, de 1 à 120. Les appels sans réponse prennent no_answer ; un appel répondu n'est pas limité. |
| Issues | success, busy, no_answer et failure. success suit après la fin de l'appel connecté et la restauration de l'audio de l'appel initial, pas au moment où le destinataire répond. Un trunk SIP qui rejette ou transfère l'appel sélectionne failure. Une issue failure non connectée fait échouer l'exécution. Pour un groupe de sonnerie, busy signifie que ses membres étaient occupés, ont refusé ou étaient déjà en communication, no_answer signifie que personne n'a répondu en 60 secondes ou que personne n'était en ligne, et failure signifie que Bird n'a pas pu faire sonner le groupe. |
La version 2 n'a pas de cible ring_group et exige toujours timeout_seconds. Toute entrée valide en version 2 l'est aussi en version 3 : la mise à niveau d'une étape ne change donc rien d'autre.
La version 1 prend le numéro dans input.to et n'a pas de orig. Les étapes qui l'utilisent continuent de fonctionner. Lorsque vous mettez à niveau une étape en version 1 dans l'éditeur, sa valeur to est déplacée vers pstn.dest.
logic.voice_goto
Démarre une autre entrée dans la même définition. La nouvelle visite reçoit des trigger.data nouvelles et efface les sorties et variables des étapes précédentes ; l'appel continue.
| Champ | Valeur |
|---|---|
input.entry_node_id | Obligatoire. ID d'un nœud trigger.start_call dans cette définition. |
input.data | Facultatif, expr, par défaut {}. Données d'entrée pour le schéma de ce nœud. |
| Résultats | Aucun. |
Automations
automation.send_event
Envoie un événement applicatif à une Automation sans attendre d'exécution. L'appel continue dès que l'événement est mis en file d'attente ; le démarrage éventuel d'une exécution n'est visible que dans Automations.
| Champ | Valeur |
|---|---|
input.automation_id | Obligatoire. ID d'une automatisation dans cet espace de travail. |
input.event | Obligatoire. Nom de l'événement de l'automatisation : de 1 à 128 lettres, chiffres, points, traits de soulignement ou traits d'union. |
input.data | Facultatif, par défaut {}. L'ensemble des données de l'événement. Ses valeurs de premier niveau acceptent les bind, ou l'objet entier peut être un seul $expr. Les valeurs plus imbriquées restent littérales. L'ensemble de input fait au plus 16 Kio. |
| Issues | success une fois l'événement mis en file d'attente, ou failure s'il ne peut pas l'être. Aucune des deux issues ne rend compte de l'exécution de l'automatisation. Une issue failure non connectée fait échouer l'exécution. |
Fin de l'appel
logic.exit
Met fin à l'appel avec un résultat.
| Champ | Valeur |
|---|---|
config.status | Requis. succeeded ou failed. |
config.reason | Optionnel, expr. Code stable composé de lettres minuscules, de chiffres et de _, commençant par une lettre ou un chiffre, jusqu'à 64 caractères. Omettez-le plutôt que d'envoyer null. |
input.output | Objet requis, qui peut être {}. Ses valeurs de premier niveau acceptent binds. |
| Résultats | Aucun. |
voice.hangup
Met fin à l'appel sans résultat défini. Ce nœud n'a ni champs ni résultats.
Consultez Utiliser les données d'application dans une séquence vocale pour voice.webhook.
Exemple : transfert vers une personne
Cette définition salue le destinataire, compose un numéro de support et enregistre si le transfert a abouti :
{
"schema_version": 1,
"expression_environment": "bird.cel.v1",
"nodes": [
{
"id": "start",
"type": "trigger.start_call",
"type_version": 1,
"config": {},
"input": {},
"connections": { "event": { "node_id": "greeting", "port": "input" } }
},
{
"id": "greeting",
"type": "voice.say",
"type_version": 1,
"config": {},
"input": { "text": "Connecting you to our support team.", "language": "en" },
"connections": { "next": { "node_id": "support", "port": "input" } }
},
{
"id": "support",
"type": "voice.dial",
"type_version": 3,
"config": {},
"input": { "type": "pstn", "pstn": { "dest": "+12025550123" }, "timeout_seconds": 30 },
"connections": {
"success": { "node_id": "connected", "port": "input" },
"busy": { "node_id": "unavailable", "port": "input" },
"no_answer": { "node_id": "unavailable", "port": "input" },
"failure": { "node_id": "unavailable", "port": "input" }
}
},
{
"id": "connected",
"type": "logic.exit",
"type_version": 1,
"config": { "status": "succeeded", "reason": "transferred" },
"input": { "output": {} }
},
{
"id": "unavailable",
"type": "logic.exit",
"type_version": 1,
"config": { "status": "failed", "reason": "support_unavailable" },
"input": { "output": {} }
}
]
}Envoyez-la en tant que sequence.definition avec "entry_node_id": "start" et "trigger_data": {}.
Ressources associées
Poursuivez avec la documentation, les guides et les exemples sur ce sujet.