ThunderPhone 2.0 ఇప్పుడు అందుబాటులో ఉంది.మీరే ప్రారంభించవచ్చు—నిమిషానికి 2¢ నుంచి.ప్రకటనను చదవండి

Webhooks

telephony.incoming / web.incoming

ఇన్‌బౌండ్ కాల్ కాన్ఫిగరేషన్‌ను రియల్ టైమ్‌లో రూపొందించే బ్లాకింగ్ webhook.

ఏజెంట్ కేటాయించని నంబర్‌కు ఇన్‌బౌండ్ ఫోన్ కాల్ వచ్చినప్పుడు లేదా mode="webhook"లో ఉన్న ప్రచురణీయ కీపై వెబ్ విడ్జెట్ సెషన్ ప్రారంభమైనప్పుడు, ThunderPhone మీ లెగసీ webhook URLకు నిరోధక telephony.incoming / web.incoming అభ్యర్థనను పంపి, కాన్ఫిగరేషన్ ప్రతిస్పందన కోసం గరిష్ఠంగా 10 సెకన్లు వేచి ఉంటుంది. ప్రతి కాల్‌కు prompt, వాయిస్, టూల్స్‌ను డైనమిక్‌గా ఎంచుకోవడానికి ఈ మార్పిడిని ఉపయోగించండి — పూర్తి విధానం కోసం డైనమిక్ కాల్ కాన్ఫిగరేషన్ గైడ్ను చూడండి.

ఈ నిరోధక మార్పిడికి ఫాల్‌బ్యాక్ లేదు: మీ హ్యాండ్లర్ non-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అరేలేదుఇన్‌లైన్ ఫంక్షన్-టూల్ స్కీమాలు (ఫంక్షన్ టూల్స్ చూడండి)
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ఎక్కువలోతైనదిఆలోచిస్తున్నప్పుడు ఆటో ఫిల్లర్

సంబంధితవి