telephony.incoming / web.incoming

ஒரு உள்வரும் தொலைபேசி அழைப்பு ஏஜென்ட் ஒதுக்கப்படாத எண்ணை அடையும்போது, அல்லது mode="webhook" உள்ள வெளியிடக்கூடிய விசையில் ஒரு வலை விஜெட் அமர்வு தொடங்கும்போது, ThunderPhone உங்கள் முந்தைய வெப்ஹுக் 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":   []
}
புலம்வகைஅவசியம்விளக்கம்
promptstringஆம்ஏஜென்டை இயக்கும் சிஸ்டம் prompt
voicestringஆம்GET /v1/voices இலிருந்து பெறப்படும் குரல் ID, எ.கா. john. voice_name மாற்றுப்பெயராக ஏற்கப்படும். அறியப்படாத குரல்கள் சரிபார்ப்பில் தோல்வியடைந்து அழைப்பை நிராகரிக்கும்
productstringஇல்லைஇயல்புநிலை spark. அனுமதிக்கப்பட்டவை: spark, bolt, storm-base, storm-base-with-ack, storm-extra, storm-extra-with-ack
thinking_levelstringஇல்லைminimal, base (இயல்புநிலை), அல்லது extra. Storm தயாரிப்புகளுக்கு மேலெழுதப்படும்: storm-extra* கட்டாயமாக extra ஆகும், மற்ற storm-* கட்டாயமாக base ஆகும்
audio_context_modestringஇல்லைfull (இயல்புநிலை) அல்லது reduced
watchdog_enabledbooleanஇல்லைஇந்த அழைப்பிற்கான மேற்பார்வையை இயக்கவும். இயல்புநிலை false
storm_feedback_modestringஇல்லைnone, acknowledgement (இயல்புநிலை), அல்லது tick
languagestringஇல்லைprimary_language என்பதற்கான சுருக்கம்
primary_languagestringஇல்லைமொழிக் குறியீடு, இயல்பாக்கப்பட்டது (இயல்புநிலை en). தீர்மானிக்க முடியாத குறியீடுகள் அழைப்பை நிராகரிக்கும்
has_additional_languagesbooleanஇல்லைஇயல்புநிலை false
additional_languagesarray of stringஇல்லைஏஜென்ட் மாறக்கூடிய கூடுதல் மொழிகள்
background_trackstring | nullஇல்லைசூழல் ஒலி ID அல்லது null
acknowledgement_prompt_modestringஇல்லைauto (இயல்புநிலை) அல்லது manual (Storm-with-ack தயாரிப்புகள்)
acknowledgement_promptstringஇல்லைacknowledgement_prompt_mode="manual" ஆக இருக்கும்போது பயன்படுத்தப்படும்
silence_interval_secondsinteger | nullஇல்லை5–120. சரிபார்ப்பு தொடர்புக்கு முன் அழைப்பாளரின் அமைதிக்கான விநாடிகள்
silence_max_checkinsinteger | nullஇல்லை1–10
silence_checkins_enabledbooleanஇல்லைஇயல்புநிலை true
connect_tone_enabledbooleanஇல்லைஇயல்புநிலை false
voicemail_actionstringஇல்லைprompt (இயல்புநிலை), hangup, அல்லது message
voicemail_messagestringஇல்லைvoicemail_action="message" ஆக இருக்கும்போது பயன்படுத்தப்படும்
agent_namestringஇல்லைடாஷ்போர்டுகள் மற்றும் விட்ஜெட்டில் காட்டப்படும் காட்சி பெயர்
org_namestringஇல்லைஏஜென்டின் ஆளுமைக்கான நிறுவன காட்சி பெயர்
toolsarrayஇல்லைஇன்லைன் ஃபங்க்ஷன்-டூல் ஸ்கீமாக்கள் (ஃபங்க்ஷன் டூல்கள் பார்க்கவும்)
call_idintegerஇல்லைகோரிக்கையின் அழைப்பு ID-யின் விருப்பமான எதிரொலி; புறக்கணிக்கப்படும்

prompt மற்றும் voice அவசியம் என்பதால், {} அல்லது சரிபார்ப்பில் தோல்வியடையும் எந்தப் பதிலும் 422 உடன் அழைப்பை நிராகரிக்கும் — இந்தப் பாதையில் நிலையான ஏஜென்ட் மாற்று வழி இல்லை (webhook முறையில் ஒரு எண்ணுக்கோ விசைக்கோ ஒதுக்கப்பட்ட ஏஜென்ட் இல்லை).


பதில் அளவு வரம்பு


எடுத்துக்காட்டு ஹேண்ட்லர்

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அதிகம்ஆழமானதுசிந்திக்கும் போது தானியங்கி நிரப்பி

தொடர்புடையவை