Rakenna työkalun integraatio (API)
Anna agenttisi kutsua API-rajapintojasi kesken keskustelun – hae tietoa tietokannasta, luo tukipyyntö tai etsi tilaus.
Työkalintegraatio on uudelleenkäytettävä HTTP-päätepiste, jonka agentti voi kutsua puhelun aikana. Annat ThunderPhonelle työkalun JSON-skeemakuvauksen sekä päätepisteen URL-osoitteen; agentti päättää keskustelun perusteella, milloin sitä kutsutaan, ja ThunderPhone tekee lähtevän HTTP-pyynnön palvelimiltaan sekä palauttaa vastauksen agentille.
Tässä oppaassa rakennetaan sääntarkistustyökalu alusta loppuun.
Työkalun rakenne
Kaksi osaa:
- Skeema — OpenAI-tyylinen funktiomääritelmä
(
{type: "function", function: {name, description, parameters}}), joka kertoo LLM:lle, mitä työkalu tekee ja mitä argumentteja se ottaa. - Päätepiste — URL-osoite, jota ThunderPhonen palvelimet kutsuvat, kun LLM päättää käyttää työkalua. Pyyntö on JSON-muotoinen POST-pyyntö, jonka runkona ovat LLM:n valitsemat argumentit.
1. Valitse tallennusstrategia
Liitä kertakäyttöinen työkalu agentin tools-taulukkoon. Yksinkertaista,
mutta ei uudelleenkäytettävää.
Tallenna työkalu uudelleenkäytettävänä integraationa ja linkitä se useisiin agentteihin. Suositellaan kaikkeen, mitä käytetään useammin kuin kerran.
Tässä oppaassa käytetään tallennetun integraation polkua.
2. Luo integraatio
curl -X POST https://api.thunderphone.com/v1/integrations \
-H "Authorization: Bearer sk_live_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"display_name": "Weather API",
"spec": {
"type": "function",
"function": {
"name": "get_weather",
"description": "Return the current weather for a zip code.",
"parameters": {
"type": "object",
"properties": {
"zip": { "type": "string", "description": "5-digit US ZIP code" }
},
"required": ["zip"]
}
}
},
"endpoint_url": "https://api.example.com/weather",
"endpoint_method": "GET",
"headers": [
{ "key": "X-Api-Key", "value": "your-provider-key" }
]
}'Tallenna palautettu id (UUID).
3. Testaa päätepiste hiekkalaatikossa
Ennen kuin linkität integraation agenttiin, lähetä allekirjoitettu pyyntö ThunderPhonen palvelimilta varmistaaksesi yhteyden:
curl -X POST https://api.thunderphone.com/v1/integrations/test-request \
-H "Authorization: Bearer sk_live_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://api.example.com/weather?zip=94110",
"method": "GET",
"headers": { "X-Api-Key": "your-provider-key" }
}'{
"ok": true,
"status": 200,
"elapsed_ms": 187,
"response_headers": { "content-type": "application/json" },
"response_preview": "{\"temperature_f\": 64, ...}"
}Tämä testi myös vahvistaa ThunderPhonen SSRF-suojauksia — localhostiin tai
yksityisiin IP-osoitealueisiin kohdistuvat pyynnöt palauttavat 400 code=url_not_allowed.
4. Liitä integraatio agenttiin
Liitä integration_ids-kentän kautta, kun luot tai päivität agentin:
curl -X PATCH https://api.thunderphone.com/v1/agents/12 \
-H "Authorization: Bearer sk_live_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"integration_ids": ["f9b5a1a4-..."]
}'Voit liittää useita integraatioita yhteen agenttiin. Agentin kehotteessa voidaan
viitata niihin nimellä — "use get_weather when the caller asks
about conditions" — tai agentti voi tunnistaa ne epäsuorasti
skeemakuvausten perusteella.
5. Toteuta päätepiste
Kun agentti kutsuu työkalua, ThunderPhone lähettää allekirjoitetun POST-pyynnön
endpoint_url-osoitteeseesi:
POST /weather HTTP/1.1
Host: api.example.com
X-Api-Key: your-provider-key
X-ThunderPhone-Signature: <HMAC-SHA256 hex>
X-ThunderPhone-Call-ID: 987654321
Content-Type: application/json
{"zip": "94110"}
Palvelimesi vastaa JSONilla, joka välitetään takaisin LLM:lle:
{"temperature_f": 64, "condition": "Partly cloudy", "wind_mph": 8}LLM käsittelee vastauksen ja kertoo soittajalle selkokielisen yhteenvedon.
6. Testaa kokonaisuus
Käynnistä mikrofonisessio agenttia vasten ja esitä kysymys, jota työkalusi käsittelee ("What's the weather in 94110?"). Puhelun transkriptio näyttää koko kierroksen:
{
"call_id": 987654321,
"transcripts": [
{ "role": "user",
"content": "What's the weather in 94110?" },
{ "role": "tool_call",
"content": "{\"tool_call\": \"get_weather\", \"arguments\": {\"zip\": \"94110\"}}" },
{ "role": "tool_response",
"content": "{\"tool_name\": \"get_weather\", \"response\": {\"temperature_f\": 64, \"condition\": \"Partly cloudy\"}}" },
{ "role": "agent",
"content": "It's 64 degrees and partly cloudy." }
]
}Voit hakea tämän
GET /v1/calls/{call_id}/transcript-kutsulla;
raaka tapahtumavirta (merkintäkohtaisine ajoituksineen ja äänisiirtymineen) on
saatavilla
GET /v1/calls/{call_id}/history-kutsulla.
Yleiset sudenkuopat
Agentti ei koskaan kutsu työkalua
LLM tekee päätöksen työkalun kuvauksen perusteella. Jos soittajan
kysymys ei vastaa kuvausta, malli ei kutsu työkalua. Tarkennna kuvausta
(lisää yleisiä synonyymejä ja ilmaisutapoja) tai mainitse se
nimenomaisesti agentin kehotteessa ("When the caller asks about weather, use get_weather.").
Työkalu palauttaa liikaa dataa
Yli 6 kB:n vastaukset katkaistaan transkription esikatselussa. Palauta vain LLM:n tarvitsemat kentät — älä koko tietuettasi.
Aikakatkaisut
Työkalujen päätepisteiden oletusaikakatkaisu on 10 sekuntia. Jos tarvitset enemmän aikaa,
käsittele pyyntö asynkronisesti: palauta {"status": "pending", "request_id": "..."}
ja tuo tulos esiin erillisellä työkalukutsulla.
Versiointi
Jokainen integraation PATCH luo uuden revision. Tarkista
GET /v1/integrations/{id}/versions
nähdäksesi, kuka muutti mitäkin. Jos rikot työkalun skeeman, voit
palauttaa sen manuaalisesti tekemällä PATCH-pyynnön vanhemmällä tilannevedoksella.
Seuraavat vaiheet
CRUD, siirto, versiohistoria.
Täydellinen JSON-skeemakielioppi ja allekirjoitettujen päätepisteiden sopimus.
Käytä webhook-allekirjoitusmallia työkalujen päätepisteisiin.
Tarkastele työkalukutsun koko edestakaista kulkua.