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
| Pole | Wartość |
|---|---|
schema_version | 1. |
expression_environment | "bird.cel.v1". |
nodes | Tablica obiektów węzłów. Kolejność elementów tablicy nie wpływa na wykonanie. |
settings | Pomiń lub wyślij {}. Niepusty obiekt powoduje błąd unsupported_contract; wartość, która nie jest obiektem, powoduje błąd invalid_envelope. |
presentation | Opcjonalny 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:
| Pole | Wartość |
|---|---|
id | Unikalny w definicji. Zaczyna się od małej litery, potem małe litery, cyfry lub _, do 64 znaków. |
type | Typ węzła z tej strony, na przykład voice.say. |
type_version | 1 dla każdego typu węzła na tej stronie, z wyjątkiem 3 dla voice.dial. |
config | Konfiguracja ustalająca kształt węzła, na przykład zadeklarowane wyniki. Użyj {}, gdy węzeł ich nie ma. |
input | Wartości używane przez węzeł podczas wykonywania. Użyj {}, gdy węzeł ich nie ma. |
connections | Mapa 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.data | Dane wejściowe, zgodne z data_schema wejścia. |
trigger.node_id | Identyfikator wejścia, które rozpoczęło tę wizytę. |
trigger.type | Typ wejścia, które rozpoczęło tę wizytę, na przykład trigger.start_call. |
steps.<id>.output | Wynik 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_at | Identyfikator uruchomienia i czas jego rozpoczęcia. Użyj string(execution.started_at) w mowie. |
execution.call | id 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ł.
| Pole | Wartość |
|---|---|
config.data_schema | Opcjonalny schemat obiektu JSON Schema (draft 2020-12) dla trigger_data. Obsługiwany jest tylko lokalny $ref. Bez niego wejście akceptuje jedynie {}. |
| Wynik | event. |
Dane wejściowe są ograniczone do 16 KiB.
Mowa i dźwięk
voice.say
| Pole | Wartość |
|---|---|
input.text | Wymagane, binds. Tekst do odczytania, maksymalnie 160 bajtów. |
input.language | Wymagane. Kod języka mowy, na przykład en. |
| Wynik | next. |
voice.play
| Pole | Wartość |
|---|---|
input.asset_id | Wymagane. ID zasobu audio dostępnego w tym obszarze roboczym. Niedostępny zasób może spowodować niepowodzenie połączenia w momencie wykonania kroku. |
| Wynik | next. |
voice.tone
| Pole | Wartość |
|---|---|
input.frequency_hz | Wymagane. 100 do 3000. |
input.duration_ms | Wymagane. 1 do 10000. |
| Wynik | next. |
logic.pause
Czeka z aktywnym połączeniem.
| Pole | Wartość |
|---|---|
input.duration_ms | Wymagane. 1 do 60000. |
| Wynik | next. |
Wprowadzanie z klawiatury
voice.gather
Odtwarza komunikaty, które naciśnięcie klawisza przerywa, i zbiera cyfry z klawiatury.
| Pole | Wartość |
|---|---|
input.prompts | Wymagane. 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_digits | Wymagane. Od 1 do 32. |
input.timeout_seconds | Wymagane. Sekundy oczekiwania na pierwszy klawisz, od 1 do 10. |
input.inter_digit_timeout_seconds | Wymagane. Sekundy oczekiwania między klawiszami, od 1 do 5. |
input.finish_on_key | Wymagane. Jeden z 0–9, *, #, A–D kończący wprowadzanie, lub null. |
input.matches | Wymagane. 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.private | Opcjonalne, domyślnie false. Gdy true, późniejsze kroki nie mogą odczytać cyfr, a cyfry są pomijane w śladzie. |
| Wyniki | Każda nazwa w matches, timeout, gdy żaden klawisz nie zostanie naciśnięty, oraz fallback dla każdego innego wejścia. |
| Wyjście | digits 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.
| Pole | Wartość |
|---|---|
config.cases | Wymagane. Co najmniej jeden {"port": "<name>", "when": {"$expr": "<boolean>"}}. |
config.default_port | Wymagane. Nazwa wyniku, gdy żaden przypadek nie jest prawdziwy. |
| Wyniki | Każdy port w cases oraz default_port. |
| Wyjście | branch: nazwa wybranego wyniku. |
data.set
Zapisuje wartości dla późniejszych kroków w tej samej wizycie.
| Pole | Wartość |
|---|---|
input | Obiekt 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. |
| Wynik | next. |
| Wyjście | Zapisany 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.
| Pole | Wartość |
|---|---|
input.type | Wymagane. 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.pstn | Wymagane, gdy type ma wartość pstn, w przeciwnym razie pomijane. Obiekt z dest i opcjonalnym orig. |
input.sip_trunk | Wymagane, gdy type ma wartość sip_trunk, w przeciwnym razie pomijane. Obiekt z trunk_id, dest i opcjonalnym orig. |
input.ring_group | Wymagane, gdy type ma wartość ring_group, w przeciwnym razie pomijane. Obiekt z polem ring_group_id. |
trunk_id | Wymagane w sip_trunk. ID przychodzącego trunku SIP w Twoim obszarze roboczym, na przykład spt_01jzj6c0p4f8b3x2m9k7q5r1tw. Tylko wartość literalna. |
ring_group_id | Wymagane w ring_group. ID grupy dzwonienia w Twoim obszarze roboczym, w tym jego grupy domyślnej, na przykład vrg_01jzj6c0p4f8b3x2m9k7q5r1tw. Tylko wartość literalna. |
dest | Wymagane, 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ść. |
orig | Opcjonalne, 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_seconds | Wymagane 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. |
| Wyniki | success, 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.
| Pole | Wartość |
|---|---|
input.entry_node_id | Wymagane. ID węzła trigger.start_call w tej definicji. |
input.data | Opcjonalne, expr, domyślnie {}. Dane wejściowe dla schematu tego węzła. |
| Wyniki | Brak. |
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.
| Pole | Wartość |
|---|---|
input.automation_id | Wymagane. ID automatyzacji w tym obszarze roboczym. |
input.event | Wymagane. Nazwa zdarzenia automatyzacji: od 1 do 128 liter, cyfr, kropek, podkreśleń lub łączników. |
input.data | Opcjonalne, 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. |
| Wyniki | success, 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.
| Pole | Wartość |
|---|---|
config.status | Wymagane. succeeded lub failed. |
config.reason | Opcjonalne, 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.output | Wymagany obiekt, który może być {}. Jego wartości najwyższego poziomu obsługują binds. |
| Wyniki | Brak. |
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:
{
"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": {}.
Powiązane zasoby
Przejdź do dokumentacji, przewodników i przykładów dotyczących tego tematu.