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
| 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. |
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 inny numer i łączy go z bieżącym połączeniem.
| Pole | Wartość |
|---|---|
input.to | Wymagane, binds. Numer E.164, np. +12025550123. |
input.timeout_seconds | Wymagane, expr. Czas dzwonienia w sekundach, od 1 do 120. |
| 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ę. 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.
| 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. |
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.
| 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.
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:
{
"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": {}.
Powiązane zasoby
Przejdź do dokumentacji, przewodników i przykładów dotyczących tego tematu.