ThunderPhone 2.0 அறிமுகமாகிவிட்டது.நீங்களே தொடங்கலாம்; நிமிடத்திற்கு 2¢ முதல்.அறிவிப்பைப் படிக்கவும்

Developer cookbook

ஒவ்வொரு அழைப்பிற்குமான டைனமிக் கட்டமைப்பு

நீங்கள் கட்டுப்படுத்தும் webhook-இல் உள்ள தனிப்பயன் தர்க்கத்தின் அடிப்படையில், ஒவ்வொரு உள்வரும் அழைப்பிற்கும் பதிலளிக்கும் ஏஜென்ட்டைத் தனித்தனியாகத் தேர்ந்தெடுக்கவும் அல்லது அதன் prompt மற்றும் அமைப்புகளை மாற்றியமைக்கவும்.

இயல்பாக, ஒவ்வொரு தொலைபேசி எண்ணுக்கும் வெளியிடக்கூடிய விசைக்கும் ஒரு நிலையான ஏஜென்ட் ஒதுக்கப்பட்டிருக்கும். ஒவ்வொரு அழைப்பாளருக்கும் அல்லது ஒவ்வொரு பார்வையாளருக்கும் ஏற்ப தனிப்பயனாக்கம் தேவைப்படும்போது — VIP வழிமாற்றம், உள்நுழைந்த பயனர் சூழல், A/B prompt சோதனைகள் — வெப்ஹுக் பயன்முறைக்கு மாறி, உங்கள் சர்வர் முடிவு செய்ய அனுமதிக்கவும்.

இது எவ்வாறு செயல்படுகிறது

  1. நீங்கள் telephony.incoming (தொலைபேசி) அல்லது web.incoming (விட்ஜெட்) நிகழ்வுக்கு சந்தா செலுத்துகிறீர்கள். இரண்டும் தடுக்கும் வெப்ஹுக்குகள்: அழைப்பைத் தொடர்வதற்கு முன் உங்கள் பதிலுக்காக ThunderPhone 10 வினாடிகள் வரை காத்திருக்கும்.
  2. ThunderPhone உங்களுக்கு {call_id, from_number, to_number} அனுப்பும் (விட்ஜெட் அமர்வுகள் எண்களுக்குப் பதிலாக விட்ஜெட்டுக்கான புலங்களைக் கொண்டிருக்கும் — கோரிக்கை ஸ்கீமாவைப் பார்க்கவும்).
  3. உங்கள் சர்வர் ஒரு ஏஜென்ட் கட்டமைப்புடன் பதிலளிக்கும் (prompt, குரல், தயாரிப்பு, கருவிகள்). அந்த அழைப்புக்கு ThunderPhone அந்தக் கட்டமைப்பைப் பயன்படுத்தும்.
  4. நீங்கள் {} அனுப்பினாலோ, நேரம் முடிந்தாலோ அல்லது பிழை ஏற்பட்டாலோ, நிலையாக ஒதுக்கப்பட்ட ஏஜென்ட் மாற்றுத் தேர்வாகப் பயன்படுத்தப்படும். பாதுகாப்பான இயல்புநிலை.

1. வெப்ஹுக் இலக்கை கட்டமைக்கவும்

தொலைபேசி எண்களுக்கு, உங்கள் எண்ட்பாயிண்ட்டை telephony.incoming-க்கு சந்தா செலுத்தவும்:

curl -X POST https://api.thunderphone.com/v1/developer/webhook-endpoints \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "label":  "Prod call-incoming",
    "url":    "https://example.com/thunderphone/incoming",
    "events": ["telephony.incoming"]
  }'

பதில் ஒருமுறை மட்டுமே பயன்படுத்தக்கூடிய secret-ஐ கொண்டிருக்கும் — அதைச் சேமிக்கவும்; கையொப்பச் சரிபார்ப்புக்கு அதைப் பயன்படுத்துவீர்கள்.

விட்ஜெட் அமர்வுகளுக்கு, உங்கள் எண்ட்பாயிண்ட் URL உட்பொதிக்கப்பட்ட நிலையில் mode="webhook"-இல் வெளியிடக்கூடிய விசையை உருவாக்கவும்:

curl -X POST https://api.thunderphone.com/v1/publishable-key \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name":            "Dynamic widget",
    "mode":            "webhook",
    "webhook_url":     "https://example.com/thunderphone/widget-incoming",
    "allowed_domains": ["example.com"]
  }'

ஒவ்வொரு அமர்வு தொடக்கத்திலும் விட்ஜெட் இந்த URL-க்கு POST செய்யும்.

2. ஹேண்ட்லரை செயல்படுத்துங்கள்

