Sign inGet Started

Référence des nœuds de séquence vocale

Warning: Voice sequences are in preview. Steps, entry data, and the sequence definition format can change in ways that break existing sequences and API requests.

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 sur cette page.
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.
Issuenext.

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 d'issue et les chiffres exacts qui la 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.
IssuesChaque 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 de l'issue quand aucun cas n'est vrai.
IssuesChaque port dans cases, et default_port.
Sortiebranch : le nom de l'issue sélectionnée.

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.
Issuenext.
SortieL'objet enregistré.

Appels et transferts

voice.dial

Appelle un autre numéro et le connecte à l'appel en cours.

ChampValeur
input.toObligatoire, binds. Numéro E.164, par exemple +12025550123.
input.timeout_secondsObligatoire, expr. Secondes de sonnerie, de 1 à 120.
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. Une issue failure non connectée fait échouer l'exécution.

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.
IssuesAucun.

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.

Étapes en accès anticipé

voice.webhook, voice.record_start, voice.record_stop et logic.voice_goto avec dependency_id pour la messagerie vocale gérée ou l'enregistrement d'appels sont en accès anticipé et ne sont pas documentés ici. Leur utilisation nécessite un accès pour votre espace de travail.

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": 1,
      "config": {},
      "input": { "to": "+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.