Megérkezett a ThunderPhone 2.0.Önkiszolgáló használat már 2 cent/perctől.Olvassa el a bejelentést

Function Tools

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

  1. Definiálja az eszközöket egy sémával (az eszköz által elfogadott argumentumokkal)
  2. Adjon meg egy endpoint konfigurációt (ahol a ThunderPhone meghívja az API-ját) — vagy hagyja ki, hogy az eszközhívásokat a szervezeti webhookon fogadja
  3. Hívás közben az AI a beszélgetés alapján dönti el, mikor használjon eszközt
  4. A ThunderPhone az eszköz argumentumaival meghívja az Ön végpontját
  5. 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ípusKötelezőLeírás
timeoutnumberNemMaximális végrehajtási idő másodpercben (alapértelmezett: 20, maximum: 180)

Funkciódefiníció

MezőTípusKötelezőLeírás
namestringIgenAz eszköz egyedi azonosítója
descriptionstringIgenElmagyarázza az AI-nak, mikor használja ezt az eszközt
parametersobjectIgenJSON-séma az eszköz argumentumaihoz

Végpontkonfiguráció

MezőTípusKötelezőLeírás
urlstringIgenAz Ön API-végpontjának URL-je
methodstringNemHTTP-metódus (alapértelmezett: POST)
headersobjectNemFelvenni 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ássalEszköz endpoint beállítás nélkül
A kérés célhelyeKözvetlenül az endpoint.url címreAz Ön szervezetének régi webhook URL-je
TörzsCsak az eszköz argumentumaitelephony.tool / web.tool boríték
FejlécekAz Ön endpoint.headers fejlécei + X-ThunderPhone-Call-ID + X-ThunderPhone-SignatureContent-Type + X-ThunderPhone-Signature
AláírókulcsSzervezeti webhook-titokSzervezeti 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-key

Az 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 kulcsolva
  • X-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 / DELETE eszközök az üres bájtsorozatot írják alá
Python
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}
Node.js
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