Open in
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_id | integer | ಕರೆ ಐಡಿ — ಈ ಕರೆಯ ಎಲ್ಲ ಈವೆಂಟ್ಗಳಲ್ಲಿ ಸ್ಥಿರವಾಗಿರುತ್ತದೆ |
from_number | string | E.164 ಕರೆಮಾಡುವವರ ಸಂಖ್ಯೆ |
to_number | string | 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 | integer | ಕರೆ ಐಡಿ |
origin_domain | string | ವಿಜೆಟ್ ಅನ್ನು ಹೋಸ್ಟ್ ಮಾಡುವ ಪುಟದ ಮೂಲ |
publishable_key_prefix | string | ಸೆಷನ್ ತೆರೆದ ಪ್ರಕಟಿಸಬಹುದಾದ ಕೀಯ ಮೊದಲ ಅಕ್ಷರಗಳು |
language, primary_language | string | ವಿಜೆಟ್ ಸೆಷನ್ ಭಾಷೆ ಓವರ್ರೈಡ್ ಅನ್ನು ವಿನಂತಿಸಿದಾಗ ಇರುತ್ತದೆ |
voice | string | ವಿಜೆಟ್ ಸೆಷನ್ ಧ್ವನಿ ಓವರ್ರೈಡ್ ಅನ್ನು ವಿನಂತಿಸಿದಾಗ ಇರುತ್ತದೆ |
website_context | string | ವಿಜೆಟ್ ಪ್ರತಿ-ಸೆಷನ್ ಪುಟ ಸಂದರ್ಭವನ್ನು ರವಾನಿಸಿದಾಗ ಇರುತ್ತದೆ |
ಪ್ರತಿಕ್ರಿಯೆ ಸ್ಕೀಮಾ
ಈ ಕರೆಯ ಏಜೆಂಟ್ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ವಿವರಿಸುವ JSON ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ಹಿಂತಿರುಗಿಸಿ.
prompt ಮತ್ತು voice ಅಗತ್ಯವಿದೆ; ಉಳಿದ ಎಲ್ಲವೂ ಐಚ್ಛಿಕ.
{
"prompt": "You are a helpful booking assistant for Acme Restaurant.",
"voice": "john",
"product": "spark",
"background_track": null,
"tools": []
}| ಕ್ಷೇತ್ರ | ವಿಧ | ಅಗತ್ಯ | ವಿವರಣೆ |
|---|---|---|---|
prompt | string | ಹೌದು | ಏಜೆಂಟ್ನ್ನು ನಿರ್ವಹಿಸುವ ಸಿಸ್ಟಮ್ prompt |
voice | string | ಹೌದು | GET /v1/voices ಇಂದಿನ ಧ್ವನಿ id, ಉದಾ. john. voice_name ಅನ್ನು ಅಲಿಯಾಸ್ ಆಗಿಯೂ ಸ್ವೀಕರಿಸಲಾಗುತ್ತದೆ. ತಿಳಿದಿಲ್ಲದ ಧ್ವನಿಗಳು ಮಾನ್ಯೀಕರಣದಲ್ಲಿ ವಿಫಲವಾಗಿ ಕರೆಯನ್ನು ತಿರಸ್ಕರಿಸುತ್ತವೆ |
product | string | ಇಲ್ಲ | ಪೂರ್ವನಿಯೋಜಿತವಾಗಿ spark. ಅನುಮತಿತ: spark, bolt, storm-base, storm-base-with-ack, storm-extra, storm-extra-with-ack |
thinking_level | string | ಇಲ್ಲ | minimal, base (ಪೂರ್ವನಿಯೋಜಿತ), ಅಥವಾ extra. Storm ಉತ್ಪನ್ನಗಳಿಗೆ ಅತಿಕ್ರಮಿಸಲಾಗುತ್ತದೆ: storm-extra* extra ಅನ್ನು ಬಲವಂತಗೊಳಿಸುತ್ತದೆ, ಇತರ storm-* base ಅನ್ನು ಬಲವಂತಗೊಳಿಸುತ್ತವೆ |
audio_context_mode | string | ಇಲ್ಲ | full (ಪೂರ್ವನಿಯೋಜಿತ) ಅಥವಾ reduced |
watchdog_enabled | boolean | ಇಲ್ಲ | ಈ ಕರೆಗೆ ಮೇಲ್ವಿಚಾರಣೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ. ಪೂರ್ವನಿಯೋಜಿತ false |
additional_audio_context | boolean | null | ಇಲ್ಲ | ಇತ್ತೀಚಿನ ಸರದಿಯಷ್ಟೇ ಅಲ್ಲದೆ ಕಾಲರ್ ಆಡಿಯೊದ ಕೊನೆಯ ಕೆಲವು ಸರದಿಗಳನ್ನು ಸೇರಿಸಿ; ಇದು ಸಣ್ಣ ವಿಳಂಬ/ವೆಚ್ಚದ ಹೆಚ್ಚುವರಿಯೊಂದಿಗೆ ತಿದ್ದುಪಡಿಗಳು ಮತ್ತು ಕಾಗುಣಿತ/ಸಂಖ್ಯೆ-ಹೆಚ್ಚಿನ ಡೇಟಾ ಸಂಗ್ರಹಣೆಯನ್ನು ಸುಧಾರಿಸುತ್ತದೆ. ಒಳಬರುವ ಸೆಷನ್ಗಳಿಗೆ ಪೂರ್ವನಿಯೋಜಿತವಾಗಿ ಆನ್ ಆಗಿರುತ್ತದೆ ಮತ್ತು ಹೊರಹೋಗುವ ಫೋನ್ ಕರೆಗಳಿಗೆ ಆಫ್ ಆಗಿರುತ್ತದೆ; null ಪೂರ್ವನಿಯೋಜಿತವನ್ನು ಉಳಿಸುತ್ತದೆ |
storm_feedback_mode | string | ಇಲ್ಲ | none, acknowledgement (ಪೂರ್ವನಿಯೋಜಿತ), ಅಥವಾ tick |
language | string | ಇಲ್ಲ | primary_language ಗಾಗಿ ಸಂಕ್ಷಿಪ್ತ ರೂಪ |
primary_language | string | ಇಲ್ಲ | ಭಾಷಾ ಕೋಡ್, ಸಾಮಾನ್ಯೀಕರಿಸಲಾಗಿದೆ (ಪೂರ್ವನಿಯೋಜಿತ en). ಪರಿಹರಿಸಲಾಗದ ಕೋಡ್ಗಳು ಕರೆಯನ್ನು ತಿರಸ್ಕರಿಸುತ್ತವೆ |
has_additional_languages | boolean | ಇಲ್ಲ | ಪೂರ್ವನಿಯೋಜಿತ false |
additional_languages | array of string | ಇಲ್ಲ | ಏಜೆಂಟ್ ಬದಲಾಯಿಸಬಹುದಾದ ಹೆಚ್ಚುವರಿ ಭಾಷೆಗಳು |
native_voice_switching | boolean | ಇಲ್ಲ | ಪೂರ್ವನಿಯೋಜಿತ false. ಕರೆ ಮತ್ತೊಂದು ಭಾಷೆಗೆ ಬದಲಾದಾಗ, ಕಾನ್ಫಿಗರ್ ಮಾಡಿರುವ ಧ್ವನಿಯನ್ನು ಉಳಿಸಿಕೊಳ್ಳುವ ಬದಲು ಆ ಭಾಷೆಗೆ ಸ್ಥಳೀಯವಾದ ಧ್ವನಿಗೆ ಬದಲಾಯಿಸಿ (ಲಿಂಗದ ಆಧಾರದ ಮೇಲೆ ಹೊಂದಿಸಲಾಗುತ್ತದೆ) |
background_track | string | null | ಇಲ್ಲ | ಸುತ್ತಮುತ್ತಲಿನ ಆಡಿಯೊ id ಅಥವಾ null |
acknowledgement_prompt_mode | string | ಇಲ್ಲ | auto (ಪೂರ್ವನಿಯೋಜಿತ) ಅಥವಾ manual (Storm-with-ack ಉತ್ಪನ್ನಗಳು) |
acknowledgement_prompt | string | ಇಲ್ಲ | acknowledgement_prompt_mode="manual" ಆಗಿರುವಾಗ ಬಳಸಲಾಗುತ್ತದೆ |
silence_interval_seconds | integer | null | ಇಲ್ಲ | 5–120. ಪರಿಶೀಲನೆಗೂ ಮುನ್ನ ಕಾಲರ್ ಮೌನವಾಗಿರುವ ಸೆಕೆಂಡುಗಳು |
silence_max_checkins | integer | null | ಇಲ್ಲ | 1–10 |
silence_checkins_enabled | boolean | ಇಲ್ಲ | ಪೂರ್ವನಿಯೋಜಿತ true |
connect_tone_enabled | boolean | ಇಲ್ಲ | ಪೂರ್ವನಿಯೋಜಿತ false |
voicemail_action | string | ಇಲ್ಲ | prompt (ಪೂರ್ವನಿಯೋಜಿತ), hangup, ಅಥವಾ message |
voicemail_message | string | ಇಲ್ಲ | voicemail_action="message" ಆಗಿರುವಾಗ ಬಳಸಲಾಗುತ್ತದೆ |
agent_name | string | ಇಲ್ಲ | ಡ್ಯಾಶ್ಬೋರ್ಡ್ಗಳು ಮತ್ತು ವಿಜೆಟ್ಗೆ ವರದಿ ಮಾಡಲಾಗುವ ಪ್ರದರ್ಶನ ಹೆಸರು |
org_name | string | ಇಲ್ಲ | ಏಜೆಂಟ್ನ ವ್ಯಕ್ತಿತ್ವಕ್ಕಾಗಿ ಸಂಸ್ಥೆಯ ಪ್ರದರ್ಶನ ಹೆಸರು |
tools | array | ಇಲ್ಲ | ಇನ್ಲೈನ್ ಕಾರ್ಯ-ಉಪಕರಣ ಸ್ಕೀಮಾಗಳು (ಕಾರ್ಯ ಉಪಕರಣಗಳು ನೋಡಿ) |
call_id | integer | ಇಲ್ಲ | ವಿನಂತಿಯ ಕರೆ 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 ಪರೀಕ್ಷೆಗಳ ಮಾದರಿಗಳು.