Sign inGet Started

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

FieldNilai
schema_version1.
expression_environment"bird.cel.v1".
nodesArray objek node. Urutan array tidak memengaruhi eksekusi.
settingsAbaikan atau kirim {}. Objek yang tidak kosong gagal dengan unsupported_contract; nilai yang bukan objek gagal dengan invalid_envelope.
presentationTata letak dan label editor opsional. Tidak memengaruhi eksekusi tetapi dihitung dalam batas ukuran.

Setiap node memiliki field berikut:

FieldNilai
idUnik dalam definisi. Diawali huruf kecil, lalu huruf kecil, digit, atau _, maksimal 64 karakter.
typeTipe node dari halaman ini, misalnya voice.say.
type_version1 untuk setiap tipe node di halaman ini.
configPengaturan yang menentukan bentuk node, seperti outcome yang dideklarasikan. Gunakan {} jika node tidak memilikinya.
inputNilai yang digunakan node saat dijalankan. Gunakan {} jika node tidak memilikinya.
connectionsPemetaan 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:

NilaiIsi
trigger.dataData entry, sesuai dengan data_schema dari entry tersebut.
trigger.node_idID entry yang memulai kunjungan ini.
trigger.typeTipe entry yang memulai kunjungan ini, seperti trigger.start_call.
steps.<id>.outputOutput 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_atID proses dan waktu mulainya. Gunakan string(execution.started_at) dalam ucapan.
execution.callid 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.

FieldNilai
config.data_schemaOpsional. Skema objek JSON Schema (draft 2020-12) untuk trigger_data. Hanya $ref lokal yang didukung. Tanpa skema ini, entry hanya menerima {}.
Outcomeevent.

Data entry dibatasi hingga 16 KiB.

Ucapan dan audio

voice.say

FieldNilai
input.textWajib, binds. Teks yang diucapkan, maksimal 160 byte.
input.languageWajib. Kode bahasa ucapan, seperti en.
Outcomenext.

voice.play

FieldNilai
input.asset_idWajib. ID aset audio yang tersedia di workspace ini. Aset yang tidak tersedia dapat membuat panggilan gagal saat langkah ini dijalankan.
Outcomenext.

voice.tone

FieldNilai
input.frequency_hzWajib. 100 hingga 3000.
input.duration_msWajib. 1 hingga 10000.
Outcomenext.

logic.pause

Menunggu dengan panggilan tetap terhubung.

FieldNilai
input.duration_msWajib. 1 hingga 60000.
Outcomenext.

Input keypad

voice.gather

Memutar prompt, yang dapat diinterupsi oleh penekanan tombol, dan mengumpulkan digit keypad.

FieldNilai
input.promptsWajib. 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_digitsWajib. 1 hingga 32.
input.timeout_secondsWajib. Detik menunggu tombol pertama, 1 hingga 10.
input.inter_digit_timeout_secondsWajib. Detik menunggu antar tombol, 1 hingga 5.
input.finish_on_keyWajib. Salah satu dari 0–9, *, #, A–D yang mengakhiri input, atau null.
input.matchesWajib. 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.privateOpsional, default false. Jika true, langkah berikutnya tidak dapat membaca digit tersebut, dan digit dihilangkan dari trace.
OutcomeSetiap nama dalam matches, timeout saat tidak ada tombol yang ditekan, dan fallback untuk input lainnya.
Outputdigits 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.

FieldNilai
config.casesWajib. Minimal satu {"port": "<name>", "when": {"$expr": "<boolean>"}}.
config.default_portWajib. Nama outcome ketika tidak ada case yang bernilai benar.
OutcomeSetiap port dalam cases, dan default_port.
Outputbranch: nama outcome yang dipilih.

data.set

Menyimpan nilai untuk langkah-langkah selanjutnya dalam kunjungan yang sama.

FieldNilai
inputObjek berisi nilai, masing-masing binds. Setiap key menjadi variables.<key>. Setiap nilai dihitung dari variabel sebagaimana kondisinya sebelum node ini.
Outcomenext.
OutputObjek yang disimpan.

Panggilan dan transfer

voice.dial

Menelepon nomor lain dan menghubungkannya ke panggilan saat ini.

FieldNilai
input.toWajib, binds. Nomor E.164, misalnya +12025550123.
input.timeout_secondsWajib, expr. Detik untuk berdering, 1 sampai 120.
Outcomesuccess, 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.

FieldNilai
input.entry_node_idWajib. ID node trigger.start_call dalam definisi ini.
input.dataOpsional, expr, default {}. Data entry untuk skema node tersebut.
OutcomeTidak ada.

Mengakhiri panggilan

logic.exit

Mengakhiri panggilan dengan hasil.

FieldNilai
config.statusWajib. succeeded atau failed.
config.reasonOpsional, expr. Kode stabil berupa huruf kecil, digit, dan _, diawali huruf atau digit, maksimal 64 karakter. Kosongkan alih-alih mengirim null.
input.outputObjek wajib, yang boleh berupa {}. Nilai level teratasnya bind.
OutcomeTidak 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:

Contoh kode
{
  "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": {}.

Lanjutkan dengan dokumentasi, panduan, dan contoh untuk topik ini.