Sign inGet Started

वॉइस सीक्वेंस नोड संदर्भ

चेतावनी: वॉइस सीक्वेंस प्रीव्यू में हैं। चरण, एंट्री डेटा और सीक्वेंस परिभाषा का फ़ॉर्मैट ऐसे बदल सकते हैं जिससे मौजूदा सीक्वेंस और API अनुरोध काम करना बंद कर दें।

Create Call के साथ भेजी जाने वाली sequence.definition लिखने के लिए इस संदर्भ का उपयोग करें। Bird इनलाइन परिभाषा को एक बार चलाता है और उसे सहेजता नहीं है। किसी सीक्वेंस को सहेजकर रखने के लिए उसे डैशबोर्ड एडिटर में बनाएँ।

परिभाषा

फ़ील्डमान
schema_version1।
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_schematrigger_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_grouptype के ring_group होने पर आवश्यक, अन्यथा छोड़ दें। ring_group_id वाला ऑब्जेक्ट।
trunk_idsip_trunk में आवश्यक। आपके वर्कस्पेस में किसी इनबाउंड SIP ट्रंक की ID, जैसे spt_01jzj6c0p4f8b3x2m9k7q5r1tw। केवल शाब्दिक मान।
ring_group_idring_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_secondspstn और 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 के रूप में भेजें।

इस विषय के लिए दस्तावेज़, गाइड और उदाहरणों के साथ आगे बढ़ें।