Sign inGet Started

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

ChampValeur
schema_version1.
expression_environment"bird.cel.v1".
nodesTableau d'objets de nœud. L'ordre du tableau n'a aucun effet sur l'exécution.
settingsOmettez-le ou envoyez {}. Un objet non vide échoue avec unsupported_contract ; une valeur qui n’est pas un objet échoue avec invalid_envelope.
presentationDisposition 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 :

ChampValeur
idUnique dans la définition. Commence par une lettre minuscule, puis lettres minuscules, chiffres ou _, jusqu'à 64 caractères.
typeUn type de nœud de cette page, par exemple voice.say.
type_version1 pour chaque type de nœud de cette page, sauf 3 pour voice.dial.
configConfiguration qui fixe la forme du nœud, comme les résultats déclarés. Utilisez {} quand le nœud n'en a pas.
inputValeurs que le nœud utilise lors de son exécution. Utilisez {} quand le nœud n'en a pas.
connectionsCorrespondance 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 :

ValeurContenu
trigger.dataLes données d'entrée, correspondant au data_schema de l'entrée.
trigger.node_idL'identifiant de l'entrée qui a démarré cette visite.
trigger.typeLe type de l’entrée qui a démarré cette visite, par exemple trigger.start_call.
steps.<id>.outputSortie 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_atL'identifiant de l'exécution et son heure de début. Utilisez string(execution.started_at) dans la synthèse vocale.
execution.callLe 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.

ChampValeur
config.data_schemaSché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ésultatevent.

Les données d'entrée sont limitées à 16 Kio.

Parole et audio

voice.say

ChampValeur
input.textRequis, binds. Texte à prononcer, 160 octets maximum.
input.languageRequis. Code de langue vocale, par exemple en.
Résultatnext.

voice.play

ChampValeur
input.asset_idObligatoire. 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ésultatnext.

voice.tone

ChampValeur
input.frequency_hzRequis. 100 à 3000.
input.duration_msRequis. 1 à 10000.
Résultatnext.

logic.pause

Attend avec l'appel connecté.

ChampValeur
input.duration_msRequis. 1 à 60000.
Résultatnext.

Saisie au clavier

voice.gather

Joue des invites, qu'une pression de touche interrompt, et collecte les chiffres saisis au clavier.

ChampValeur
input.promptsObligatoire. 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_digitsObligatoire. 1 à 32.
input.timeout_secondsObligatoire. Secondes d'attente avant la première touche, 1 à 10.
input.inter_digit_timeout_secondsObligatoire. Secondes d'attente entre les touches, 1 à 5.
input.finish_on_keyRequis. Un parmi 0–9, *, #, A–D qui met fin à la saisie, ou null.
input.matchesRequis. 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.privateOptionnel, par défaut false. Quand true, les étapes suivantes ne peuvent pas lire les chiffres, et ceux-ci sont exclus de la trace.
RésultatsChaque nom dans matches, timeout quand aucune touche n'est pressée, et fallback pour toute autre saisie.
Sortiedigits 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.

ChampValeur
config.casesObligatoire. Au moins un {"port": "<name>", "when": {"$expr": "<boolean>"}}.
config.default_portObligatoire. Nom du résultat quand aucun cas n'est vrai.
RésultatsChaque port dans cases, et default_port.
Sortiebranch : le nom du résultat sélectionné.

data.set

Enregistre des valeurs pour les étapes suivantes de la même visite.

ChampValeur
inputObjet 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ésultatnext.
SortieL'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.

ChampValeur
input.typeObligatoire. 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.pstnObligatoire quand type vaut pstn, omis sinon. Objet avec dest et orig facultatif.
input.sip_trunkObligatoire quand type vaut sip_trunk, omis sinon. Objet avec trunk_id, dest et orig facultatif.
input.ring_groupObligatoire quand type vaut ring_group, omis sinon. Objet avec ring_group_id.
trunk_idObligatoire dans sip_trunk. ID d'un trunk SIP entrant de votre espace de travail, par exemple spt_01jzj6c0p4f8b3x2m9k7q5r1tw. Valeur littérale uniquement.
ring_group_idObligatoire 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.
destObligatoire, 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.
origFacultatif, 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_secondsObligatoire 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é.
Issuessuccess, 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.

ChampValeur
input.entry_node_idObligatoire. ID d'un nœud trigger.start_call dans cette définition.
input.dataFacultatif, expr, par défaut {}. Données d'entrée pour le schéma de ce nœud.
RésultatsAucun.

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.

ChampValeur
input.automation_idObligatoire. ID d'une automatisation dans cet espace de travail.
input.eventObligatoire. Nom de l'événement de l'automatisation : de 1 à 128 lettres, chiffres, points, traits de soulignement ou traits d'union.
input.dataFacultatif, 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.
Issuessuccess 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.

ChampValeur
config.statusRequis. succeeded ou failed.
config.reasonOptionnel, 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.outputObjet requis, qui peut être {}. Ses valeurs de premier niveau acceptent binds.
RésultatsAucun.

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 :

Exemple de code
{
  "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": {}.

Poursuivez avec la documentation, les guides et les exemples sur ce sujet.