ThunderPhone 2.0 je stigao.Postavite sve sami, već od 2 ¢/min.Pročitajte objavu

Function Tools

Funkcijski alati

Omogućite svojim AI agentima funkcijske alate koji tijekom razgovora pozivaju vanjske API-je — dohvaćaju podatke o korisnicima, rezerviraju termine, ažuriraju zapise — s tipiziranim parametrima.

Funkcijski alati omogućuju vašim AI agentima pozivanje vanjskih API-ja tijekom telefonskih poziva. Upotrijebite ih za dohvaćanje podataka o korisnicima, provjeru dostupnosti, rezerviranje termina ili izvođenje bilo koje radnje koju vaš pozadinski sustav podržava.

Kako funkcionira

  1. Definirate alate sa shemom (koje argumente alat prihvaća)
  2. Navodite konfiguraciju endpoint (gdje ThunderPhone poziva vaš API) — ili je izostavite kako biste pozive alata primali na webhooku svoje organizacije
  3. Tijekom poziva AI odlučuje kada upotrijebiti alat na temelju razgovora
  4. ThunderPhone poziva vašu krajnju točku s argumentima alata
  5. Odgovor vašeg API-ja vraća se AI-ju radi nastavka razgovora
MogućnostGdje se izvršavaPostavljanje
Ugrađeni alatiThunderPhoneUpute u promptu; neki alati zahtijevaju i postavku agenta
Povezivanja aplikacijaThunderPhone i povezani pružatelj uslugePovežite račun i priložite odobrene radnje
API povezivanja i funkcijski alatiVaš HTTP APIDefinirajte krajnju točku i shemu ili primajte pozive funkcija putem webhooka
MCP poslužiteljiUdaljeni MCP poslužiteljDodajte poslužitelj, otkrijte njegove alate i priložite ga agentu

Shema alata

Svaki alat slijedi ovu strukturu:

{
  "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
}

Konfiguracija alata

PoljeVrstaObaveznoOpis
timeoutbrojNeMaksimalno vrijeme izvršavanja u sekundama (zadano: 20, najviše: 180)

Definicija funkcije

PoljeVrstaObaveznoOpis
nameniz znakovaDaJedinstveni identifikator alata
descriptionniz znakovaDaObjašnjava AI-ju kada upotrijebiti ovaj alat
parametersobjektDaJSON Schema za argumente alata

Konfiguracija krajnje točke

PoljeVrstaObaveznoOpis
urlniz znakovaDaURL krajnje točke vašeg API-ja
methodniz znakovaNeHTTP metoda (zadano: POST)
headersobjektNePrilagođena zaglavlja koja treba uključiti

Dva načina pozivanja

Zahtjev koji vaš poslužitelj primi ovisi o tome ima li alat endpoint:

Alat s endpointAlat bez endpoint
Odredište zahtjevaIzravno na endpoint.urlNaslijeđeni URL webhooka vaše organizacije
TijeloSamo argumenti alataOmotnica telephony.tool / web.tool
ZaglavljaVaša endpoint.headers + X-ThunderPhone-Call-ID + X-ThunderPhone-SignatureContent-Type + X-ThunderPhone-Signature
Ključ za potpisivanjeTajna webhooka organizacijeTajna webhooka organizacije

Oba su načina blokirajuća — AI usred rečenice čeka rezultat. Zadano vremensko ograničenje je 20 s; postavite timeout alata na najvišoj razini kako biste omogućili dulje izvršavanje, do maksimuma platforme od 180 s. Neka obrađivači budu brzi. Kombinacija je dopuštena: u pozivu čija organizacija ima URL webhooka alati s endpoint pozivaju se izravno, a ostali se vraćaju na webhook.

Izravni pozivi krajnjih točaka

Kada AI pozove alat koji ima endpoint, ThunderPhone šalje zahtjev na Vaš URL:

Zaglavlja zahtjeva

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

