Open in
telephony.incoming / web.incoming
येणाऱ्या कॉलचे कॉन्फिगरेशन रिअल टाइममध्ये आकार देणारा ब्लॉकिंग webhook.
जेव्हा इनबाउंड फोन कॉल नियुक्त
एजंटशिवाय असलेल्या नंबरवर येतो किंवा mode="webhook" मधील
पब्लिश करण्यायोग्य कीवर वेब विजेट सेशन सुरू होते, तेव्हा ThunderPhone तुमच्या
लेगसी webhook URL
वर ब्लॉकिंग
telephony.incoming / web.incoming विनंती पाठवते आणि कॉन्फिगरेशन प्रतिसादासाठी
कमाल 10 सेकंद प्रतीक्षा करते. प्रत्येक कॉलसाठी prompt, आवाज आणि टूल्स
डायनॅमिकरीत्या निवडण्यासाठी हा विनिमय वापरा —
संपूर्ण पॅटर्नसाठी डायनॅमिक कॉल कॉन्फिगरेशन मार्गदर्शक
पाहा.
या ब्लॉकिंग विनिमयाला कोणताही फॉलबॅक नाही: तुमचा हँडलर नॉन-2xx स्टेटस परत करत असल्यास,
टाइम आउट झाल्यास किंवा व्हॅलिडेशन अयशस्वी होणारे कॉन्फिगरेशन परत करत असल्यास,
कॉल नाकारला जातो (फोन कॉल कनेक्ट होत नाही; विजेट सेशन विनंती 502/422 सह
अयशस्वी होते). त्वरीत प्रतिसाद द्या — तुम्ही निर्णय घेत असताना कॉलरला रिंगबॅक ऐकू येत असतो.
विनंती पेलोड
फोन कॉलसाठी (telephony.incoming):
{
"type": "telephony.incoming",
"data": {
"call_id": 987654321,
"from_number": "+14155550199",
"to_number": "+15551234567"
}
}| फील्ड | प्रकार | वर्णन |
|---|---|---|
call_id | integer | कॉल ID — या कॉलसाठी सर्व इव्हेंट्समध्ये स्थिर |
from_number | string | E.164 कॉलर नंबर |
to_number | string | E.164 गंतव्य (तुमच्या ThunderPhone नंबरपैकी एक) |
वेब विजेट सेशनसाठी (web.incoming), data फोन नंबरऐवजी
एम्बेडिंग पेज ओळखते:
{
"type": "web.incoming",
"data": {
"call_id": 987654322,
"origin_domain": "https://example.com",
"publishable_key_prefix": "pk_live_a1b2"
}
}| फील्ड | प्रकार | वर्णन |
|---|---|---|
call_id | integer | कॉल ID |
origin_domain | string | विजेट होस्ट करणारा पेज ऑरिजिन |
publishable_key_prefix | string | सेशन उघडणाऱ्या पब्लिश करण्यायोग्य कीची सुरुवातीची अक्षरे |
language, primary_language | string | विजेट सेशनने भाषा ओव्हरराइडची विनंती केल्यावर उपलब्ध असते |
voice | string | विजेट सेशनने आवाज ओव्हरराइडची विनंती केल्यावर उपलब्ध असते |
website_context | string | विजेटने प्रति-सेशन पेज कॉन्टेक्स्ट पास केल्यावर उपलब्ध असते |
प्रतिसाद स्कीमा
या कॉलसाठी एजंट कॉन्फिगरेशनचे वर्णन करणारा JSON ऑब्जेक्ट परत करा.
prompt आणि voice आवश्यक आहेत; इतर सर्व पर्यायी आहेत.
{
"prompt": "You are a helpful booking assistant for Acme Restaurant.",
"voice": "john",
"product": "spark",
"background_track": null,
"tools": []
}| फील्ड | प्रकार | आवश्यक | वर्णन |
|---|---|---|---|
prompt | स्ट्रिंग | होय | एजंटला मार्गदर्शन करणारा सिस्टम prompt |
voice | स्ट्रिंग | होय | GET /v1/voices मधील व्हॉइस आयडी, उदा. john. voice_name हे उपनाव म्हणून स्वीकारले जाते. अज्ञात व्हॉइस सत्यापनात अयशस्वी होतात आणि कॉल नाकारतात |
product | स्ट्रिंग | नाही | डीफॉल्ट spark. अनुमत: spark, bolt, storm-base, storm-base-with-ack, storm-extra, storm-extra-with-ack |
thinking_level | स्ट्रिंग | नाही | minimal, base (डीफॉल्ट), किंवा extra. Storm उत्पादनांसाठी ओव्हरराइड केले जाते: storm-extra* मुळे extra सक्तीचे होते, इतर storm-* मुळे base सक्तीचे होते |
audio_context_mode | स्ट्रिंग | नाही | full (डीफॉल्ट) किंवा reduced |
watchdog_enabled | बूलियन | नाही | या कॉलसाठी पर्यवेक्षण सक्षम करा. डीफॉल्ट false |
additional_audio_context | बूलियन | null | नाही | केवळ सर्वात अलीकडील टर्नऐवजी कॉलरच्या ऑडिओमधील शेवटचे काही टर्न समाविष्ट करा, ज्यामुळे कमी विलंब/खर्चाच्या वाढीसह दुरुस्त्या आणि स्पेलिंग/संख्या-केंद्रित डेटा संकलन सुधारते. इनबाउंड सत्रांसाठी डीफॉल्टने चालू आणि आउटबाउंड फोन कॉलसाठी बंद; null डीफॉल्ट कायम ठेवते |
storm_feedback_mode | स्ट्रिंग | नाही | none, acknowledgement (डीफॉल्ट), किंवा tick |
language | स्ट्रिंग | नाही | primary_language साठी संक्षिप्त रूप |
primary_language | स्ट्रिंग | नाही | भाषा कोड, सामान्यीकृत (डीफॉल्ट en). निराकरण न होणारे कोड कॉल नाकारतात |
has_additional_languages | बूलियन | नाही | डीफॉल्ट false |
additional_languages | स्ट्रिंगचा अॅरे | नाही | एजंट ज्या अतिरिक्त भाषांवर स्विच करू शकतो त्या |
native_voice_switching | बूलियन | नाही | डीफॉल्ट false. कॉल दुसऱ्या भाषेवर स्विच झाल्यावर, कॉन्फिगर केलेला व्हॉइस ठेवण्याऐवजी त्या भाषेतील मूळ व्हॉइसवर स्विच करा (लिंगानुसार जुळवलेला) |
background_track | स्ट्रिंग | null | नाही | पार्श्वभूमी ऑडिओ आयडी किंवा null |
acknowledgement_prompt_mode | स्ट्रिंग | नाही | auto (डीफॉल्ट) किंवा manual (Storm-with-ack उत्पादने) |
acknowledgement_prompt | स्ट्रिंग | नाही | acknowledgement_prompt_mode="manual" असताना वापरले जाते |
silence_interval_seconds | पूर्णांक | null | नाही | 5–120. तपासणीपूर्वी कॉलरच्या शांततेचे सेकंद |
silence_max_checkins | पूर्णांक | null | नाही | 1–10 |
silence_checkins_enabled | बूलियन | नाही | डीफॉल्ट true |
connect_tone_enabled | बूलियन | नाही | डीफॉल्ट false |
voicemail_action | स्ट्रिंग | नाही | prompt (डीफॉल्ट), hangup, किंवा message |
voicemail_message | स्ट्रिंग | नाही | voicemail_action="message" असताना वापरले जाते |
agent_name | स्ट्रिंग | नाही | डॅशबोर्ड आणि विजेटला कळवले जाणारे प्रदर्शन नाव |
org_name | स्ट्रिंग | नाही | एजंटच्या व्यक्तिमत्त्वासाठी संस्थेचे प्रदर्शन नाव |
tools | अॅरे | नाही | इनलाइन फंक्शन-टूल स्कीमा (Function Tools पहा) |
call_id | पूर्णांक | नाही | विनंतीच्या कॉल आयडीचा पर्यायी इको; दुर्लक्षित केला जातो |
prompt आणि voice आवश्यक असल्यामुळे, {} किंवा सत्यापनात अयशस्वी होणारा कोणताही
प्रतिसाद कॉल 422 सह नाकारतो — या मार्गावर स्थिर-एजंट फॉलबॅक नाही (वेबहुक मोडमधील
नंबर किंवा कीला नियुक्त एजंट नसतो).
प्रतिसाद आकार मर्यादा
उदाहरण हँडलर
import hashlib
import hmac
import json
import os
from fastapi import FastAPI, HTTPException, Request
app = FastAPI()
WEBHOOK_SECRET = os.environ["THUNDERPHONE_WEBHOOK_SECRET"]
def verify(body: bytes, signature: str) -> bool:
expected = hmac.new(WEBHOOK_SECRET.encode(), body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, signature or "")
@app.post("/thunderphone-webhook")
async def webhook(request: Request):
body = await request.body()
if not verify(body, request.headers.get("X-ThunderPhone-Signature", "")):
raise HTTPException(status_code=401)
event = json.loads(body)
if event["type"] == "telephony.incoming":
caller = event["data"]["from_number"]
prompt = (
"Greet the caller as a San Francisco local…"
if caller.startswith("+1415")
else "You are a friendly customer support agent…"
)
return {
"prompt": prompt,
"voice": "john",
"product": "spark",
}
if event["type"] == "web.incoming":
return {
"prompt": "You are the website's helpful voice assistant…",
"voice": "john",
"product": "spark",
}
return {}import crypto from "node:crypto";
import express from "express";
const app = express();
const SECRET = process.env.THUNDERPHONE_WEBHOOK_SECRET;
function verify(body, signature) {
const expected = crypto
.createHmac("sha256", SECRET)
.update(body)
.digest("hex");
return signature &&
crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
}
app.post(
"/thunderphone-webhook",
express.raw({ type: "application/json" }),
(req, res) => {
if (!verify(req.body, req.header("X-ThunderPhone-Signature"))) {
return res.sendStatus(401);
}
const event = JSON.parse(req.body.toString("utf8"));
if (event.type === "telephony.incoming" || event.type === "web.incoming") {
const caller = event.data.from_number || "web";
const prompt = caller.startsWith("+1415")
? "Greet the caller as a San Francisco local…"
: "You are a friendly customer support agent…";
return res.json({
prompt,
voice: "john",
product: "spark",
});
}
res.json({});
},
);फंक्शन टूल्ससह प्रतिसाद
AI संभाषणादरम्यान तुमच्या API कॉल करू शकेल यासाठी टूल्स जोडा:
{
"prompt": "You are a booking assistant. Use the available tools to help customers schedule appointments.",
"voice": "john",
"product": "spark",
"tools": [
{
"type": "function",
"function": {
"name": "search_appointments",
"description": "Find available appointment slots",
"parameters": {
"type": "object",
"properties": {
"date": { "type": "string", "description": "YYYY-MM-DD" },
"service": { "type": "string" }
},
"required": ["date"]
}
},
"endpoint": {
"url": "https://api.example.com/appointments/search",
"method": "POST",
"headers": {
"X-Api-Key": "your-key"
}
}
}
]
}उत्पादन स्तर जलद संदर्भ
| उत्पादन | विलंबता | तर्कशक्ती | पोचपावती |
|---|---|---|---|
spark | सर्वात कमी | मूलभूत | — |
bolt | कमी | सुधारित | — |
storm-base | मध्यम | सक्षम | — |
storm-base-with-ack | मध्यम | सक्षम | विचार करताना स्वयंचलित फिलर |
storm-extra | जास्त | सखोल | — |
storm-extra-with-ack | जास्त | सखोल | विचार करताना स्वयंचलित फिलर |
संबंधित
कॉलच्या शेवटची नॉन-ब्लॉकिंग घटना.
tools[] साठी पूर्ण JSON स्कीमा आणि स्वाक्षरीकृत एंडपॉइंट करार.
telephony.incoming / web.incoming साठी अनेक URLs सबस्क्राइब करा.
प्रत्येक कॉलरसाठी prompt, टूल्स आणि A/B चाचण्यांचे पॅटर्न.