ఫంక్షన్ టూల్స్
ఫంక్షన్ టూల్స్ మీ AI ఏజెంట్లు ఫోన్ కాల్ల సమయంలో బాహ్య APIలను అమలు చేయడానికి అనుమతిస్తాయి. కస్టమర్ డేటాను చూడటానికి, లభ్యతను తనిఖీ చేయడానికి, అపాయింట్మెంట్లను బుక్ చేయడానికి లేదా మీ బ్యాకెండ్ మద్దతిచ్చే ఏ చర్యనైనా నిర్వహించడానికి వాటిని ఉపయోగించండి.
ఇది ఎలా పనిచేస్తుంది
- మీరు స్కీమాతో టూల్లను నిర్వచిస్తారు (టూల్ స్వీకరించే ఆర్గ్యుమెంట్లు)
- మీరు
endpointకాన్ఫిగరేషన్ను అందిస్తారు (ThunderPhone మీ APIని ఎక్కడ కాల్ చేస్తుంది) — లేదా మీ సంస్థ వెబ్హుక్లో టూల్ కాల్లను స్వీకరించడానికి దాన్ని ఇవ్వకుండా వదిలేయండి - కాల్ సమయంలో, సంభాషణ ఆధారంగా టూల్ను ఎప్పుడు ఉపయోగించాలో AI నిర్ణయిస్తుంది
- ThunderPhone టూల్ ఆర్గ్యుమెంట్లతో మీ ఎండ్పాయింట్ను కాల్ చేస్తుంది
- సంభాషణను కొనసాగించడానికి మీ API ప్రతిస్పందన AIకి తిరిగి అందించబడుతుంది
టూల్ స్కీమా
ప్రతి టూల్ ఈ నిర్మాణాన్ని అనుసరిస్తుంది:
{
"type": "function",
"function": {
"name": "search_appointments",
"description": "Find available appointment slots for a given date",
"parameters": {
"type": "object",
"properties": {
"date": {
"type": "string",
"description": "Date in YYYY-MM-DD format"
},
"service": {
"type": "string",
"description": "Type of service (e.g., 'consultation', 'follow-up')"
}
},
"required": ["date"]
}
},
"endpoint": {
"url": "https://api.example.com/appointments/search",
"method": "POST",
"headers": {
"X-Api-Key": "your-api-key"
}
}
}
ఫంక్షన్ నిర్వచనం
| ఫీల్డ్ | రకం | అవసరం | వివరణ |
|---|---|---|---|
name | స్ట్రింగ్ | అవును | టూల్కు ప్రత్యేక గుర్తింపుదారు |
description | స్ట్రింగ్ | అవును | ఈ టూల్ను ఎప్పుడు ఉపయోగించాలో AIకి వివరిస్తుంది |
parameters | ఆబ్జెక్ట్ | అవును | టూల్ ఆర్గ్యుమెంట్ల కోసం JSON స్కీమా |
ఎండ్పాయింట్ కాన్ఫిగరేషన్
| ఫీల్డ్ | రకం | అవసరం | వివరణ |
|---|---|---|---|
url | స్ట్రింగ్ | అవును | మీ API ఎండ్పాయింట్ URL |
method | స్ట్రింగ్ | కాదు | HTTP పద్ధతి (డిఫాల్ట్: POST) |
headers | ఆబ్జెక్ట్ | కాదు | చేర్చాల్సిన అనుకూల హెడర్లు |
రెండు ఇన్వొకేషన్ మార్గాలు
మీ సర్వర్ స్వీకరించే అభ్యర్థన, టూల్కు
endpoint ఉందా లేదా అనే దానిపై ఆధారపడి ఉంటుంది:
endpoint ఉన్న టూల్ | endpoint లేని టూల్ | |
|---|---|---|
| అభ్యర్థన వెళ్లే స్థలం | నేరుగా endpoint.urlకు | మీ సంస్థ యొక్క లెగసీ వెబ్హుక్ URL |
| బాడీ | కేవలం టూల్ ఆర్గ్యుమెంట్లు | telephony.tool / web.tool ఎన్వలప్ |
| హెడర్లు | మీ endpoint.headers + X-ThunderPhone-Call-ID + X-ThunderPhone-Signature | Content-Type + X-ThunderPhone-Signature |
| సైనింగ్ కీ | సంస్థ వెబ్హుక్ సీక్రెట్ | సంస్థ వెబ్హుక్ సీక్రెట్ |
రెండు మార్గాలు బ్లాకింగ్ — ఫలితం కోసం AI వాక్యం మధ్యలో
వేచి ఉంటుంది — మరియు 20 s టైమ్అవుట్ కలిగి ఉంటాయి. హ్యాండ్లర్లను వేగంగా ఉంచండి. మిశ్రమం కూడా సరే:
వెబ్హుక్ URL ఉన్న సంస్థకు చెందిన కాల్లో, endpoint ఉన్న టూల్లు
నేరుగా కాల్ చేయబడతాయి మరియు మిగతావి వెబ్హుక్కు తిరిగి మారుతాయి.
ప్రత్యక్ష ఎండ్పాయింట్ కాల్లు
AI endpoint ఉన్న టూల్ను ఇన్వోక్ చేసినప్పుడు, ThunderPhone మీ URLకు
రిక్వెస్ట్ పంపుతుంది:
రిక్వెస్ట్ హెడర్లు
POST /appointments/search HTTP/1.1
Host: api.example.com
Content-Type: application/json
X-ThunderPhone-Signature: abc123...
X-ThunderPhone-Call-ID: 987654321
X-Api-Key: your-api-key
మీ endpoint.headers నుండి కస్టమ్ హెడర్లు ఎల్లప్పుడూ యథాతథంగా
చేర్చబడతాయి, అలాగే ThunderPhone నేమ్స్పేస్తో ఉన్న రెండు హెడర్లు కూడా:
X-ThunderPhone-Signature— మీ సంస్థ webhook సీక్రెట్తో కీ చేసిన, ఖచ్చితమైన రిక్వెస్ట్-బాడీ బైట్ల HMAC-SHA256X-ThunderPhone-Call-ID— ప్రస్తుత కాల్ ID
మీ endpoint.headers దానిని ఓవర్రైడ్ చేయనంత వరకు
Content-Type: application/json సెట్ చేయబడుతుంది — కస్టమ్ Content-Typeకే ప్రాధాన్యం ఉంటుంది.
రిక్వెస్ట్ బాడీ
POST / PUT / PATCH కోసం, బాడీలో టూల్ ఆర్గ్యుమెంట్లు మాత్రమే
ఉంటాయి (ర్యాపర్ ఉండదు), కానానికల్గా సీరియలైజ్ చేయబడతాయి (కీలను క్రమబద్ధీకరించి,
కాంపాక్ట్ సెపరేటర్లతో):
{"date":"2025-01-02","service":"consultation"}
GET / DELETE కోసం, ఆర్గ్యుమెంట్లు క్వెరీ పారామీటర్లుగా పంపబడతాయి
మరియు బాడీ ఖాళీగా ఉంటుంది — అప్పుడు సిగ్నేచర్ ఖాళీ బైట్ స్ట్రింగ్పై
కంప్యూట్ చేయబడుతుంది. చూడండి
webhook సిగ్నేచర్లను ధృవీకరించండి.
ప్రతిస్పందన
టూల్ ఫలితంతో కూడిన JSON ప్రతిస్పందనను తిరిగి పంపండి:
{
"available_slots": ["9:00 AM", "2:00 PM", "4:30 PM"],
"timezone": "America/Los_Angeles"
}
ప్రతిస్పందనను ఫార్మాట్ చేసి, సంభాషణను కొనసాగించడానికి AIకి అందిస్తారు.
JSON కాని ప్రతిస్పందనలను {"data": "<text>"}గా ర్యాప్ చేస్తారు;
టైమ్అవుట్లు మరియు కనెక్షన్ వైఫల్యాలను AIకి ఎర్రర్లుగా నివేదిస్తారు, కాబట్టి
ఏజెంట్ ఆగిపోకుండా క్షమాపణ చెప్పి ముందుకు సాగవచ్చు.
Webhook-మోడ్ డిస్పాచ్
endpoint లేని టూల్లు మీ సంస్థ లెగసీ webhook URLకు సంతకం చేసిన telephony.tool
(ఫోన్ కాల్లు) లేదా web.tool (వెబ్ కాల్లు) రిక్వెస్ట్గా డిస్పాచ్ చేయబడతాయి.
ఎగ్జిక్యూషన్ తర్వాత webhook ఎండ్పాయింట్లకు అందించే ఆడిట్ నోటిఫికేషన్లకు
భిన్నంగా, ఈ రిక్వెస్ట్యే ఎగ్జిక్యూషన్ — మీ HTTP ప్రతిస్పందనే టూల్ ఫలితం.
{
"type": "telephony.tool",
"data": {
"call_id": 987654321,
"tool_name": "search_appointments",
"arguments": { "date": "2026-04-21" },
"from_number": "+14155550199",
"to_number": "+15551234567"
}
}
web.tool, from_number / to_numberకు బదులుగా origin_domainను కలిగి ఉంటుంది.
టూల్ ఫలితాన్ని JSONగా ప్రతిస్పందించండి — ప్రత్యక్ష ఎండ్పాయింట్ కాల్లకు ఉన్నదే
ప్రతిస్పందన కాంట్రాక్ట్. ప్రతి ఇతర webhook మాదిరిగానే, రిక్వెస్ట్ రా బాడీపై
సంస్థ webhook సీక్రెట్తో సంతకం చేయబడుతుంది.
సంతకం ధృవీకరణ
ప్రత్యక్ష టూల్ కాల్లు వెబ్హుక్ల మాదిరిగానే సంతకం చేయబడతాయి:
- ఖచ్చితమైన రిక్వెస్ట్-బాడీ బైట్లపై HMAC-SHA256 (కానానికల్ JSON — క్రమబద్ధీకరించిన కీలు, అదనపు ఖాళీలు లేవు)
- మీ సంస్థ వెబ్హుక్ సీక్రెట్తో కీ చేయబడుతుంది
GET/DELETEటూల్లు ఖాళీ బైట్ స్ట్రింగ్పై సంతకం చేస్తాయి
import hmac
import hashlib
def verify_tool_call(body: bytes, signature: str, secret: str) -> bool:
expected = hmac.new(secret.encode(), body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, signature)
@app.post("/appointments/search")
async def search_appointments(request: Request):
body = await request.body()
signature = request.headers.get("X-ThunderPhone-Signature", "")
if not verify_tool_call(body, signature, WEBHOOK_SECRET):
raise HTTPException(status_code=401)
data = json.loads(body)
date = data["date"]
# Look up availability
slots = await get_available_slots(date)
return {"available_slots": slots}
app.post('/appointments/search', express.raw({type: 'application/json'}), (req, res) => {
const signature = req.headers['x-thunderphone-signature'] || '';
const expected = crypto
.createHmac('sha256', WEBHOOK_SECRET)
.update(req.body)
.digest('hex');
if (!signature ||
signature.length !== expected.length ||
!crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature))) {
return res.status(401).send('Invalid signature');
}
const { date, service } = JSON.parse(req.body);
// Look up availability
const slots = getAvailableSlots(date, service);
res.json({ available_slots: slots });
});
ఖాళీ-బాడీ సందర్భం మరియు సీక్రెట్ లేని పరిస్థితిపై హెచ్చరికతో సహా పూర్తి విధానాలు వెబ్హుక్ సంతకాలను ధృవీకరించండిలో ఉన్నాయి.
ఉదాహరణ: పూర్తి బుకింగ్ ప్రవాహం
పూర్తి అపాయింట్మెంట్ బుకింగ్ సిస్టమ్ కోసం టూల్ల సమితి ఇది:
{
"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": "key" }
}
},
{
"type": "function",
"function": {
"name": "book_appointment",
"description": "Book an appointment at a specific time",
"parameters": {
"type": "object",
"properties": {
"date": { "type": "string", "description": "YYYY-MM-DD" },
"time": { "type": "string", "description": "HH:MM format" },
"customer_name": { "type": "string" },
"customer_phone": { "type": "string" }
},
"required": ["date", "time", "customer_name"]
}
},
"endpoint": {
"url": "https://api.example.com/appointments/book",
"method": "POST",
"headers": { "X-Api-Key": "key" }
}
},
{
"type": "function",
"function": {
"name": "cancel_appointment",
"description": "Cancel an existing appointment",
"parameters": {
"type": "object",
"properties": {
"confirmation_number": { "type": "string" }
},
"required": ["confirmation_number"]
}
},
"endpoint": {
"url": "https://api.example.com/appointments/cancel",
"method": "POST",
"headers": { "X-Api-Key": "key" }
}
}
]
}
ఉత్తమ పద్ధతులు
స్పష్టమైన వివరణలు రాయండి
description ఫీల్డ్ టూల్ను ఎప్పుడు ఉపయోగించాలో AIకి అర్థం చేసుకోవడంలో సహాయపడుతుంది. అది ఏమి చేస్తుందో, ఎప్పుడు ఉపయోగించడం సముచితమో నిర్దిష్టంగా పేర్కొనండి.
ఎర్రర్లను సజావుగా నిర్వహించండి
AI అర్థం చేసుకోగల ఎర్రర్ సందేశాలను అందించండి: సాధారణ 500 ఎర్రర్లకు బదులుగా {"error": "No slots available for that date"}.
ప్రతిస్పందనలను సంక్షిప్తంగా ఉంచండి
సంభాషణను కొనసాగించడానికి AIకి అవసరమైనదాన్ని మాత్రమే అందించండి. పెద్ద పేలోడ్లు ప్రతిస్పందన సమయాలను నెమ్మదింపజేస్తాయి.
అవసరమైన ఫీల్డ్లను వివేకంగా ఉపయోగించండి
నిజంగా అవసరమైనప్పుడు మాత్రమే ఫీల్డ్లను requiredగా గుర్తించండి. టూల్ను కాల్ చేయడానికి ముందు AI అవసరమైన సమాచారాన్ని వినియోగదారుని అడుగుతుంది.
సంబంధితవి
HubSpot, Salesforce, Slack, Google Calendar, Google Sheets మరియు Cal.com కోసం ప్లాట్ఫారమ్ నిర్వహించే టూల్స్ — ఎండ్పాయింట్ అవసరం లేదు.
MCP సర్వర్ను జతచేసి, ఏజెంట్ దాని టూల్స్ను కాల్ చేయనివ్వండి.
ఏజెంట్లకు జతచేయగల పునర్వినియోగించదగిన REST ఇంటిగ్రేషన్లు.
వెబ్హుక్లు మరియు టూల్ కాల్ల కోసం ఒక ధృవీకరణ హెల్పర్.