மூன்று வழிகாட்டும் விதிகள்:

  • ஒவ்வொரு கோரிக்கையிலும் கையொப்பத்தைச் சரிபார்க்கவும் (வெப்ஹுக் கையொப்பங்களைச் சரிபார்க்கவும் என்பதைப் பார்க்கவும்). டெவலப்மெண்டில் இதைத் தவிர்க்காதீர்கள் — ஒருமுறை சரியாக அமைத்து மீண்டும் பயன்படுத்துங்கள்.
  • விரைவாகப் பதிலளிக்கவும். பத்து விநாடிகள் கடுமையான உச்சவரம்பாகும்; ஒவ்வொரு விநாடியும் அழைப்பாளருக்கு அமைதியான இடைவெளியாக இருக்கும். தேவைப்பட்டால் தரவுத்தளத் தேடல்களைச் செய்யலாம், ஆனால் பின்தொடரும் LLM-களை ஒத்திசைவாக அழைக்காதீர்கள் — டைனமிக் prompt உருவாக்கம் வேண்டுமெனில், முன்கூட்டியே கணக்கிட்டு கேஷ் செய்யுங்கள்.
  • சரியாக மாற்று வழிக்குச் செல்லுங்கள். எதிர்பாராத எந்த நிலையிலும் {} ஐத் திருப்பி அனுப்ப வேண்டும்; அப்போது நிலையாக ஒதுக்கப்பட்ட ஏஜென்ட் அழைப்பைக் கையாளும்.
FastAPI
import hashlib
import hmac
import json
import os
 
from fastapi import FastAPI, HTTPException, Request
 
app = FastAPI()
SECRET = os.environ["THUNDERPHONE_WEBHOOK_SECRET"]
 
def verify(body: bytes, sig: str) -> bool:
    expected = hmac.new(SECRET.encode(), body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, sig or "")
 
@app.post("/thunderphone/incoming")
async def incoming(request: Request):
    body = await request.body()
    if not verify(body, request.headers.get("X-ThunderPhone-Signature", "")):
        raise HTTPException(401)
 
    event = json.loads(body)
    if event["type"] not in ("telephony.incoming", "web.incoming"):
        return {}  # fall back to default
 
    caller = event["data"]["from_number"]
    # Cheap DB lookup: is this a known VIP?
    customer = lookup_customer(caller)
    if customer and customer.tier == "vip":
        return {
            "prompt":  f"You are a VIP concierge for {customer.name}. Be proactive…",
            "voice":   "john",
            "product": "storm-base",
        }
    return {}  # default agent handles non-VIPs
 
def lookup_customer(phone: str):
    # ... your CRM integration ...
    pass
Express
import crypto from "node:crypto";
import express from "express";
 
const app = express();
const SECRET = process.env.THUNDERPHONE_WEBHOOK_SECRET;
 
function verify(body, sig) {
  const expected = crypto.createHmac("sha256", SECRET).update(body).digest("hex");
  return sig &&
    crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(sig));
}
 
app.post(
  "/thunderphone/incoming",
  express.raw({ type: "application/json" }),
  async (req, res) => {
    if (!verify(req.body, req.header("X-ThunderPhone-Signature"))) {
      return res.sendStatus(401);
    }
    const event = JSON.parse(req.body.toString("utf8"));
 
    const IMPORTANT_TYPES = new Set([
      "telephony.incoming",
      "web.incoming",
    ]);
    if (!IMPORTANT_TYPES.has(event.type)) return res.json({});
 
    const customer = await lookupCustomer(event.data.from_number);
    if (customer?.tier === "vip") {
      return res.json({
        prompt:  `You are a VIP concierge for ${customer.name}. Be proactive…`,
        voice:   "john",
        product: "storm-base",
      });
    }
    res.json({}); // fall back to default agent
  },
);

3. பதில் ஸ்கீமா

பதில் உடல் உள்வரும் அழைப்பு பதில் ஸ்கீமாவுடன் முழுமையாகப் பொருந்தும். பொதுவாகப் பயன்படுத்தப்படும் புலங்கள்:

புலம்வகைவிளக்கம்
promptசரம் (தேவையானது)ஏஜென்டிற்கான சிஸ்டம் prompt
voiceசரம் (தேவையானது)GET /v1/voices இலிருந்து குரல் ஐடி
productசரம்இயல்புநிலை spark
background_trackசரம் | nullசூழல் ஒலி ஐடி
acknowledgement_prompt_modeசரம்auto அல்லது manual (அங்கீகாரத்துடன் Storm மட்டும்)
acknowledgement_promptசரம்பயன்முறை manual ஆக இருக்கும்போது தேவையானது
toolsஅணிவரிசைஇன்லைன் செயல்பாட்டு-கருவி ஸ்கீமாக்கள் — செயல்பாட்டு கருவிகள் பார்க்கவும்

