Sign inGet Started

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

FeldWert
schema_version1.
expression_environment"bird.cel.v1".
nodesArray aus Node-Objekten. Die Reihenfolge im Array hat keinen Einfluss auf die Ausführung.
settingsWeglassen oder {} senden. Ein nicht leeres Objekt schlägt mit unsupported_contract fehl; ein Wert, der kein Objekt ist, schlägt mit invalid_envelope fehl.
presentationOptionales Editor-Layout und Bezeichnungen. Hat keinen Einfluss auf die Ausführung, zählt aber zum Größenlimit.

Jeder Node hat diese Felder:

FeldWert
idEindeutig in der Definition. Beginnt mit einem Kleinbuchstaben, dann Kleinbuchstaben, Ziffern oder _, bis zu 64 Zeichen.
typeEin Node-Typ von dieser Seite, z. B. voice.say.
type_version1 für jeden Knotentyp auf dieser Seite, außer 3 für voice.dial.
configKonfiguration, die die Form des Knotens festlegt, z. B. deklarierte Outcomes. Verwenden Sie {}, wenn der Knoten keine hat.
inputWerte, die der Knoten bei der Ausführung verwendet. Verwenden Sie {}, wenn der Knoten keine hat.
connectionsZuordnung 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:

WertInhalt
trigger.dataDie Entry-Daten, passend zum data_schema des Entry.
trigger.node_idDie ID des Entry, der diesen Visit gestartet hat.
trigger.typeDer Typ des Entry, der diesen Visit gestartet hat, zum Beispiel trigger.start_call.
steps.<id>.outputAusgabe eines zuvor abgeschlossenen Node in diesem Visit.
variables.<key>Werte, die ein data.set-Node in diesem Visit gespeichert hat.
execution.id, execution.started_atDie Ausführungs-ID und deren Startzeit. Verwenden Sie string(execution.started_at) in Sprachausgaben.
execution.callid, 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.

FeldWert
config.data_schemaOptionales JSON-Schema-Objektschema (Draft 2020-12) für trigger_data. Nur lokale $ref werden unterstützt. Ohne Angabe akzeptiert der Entry nur {}.
Outcomeevent.

Eingabedaten sind auf 16 KiB begrenzt.

Sprache und Audio

voice.say

FeldWert
input.textErforderlich, binds. Zu sprechender Text, maximal 160 Bytes.
input.languageErforderlich. Sprachcode für die Sprachausgabe, z. B. en.
Outcomenext.

voice.play

FeldWert
input.asset_idErforderlich. 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.
Outcomenext.

voice.tone

FeldWert
input.frequency_hzErforderlich. 100 bis 3000.
input.duration_msErforderlich. 1 bis 10000.
Outcomenext.

logic.pause

Wartet bei verbundenem Anruf.

FeldWert
input.duration_msErforderlich. 1 bis 60000.
Outcomenext.

Tastatureingabe

voice.gather

Spielt Ansagen ab, die ein Tastendruck unterbricht, und sammelt Tastatureingaben.

FeldWert
input.promptsErforderlich. 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_digitsErforderlich. 1 bis 32.
input.timeout_secondsErforderlich. Sekunden Wartezeit auf die erste Taste, 1 bis 10.
input.inter_digit_timeout_secondsErforderlich. Sekunden Wartezeit zwischen Tasten, 1 bis 5.
input.finish_on_keyErforderlich. Eines von 0–9, *, #, A–D, das die Eingabe beendet, oder null.
input.matchesErforderlich. 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.privateOptional, Standard false. Bei true können spätere Schritte die Ziffern nicht lesen, und sie werden im Trace weggelassen.
OutcomesJeder Name in matches, timeout, wenn keine Taste gedrückt wird, und fallback für jede andere Eingabe.
Outputdigits 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.

FeldWert
config.casesErforderlich. Mindestens ein {"port": "<name>", "when": {"$expr": "<boolean>"}}.
config.default_portErforderlich. Outcome-Name, wenn kein Fall zutrifft.
OutcomesJeder port in cases und default_port.
Outputbranch: der ausgewählte Outcome-Name.

data.set

Speichert Werte für spätere Schritte im selben Visit.

FeldWert
inputObjekt 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.
Outcomenext.
OutputDas 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.

FeldWert
input.typeErforderlich. 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.pstnErforderlich, wenn type den Wert pstn hat, sonst weglassen. Objekt mit dest und optional orig.
input.sip_trunkErforderlich, wenn type den Wert sip_trunk hat, sonst weglassen. Objekt mit trunk_id, dest und optional orig.
input.ring_groupErforderlich, wenn type den Wert ring_group hat, sonst weglassen. Objekt mit ring_group_id.
trunk_idErforderlich in sip_trunk. ID eines eingehenden SIP-Trunks in Ihrem Workspace, z. B. spt_01jzj6c0p4f8b3x2m9k7q5r1tw. Nur literaler Wert.
ring_group_idErforderlich in ring_group. ID einer Ringgruppe in Ihrem Workspace, einschließlich ihrer Standardgruppe, z. B. vrg_01jzj6c0p4f8b3x2m9k7q5r1tw. Nur literaler Wert.
destErforderlich, 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.
origOptional, 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_secondsErforderlich 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.
Outcomessuccess, 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.

FeldWert
input.entry_node_idErforderlich. ID eines trigger.start_call-Knotens in dieser Definition.
input.dataOptional, expr, Standard {}. Eingabedaten für das Schema dieses Knotens.
OutcomesKeine.

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.

FeldWert
input.automation_idErforderlich. ID einer Automation in diesem Workspace.
input.eventErforderlich. Der Ereignisname der Automation: 1 bis 128 Buchstaben, Ziffern, Punkte, Unterstriche oder Bindestriche.
input.dataOptional, 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ß.
Outcomessuccess, 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.

FeldWert
config.statusErforderlich. succeeded oder failed.
config.reasonOptional, 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.outputErforderliches Objekt, das {} sein kann. Seine Werte auf oberster Ebene unterstützen bind.
OutcomesKeine.

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:

Codebeispiel
{
  "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": {}.

Weiter mit der Dokumentation, Anleitungen und Beispielen zu diesem Thema.