Sign inGet Started

Referensi node urutan suara

Peringatan: Urutan suara masih dalam tahap pratinjau. Langkah, data entry, dan format definisi urutan dapat berubah sehingga merusak urutan dan permintaan API yang sudah ada.

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, kecuali 3 untuk voice.dial.
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 telepon atau nomor pada salah satu trunk SIP masuk di workspace Anda, atau membunyikan ring group, lalu menghubungkannya ke panggilan saat ini. Gunakan type_version 3.

FieldNilai
input.typeWajib. pstn untuk menelepon nomor telepon, sip_trunk untuk menelepon nomor melalui salah satu trunk SIP masuk Anda, atau ring_group untuk membunyikan anggota ring group yang sedang online.
input.pstnWajib jika type bernilai pstn, dan dihilangkan jika tidak. Objek dengan dest dan orig opsional.
input.sip_trunkWajib jika type bernilai sip_trunk, dan dihilangkan jika tidak. Objek dengan trunk_id, dest, dan orig opsional.
input.ring_groupWajib jika type bernilai ring_group, dan dihilangkan jika tidak. Objek dengan ring_group_id.
trunk_idWajib dalam sip_trunk. ID trunk SIP masuk di workspace Anda, misalnya spt_01jzj6c0p4f8b3x2m9k7q5r1tw. Hanya nilai literal.
ring_group_idWajib dalam ring_group. ID ring group di workspace Anda, termasuk grup default-nya, misalnya vrg_01jzj6c0p4f8b3x2m9k7q5r1tw. Hanya nilai literal.
destWajib, binds. Untuk pstn, nomor E.164 yang akan ditelepon, misalnya +12025550123. Untuk sip_trunk, nomor, ekstensi, atau nama, misalnya 1001: 1 hingga 64 huruf, digit, dan +*._-. Routing masuk trunk mengirimkan panggilan seolah-olah panggilan tersebut masuk untuk nilai ini.
origOpsional, binds. Jika Anda menghilangkan properti orig, panggilan menampilkan nomor Bird yang dihubungi pada panggilan masuk atau nomor asal pada panggilan keluar. Untuk pstn, gunakan caller ID workspace atau nomor E.164 penelepon masuk yang valid. Nomor penelepon masuk dikirim tanpa tanda tangan dan dapat disaring oleh operator penerima. Untuk sip_trunk, field ini menerima nilai yang sama dengan dest, misalnya sales.
input.timeout_secondsWajib untuk pstn dan sip_trunk, dan dihilangkan untuk ring_group, expr. Detik menunggu jawaban, termasuk failover antar-gateway trunk, 1 hingga 120. Panggilan yang tidak dijawab mengikuti no_answer; panggilan yang dijawab tidak dibatasi.
Outcomesuccess, busy, no_answer, dan failure. success diikuti setelah panggilan yang terhubung berakhir dan audio panggilan asal dipulihkan, bukan saat tujuan menjawab. Trunk SIP yang menolak atau meneruskan panggilan memilih failure. failure yang tidak terhubung menggagalkan eksekusi. Untuk ring group, busy berarti anggotanya sibuk, menolak, atau sedang dalam panggilan lain, no_answer berarti tidak ada yang menjawab dalam 60 detik atau tidak ada yang online, dan failure berarti Bird tidak dapat membunyikan grup tersebut.

Versi 2 tidak memiliki target ring_group dan selalu mewajibkan timeout_seconds. Setiap input versi 2 juga valid di versi 3, sehingga meningkatkan versi langkah tidak mengubah hal lain.

Versi 1 menerima nomor di input.to dan tidak memiliki orig. Langkah yang menggunakannya tetap berjalan. Saat Anda meningkatkan langkah versi 1 di editor, nilai to-nya dipindahkan ke pstn.dest.

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.

Automations

automation.send_event

Mengirim event aplikasi ke Automation tanpa menunggu eksekusi. Panggilan berlanjut setelah event masuk antrean; apakah eksekusi dimulai hanya terlihat di Automations.

FieldNilai
input.automation_idWajib. ID automasi di workspace ini.
input.eventWajib. Nama event automasi: 1 hingga 128 huruf, digit, titik, garis bawah, atau tanda hubung.
input.dataOpsional, default {}. Seluruh data event. Nilai level teratasnya bind, atau seluruh objek dapat berupa satu $expr. Nilai yang bersarang lebih dalam tetap literal. Seluruh input maksimal 16 KiB.
Outcomesuccess setelah event masuk antrean, atau failure jika event tidak dapat dimasukkan ke antrean. Keduanya tidak melaporkan eksekusi automasi. failure yang tidak terhubung menggagalkan eksekusi.

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. Hilangkan field ini 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.

Lihat Menggunakan data aplikasi dalam urutan suara untuk voice.webhook.

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": 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": {} }
    }
  ]
}

Kirim sebagai sequence.definition dengan "entry_node_id": "start" dan "trigger_data": {}.

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