ThunderPhone 2.0 आता लाइव्ह आहे.स्वतःच सुरू करा—2¢/मिनिटपासून.घोषणा वाचा

Webhooks

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_idintegerकॉल ID — या कॉलसाठी सर्व इव्हेंट्समध्ये स्थिर
from_numberstringE.164 कॉलर नंबर
to_numberstringE.164 गंतव्य (तुमच्या ThunderPhone नंबरपैकी एक)

वेब विजेट सेशनसाठी (web.incoming), data फोन नंबरऐवजी एम्बेडिंग पेज ओळखते:

{
  "type": "web.incoming",
  "data": {
    "call_id": 987654322,
    "origin_domain": "https://example.com",
    "publishable_key_prefix": "pk_live_a1b2"
  }
}
फील्डप्रकारवर्णन
call_idintegerकॉल ID
origin_domainstringविजेट होस्ट करणारा पेज ऑरिजिन
publishable_key_prefixstringसेशन उघडणाऱ्या पब्लिश करण्यायोग्य कीची सुरुवातीची अक्षरे
language, primary_languagestringविजेट सेशनने भाषा ओव्हरराइडची विनंती केल्यावर उपलब्ध असते
voicestringविजेट सेशनने आवाज ओव्हरराइडची विनंती केल्यावर उपलब्ध असते
website_contextstringविजेटने प्रति-सेशन पेज कॉन्टेक्स्ट पास केल्यावर उपलब्ध असते

प्रतिसाद स्कीमा

या कॉलसाठी एजंट कॉन्फिगरेशनचे वर्णन करणारा 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 सह नाकारतो — या मार्गावर स्थिर-एजंट फॉलबॅक नाही (वेबहुक मोडमधील नंबर किंवा कीला नियुक्त एजंट नसतो).


प्रतिसाद आकार मर्यादा


उदाहरण हँडलर

Python (FastAPI)
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 {}
Node.js (Express)
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जास्तसखोलविचार करताना स्वयंचलित फिलर

संबंधित