Sign inGet Started

Dokumentacja węzłów sekwencji głosowej

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.

Użyj tej dokumentacji, aby napisać sequence.definition, który wysyłasz za pomocą Create Call. Bird uruchamia definicję inline jednorazowo i nie zapisuje jej. Aby zachować sekwencję, zbuduj ją w edytorze dashboardu.

Definicja

PoleWartość
schema_version1.
expression_environment"bird.cel.v1".
nodesTablica obiektów węzłów. Kolejność elementów tablicy nie wpływa na wykonanie.
settingsPomiń lub wyślij {}. Niepusty obiekt powoduje błąd unsupported_contract; wartość, która nie jest obiektem, powoduje błąd invalid_envelope.
presentationOpcjonalny układ i etykiety edytora. Nie wpływa na wykonanie, ale wlicza się do limitów rozmiaru.

Każdy węzeł ma następujące pola:

PoleWartość
idUnikalny w definicji. Zaczyna się od małej litery, potem małe litery, cyfry lub _, do 64 znaków.
typeTyp węzła z tej strony, na przykład voice.say.
type_version1 dla każdego typu węzła na tej stronie.
configKonfiguracja ustalająca kształt węzła, na przykład zadeklarowane wyniki. Użyj {}, gdy węzeł ich nie ma.
inputWartości używane przez węzeł podczas wykonywania. Użyj {}, gdy węzeł ich nie ma.
connectionsMapa z nazwy wyniku do { "node_id": "<target>", "port": "input" }.

Połączenia nie mogą tworzyć pętli, a każdy węzeł musi być osiągalny z punktu wejścia. Wynik pominięty w connections jest niepodłączony. Niepodłączone wyniki kończą przebieg normalnie, chyba że węzeł określa inaczej.

Wartości i wyrażenia

Większość pól przyjmuje literalne JSON. Pola oznaczone binds przyjmują również $expr lub $template; pola oznaczone expr przyjmują również wyłącznie $expr:

  • {"$expr": "trigger.data.customer_name"} zwraca wartość typowaną.
  • {"$template": ["Hello ", {"$expr": "trigger.data.customer_name"}, "."]} zwraca tekst. Szablony są tablicami; {{name}} pozostaje tekstem literalnym.

Wyrażenia używają CEL i mogą odczytywać następujące wartości:

WartośćZawartość
trigger.dataDane wejściowe, zgodne z data_schema wejścia.
trigger.node_idIdentyfikator wejścia, które rozpoczęło tę wizytę.
trigger.typeTyp wejścia, które rozpoczęło tę wizytę, na przykład trigger.start_call.
steps.<id>.outputWynik wcześniej ukończonego węzła w tej wizycie.
variables.<key>Wartości zapisane przez węzeł data.set w tej wizycie.
execution.id, execution.started_atIdentyfikator uruchomienia i czas jego rozpoczęcia. Użyj string(execution.started_at) w mowie.
execution.callid połączenia, session_id oraz oryginalne strony orig i dest, z których każda może być null.

Zabezpiecz wartości opcjonalne przed ich odczytaniem, na przykład has(trigger.data.name) ? trigger.data.name : 'caller'. Makro has jest dostępne; map, filter, all, exists i exists_one nie są dostępne.

Wejście

trigger.start_call

Miejsce, w którym połączenie się rozpoczyna. entry_node_id w żądaniu Create Call wskazuje ten węzeł.

PoleWartość
config.data_schemaOpcjonalny schemat obiektu JSON Schema (draft 2020-12) dla trigger_data. Obsługiwany jest tylko lokalny $ref. Bez niego wejście akceptuje jedynie {}.
Wynikevent.

Dane wejściowe są ograniczone do 16 KiB.

Mowa i dźwięk

voice.say

PoleWartość
input.textWymagane, binds. Tekst do odczytania, maksymalnie 160 bajtów.
input.languageWymagane. Kod języka mowy, na przykład en.
Wyniknext.

voice.play

PoleWartość
input.asset_idWymagane. ID zasobu audio dostępnego w tym obszarze roboczym. Niedostępny zasób może spowodować niepowodzenie połączenia w momencie wykonania kroku.
Wyniknext.

voice.tone

PoleWartość
input.frequency_hzWymagane. 100 do 3000.
input.duration_msWymagane. 1 do 10000.
Wyniknext.

logic.pause

Czeka z aktywnym połączeniem.

PoleWartość
input.duration_msWymagane. 1 do 60000.
Wyniknext.

Wprowadzanie z klawiatury

voice.gather

Odtwarza komunikaty, które naciśnięcie klawisza przerywa, i zbiera cyfry z klawiatury.

