telephony.incoming / web.incoming

ನಿಯೋಜಿತ ಏಜೆಂಟ್ ಇಲ್ಲದ ಸಂಖ್ಯೆಗೆ ಒಳಬರುವ ಫೋನ್ ಕರೆ ತಲುಪಿದಾಗ ಅಥವಾ mode="webhook" ನಲ್ಲಿರುವ publishable key ನಲ್ಲಿ ವೆಬ್ ವಿಜೆಟ್ ಸೆಷನ್ ಪ್ರಾರಂಭವಾದಾಗ, ThunderPhone ನಿಮ್ಮ ಲೆಗಸಿ webhook 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_idಪೂರ್ಣಾಂಕಕರೆ id — ಈ ಕರೆಯ ಎಲ್ಲ ಈವೆಂಟ್‌ಗಳಲ್ಲಿ ಸ್ಥಿರವಾಗಿರುತ್ತದೆ
from_numberಸ್ಟ್ರಿಂಗ್E.164 ಕರೆ ಮಾಡುವವರ ಸಂಖ್ಯೆ
to_numberಸ್ಟ್ರಿಂಗ್E.164 ಗಮ್ಯಸ್ಥಾನ (ನಿಮ್ಮ ThunderPhone ಸಂಖ್ಯೆಗಳಲ್ಲಿ ಒಂದು)

ವೆಬ್ ವಿಜೆಟ್ ಸೆಷನ್‌ಗಳಿಗಾಗಿ (web.incoming), data ಫೋನ್ ಸಂಖ್ಯೆಗಳ ಬದಲಿಗೆ ಎಂಬೆಡ್ ಮಾಡಿರುವ ಪುಟವನ್ನು ಗುರುತಿಸುತ್ತದೆ:

{
  "type": "web.incoming",
  "data": {
    "call_id": 987654322,
    "origin_domain": "https://example.com",
    "publishable_key_prefix": "pk_live_a1b2"
  }
}
ಕ್ಷೇತ್ರಪ್ರಕಾರವಿವರಣೆ
call_idಪೂರ್ಣಾಂಕಕರೆ id
origin_domainಸ್ಟ್ರಿಂಗ್ವಿಜೆಟ್ ಅನ್ನು ಹೋಸ್ಟ್ ಮಾಡುವ ಪುಟದ ಮೂಲ
publishable_key_prefixಸ್ಟ್ರಿಂಗ್ಸೆಷನ್ ಅನ್ನು ತೆರೆದ publishable key ಯ ಮೊದಲ ಅಕ್ಷರಗಳು
language, primary_languageಸ್ಟ್ರಿಂಗ್ವಿಜೆಟ್ ಸೆಷನ್ ಭಾಷೆ ಓವರ್‌ರೈಡ್ ಅನ್ನು ವಿನಂತಿಸಿದಾಗ ಇರುತ್ತದೆ
voiceಸ್ಟ್ರಿಂಗ್ವಿಜೆಟ್ ಸೆಷನ್ ಧ್ವನಿ ಓವರ್‌ರೈಡ್ ಅನ್ನು ವಿನಂತಿಸಿದಾಗ ಇರುತ್ತದೆ
website_contextಸ್ಟ್ರಿಂಗ್ವಿಜೆಟ್ ಪ್ರತಿ-ಸೆಷನ್ ಪುಟದ ಸಂದರ್ಭವನ್ನು ಹಾದುಹೋಗಿಸಿದಾಗ ಇರುತ್ತದೆ

ಪ್ರತಿಕ್ರಿಯೆ ಸ್ಕೀಮಾ

ಈ ಕರೆಯ ಏಜೆಂಟ್ ಕಾನ್ಫಿಗರೇಶನ್‌ ಅನ್ನು ವಿವರಿಸುವ 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 ನಿಂದ ವಾಯ್ಸ್ ID, ಉದಾ. 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
storm_feedback_modeಸ್ಟ್ರಿಂಗ್ಇಲ್ಲnone, acknowledgement (ಡೀಫಾಲ್ಟ್), ಅಥವಾ tick
languageಸ್ಟ್ರಿಂಗ್ಇಲ್ಲprimary_language ಗಾಗಿ ಸಂಕ್ಷಿಪ್ತ ರೂಪ
primary_languageಸ್ಟ್ರಿಂಗ್ಇಲ್ಲಭಾಷಾ ಕೋಡ್, ಸಾಮಾನ್ಯೀಕರಿಸಿದ (ಡೀಫಾಲ್ಟ್ en). ಪರಿಹರಿಸಲಾಗದ ಕೋಡ್‌ಗಳು ಕರೆಯನ್ನು ತಿರಸ್ಕರಿಸುತ್ತವೆ
has_additional_languagesಬೂಲಿಯನ್ಇಲ್ಲಡೀಫಾಲ್ಟ್ false
additional_languagesಸ್ಟ್ರಿಂಗ್‌ಗಳ ಅರೆಇಲ್ಲಏಜೆಂಟ್ ಬದಲಾಯಿಸಬಹುದಾದ ಹೆಚ್ಚುವರಿ ಭಾಷೆಗಳು
background_trackಸ್ಟ್ರಿಂಗ್ | ನಲ್ಇಲ್ಲಸುತ್ತಮುತ್ತಲಿನ ಆಡಿಯೊ ID ಅಥವಾ null
acknowledgement_prompt_modeಸ್ಟ್ರಿಂಗ್ಇಲ್ಲauto (ಡೀಫಾಲ್ಟ್) ಅಥವಾ manual (Storm-with-ack ಉತ್ಪನ್ನಗಳು)
acknowledgement_promptಸ್ಟ್ರಿಂಗ್ಇಲ್ಲacknowledgement_prompt_mode="manual" ಆಗಿರುವಾಗ ಬಳಸಲಾಗುತ್ತದೆ
silence_interval_secondsಪೂರ್ಣಾಂಕ | ನಲ್ಇಲ್ಲ5–120. ಪರಿಶೀಲನೆಗೂ ಮುನ್ನ ಕರೆಮಾಡುವವರ ಮೌನದ ಸೆಕೆಂಡುಗಳು
silence_max_checkinsಪೂರ್ಣಾಂಕ | ನಲ್ಇಲ್ಲ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ಪೂರ್ಣಾಂಕಇಲ್ಲವಿನಂತಿಯ ಕಾಲ್ ID ಯ ಐಚ್ಛಿಕ ಪ್ರತಿಧ್ವನಿ; ನಿರ್ಲಕ್ಷಿಸಲಾಗುತ್ತದೆ

prompt ಮತ್ತು voice ಅಗತ್ಯವಾಗಿರುವುದರಿಂದ, {} ಅಥವಾ ವ್ಯಾಲಿಡೇಶನ್‌ನಲ್ಲಿ ವಿಫಲವಾಗುವ ಯಾವುದೇ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಹಿಂತಿರುಗಿಸಿದರೆ ಕರೆ 422 ನೊಂದಿಗೆ ತಿರಸ್ಕರಿಸಲಾಗುತ್ತದೆ — ಈ ಮಾರ್ಗದಲ್ಲಿ ಸ್ಥಿರ-ಏಜೆಂಟ್ ಫಾಲ್‌ಬ್ಯಾಕ್ ಇಲ್ಲ (ವೆಬ್‌ಹುಕ್ ಮೋಡ್‌ನಲ್ಲಿನ ಸಂಖ್ಯೆಗೆ ಅಥವಾ ಕೀಗೆ ನಿಯೋಜಿತ ಏಜೆಂಟ್ ಇರುವುದಿಲ್ಲ).


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


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

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

ಸಂಬಂಧಿತ