ThunderPhone 2.0 ഇപ്പോൾ ലൈവാണ്.സ്വയം തുടങ്ങാം — 2¢/മിനിറ്റ് മുതൽ.പ്രഖ്യാപനം വായിക്കുക

Webhooks

telephony.incoming / web.incoming

ഇൻബൗണ്ട് കോളിന്റെ കോൺഫിഗറേഷൻ തത്സമയം രൂപപ്പെടുത്തുന്ന ബ്ലോക്കിംഗ് വെബ്ഹുക്ക്.

ഒരു ഇൻബൗണ്ട് ഫോൺ കോൾ നിയോഗിച്ച ഏജന്റില്ലാത്ത ഒരു നമ്പറിലെത്തുമ്പോഴോ, mode="webhook"-ലുള്ള ഒരു പ്രസിദ്ധീകരിക്കാവുന്ന കീയിൽ ഒരു വെബ് വിഡ്ജറ്റ് സെഷൻ ആരംഭിക്കുമ്പോഴോ, ThunderPhone നിങ്ങളുടെ ലെഗസി വെബ്‌ഹുക്ക് URL-ലേക്ക് ഒരു തടസ്സപ്പെടുത്തുന്ന telephony.incoming / web.incoming അഭ്യർത്ഥന അയയ്ക്കുകയും കോൺഫിഗറേഷൻ പ്രതികരണത്തിനായി 10 സെക്കൻഡ് വരെ കാത്തിരിക്കുകയും ചെയ്യുന്നു. ഓരോ കോളിനും prompt, voice, ടൂളുകൾ എന്നിവ ഡൈനാമിക്കായി തിരഞ്ഞെടുക്കാൻ ഈ കൈമാറ്റം ഉപയോഗിക്കുക — സമഗ്രമായ രീതിക്കായി ഡൈനാമിക് കോൾ കോൺഫിഗറേഷൻ ഗൈഡ് കാണുക.

തടസ്സപ്പെടുത്തുന്ന ഈ കൈമാറ്റത്തിന് ഫാൾബാക്കില്ല: നിങ്ങളുടെ ഹാൻഡ്‌ലർ 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കൂടുതൽആഴത്തിലുള്ളചിന്തിക്കുന്നതിനിടെ സ്വയമേവയുള്ള ഫില്ലർ

ബന്ധപ്പെട്ടവ