Referensi node urutan suara
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.
Gunakan referensi ini untuk menulis sequence.definition yang Anda kirim dengan Buat Panggilan. Bird menjalankan definisi inline sekali dan tidak menyimpannya. Untuk menyimpan urutan, buat di editor dasbor.
Definisi
| Field | Nilai |
|---|---|
schema_version | 1. |
expression_environment | "bird.cel.v1". |
nodes | Array objek node. Urutan array tidak memengaruhi eksekusi. |
settings | Abaikan atau kirim {}. Objek yang tidak kosong gagal dengan unsupported_contract; nilai yang bukan objek gagal dengan invalid_envelope. |
presentation | Tata letak dan label editor opsional. Tidak memengaruhi eksekusi tetapi dihitung dalam batas ukuran. |
Setiap node memiliki field berikut:
| Field | Nilai |
|---|---|
id | Unik dalam definisi. Diawali huruf kecil, lalu huruf kecil, digit, atau _, maksimal 64 karakter. |
type | Tipe node dari halaman ini, misalnya voice.say. |
type_version | 1 untuk setiap tipe node di halaman ini. |
config | Pengaturan yang menentukan bentuk node, seperti outcome yang dideklarasikan. Gunakan {} jika node tidak memilikinya. |
input | Nilai yang digunakan node saat dijalankan. Gunakan {} jika node tidak memilikinya. |
connections | Pemetaan dari nama outcome ke { "node_id": "<target>", "port": "input" }. |
Koneksi tidak boleh membentuk loop, dan setiap node harus dapat dijangkau dari entry. Outcome yang tidak ada di connections dianggap tidak terhubung. Outcome yang tidak terhubung mengakhiri eksekusi secara normal, kecuali jika node menentukan sebaliknya.
Nilai dan ekspresi
Sebagian besar field menerima JSON literal. Field bertanda binds juga menerima $expr atau $template; field bertanda expr hanya menerima $expr:
{"$expr": "trigger.data.customer_name"}mengembalikan nilai bertipe.{"$template": ["Hello ", {"$expr": "trigger.data.customer_name"}, "."]}mengembalikan teks. Template berupa array;{{name}}tetap berupa teks literal.
Ekspresi menggunakan CEL dan dapat membaca nilai berikut:
| Nilai | Isi |
|---|---|
trigger.data | Data entry, sesuai dengan data_schema dari entry tersebut. |
trigger.node_id | ID entry yang memulai kunjungan ini. |
trigger.type | Tipe entry yang memulai kunjungan ini, seperti trigger.start_call. |
steps.<id>.output | Output dari node yang telah selesai sebelumnya dalam kunjungan ini. |
variables.<key> | Nilai yang disimpan oleh node data.set dalam kunjungan ini. |
execution.id, execution.started_at | ID proses dan waktu mulainya. Gunakan string(execution.started_at) dalam ucapan. |
execution.call | id panggilan, session_id, dan pihak asal orig serta dest, yang masing-masing dapat berupa null. |
Periksa nilai opsional sebelum membacanya, misalnya has(trigger.data.name) ? trigger.data.name : 'caller'. Makro has tersedia; map, filter, all, exists, dan exists_one tidak tersedia.
Entry
trigger.start_call
Tempat panggilan dimulai. entry_node_id dalam permintaan Create Call menamai node ini.
| Field | Nilai |
|---|---|
config.data_schema | Opsional. Skema objek JSON Schema (draft 2020-12) untuk trigger_data. Hanya $ref lokal yang didukung. Tanpa skema ini, entry hanya menerima {}. |
| Outcome | event. |
Data entry dibatasi hingga 16 KiB.
Ucapan dan audio
voice.say
| Field | Nilai |
|---|---|
input.text | Wajib, binds. Teks yang diucapkan, maksimal 160 byte. |
input.language | Wajib. Kode bahasa ucapan, seperti en. |
| Outcome | next. |
voice.play
| Field | Nilai |
|---|---|
input.asset_id | Wajib. ID aset audio yang tersedia di workspace ini. Aset yang tidak tersedia dapat membuat panggilan gagal saat langkah ini dijalankan. |
| Outcome | next. |
voice.tone
| Field | Nilai |
|---|---|
input.frequency_hz | Wajib. 100 hingga 3000. |
input.duration_ms | Wajib. 1 hingga 10000. |
| Outcome | next. |
logic.pause
Menunggu dengan panggilan tetap terhubung.
| Field | Nilai |
|---|---|
input.duration_ms | Wajib. 1 hingga 60000. |
| Outcome | next. |
Input keypad
voice.gather
Memutar prompt, yang dapat diinterupsi oleh penekanan tombol, dan mengumpulkan digit keypad.
| Field | Nilai |
|---|---|
input.prompts | Wajib. Maksimal 4 prompt. Masing-masing berupa {"type": "say", "text", "language"}, {"type": "play", "asset_id"}, {"type": "tone", "frequency_hz", "duration_ms"}, atau {"type": "pause", "duration_ms"}, dengan batasan yang sama seperti node yang sesuai. Total durasi tone dan pause maksimal 60.000 ms. text prompt binds. |
input.max_digits | Wajib. 1 hingga 32. |
input.timeout_seconds | Wajib. Detik menunggu tombol pertama, 1 hingga 10. |
input.inter_digit_timeout_seconds | Wajib. Detik menunggu antar tombol, 1 hingga 5. |
input.finish_on_key | Wajib. Salah satu dari 0–9, *, #, A–D yang mengakhiri input, atau null. |
input.matches | Wajib. Pemetaan dari nama outcome ke digit persis yang memilihnya, seperti {"hours": "1"}. Nama dan digit harus unik. Nama tidak boleh input, timeout, atau fallback. Digit maksimal sepanjang max_digits dan tidak boleh mengandung finish_on_key. |
input.private | Opsional, default false. Jika true, langkah berikutnya tidak dapat membaca digit tersebut, dan digit dihilangkan dari trace. |
| Outcome | Setiap nama dalam matches, timeout saat tidak ada tombol yang ditekan, dan fallback untuk input lainnya. |
| Output | digits dan reason: initial_timeout, max_digits, finish_key, atau inter_digit_timeout. |
Logika dan data
logic.branch
Memeriksa kondisi secara berurutan dan mengikuti kondisi pertama yang bernilai benar.
| Field | Nilai |
|---|---|
config.cases | Wajib. Minimal satu {"port": "<name>", "when": {"$expr": "<boolean>"}}. |
config.default_port | Wajib. Nama outcome ketika tidak ada case yang bernilai benar. |
| Outcome | Setiap port dalam cases, dan default_port. |
| Output | branch: nama outcome yang dipilih. |
data.set
Menyimpan nilai untuk langkah-langkah selanjutnya dalam kunjungan yang sama.
| Field | Nilai |
|---|---|
input | Objek berisi nilai, masing-masing binds. Setiap key menjadi variables.<key>. Setiap nilai dihitung dari variabel sebagaimana kondisinya sebelum node ini. |
| Outcome | next. |
| Output | Objek yang disimpan. |
Panggilan dan transfer
voice.dial
Menelepon nomor lain dan menghubungkannya ke panggilan saat ini.
| Field | Nilai |
|---|---|
input.to | Wajib, binds. Nomor E.164, misalnya +12025550123. |
input.timeout_seconds | Wajib, expr. Detik untuk berdering, 1 sampai 120. |
| Outcome | success, busy, no_answer, dan failure. success mengikuti setelah panggilan yang terhubung berakhir dan audio panggilan asal dipulihkan, bukan saat tujuan menjawab. failure yang tidak terhubung menggagalkan eksekusi. |
logic.voice_goto
Memulai entry lain dalam definisi yang sama. Kunjungan baru mendapatkan trigger.data baru dan menghapus output serta variabel dari langkah sebelumnya; panggilan tetap berlanjut.
| Field | Nilai |
|---|---|
input.entry_node_id | Wajib. ID node trigger.start_call dalam definisi ini. |
input.data | Opsional, expr, default {}. Data entry untuk skema node tersebut. |
| Outcome | Tidak ada. |
Mengakhiri panggilan
logic.exit
Mengakhiri panggilan dengan hasil.
| Field | Nilai |
|---|---|
config.status | Wajib. succeeded atau failed. |
config.reason | Opsional, expr. Kode stabil berupa huruf kecil, digit, dan _, diawali huruf atau digit, maksimal 64 karakter. Kosongkan alih-alih mengirim null. |
input.output | Objek wajib, yang boleh berupa {}. Nilai level teratasnya bind. |
| Outcome | Tidak ada. |
voice.hangup
Mengakhiri panggilan tanpa hasil yang ditulis. Node ini tidak memiliki field maupun outcome.
Langkah akses awal
voice.webhook, voice.record_start, voice.record_stop, dan logic.voice_goto dengan dependency_id untuk pesan suara terkelola atau perekaman panggilan masih dalam akses awal dan belum didokumentasikan di sini. Penggunaannya memerlukan akses untuk workspace Anda.
Contoh: transfer ke seseorang
Definisi ini menyapa penerima, menghubungi nomor dukungan, dan mencatat apakah transfer berhasil tersambung:
{
"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": {} }
}
]
}Kirim sebagai sequence.definition dengan "entry_node_id": "start" dan "trigger_data": {}.
Sumber daya terkait
Lanjutkan dengan dokumentasi, panduan, dan contoh untuk topik ini.