Sign inGet Started

Referenz der Voice-Sequence-Nodes

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.

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

voice.tone

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

logic.pause

Wartet bei verbundenem Anruf.

FeldWert
input.duration_msErforderlich. 1 bis 60000.
Ergebnisnext.

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 andere Nummer an und verbindet sie mit dem aktuellen Anruf.

FeldWert
input.toErforderlich, binds. E.164-Nummer, z. B. +12025550123.
input.timeout_secondsErforderlich, expr. Sekunden, die es klingelt, 1 bis 120.
Ergebnissesuccess, 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 nicht verbundenes failure lässt den Durchlauf fehlschlagen.

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

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 binds.
OutcomesKeine.

voice.hangup

Beendet den Anruf ohne ein verfasstes Ergebnis. Der Knoten hat keine Felder und keine Outcomes.

Early-Access-Schritte

voice.webhook, voice.record_start, voice.record_stop und logic.voice_goto mit dependency_id für verwaltete Voicemail oder Anrufaufzeichnung befinden sich im Early Access und sind hier nicht dokumentiert. Die Nutzung erfordert Zugang für Ihren Workspace.

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

Senden Sie es als sequence.definition mit "entry_node_id": "start" und "trigger_data": {}.

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