Izdelajte integracijo orodja (API)

Integracija orodja je vnovič uporabljiv končni točki HTTP, ki ju lahko agent pokliče med klicem. ThunderPhoneu posredujete opis orodja v obliki sheme JSON ter URL končne točke; agent se na podlagi pogovora odloči, kdaj jo bo poklical, ThunderPhone pa s svojih strežnikov izvede odhodno zahtevo HTTP in odgovor vrne agentu.

Ta vodnik prikazuje celoten postopek izdelave orodja za pridobivanje vremenskih podatkov.

Zgradba orodja

Dva dela:

  1. Shema — definicija funkcije v slogu OpenAI ({type: "function", function: {name, description, parameters}}), ki LLM-ju pove, kaj orodje počne in katere argumente sprejema.
  2. Končna točka — URL, ki ga strežniki ThunderPhone pokličejo, ko se LLM odloči uporabiti orodje. Zahteva je JSON POST z argumenti, ki jih izbere LLM, v telesu zahteve.

1. Izberite strategijo shranjevanja

Vdelano v agenta

Enkratno orodje pripnite polju tools agenta. Preprosto, vendar ni vnovič uporabljivo.

Shranjena integracija

Orodje shranite kot vnovič uporabljivo integracijo in ga povežite z več agenti. Priporočeno za vse, kar uporabite več kot enkrat.

Ta vodnik uporablja pot shranjene integracije.

2. Ustvarite integracijo

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

Shranite vrnjeni id (UUID).

3. Preizkusite končno točko v peskovniku

Preden integracijo povežete z agentom, s strežnikov ThunderPhone pošljite podpisano zahtevo, da potrdite povezljivost:

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, ...}"
}

Ta preizkus tudi utrdi zaščite ThunderPhone pred SSRF — zahteve za localhost ali zasebne obsege IP vrnejo 400 code=url_not_allowed.

4. Povežite integracijo z agentom

Integracijo pripnite prek integration_ids, ko ustvarjate ali posodabljate agenta:

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-..."]
  }'

Z enim agentom lahko povežete več integracij. Poziv agenta se lahko nanje sklicuje po imenu — »uporabite get_weather, ko klicatelj vpraša o vremenskih razmerah« — ali pa jih lahko implicitno odkrije iz opisov sheme.

5. Implementirajte končno točko

Ko agent prikliče orodje, ThunderPhone pošlje podpisano zahtevo POST na vaš 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"}

Vaš strežnik odgovori z zapisom JSON, ki se posreduje nazaj LLM-ju:

{"temperature_f": 64, "condition": "Partly cloudy", "wind_mph": 8}

LLM obdela ta odgovor in klicatelju glasovno poda razumljiv povzetek.

6. Preizkusite celoten potek

Zaženite sejo z mikrofonom za agenta in postavite vprašanje, ki ga obravnava vaše orodje (»Kakšno je vreme v 94110?«). Prepis klica prikazuje celoten potek:

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

To lahko pridobite prek GET /v1/calls/{call_id}/transcript; neobdelani tok dogodkov (s časovnimi podatki za posamezne vnose in odmiki zvoka) je na voljo prek GET /v1/calls/{call_id}/history.

Pogoste težave

Agent nikoli ne prikliče orodja

LLM se odloča na podlagi opisa orodja. Če se vprašanje klicatelja ne ujema z opisom, model ne bo priklical orodja. Izboljšajte opis (dodajte pogoste sopomenke in formulacije) ali ga izrecno navedite v pozivu agenta (»Ko klicatelj vpraša o vremenu, uporabite get_weather.«).

Orodje vrne preveč podatkov

Odgovori, večji od 6 kB, so v predogledu prepisa skrajšani. Vrnite samo polja, ki jih LLM potrebuje — ne celotne vrstice.

Časovne omejitve

Končne točke orodij imajo privzeto časovno omejitev 10 sekund. Če potrebujete več časa, obravnavajte zahtevo asinhrono: vrnite {"status": "pending", "request_id": "..."} in rezultat posredujte prek ločenega klica orodja.

Različice

Vsak PATCH integracije ustvari novo revizijo. Preglejte GET /v1/integrations/{id}/versions, da vidite, kdo je kaj spremenil. Če pokvarite shemo orodja, lahko spremembo ročno povrnete tako, da z ukazom PATCH znova uporabite starejši posnetek.


Naslednji koraki