சேமிக்கப்பட்ட ஏஜென்டை வைத்திருந்து மாறிகளை வழங்கவும்

அந்த நிறுவனத்தின் சேமிக்கப்பட்ட ஏஜென்டை ஒவ்வொரு அழைப்பிற்குமான தரவுடன் பயன்படுத்த, {"agent_id": 12, "variables": {"name": "Ada"}} ஐத் திருப்பி அனுப்பவும். அதன் prompt-ல் {{name}} அல்லது {{name|Friend}} இருக்கலாம். வெப்ஹுக் மாறிகள் கோரிக்கை-நிலை மாறிகளை மேலெழுதும்; null என்பது பிளேஸ்ஹோல்டர் இயல்புநிலையைப் பயன்படுத்தும், அல்லது எதுவும் வழங்கப்படவில்லை என்றால் வெற்றிட உரையைப் பயன்படுத்தும். இறுதி மதிப்புகளும் தீர்க்கப்படாத பெயர்களும் அழைப்பு விவரங்களிலும் நிறைவு வெப்ஹுக்குகளிலும் தோன்றும். சேமிக்கப்பட்ட-ஏஜென்ட் பதில்கள் agent_id மற்றும் variables ஐ மட்டுமே ஏற்கும். prompt இருந்தால், பதில் இன்லைன் கட்டமைப்பைப் பயன்படுத்தி agent_id ஐப் புறக்கணிக்கும் (null அல்லது முழுஎண் அல்லாத மெட்டாடேட்டா உட்பட); இன்லைன் prompt இன்னும் செல்லுபடியாக இருக்க வேண்டும். இன்லைன் கட்டமைப்பு பதில்களில் variables உம் இருக்கலாம். சேமிக்கப்பட்ட-ஏஜென்ட் பதில்கள், தொலைபேசி மற்றும் விட்ஜெட் அழைப்புகள் இரண்டிலும் ஏஜென்டின் வெளியிடப்பட்ட A/B பிரிப்பைப் பயன்படுத்தி, பின்னர் மாறிகளை ரெண்டர் செய்யும். வரம்புகள் மற்றும் அமர்வு API ஆதரவுக்கு அழைப்பு மாறிகள் பார்க்கவும். தடுப்புக் கட்டமைப்பு பழைய தொலைபேசி-எண்/நிறுவன URL அல்லது வெப்ஹுக்-பயன்முறை விட்ஜெட் விசையிலிருந்து வருகிறது; எண்ட்பாயிண்ட்-சிஸ்டம் உள்வரும் நிகழ்வுகள் அறிவிப்புகள் மட்டுமே.

வடிவங்கள்

உள்நுழைந்த பயனர் சூழல்

வெப்ஹுக்-பயன்முறை விட்ஜெட்களில், பார்வையாளரின் பக்கத்திற்கு அவர்கள் யார் என்பது ஏற்கனவே தெரியும். விட்ஜெட் SDK அனுப்பும் வினவல் சரம் அளவுருவுடன் (?customer_id=123) உங்கள் வெப்ஹுக்கை அழைத்து, வாடிக்கையாளரை சர்வர் பக்கத்தில் தேடவும்.

A/B prompt வெளியீடு

இதை நீங்களே உருவாக்குவதற்கு முன், ThunderPhone-இல் வகைகளை வரையறுத்து, டிராஃபிக்கைப் பிரித்து, ஒவ்வொரு வகையின் முடிவுகளையும் ஒப்பிடும் சொந்த பரிசோதனைகள் வசதி உள்ளது என்பதை நினைவில் கொள்ளவும் (/dashboard/experiments மற்றும் ஏஜென்ட் பில்டரின் A/B தாவல்) — வெப்ஹுக் தேவையில்லை.

எப்படியிருந்தாலும் வெப்ஹுக்-பக்கக் கட்டுப்பாடு தேவைப்பட்டால்: call_id → பக்கெட் என ஹாஷ் செய்யவும்; 0..49 க்கு prompt A-ஐயும், 50..99 க்கு prompt B-ஐயும் வழங்கவும். நீங்கள் தேர்ந்தெடுத்த பக்கெட்டை உங்கள் சொந்த DB-யில் பதிவு செய்து, பின்னர் நிறைவடைந்த அழைப்பின் மதிப்பெண்ணுடன் தொடர்புபடுத்தவும்.

நேர அடிப்படையிலான வழிமாற்றம்

வணிக நேரம் → "நேரடி ஆதரவு" ஏஜென்ட்; அலுவல் நேரத்திற்குப் பின் → "செய்தி எடுக்கவும்" ஏஜென்ட். உங்கள் ஹேண்ட்லரில் new Date().getUTCHours() அடிப்படையில் எளிய மாற்றம்.


அடுத்த படிகள்