ThunderPhone 2.0 ಈಗ ಬಿಡುಗಡೆಯಾಗಿದೆ.ನೀವೇ ನೇರವಾಗಿ ಆರಂಭಿಸಿ — 2¢/ನಿಮಿಷದಿಂದ.ಘೋಷಣೆ ಓದಿ

Webhooks

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ಕರೆ ಐಡಿ — ಈ ಕರೆಯ ಎಲ್ಲ ಈವೆಂಟ್‌ಗಳಲ್ಲಿ ಸ್ಥಿರವಾಗಿರುತ್ತದೆ
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ಕರೆ ಐಡಿ
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
additional_audio_contextboolean | nullಇಲ್ಲಇತ್ತೀಚಿನ ಸರದಿಯಷ್ಟೇ ಅಲ್ಲದೆ ಕಾಲರ್ ಆಡಿಯೊದ ಕೊನೆಯ ಕೆಲವು ಸರದಿಗಳನ್ನು ಸೇರಿಸಿ; ಇದು ಸಣ್ಣ ವಿಳಂಬ/ವೆಚ್ಚದ ಹೆಚ್ಚುವರಿಯೊಂದಿಗೆ ತಿದ್ದುಪಡಿಗಳು ಮತ್ತು ಕಾಗುಣಿತ/ಸಂಖ್ಯೆ-ಹೆಚ್ಚಿನ ಡೇಟಾ ಸಂಗ್ರಹಣೆಯನ್ನು ಸುಧಾರಿಸುತ್ತದೆ. ಒಳಬರುವ ಸೆಷನ್‌ಗಳಿಗೆ ಪೂರ್ವನಿಯೋಜಿತವಾಗಿ ಆನ್ ಆಗಿರುತ್ತದೆ ಮತ್ತು ಹೊರಹೋಗುವ ಫೋನ್ ಕರೆಗಳಿಗೆ ಆಫ್ ಆಗಿರುತ್ತದೆ; null ಪೂರ್ವನಿಯೋಜಿತವನ್ನು ಉಳಿಸುತ್ತದೆ
storm_feedback_modestringಇಲ್ಲnone, acknowledgement (ಪೂರ್ವನಿಯೋಜಿತ), ಅಥವಾ tick
languagestringಇಲ್ಲprimary_language ಗಾಗಿ ಸಂಕ್ಷಿಪ್ತ ರೂಪ
primary_languagestringಇಲ್ಲಭಾಷಾ ಕೋಡ್, ಸಾಮಾನ್ಯೀಕರಿಸಲಾಗಿದೆ (ಪೂರ್ವನಿಯೋಜಿತ en). ಪರಿಹರಿಸಲಾಗದ ಕೋಡ್‌ಗಳು ಕರೆಯನ್ನು ತಿರಸ್ಕರಿಸುತ್ತವೆ
has_additional_languagesbooleanಇಲ್ಲಪೂರ್ವನಿಯೋಜಿತ false
additional_languagesarray of stringಇಲ್ಲಏಜೆಂಟ್ ಬದಲಾಯಿಸಬಹುದಾದ ಹೆಚ್ಚುವರಿ ಭಾಷೆಗಳು
native_voice_switchingbooleanಇಲ್ಲಪೂರ್ವನಿಯೋಜಿತ false. ಕರೆ ಮತ್ತೊಂದು ಭಾಷೆಗೆ ಬದಲಾದಾಗ, ಕಾನ್ಫಿಗರ್ ಮಾಡಿರುವ ಧ್ವನಿಯನ್ನು ಉಳಿಸಿಕೊಳ್ಳುವ ಬದಲು ಆ ಭಾಷೆಗೆ ಸ್ಥಳೀಯವಾದ ಧ್ವನಿಗೆ ಬದಲಾಯಿಸಿ (ಲಿಂಗದ ಆಧಾರದ ಮೇಲೆ ಹೊಂದಿಸಲಾಗುತ್ತದೆ)
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 ನೊಂದಿಗೆ ತಿರಸ್ಕರಿಸಲಾಗುತ್ತದೆ — ಈ ಮಾರ್ಗದಲ್ಲಿ ಸ್ಥಿರ-ಏಜೆಂಟ್ ಫಾಲ್‌ಬ್ಯಾಕ್ ಇಲ್ಲ (ವೆಬ್‌ಹುಕ್ ಕ್ರಮದಲ್ಲಿನ ಸಂಖ್ಯೆ ಅಥವಾ ಕೀಲಿಗೆ ಯಾವುದೇ ನಿಯೋಜಿತ ಏಜೆಂಟ್ ಇರುವುದಿಲ್ಲ).


ಪ್ರತಿಕ್ರಿಯೆ ಗಾತ್ರದ ಮಿತಿ


ಉದಾಹರಣೆ ಹ್ಯಾಂಡ್ಲರ್

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ಹೆಚ್ಚುಆಳವಾದಯೋಚಿಸುವಾಗ ಸ್ವಯಂಚಾಲಿತ ಫಿಲ್ಲರ್

ಸಂಬಂಧಿತ