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 | ಹೆಚ್ಚು | ಆಳವಾದ | ಯೋಚಿಸುವಾಗ ಸ್ವಯಂಚಾಲಿತ ಭರ್ತಿಪದ |
ಸಂಬಂಧಿತ
ತಡೆಯದ ಕರೆ-ಅಂತ್ಯ ಈವೆಂಟ್.
tools[] ಮತ್ತು ಸಹಿ ಮಾಡಲಾದ ಎಂಡ್ಪಾಯಿಂಟ್ ಒಪ್ಪಂದಕ್ಕಾಗಿ ಸಂಪೂರ್ಣ JSON ಸ್ಕೀಮಾ.
telephony.incoming / web.incoming ಗೆ ಬಹು URLಗಳನ್ನು ಚಂದಾದಾರಗೊಳಿಸಿ.
ಪ್ರತಿ ಕರೆಗಾರರ promptಗಳು, ಸಾಧನಗಳು ಮತ್ತು A/B ಪರೀಕ್ಷೆಗಳ ಮಾದರಿಗಳು.