Funkcióeszközök
Adjon AI-ügynökeinek olyan funkcióeszközöket, amelyek a beszélgetés közben külső API-kat hívnak meg — ügyféladatokat kérnek le, időpontokat foglalnak, rekordokat frissítenek — típusos paraméterekkel.
A funkcióeszközök lehetővé teszik, hogy AI-ügynökei telefonhívások során külső API-kat hívjanak meg. Használja őket ügyféladatok lekérdezésére, elérhetőség ellenőrzésére, időpontfoglalásra vagy bármely, a háttérrendszere által támogatott művelet elvégzésére.
Működés
- Definiálja az eszközöket egy sémával (az eszköz által elfogadott argumentumokkal)
- Adjon meg egy
endpointkonfigurációt (ahol a ThunderPhone meghívja az API-ját) — vagy hagyja ki, hogy az eszközhívásokat a szervezeti webhookon fogadja - Hívás közben az AI a beszélgetés alapján dönti el, mikor használjon eszközt
- A ThunderPhone az eszköz argumentumaival meghívja az Ön végpontját
- Az API válasza visszakerül az AI-hoz a beszélgetés folytatásához
Eszközséma
Minden eszköz ezt a struktúrát követi:
{
"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"
}
},
"timeout": 120
}Eszközkonfiguráció
| Mező | Típus | Kötelező | Leírás |
|---|---|---|---|
timeout | number | Nem | Maximális végrehajtási idő másodpercben (alapértelmezett: 20, maximum: 180) |
Funkciódefiníció
| Mező | Típus | Kötelező | Leírás |
|---|---|---|---|
name | string | Igen | Az eszköz egyedi azonosítója |
description | string | Igen | Elmagyarázza az AI-nak, mikor használja ezt az eszközt |
parameters | object | Igen | JSON-séma az eszköz argumentumaihoz |
Végpontkonfiguráció
| Mező | Típus | Kötelező | Leírás |
|---|---|---|---|
url | string | Igen | Az Ön API-végpontjának URL-je |
method | string | Nem | HTTP-metódus (alapértelmezett: POST) |
headers | object | Nem | Felvenni kívánt egyéni fejlécek |
Két meghívási útvonal
Az, hogy a szervere melyik kérést kapja, attól függ, rendelkezik-e az eszköz
endpoint beállítással:
Eszköz endpoint beállítással | Eszköz endpoint beállítás nélkül | |
|---|---|---|
| A kérés célhelye | Közvetlenül az endpoint.url címre | Az Ön szervezetének régi webhook URL-je |
| Törzs | Csak az eszköz argumentumai | telephony.tool / web.tool boríték |
| Fejlécek | Az Ön endpoint.headers fejlécei + X-ThunderPhone-Call-ID + X-ThunderPhone-Signature | Content-Type + X-ThunderPhone-Signature |
| Aláírókulcs | Szervezeti webhook-titok | Szervezeti webhook-titok |
Mindkét útvonal blokkoló — az AI a mondat közepén vár az
eredményre. Az alapértelmezett időkorlát 20 s; az eszköz legfelső szintű
timeout értékének beállításával hosszabb végrehajtást engedélyezhet, a platform
180 s maximális értékéig. Tartsa gyorsan a kezelőket. A vegyes használat is megfelelő:
ha egy hívás szervezetéhez webhook URL tartozik, az endpoint beállítással rendelkező eszközöket
közvetlenül hívja a rendszer, a többi pedig a webhookra tér vissza.
Közvetlen végponthívások
Amikor az AI meghív egy endpoint értékkel rendelkező eszközt, a ThunderPhone
kérést küld az Ön URL-címére:
Kérésfejlécek
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-keyAz endpoint.headers egyéni fejlécei mindig változatlanul szerepelnek,
valamint két ThunderPhone-névterű fejléc:
X-ThunderPhone-Signature— a pontos kéréstörzs bájtjainak HMAC-SHA256 értéke, az Ön szervezeti webhooktitkával kulcsolvaX-ThunderPhone-Call-ID— Az aktuális hívásazonosító
A Content-Type: application/json be van állítva, kivéve, ha az endpoint.headers
felülírja — az egyéni Content-Type elsőbbséget élvez.
Kéréstörzs
POST / PUT / PATCH esetén a törzs csak az eszköz
argumentumait tartalmazza (burkoló nélkül), kanonikusan szerializálva (rendezett kulcsok,
tömör elválasztók):
{"date":"2025-01-02","service":"consultation"}GET / DELETE esetén az argumentumok lekérdezési paraméterekként
kerülnek elküldésre, a törzs pedig üres — az aláírás ekkor az üres
bájtsorozaton kerül kiszámításra. Lásd:
Webhook-aláírások ellenőrzése.
Válasz
Adjon vissza JSON-választ az eszköz eredményével:
{
"available_slots": ["9:00 AM", "2:00 PM", "4:30 PM"],
"timezone": "America/Los_Angeles"
}A válasz formázva kerül az AI-hoz, hogy folytathassa a
beszélgetést. A nem JSON-válaszok {"data": "<text>"} formában kerülnek becsomagolásra;
az időtúllépéseket és kapcsolati hibákat az AI hibaként kapja meg, így
az ügynök elnézést kérhet és továbbléphet ahelyett, hogy elakadna.
Webhook módú továbbítás
Az endpoint nélküli eszközök a szervezet régi
webhook-URL-címére kerülnek továbbításra aláírt telephony.tool (telefonhívások) vagy web.tool
(webes hívások) kérésként. A végrehajtás után webhookvégpontokra kézbesített
auditértesítésekkel ellentétben ez a kérés maga
a végrehajtás — az Ön HTTP-válasza az eszköz eredménye.
{
"type": "telephony.tool",
"data": {
"call_id": 987654321,
"tool_name": "search_appointments",
"arguments": { "date": "2026-04-21" },
"from_number": "+14155550199",
"to_number": "+15551234567"
}
}A web.tool a from_number /
to_number helyett origin_domain értéket tartalmaz. Válaszoljon az eszköz eredményével JSON formátumban —
ugyanazzal a válaszszerződéssel, mint a közvetlen végponthívások esetén. A kérés a szervezeti
webhooktitokkal van aláírva a nyers törzs alapján, mint minden más webhook.
Aláírás-ellenőrzés
A közvetlen eszközhívások aláírása ugyanúgy történik, mint a webhookoké:
- HMAC-SHA256 a kérés törzsének pontos bájtjain (a kanonikus JSON-on — rendezett kulcsokkal, extra szóközök nélkül)
- Az Ön szervezetének webhook-titkával kulcsolva
- A
GET/DELETEeszközök az üres bájtsorozatot írják alá
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 });
});A teljes útmutatókat — beleértve az üres törzs esetét és a titok hiányára vonatkozó figyelmeztetést — a Webhook-aláírások ellenőrzése című útmutatóban találja.
Példa: Teljes foglalási folyamat
Íme egy teljes időpontfoglalási rendszerhez tartozó eszközkészlet:
{
"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" }
}
}
]
}Ajánlott gyakorlatok
Írjon egyértelmű leírásokat
A description mező segít az AI-nak megérteni, mikor használja az eszközt. Pontosan írja le, mit végez, és mikor célszerű használni.
Kezelje gördülékenyen a hibákat
Olyan hibaüzeneteket adjon vissza, amelyeket az AI megért: {"error": "No slots available for that date"} az általános 500-as hibák helyett.
Tartsa tömören a válaszokat
Csak azt adja vissza, amire az AI-nak szüksége van a beszélgetés folytatásához. A nagy payloadok lassítják a válaszidőt.
Használja körültekintően a kötelező mezőket
Csak akkor jelölje a mezőket required értékűnek, ha valóban szükséges. Az AI az eszköz meghívása előtt elkéri a felhasználótól a kötelező adatokat.
Kapcsolódó tartalmak
A platform által kezelt eszközök a HubSpothoz, Salesforce-hoz, Slackhez, Google Calendarhoz, Google Sheetshöz és Cal.comhoz — nincs szükség végpontra.
Csatlakoztasson egy MCP-szervert, és engedje, hogy az ügynök meghívja az eszközeit.
Újrahasználható REST-integrációk, amelyeket ügynökökhöz csatolhat.
Egy ellenőrzési segédprogram webhookokhoz és eszközhívásokhoz.