Sign inGet Started

Dokumentacja węzłów sekwencji głosowej

Ostrzeżenie: Sekwencje głosowe są w wersji zapoznawczej. Kroki, dane wejściowe i format definicji sekwencji mogą się zmienić w sposób, który zepsuje istniejące sekwencje i żądania API.

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, z wyjątkiem 3 dla voice.dial.
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 60 000 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 zostanie 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 wybiera pierwszy spełniony.

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.
Wyjściebranch: 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.
WyjścieZapisany obiekt.

Połączenia i przekierowania

voice.dial

Dzwoni pod numer telefonu lub numer w jednym z przychodzących trunków SIP Twojego obszaru roboczego albo wywołuje grupę dzwonienia i łączy go z bieżącym połączeniem. Użyj type_version 3.

PoleWartość
input.typeWymagane. pstn, aby zadzwonić pod numer telefonu, sip_trunk, aby zadzwonić pod numer przez jeden z Twoich przychodzących trunków SIP, lub ring_group, aby wywołać członków grupy dzwonienia, którzy są online.
input.pstnWymagane, gdy type ma wartość pstn, w przeciwnym razie pomijane. Obiekt z dest i opcjonalnym orig.
input.sip_trunkWymagane, gdy type ma wartość sip_trunk, w przeciwnym razie pomijane. Obiekt z trunk_id, dest i opcjonalnym orig.
input.ring_groupWymagane, gdy type ma wartość ring_group, w przeciwnym razie pomijane. Obiekt z polem ring_group_id.
trunk_idWymagane w sip_trunk. ID przychodzącego trunku SIP w Twoim obszarze roboczym, na przykład spt_01jzj6c0p4f8b3x2m9k7q5r1tw. Tylko wartość literalna.
ring_group_idWymagane w ring_group. ID grupy dzwonienia w Twoim obszarze roboczym, w tym jego grupy domyślnej, na przykład vrg_01jzj6c0p4f8b3x2m9k7q5r1tw. Tylko wartość literalna.
destWymagane, binds. Dla pstn numer E.164, pod który należy zadzwonić, na przykład +12025550123. Dla sip_trunk numer, numer wewnętrzny lub nazwa, na przykład 1001: od 1 do 64 liter, cyfr i +*._-. Routing przychodzący trunku dostarcza połączenie tak, jakby przyszło na tę wartość.
origOpcjonalne, binds. Jeśli pominiesz właściwość orig, połączenie prezentuje numer Bird wybrany w połączeniu przychodzącym lub numer źródłowy w połączeniu wychodzącym. Dla pstn użyj identyfikatora dzwoniącego z obszaru roboczego lub numeru E.164 prawidłowego dzwoniącego z połączenia przychodzącego. Numery dzwoniących z połączeń przychodzących są wysyłane bez podpisu i mogą zostać odfiltrowane przez operatora odbierającego. Dla sip_trunk przyjmuje te same wartości co dest, na przykład sales.
input.timeout_secondsWymagane dla pstn i sip_trunk, pomijane dla ring_group, expr. Czas oczekiwania na odebranie w sekundach, łącznie z przełączaniem awaryjnym między bramami trunku, od 1 do 120. Nieodebrane połączenia wybierają no_answer; odebrane połączenie nie ma limitu.
Wynikisuccess, busy, no_answer i failure. success następuje po zakończeniu zestawionego połączenia i przywróceniu dźwięku pierwotnego połączenia, a nie w momencie odebrania przez odbiorcę. Trunk SIP, który odrzuca lub przekazuje połączenie dalej, wybiera failure. Niepodłączony failure powoduje niepowodzenie przebiegu. W przypadku grupy dzwonienia busy oznacza, że jej członkowie byli zajęci, odrzucili połączenie lub prowadzili inną rozmowę, no_answer oznacza, że nikt nie odebrał w ciągu 60 sekund lub nikt nie był online, a failure oznacza, że Bird nie mógł uruchomić dzwonienia do grupy.

Wersja 2 nie ma celu ring_group i zawsze wymaga timeout_seconds. Każde wejście poprawne w wersji 2 jest też poprawne w wersji 3, więc aktualizacja kroku niczego więcej nie zmienia.

Wersja 1 przyjmuje numer w input.to i nie ma orig. Kroki, które jej używają, nadal działają. Gdy zaktualizujesz krok w wersji 1 w edytorze, jego wartość to zostanie przeniesiona do pstn.dest.

logic.voice_goto

Uruchamia inne wejście w tej samej definicji. Nowa wizyta otrzymuje nowe 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.

Automations

automation.send_event

Wysyła zdarzenie aplikacji do automatyzacji bez czekania na przebieg. Połączenie trwa dalej, gdy tylko zdarzenie trafi do kolejki; to, czy przebieg się rozpoczął, widać tylko w Automations.

PoleWartość
input.automation_idWymagane. ID automatyzacji w tym obszarze roboczym.
input.eventWymagane. Nazwa zdarzenia automatyzacji: od 1 do 128 liter, cyfr, kropek, podkreśleń lub łączników.
input.dataOpcjonalne, domyślnie {}. Pełne dane zdarzenia. Jego wartości najwyższego poziomu obsługują bind albo cały obiekt może być jednym $expr. Wartości zagnieżdżone głębiej pozostają literalne. Całe input ma najwyżej 16 KiB.
Wynikisuccess, gdy zdarzenie trafi do kolejki, lub failure, jeśli nie może do niej trafić. Żaden z nich nie informuje o przebiegu automatyzacji. Niepodłączony failure powoduje niepowodzenie przebiegu.

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 wyników.

Informacje o voice.webhook znajdziesz w artykule Użyj danych aplikacji w sekwencji głosowej.

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

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.