Referenz der Voice-Sequence-Nodes
Warnung: Voice Sequences befinden sich in der Vorschau. Schritte, Entry-Daten und das Format der Sequence-Definition können sich so ändern, dass bestehende Sequences und API-Requests nicht mehr funktionieren.
Verwenden Sie diese Referenz, um die sequence.definition zu schreiben, die Sie mit Anruf erstellen senden. Bird führt eine Inline-Definition einmalig aus und speichert sie nicht. Um eine Sequence dauerhaft zu behalten, erstellen Sie sie im Dashboard-Editor.
Definition
| Feld | Wert |
|---|---|
schema_version | 1. |
expression_environment | "bird.cel.v1". |
nodes | Array aus Node-Objekten. Die Reihenfolge im Array hat keinen Einfluss auf die Ausführung. |
settings | Weglassen oder {} senden. Ein nicht leeres Objekt schlägt mit unsupported_contract fehl; ein Wert, der kein Objekt ist, schlägt mit invalid_envelope fehl. |
presentation | Optionales Editor-Layout und Bezeichnungen. Hat keinen Einfluss auf die Ausführung, zählt aber zum Größenlimit. |
Jeder Node hat diese Felder:
| Feld | Wert |
|---|---|
id | Eindeutig in der Definition. Beginnt mit einem Kleinbuchstaben, dann Kleinbuchstaben, Ziffern oder _, bis zu 64 Zeichen. |
type | Ein Node-Typ von dieser Seite, z. B. voice.say. |
type_version | 1 für jeden Knotentyp auf dieser Seite, außer 3 für voice.dial. |
config | Konfiguration, die die Form des Knotens festlegt, z. B. deklarierte Outcomes. Verwenden Sie {}, wenn der Knoten keine hat. |
input | Werte, die der Knoten bei der Ausführung verwendet. Verwenden Sie {}, wenn der Knoten keine hat. |
connections | Zuordnung von einem Outcome-Namen zu { "node_id": "<target>", "port": "input" }. |
Verbindungen dürfen keine Schleife bilden, und jeder Knoten muss von einem Einstiegspunkt aus erreichbar sein. Ein Outcome, das in connections fehlt, ist nicht verbunden. Nicht verbundene Outcomes beenden den Durchlauf normal, sofern ein Knoten nichts anderes vorgibt.
Werte und Ausdrücke
Die meisten Felder akzeptieren literale JSON. Mit binds gekennzeichnete Felder akzeptieren auch $expr oder $template; mit expr gekennzeichnete Felder akzeptieren nur $expr:
{"$expr": "trigger.data.customer_name"}gibt einen typisierten Wert zurück.{"$template": ["Hello ", {"$expr": "trigger.data.customer_name"}, "."]}gibt Text zurück. Templates sind Arrays;{{name}}bleibt literaler Text.
Ausdrücke verwenden CEL und können diese Werte lesen:
| Wert | Inhalt |
|---|---|
trigger.data | Die Entry-Daten, passend zum data_schema des Entry. |
trigger.node_id | Die ID des Entry, der diesen Visit gestartet hat. |
trigger.type | Der Typ des Entry, der diesen Visit gestartet hat, zum Beispiel trigger.start_call. |
steps.<id>.output | Ausgabe eines zuvor abgeschlossenen Node in diesem Visit. |
variables.<key> | Werte, die ein data.set-Node in diesem Visit gespeichert hat. |
execution.id, execution.started_at | Die Ausführungs-ID und deren Startzeit. Verwenden Sie string(execution.started_at) in Sprachausgaben. |
execution.call | id, session_id des Anrufs sowie die ursprünglichen Parteien orig und dest, die jeweils null sein können. |
Prüfen Sie optionale Werte, bevor Sie sie lesen, zum Beispiel has(trigger.data.name) ? trigger.data.name : 'caller'. Das Makro has ist verfügbar; map, filter, all, exists und exists_one sind es nicht.
Entry
trigger.start_call
Hier beginnt ein Anruf. entry_node_id im Create-Call-Request benennt diesen Knoten.
| Feld | Wert |
|---|---|
config.data_schema | Optionales JSON-Schema-Objektschema (Draft 2020-12) für trigger_data. Nur lokale $ref werden unterstützt. Ohne Angabe akzeptiert der Entry nur {}. |
| Outcome | event. |
Eingabedaten sind auf 16 KiB begrenzt.
Sprache und Audio
voice.say
| Feld | Wert |
|---|---|
input.text | Erforderlich, binds. Zu sprechender Text, maximal 160 Bytes. |
input.language | Erforderlich. Sprachcode für die Sprachausgabe, z. B. en. |
| Outcome | next. |
voice.play
| Feld | Wert |
|---|---|
input.asset_id | Erforderlich. ID eines Audio-Assets, das in diesem Workspace verfügbar ist. Ein nicht verfügbares Asset kann den Anruf bei der Ausführung des Schritts fehlschlagen lassen. |
| Outcome | next. |
voice.tone
| Feld | Wert |
|---|---|
input.frequency_hz | Erforderlich. 100 bis 3000. |
input.duration_ms | Erforderlich. 1 bis 10000. |
| Outcome | next. |
logic.pause
Wartet bei verbundenem Anruf.
| Feld | Wert |
|---|---|
input.duration_ms | Erforderlich. 1 bis 60000. |
| Outcome | next. |
Tastatureingabe
voice.gather
Spielt Ansagen ab, die ein Tastendruck unterbricht, und sammelt Tastatureingaben.
| Feld | Wert |
|---|---|
input.prompts | Erforderlich. Bis zu 4 Prompts. Jeder ist {"type": "say", "text", "language"}, {"type": "play", "asset_id"}, {"type": "tone", "frequency_hz", "duration_ms"} oder {"type": "pause", "duration_ms"}, mit denselben Beschränkungen wie der entsprechende Node. Ton- und Pausendauer zusammen betragen höchstens 60.000 ms. Prompt text binds. |
input.max_digits | Erforderlich. 1 bis 32. |
input.timeout_seconds | Erforderlich. Sekunden Wartezeit auf die erste Taste, 1 bis 10. |
input.inter_digit_timeout_seconds | Erforderlich. Sekunden Wartezeit zwischen Tasten, 1 bis 5. |
input.finish_on_key | Erforderlich. Eines von 0–9, *, #, A–D, das die Eingabe beendet, oder null. |
input.matches | Erforderlich. Zuordnung von einem Outcome-Namen zu den exakten Ziffern, die ihn auswählen, z. B. {"hours": "1"}. Namen und Ziffern müssen eindeutig sein. Ein Name darf nicht input, timeout oder fallback sein. Ziffern sind höchstens max_digits lang und dürfen finish_on_key nicht enthalten. |
input.private | Optional, Standard false. Bei true können spätere Schritte die Ziffern nicht lesen, und sie werden im Trace weggelassen. |
| Outcomes | Jeder Name in matches, timeout, wenn keine Taste gedrückt wird, und fallback für jede andere Eingabe. |
| Output | digits und reason: initial_timeout, max_digits, finish_key oder inter_digit_timeout. |
Logik und Daten
logic.branch
Prüft Bedingungen der Reihe nach und folgt der ersten, die zutrifft.
| Feld | Wert |
|---|---|
config.cases | Erforderlich. Mindestens ein {"port": "<name>", "when": {"$expr": "<boolean>"}}. |
config.default_port | Erforderlich. Outcome-Name, wenn kein Fall zutrifft. |
| Outcomes | Jeder port in cases und default_port. |
| Output | branch: der ausgewählte Outcome-Name. |
data.set
Speichert Werte für spätere Schritte im selben Visit.
| Feld | Wert |
|---|---|
input | Objekt mit Werten, von denen jeder binds unterstützt. Jeder Schlüssel wird zu variables.<key>. Jeder Wert wird aus den Variablen berechnet, wie sie vor diesem Node waren. |
| Outcome | next. |
| Output | Das gespeicherte Objekt. |
Anrufe und Weiterleitungen
voice.dial
Ruft eine Telefonnummer oder eine Nummer auf einem der eingehenden SIP-Trunks Ihres Workspace an oder lässt eine Ring Group klingeln und verbindet sie mit dem aktuellen Anruf. Verwenden Sie type_version 3.
| Feld | Wert |
|---|---|
input.type | Erforderlich. pstn, um eine Telefonnummer anzurufen, sip_trunk, um eine Nummer über einen Ihrer eingehenden SIP-Trunks anzurufen, oder ring_group, um die online verfügbaren Mitglieder einer Ring Group klingeln zu lassen. |
input.pstn | Erforderlich, wenn type den Wert pstn hat, sonst weglassen. Objekt mit dest und optional orig. |
input.sip_trunk | Erforderlich, wenn type den Wert sip_trunk hat, sonst weglassen. Objekt mit trunk_id, dest und optional orig. |
input.ring_group | Erforderlich, wenn type den Wert ring_group hat, sonst weglassen. Objekt mit ring_group_id. |
trunk_id | Erforderlich in sip_trunk. ID eines eingehenden SIP-Trunks in Ihrem Workspace, z. B. spt_01jzj6c0p4f8b3x2m9k7q5r1tw. Nur literaler Wert. |
ring_group_id | Erforderlich in ring_group. ID einer Ringgruppe in Ihrem Workspace, einschließlich ihrer Standardgruppe, z. B. vrg_01jzj6c0p4f8b3x2m9k7q5r1tw. Nur literaler Wert. |
dest | Erforderlich, binds. Bei pstn die anzurufende E.164-Nummer, z. B. +12025550123. Bei sip_trunk eine Nummer, Durchwahl oder ein Name, z. B. 1001: 1 bis 64 Buchstaben, Ziffern und +*._-. Das eingehende Routing des Trunks stellt den Anruf so zu, als wäre er für diesen Wert eingegangen. |
orig | Optional, binds. Wenn Sie die Eigenschaft orig weglassen, zeigt der Anruf bei einem eingehenden Anruf die gewählte Bird-Nummer und bei einem ausgehenden Anruf die Ursprungsnummer an. Verwenden Sie bei pstn eine Anrufer-ID des Workspace oder die E.164-Nummer des gültigen eingehenden Anrufers. Nummern eingehender Anrufer werden unsigniert gesendet und können vom empfangenden Netzbetreiber geprüft werden. Bei sip_trunk akzeptiert das Feld dieselben Werte wie dest, z. B. sales. |
input.timeout_seconds | Erforderlich bei pstn und sip_trunk, bei ring_group weglassen, expr. Sekunden Wartezeit auf eine Annahme, einschließlich Failover zwischen Trunk-Gateways, 1 bis 120. Unbeantwortete Anrufe nehmen no_answer; ein angenommener Anruf ist nicht begrenzt. |
| Outcomes | success, busy, no_answer und failure. success folgt, nachdem der verbundene Anruf endet und das Audio des ursprünglichen Anrufs wiederhergestellt ist, nicht wenn das Ziel abnimmt. Ein SIP-Trunk, der den Anruf ablehnt oder weiterleitet, wählt failure. Ein nicht verbundenes failure lässt den Durchlauf fehlschlagen. Bei einer Ring Group bedeutet busy, dass ihre Mitglieder besetzt waren, abgelehnt haben oder in einem anderen Anruf waren, no_answer, dass innerhalb von 60 Sekunden niemand abgenommen hat oder niemand online war, und failure, dass Bird die Gruppe nicht klingeln lassen konnte. |
Version 2 hat kein ring_group-Ziel und erfordert immer timeout_seconds. Jede Eingabe für Version 2 ist auch in Version 3 gültig. Ein Upgrade eines Schritts ändert daher sonst nichts.
Version 1 erwartet die Nummer in input.to und hat kein orig. Schritte, die diese Version verwenden, laufen weiter. Wenn Sie einen Schritt der Version 1 im Editor upgraden, wird sein to-Wert nach pstn.dest verschoben.
logic.voice_goto
Startet einen weiteren Entry in derselben Definition. Der neue Visit erhält frische trigger.data und löscht die Ausgaben und Variablen vorheriger Schritte; der Anruf läuft weiter.
| Feld | Wert |
|---|---|
input.entry_node_id | Erforderlich. ID eines trigger.start_call-Knotens in dieser Definition. |
input.data | Optional, expr, Standard {}. Eingabedaten für das Schema dieses Knotens. |
| Outcomes | Keine. |
Automations
automation.send_event
Sendet ein Anwendungsereignis an eine Automation, ohne auf einen Durchlauf zu warten. Der Anruf läuft weiter, sobald das Ereignis in die Warteschlange gestellt ist. Ob ein Durchlauf startet, sehen Sie nur in Automations.
| Feld | Wert |
|---|---|
input.automation_id | Erforderlich. ID einer Automation in diesem Workspace. |
input.event | Erforderlich. Der Ereignisname der Automation: 1 bis 128 Buchstaben, Ziffern, Punkte, Unterstriche oder Bindestriche. |
input.data | Optional, Standard {}. Die gesamten Daten des Ereignisses. Seine Werte auf oberster Ebene unterstützen bind, oder das ganze Objekt kann ein einzelnes $expr sein. Tiefer verschachtelte Werte bleiben literal. Das gesamte input ist höchstens 16 KiB groß. |
| Outcomes | success, sobald das Ereignis in die Warteschlange gestellt ist, oder failure, wenn das nicht möglich ist. Keines der beiden meldet den Durchlauf der Automation. Ein nicht verbundenes failure lässt den Durchlauf fehlschlagen. |
Anruf beenden
logic.exit
Beendet den Anruf mit einem Ergebnis.
| Feld | Wert |
|---|---|
config.status | Erforderlich. succeeded oder failed. |
config.reason | Optional, expr. Stabiler Code aus Kleinbuchstaben, Ziffern und _, beginnend mit einem Buchstaben oder einer Ziffer, bis zu 64 Zeichen. Lassen Sie ihn weg, statt null zu senden. |
input.output | Erforderliches Objekt, das {} sein kann. Seine Werte auf oberster Ebene unterstützen bind. |
| Outcomes | Keine. |
voice.hangup
Beendet den Anruf ohne ein verfasstes Ergebnis. Der Knoten hat keine Felder und keine Outcomes.
Informationen zu voice.webhook finden Sie unter Anwendungsdaten in einer Voice Sequence verwenden.
Beispiel: Weiterleitung an eine Person
Diese Definition begrüßt den Empfänger, wählt eine Supportnummer und protokolliert, ob die Weiterleitung verbunden wurde:
{
"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": {} }
}
]
}Senden Sie sie als sequence.definition mit "entry_node_id": "start" und "trigger_data": {}.
Verwandte Ressourcen
Weiter mit der Dokumentation, Anleitungen und Beispielen zu diesem Thema.