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 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 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 zestawionego połączenia i przywróceniu dźwięku pierwotnego połączenia, a nie w momencie odebrania przez odbiorcę. Niepodłączony failure powoduje niepowodzenie przebiegu.

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.

Automatyzacje

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

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.

Kroki we wczesnym dostępie

voice.webhook jest we wczesnym dostępie i nie jest tu dokumentowany. Korzystanie z niego wymaga dostępu dla Twojego obszaru roboczego. voice.record_start, voice.record_stop i logic.voice_goto z dependency_id dla zarządzanej poczty głosowej lub nagrywania rozmów również nie są tu dokumentowane.

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.