PoleWartość
input.promptsWymagane. Maksymalnie 4 komunikaty. Każdy to {"type": "say", "text", "language"}, {"type": "play", "asset_id"}, {"type": "tone", "frequency_hz", "duration_ms"} lub {"type": "pause", "duration_ms"}, z takimi samymi limitami jak odpowiadający węzeł. Łączny czas trwania tonów i pauz wynosi najwyżej 60000 ms. text komunikatu obsługuje binds.
input.max_digitsWymagane. Od 1 do 32.
input.timeout_secondsWymagane. Sekundy oczekiwania na pierwszy klawisz, od 1 do 10.
input.inter_digit_timeout_secondsWymagane. Sekundy oczekiwania między klawiszami, od 1 do 5.
input.finish_on_keyWymagane. Jeden z 0–9, *, #, A–D kończący wprowadzanie, lub null.
input.matchesWymagane. Mapa z nazwy wyniku na dokładne cyfry, które go wybierają, na przykład {"hours": "1"}. Nazwy i cyfry muszą być unikalne. Nazwa nie może być input, timeout ani fallback. Cyfry mają co najwyżej max_digits znaków i nie mogą zawierać finish_on_key.
input.privateOpcjonalne, domyślnie false. Gdy true, późniejsze kroki nie mogą odczytać cyfr, a cyfry są pomijane w śladzie.
WynikiKażda nazwa w matches, timeout gdy żaden klawisz nie został naciśnięty, oraz fallback dla każdego innego wejścia.
Wyjściedigits i reason: initial_timeout, max_digits, finish_key lub inter_digit_timeout.

Logika i dane

logic.branch

Sprawdza warunki po kolei i podąża za pierwszym, który jest prawdziwy.

PoleWartość
config.casesWymagane. Co najmniej jeden {"port": "<name>", "when": {"$expr": "<boolean>"}}.
config.default_portWymagane. Nazwa wyniku, gdy żaden przypadek nie jest prawdziwy.
WynikiKażdy port w cases oraz default_port.
Dane wyjściowebranch: nazwa wybranego wyniku.

data.set

Zapisuje wartości dla późniejszych kroków w tej samej wizycie.

PoleWartość
inputObiekt wartości, z których każda obsługuje binds. Każdy klucz staje się variables.<key>. Każda wartość jest obliczana na podstawie zmiennych w stanie sprzed tego węzła.
Wyniknext.
OutputZapisany obiekt.

Połączenia i przekierowania

voice.dial

Dzwoni pod inny numer i łączy go z bieżącym połączeniem.

PoleWartość
input.toWymagane, binds. Numer E.164, np. +12025550123.
input.timeout_secondsWymagane, expr. Czas dzwonienia w sekundach, od 1 do 120.
Wynikisuccess, busy, no_answer i failure. success następuje po zakończeniu połączonego połączenia i przywróceniu dźwięku oryginalnego połączenia, a nie w momencie odebrania przez odbiorcę. Niepodłączony failure powoduje niepowodzenie przebiegu.

logic.voice_goto

Rozpoczyna nowe wejście w tej samej definicji. Nowa wizyta otrzymuje świeże trigger.data i czyści wyjścia oraz zmienne wcześniejszych kroków; połączenie trwa dalej.

PoleWartość
input.entry_node_idWymagane. ID węzła trigger.start_call w tej definicji.
input.dataOpcjonalne, expr, domyślnie {}. Dane wejściowe dla schematu tego węzła.
WynikiBrak.

Kończenie połączenia

logic.exit

Kończy połączenie z wynikiem.

PoleWartość
config.statusWymagane. succeeded lub failed.
config.reasonOpcjonalne, expr. Stały kod złożony z małych liter, cyfr i _, zaczynający się od litery lub cyfry, do 64 znaków. Pomiń go zamiast wysyłać null.
input.outputWymagany obiekt, który może być {}. Jego wartości najwyższego poziomu obsługują binds.
WynikiBrak.

voice.hangup

Kończy połączenie bez zdefiniowanego wyniku. Nie ma pól ani rezultatów.

Kroki we wczesnym dostępie

voice.webhook, voice.record_start, voice.record_stop i logic.voice_goto z dependency_id do zarządzanej poczty głosowej lub nagrywania rozmów są w fazie wczesnego dostępu i nie są tu udokumentowane. Korzystanie z nich wymaga dostępu dla Twojego obszaru roboczego.

Przykład: przekierowanie do osoby

Ta definicja wita odbiorcę, wybiera numer wsparcia i rejestruje, czy przekierowanie zostało połączone:

Przykład kodu
{
  "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": {} }
    }
  ]
}

Wyślij ją jako sequence.definition z "entry_node_id": "start" i "trigger_data": {}.

Przejdź do dokumentacji, przewodników i przykładów dotyczących tego tematu.