Bygg en verktøyintegrasjon (API)
La agenten din kalle API-ene dine midt i samtalen — søk i en database, opprett en sak, slå opp en bestilling.
En verktøyintegrasjon er et gjenbrukbart HTTP-endepunkt som en agent kan kalle under en samtale. Du gir ThunderPhone en JSON-schemabeskrivelse av verktøyet samt en endepunkt-URL; agenten avgjør når det skal kalles basert på samtalen, og ThunderPhone utfører den utgående HTTP- forespørselen fra serverne sine og returnerer svaret til agenten.
Denne veiledningen går gjennom hvordan du bygger et verktøy for værdata fra start til slutt.
Oppbygningen av et verktøy
To deler:
- Schemaet — en funksjonsdefinisjon i OpenAI-stil
(
{type: "function", function: {name, description, parameters}}) som forteller LLM-en hva verktøyet gjør og hvilke argumenter det tar. - Endepunktet — URL-en som ThunderPhone-serverne kaller når LLM-en bestemmer seg for å bruke verktøyet. Forespørselen er en JSON POST med argumentene LLM-en har valgt som brødtekst.
1. Velg en lagringsstrategi
Knytt et engangsverktøy til agentens tools-array. Enkelt, men
ikke gjenbrukbart.
Lagre verktøyet som en gjenbrukbar integrasjon og koble det til mange agenter. Anbefales for alt som brukes mer enn én gang.
Denne veiledningen bruker fremgangsmåten med lagret integrasjon.
2. Opprett integrasjonen
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" }
]
}'Lagre den returnerte id-en (en UUID).
3. Test endepunktet i sandbox
Før du kobler integrasjonen til en agent, send en signert forespørsel fra ThunderPhone-serverne for å bekrefte tilkoblingen:
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, ...}"
}Denne testen forsterker også ThunderPhones SSRF-beskyttelse — forespørsler til
localhost eller private IP-områder returnerer 400 code=url_not_allowed.
4. Knytt integrasjonen til en agent
Knytt den til via integration_ids når du oppretter eller oppdaterer en agent:
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-..."]
}'Du kan knytte mange integrasjoner til én agent. Agentens ledetekst kan
referere til dem ved navn — «bruk get_weather når innringeren spør
om værforhold» — eller den kan oppdage dem implisitt fra
skjemabeskrivelsene.
5. Implementer endepunktet
Når agenten kaller verktøyet, sender ThunderPhone en signert POST til
din endpoint_url:
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"}
Serveren din svarer med JSON som sendes tilbake til LLM-en:
{"temperature_f": 64, "condition": "Partly cloudy", "wind_mph": 8}LLM-en tar inn svaret og gir innringeren en naturlig oppsummering.
6. Test flyten
Kjør en mikrofonøkt mot agenten og still spørsmålet verktøyet ditt håndterer («Hvordan er været i 94110?»). Samtaleutskriften viser hele runden:
{
"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." }
]
}Du kan hente dette via
GET /v1/calls/{call_id}/transcript;
den rå hendelsesstrømmen (med tidsangivelser og lydforskyvninger per oppføring) finner du på
GET /v1/calls/{call_id}/history.
Vanlige fallgruver
Agenten kaller aldri verktøyet
LLM-en avgjør basert på verktøyets beskrivelse. Hvis innringerens
spørsmål ikke samsvarer med beskrivelsen, kaller ikke modellen
verktøyet. Gjør beskrivelsen mer presis (legg til vanlige synonymer og
formuleringer), eller nevn det eksplisitt i agentens ledetekst («Når
innringeren spør om været, bruk get_weather.»).
Verktøyet returnerer for mye data
Svar over 6 kB blir avkortet i forhåndsvisningen av utskriften. Returner bare feltene LLM-en trenger — ikke hele raden.
Tidsavbrudd
Verktøyendepunkter har en standard tidsavbruddsgrense på 10 sekunder. Hvis du trenger mer tid,
håndter det asynkront: returner {"status": "pending", "request_id": "..."}
og vis resultatet via et separat verktøykall.
Versjonering
Hver PATCH av en integrasjon oppretter en ny revisjon. Undersøk
GET /v1/integrations/{id}/versions
for å se hvem som endret hva. Hvis du ødelegger skjemaet til et verktøy, kan du
rulle tilbake manuelt ved å PATCH-e et eldre øyeblikksbilde inn igjen.
Neste trinn
CRUD, overføring, versjonshistorikk.
Fullstendig JSON-schemagrammatikk og kontrakten for signerte endepunkter.
Bruk mønsteret for webhook-signaturer på verktøyendepunkter.
Undersøk hele tur-retur-flyten for et verktøykall.