वॉइस सीक्वेंस नोड संदर्भ
चेतावनी: वॉइस सीक्वेंस प्रीव्यू में हैं। चरण, एंट्री डेटा और सीक्वेंस परिभाषा का फ़ॉर्मैट ऐसे बदल सकते हैं जिससे मौजूदा सीक्वेंस और API अनुरोध काम करना बंद कर दें।
Create Call के साथ भेजी जाने वाली sequence.definition लिखने के लिए इस संदर्भ का उपयोग करें। Bird इनलाइन परिभाषा को एक बार चलाता है और उसे सहेजता नहीं है। किसी सीक्वेंस को सहेजकर रखने के लिए उसे डैशबोर्ड एडिटर में बनाएँ।
परिभाषा
| फ़ील्ड | मान |
|---|---|
schema_version | 1। |
expression_environment | "bird.cel.v1"। |
nodes | नोड ऑब्जेक्ट की ऐरे। ऐरे के क्रम का निष्पादन पर कोई असर नहीं पड़ता। |
settings | इसे छोड़ दें या {} भेजें। खाली न होने वाला ऑब्जेक्ट unsupported_contract के साथ विफल होता है; जो मान ऑब्जेक्ट नहीं है, वह invalid_envelope के साथ विफल होता है। |
presentation | वैकल्पिक एडिटर लेआउट और लेबल। इनका निष्पादन पर असर नहीं पड़ता, लेकिन ये आकार सीमाओं में गिने जाते हैं। |
हर नोड में ये फ़ील्ड होते हैं:
| फ़ील्ड | मान |
|---|---|
id | परिभाषा में अद्वितीय। छोटे अक्षर से शुरू होता है, फिर छोटे अक्षर, अंक या _, अधिकतम 64 वर्ण। |
type | इस पेज पर दिया गया कोई नोड प्रकार, जैसे voice.say। |
type_version | इस पेज के हर नोड प्रकार के लिए 1, सिवाय voice.dial के, जिसके लिए 3 है। |
config | वह सेटअप जो नोड का ढांचा तय करता है, जैसे घोषित परिणाम। जब नोड में कोई सेटअप न हो, तो {} का उपयोग करें। |
input | वे मान जिनका उपयोग नोड चलते समय करता है। जब नोड में कोई मान न हो, तो {} का उपयोग करें। |
connections | परिणाम के नाम से { "node_id": "<target>", "port": "input" } तक का मैप। |
कनेक्शन लूप नहीं बना सकते, और हर नोड तक किसी एंट्री से पहुंचा जा सकना चाहिए। जो परिणाम connections में शामिल नहीं है, वह अनकनेक्टेड रहता है। अनकनेक्टेड परिणाम रन को सामान्य रूप से समाप्त करते हैं, सिवाय उन मामलों के जहां कोई नोड कुछ और बताता है।
मान और एक्सप्रेशन
ज़्यादातर फ़ील्ड शाब्दिक JSON लेते हैं। binds चिह्नित फ़ील्ड $expr या $template भी स्वीकार करते हैं; expr चिह्नित फ़ील्ड केवल $expr भी स्वीकार करते हैं:
{"$expr": "trigger.data.customer_name"}एक टाइप किया हुआ मान लौटाता है।{"$template": ["Hello ", {"$expr": "trigger.data.customer_name"}, "."]}टेक्स्ट लौटाता है। टेम्पलेट ऐरे होते हैं;{{name}}शाब्दिक टेक्स्ट ही रहता है।
एक्सप्रेशन CEL का उपयोग करते हैं और ये मान पढ़ सकते हैं:
| मान | सामग्री |
|---|---|
trigger.data | एंट्री डेटा, जो एंट्री के data_schema से मेल खाता है। |
trigger.node_id | उस एंट्री की ID जिसने यह विज़िट शुरू की। |
trigger.type | उस एंट्री का प्रकार जिसने यह विज़िट शुरू की, जैसे trigger.start_call। |
steps.<id>.output | इस विज़िट में पहले पूरे हुए किसी नोड का आउटपुट। |
variables.<key> | इस विज़िट में किसी data.set नोड द्वारा सहेजे गए मान। |
execution.id, execution.started_at | रन ID और उसके शुरू होने का समय। बोले जाने वाले टेक्स्ट में string(execution.started_at) का उपयोग करें। |
execution.call | कॉल का id, session_id, और मूल पक्ष orig और dest, जिनमें से हर एक null हो सकता है। |
वैकल्पिक मानों को पढ़ने से पहले जाँच लें कि वे मौजूद हैं, उदाहरण के लिए has(trigger.data.name) ? trigger.data.name : 'caller'। has मैक्रो उपलब्ध है; map, filter, all, exists और exists_one उपलब्ध नहीं हैं।
एंट्री
trigger.start_call
जहाँ से कॉल शुरू होती है। Create Call अनुरोध में entry_node_id इस नोड का नाम बताता है।
| फ़ील्ड | मान |
|---|---|
config.data_schema | trigger_data के लिए वैकल्पिक JSON Schema (draft 2020-12) ऑब्जेक्ट स्कीमा। केवल लोकल $ref समर्थित है। इसके बिना एंट्री केवल {} स्वीकार करती है। |
| परिणाम | event। |
एंट्री डेटा की सीमा 16 KiB है।
स्पीच और ऑडियो
voice.say
| फ़ील्ड | मान |
|---|---|
input.text | आवश्यक, binds। बोला जाने वाला टेक्स्ट, अधिकतम 160 बाइट। |
input.language | आवश्यक। स्पीच भाषा कोड, जैसे en। |
| परिणाम | next। |
voice.play
| फ़ील्ड | मान |
|---|---|
input.asset_id | आवश्यक। इस वर्कस्पेस में उपलब्ध किसी ऑडियो एसेट की ID। एसेट उपलब्ध न होने पर यह चरण चलते समय कॉल विफल हो सकती है। |
| परिणाम | next। |
voice.tone
| फ़ील्ड | मान |
|---|---|
input.frequency_hz | आवश्यक। 100 से 3000 तक। |
input.duration_ms | आवश्यक। 1 से 10000 तक। |
| परिणाम | next। |
logic.pause
कॉल को जुड़ा रखते हुए प्रतीक्षा करता है।
| फ़ील्ड | मान |
|---|---|
input.duration_ms | आवश्यक। 1 से 60000 तक। |
| परिणाम | next। |
कीपैड इनपुट
voice.gather
प्रॉम्प्ट चलाता है और कीपैड के अंक इकट्ठा करता है। कोई बटन दबाने पर प्रॉम्प्ट बीच में रुक जाता है।
| फ़ील्ड | मान |
|---|---|
input.prompts | आवश्यक। अधिकतम 4 प्रॉम्प्ट। हर प्रॉम्प्ट {"type": "say", "text", "language"}, {"type": "play", "asset_id"}, {"type": "tone", "frequency_hz", "duration_ms"} या {"type": "pause", "duration_ms"} होता है, और उस पर संबंधित नोड वाली सीमाएँ लागू होती हैं। टोन और विराम की कुल अवधि अधिकतम 60,000 ms हो सकती है। प्रॉम्प्ट का text binds है। |
input.max_digits | आवश्यक। 1 से 32 तक। |
input.timeout_seconds | आवश्यक। पहला बटन दबाए जाने तक प्रतीक्षा के सेकंड, 1 से 10 तक। |
input.inter_digit_timeout_seconds | आवश्यक। दो बटन दबाने के बीच प्रतीक्षा के सेकंड, 1 से 5 तक। |
input.finish_on_key | आवश्यक। इनपुट समाप्त करने वाला बटन 0–9, *, #, A–D में से एक, या null। |
input.matches | आवश्यक। परिणाम के नाम से उन सटीक अंकों तक का मैप जो उसे चुनते हैं, जैसे {"hours": "1"}। नाम और अंक अद्वितीय होने चाहिए। नाम input, timeout या fallback नहीं हो सकता। अंकों की लंबाई अधिकतम max_digits होती है और उनमें finish_on_key नहीं हो सकता। |
input.private | वैकल्पिक, डिफ़ॉल्ट false। true होने पर बाद के चरण अंक नहीं पढ़ सकते, और अंक ट्रेस में शामिल नहीं किए जाते। |
| परिणाम | matches का हर नाम, कोई बटन न दबाए जाने पर timeout, और किसी अन्य इनपुट के लिए fallback। |
| आउटपुट | digits और reason: initial_timeout, max_digits, finish_key या inter_digit_timeout। |
लॉजिक और डेटा
logic.branch
शर्तों को क्रम से जाँचता है और पहली सही शर्त का पालन करता है।
| फ़ील्ड | मान |
|---|---|
config.cases | आवश्यक। कम से कम एक {"port": "<name>", "when": {"$expr": "<boolean>"}}। |
config.default_port | आवश्यक। कोई भी केस सही न होने पर उपयोग होने वाले परिणाम का नाम। |
| परिणाम | cases में हर port, और default_port। |
| आउटपुट | branch: चुने गए परिणाम का नाम। |
data.set
उसी विज़िट के बाद वाले चरणों के लिए मान सहेजता है।
| फ़ील्ड | मान |
|---|---|
input | मानों का ऑब्जेक्ट, जिसका हर मान binds है। हर कुंजी variables.<key> बन जाती है। हर मान की गणना वेरिएबल के उन मानों से होती है जो इस नोड से पहले थे। |
| परिणाम | next। |
| आउटपुट | सहेजा गया ऑब्जेक्ट। |
कॉल और ट्रांसफ़र
voice.dial
किसी फ़ोन नंबर पर या आपके वर्कस्पेस के किसी इनबाउंड SIP ट्रंक के नंबर पर कॉल करता है, या किसी रिंग ग्रुप में घंटी बजाता है, और उसे मौजूदा कॉल से जोड़ता है। type_version 3 का उपयोग करें।
| फ़ील्ड | मान |
|---|---|
input.type | आवश्यक। फ़ोन नंबर पर कॉल करने के लिए pstn, आपके किसी इनबाउंड SIP ट्रंक के ज़रिए नंबर पर कॉल करने के लिए sip_trunk, या रिंग ग्रुप के ऑनलाइन सदस्यों की घंटी बजाने के लिए ring_group। |
input.pstn | जब type का मान pstn हो तब आवश्यक, अन्यथा इसे छोड़ दें। dest और वैकल्पिक orig वाला ऑब्जेक्ट। |
input.sip_trunk | जब type का मान sip_trunk हो तब आवश्यक, अन्यथा इसे छोड़ दें। trunk_id, dest और वैकल्पिक orig वाला ऑब्जेक्ट। |
input.ring_group | type के ring_group होने पर आवश्यक, अन्यथा छोड़ दें। ring_group_id वाला ऑब्जेक्ट। |
trunk_id | sip_trunk में आवश्यक। आपके वर्कस्पेस में किसी इनबाउंड SIP ट्रंक की ID, जैसे spt_01jzj6c0p4f8b3x2m9k7q5r1tw। केवल शाब्दिक मान। |
ring_group_id | ring_group में आवश्यक। आपके वर्कस्पेस में किसी रिंग ग्रुप की ID, उसके डिफ़ॉल्ट ग्रुप सहित, जैसे vrg_01jzj6c0p4f8b3x2m9k7q5r1tw। केवल शाब्दिक मान। |
dest | आवश्यक, binds। pstn के लिए कॉल किया जाने वाला E.164 नंबर, जैसे +12025550123। sip_trunk के लिए कोई नंबर, एक्सटेंशन या नाम, जैसे 1001: 1 से 64 अक्षर, अंक और +*._-। ट्रंक की इनबाउंड रूटिंग कॉल को ऐसे पहुँचाती है जैसे वह इसी मान के लिए आई हो। |
orig | वैकल्पिक, binds। अगर आप orig प्रॉपर्टी छोड़ देते हैं, तो कॉल पर इनबाउंड कॉल में डायल किया गया Bird नंबर या आउटबाउंड कॉल में कॉल शुरू करने वाला नंबर दिखता है। pstn के लिए वर्कस्पेस की कोई कॉलर ID या आने वाले मान्य कॉलर का E.164 नंबर उपयोग करें। आने वाले कॉलर के नंबर बिना हस्ताक्षर के भेजे जाते हैं, और प्राप्त करने वाला कैरियर उन्हें स्क्रीन कर सकता है। sip_trunk के लिए यह dest वाले ही मान लेता है, जैसे sales। |
input.timeout_seconds | pstn और sip_trunk के लिए आवश्यक, ring_group के लिए छोड़ दें, expr। जवाब की प्रतीक्षा के सेकंड, ट्रंक गेटवे के बीच फ़ेलओवर सहित, 1 से 120 तक। बिना जवाब वाली कॉल no_answer लेती हैं; जवाब दी गई कॉल पर कोई सीमा नहीं होती। |
| परिणाम | success, busy, no_answer और failure। success तब लागू होता है जब जुड़ी हुई कॉल खत्म हो जाती है और मूल कॉल का ऑडियो वापस आ जाता है, न कि तब जब गंतव्य कॉल उठाता है। अगर कोई SIP ट्रंक कॉल को अस्वीकार या फ़ॉरवर्ड करता है, तो failure चुना जाता है। अगर failure किसी नोड से नहीं जुड़ा है, तो रन विफल हो जाता है। रिंग ग्रुप के लिए busy का अर्थ है कि उसके सदस्य व्यस्त थे, उन्होंने कॉल अस्वीकार की या वे किसी दूसरी कॉल पर थे; no_answer का अर्थ है कि 60 सेकंड में किसी ने कॉल नहीं उठाई या कोई ऑनलाइन नहीं था; और failure का अर्थ है कि Bird ग्रुप में घंटी नहीं बजा सका। |
संस्करण 2 में कोई ring_group लक्ष्य नहीं है और उसमें हमेशा timeout_seconds आवश्यक होता है। संस्करण 2 का हर इनपुट संस्करण 3 में भी मान्य है, इसलिए किसी चरण को अपग्रेड करने से और कुछ नहीं बदलता।
संस्करण 1 नंबर को input.to में लेता है और उसमें orig नहीं है। इसका उपयोग करने वाले चरण चलते रहते हैं। जब आप एडिटर में संस्करण 1 वाले किसी चरण को अपग्रेड करते हैं, तो उसका to मान pstn.dest में चला जाता है।
logic.voice_goto
उसी परिभाषा में कोई दूसरी एंट्री शुरू करता है। नई विज़िट को नया trigger.data मिलता है और पिछले चरणों के आउटपुट और वेरिएबल साफ़ हो जाते हैं; कॉल जारी रहती है।
| फ़ील्ड | मान |
|---|---|
input.entry_node_id | आवश्यक। इस परिभाषा में मौजूद किसी trigger.start_call नोड की ID। |
input.data | वैकल्पिक, expr, डिफ़ॉल्ट {}। उस नोड की स्कीमा के लिए एंट्री डेटा। |
| परिणाम | कोई नहीं। |
Automations
automation.send_event
किसी रन की प्रतीक्षा किए बिना Automation को एक एप्लिकेशन इवेंट भेजता है। इवेंट कतार में जुड़ते ही कॉल जारी रहती है; रन शुरू हुआ या नहीं, यह केवल Automations में दिखता है।
| फ़ील्ड | मान |
|---|---|
input.automation_id | आवश्यक। इस वर्कस्पेस में किसी ऑटोमेशन की ID। |
input.event | आवश्यक। ऑटोमेशन के इवेंट का नाम: 1 से 128 अक्षर, अंक, बिंदु, अंडरस्कोर या हाइफ़न। |
input.data | वैकल्पिक, डिफ़ॉल्ट {}। इवेंट का पूरा डेटा। इसके शीर्ष-स्तरीय मान bind करते हैं, या पूरा ऑब्जेक्ट एक $expr हो सकता है। इससे गहरे स्तर के मान शाब्दिक ही रहते हैं। पूरा input अधिकतम 16 KiB हो सकता है। |
| परिणाम | इवेंट कतार में जुड़ जाने पर success, या न जुड़ पाने पर failure। इनमें से कोई भी ऑटोमेशन के रन की जानकारी नहीं देता। अगर failure किसी नोड से नहीं जुड़ा है, तो रन विफल हो जाता है। |
कॉल समाप्त करना
logic.exit
कॉल को एक परिणाम के साथ समाप्त करता है।
| फ़ील्ड | मान |
|---|---|
config.status | आवश्यक। succeeded या failed। |
config.reason | वैकल्पिक, expr। छोटे अक्षरों, अंकों और _ से बना स्थिर कोड, जो किसी अक्षर या अंक से शुरू होता है और अधिकतम 64 वर्णों का होता है। null भेजने के बजाय इसे छोड़ दें। |
input.output | आवश्यक ऑब्जेक्ट, जो {} हो सकता है। इसके शीर्ष-स्तरीय मान bind करते हैं। |
| परिणाम | कोई नहीं। |
voice.hangup
लेखक द्वारा तय किए गए परिणाम के बिना कॉल समाप्त करता है। इसमें कोई फ़ील्ड और कोई परिणाम नहीं होते।
voice.webhook के लिए वॉइस सीक्वेंस में एप्लिकेशन डेटा का उपयोग करें देखें।
उदाहरण: किसी व्यक्ति को ट्रांसफ़र
यह परिभाषा प्राप्तकर्ता का अभिवादन करती है, एक सपोर्ट नंबर डायल करती है और दर्ज करती है कि ट्रांसफ़र कनेक्ट हुआ या नहीं:
{
"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": {} }
}
]
}इसे "entry_node_id": "start" और "trigger_data": {} के साथ sequence.definition के रूप में भेजें।
संबंधित संसाधन
इस विषय के लिए दस्तावेज़, गाइड और उदाहरणों के साथ आगे बढ़ें।