Prilagođena zaglavlja iz Vašeg endpoint.headers uvijek se uključuju doslovno, uz dva zaglavlja s imenskim prostorom ThunderPhonea:

  • X-ThunderPhone-Signature — HMAC-SHA256 točnih bajtova tijela zahtjeva, s ključem Vaša webhook tajna organizacije
  • X-ThunderPhone-Call-ID — ID trenutačnog poziva

Content-Type: application/json postavlja se osim ako ga Vaš endpoint.headers ne nadjača — prilagođeni Content-Type ima prednost.

Tijelo zahtjeva

Za POST / PUT / PATCH, tijelo sadrži samo argumente alata (bez omotača), kanonski serijalizirane (sortirani ključevi, sažeti razdjelnici):

{"date":"2025-01-02","service":"consultation"}

Za GET / DELETE, argumenti se šalju kao parametri upita i tijelo je prazno — potpis se tada izračunava nad praznim nizom bajtova. Pogledajte Provjera potpisa webhookova.

Odgovor

Vratite JSON odgovor s rezultatom alata:

{
  "available_slots": ["9:00 AM", "2:00 PM", "4:30 PM"],
  "timezone": "America/Los_Angeles"
}

Odgovor se formatira i dostavlja AI-ju kako bi nastavio razgovor. Odgovori koji nisu JSON omataju se kao {"data": "<text>"}; vremenska ograničenja i neuspjele veze prijavljuju se AI-ju kao pogreške, pa se agent može ispričati i nastaviti umjesto da zastane.

Slanje u načinu webhooka

Alati bez endpoint šalju se na URL naslijeđenog webhooka Vaše organizacije kao potpisani zahtjev telephony.tool (telefonski pozivi) ili web.tool (web-pozivi). Za razliku od obavijesti o reviziji koje se dostavljaju na krajnje točke webhooka nakon izvršavanja, ovaj zahtjev jest izvršavanje — Vaš HTTP odgovor rezultat je alata.

{
  "type": "telephony.tool",
  "data": {
    "call_id": 987654321,
    "tool_name": "search_appointments",
    "arguments": { "date": "2026-04-21" },
    "from_number": "+14155550199",
    "to_number": "+15551234567"
  }
}

web.tool sadrži origin_domain umjesto from_number / to_number. Odgovorite s rezultatom alata kao JSON — isti ugovor odgovora kao za izravne pozive krajnjih točaka. Zahtjev je potpisan webhook tajnom organizacije nad sirovim tijelom, kao i svaki drugi webhook.


Provjera potpisa

Izravni pozivi alata potpisuju se na isti način kao webhookovi:

  • HMAC-SHA256 nad točnim bajtovima tijela zahtjeva (kanonski JSON — sortirani ključevi, bez dodatnih razmaka)
  • S vašom tajnom za webhookove organizacije kao ključem
  • Alati GET / DELETE potpisuju prazan niz bajtova
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 });
});

Potpuni primjeri — uključujući slučaj praznog tijela i napomenu o nepostojanju tajne — nalaze se u odjeljku Provjerite potpise webhookova.


Primjer: potpuni tijek rezervacije

Evo skupa alata za potpuni sustav rezervacije termina:

{
  "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" }
      }
    }
  ]
}

Najbolje prakse

Napišite jasne opise

Polje description pomaže AI-ju razumjeti kada upotrijebiti alat. Jasno navedite što alat radi i kada ga je prikladno upotrijebiti.

Pravilno obradite pogreške

Vratite poruke o pogreškama koje AI može razumjeti: {"error": "No slots available for that date"} umjesto generičkih pogrešaka 500.

Odgovori neka budu sažeti

Vratite samo ono što AI-ju treba za nastavak razgovora. Veliki podaci usporavaju vrijeme odgovora.

Razumno koristite obavezna polja

Označite polja kao required samo kada je to zaista potrebno. AI će od korisnika zatražiti obavezne informacije prije pozivanja alata.


Povezano