Vytvorte integráciu nástroja (API)

Integrácia nástroja je opakovane použiteľný HTTP koncový bod, ktorý môže agent vyvolať počas hovoru. ThunderPhone poskytnete popis nástroja vo formáte schémy JSON spolu s adresou URL koncového bodu; agent na základe konverzácie rozhodne, kedy ho vyvolať, a ThunderPhone zo svojich serverov vykoná odchádzajúcu požiadavku HTTP a vráti odpoveď agentovi.

Tento návod vás krok za krokom prevedie vytvorením nástroja na vyhľadávanie počasia.

Štruktúra nástroja

Dve časti:

  1. Schéma — definícia funkcie v štýle OpenAI ({type: "function", function: {name, description, parameters}}), ktorá LLM informuje o funkcii nástroja a argumentoch, ktoré prijíma.
  2. Koncový bod — adresa URL, ktorú servery ThunderPhone vyvolajú, keď sa LLM rozhodne použiť nástroj. Požiadavka je JSON POST s argumentmi vybranými LLM v tele požiadavky.

1. Vyberte stratégiu ukladania

Priamo pri agentovi

Pripojte jednorazový nástroj k poľu tools agenta. Je to jednoduché, ale nie opakovane použiteľné.

Uložená integrácia

Uložte nástroj ako opakovane použiteľnú integráciu a prepojte ju s viacerými agentmi. Odporúča sa pre všetko, čo používate viac než raz.

Tento návod používa postup s uloženou integráciou.

2. Vytvorte integráciu

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

Uložte vrátené id (UUID).

3. Otestujte koncový bod v sandboxe

Pred prepojením integrácie s agentom odošlite podpísanú požiadavku zo serverov ThunderPhone na potvrdenie pripojenia:

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

Tento test tiež posilňuje ochrany ThunderPhone proti SSRF — požiadavky na localhost alebo súkromné rozsahy IP vrátia 400 code=url_not_allowed.

4. Prepojte integráciu s agentom

Pri vytváraní alebo aktualizácii hlasového agenta ju pripojte prostredníctvom integration_ids:

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

K jednému hlasovému agentovi môžete pripojiť viacero integrácií. Prompt hlasového agenta na ne môže odkazovať podľa názvu — „použite get_weather, keď volajúci žiada informácie o podmienkach“ — alebo ich môže implicitne rozpoznať z popisov schémy.

5. Implementujte koncový bod

Keď hlasový agent vyvolá nástroj, ThunderPhone odošle na váš endpoint_url podpísaný požiadavok POST:

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

Váš server odpovie JSON-om, ktorý sa odošle späť do LLM:

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

LLM spracuje túto odpoveď a volajúcemu ju zhrnie prirodzenou rečou.

6. Otestujte celý cyklus

Spustite reláciu s mikrofónom proti hlasovému agentovi a položte otázku, ktorú váš nástroj spracúva („Aké je počasie v 94110?“). Prepis hovoru zobrazuje celý cyklus:

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

Môžete ho získať prostredníctvom GET /v1/calls/{call_id}/transcript; nespracovaný tok udalostí (s časovaním jednotlivých položiek a posunmi zvuku) nájdete na GET /v1/calls/{call_id}/history.

Bežné problémy

Agent nikdy nevyvolá nástroj

LLM rozhoduje na základe popisu nástroja. Ak otázka volajúceho nezodpovedá popisu, model nástroj nevyvolá. Spresnite popis (pridajte bežné synonymá a formulácie) alebo ho výslovne uveďte v prompte hlasového agenta („Keď volajúci žiada informácie o počasí, použite get_weather.“).

Nástroj vracia príliš veľa údajov

Odpovede väčšie ako 6 kB sa v náhľade prepisu skrátia. Vráťte iba polia, ktoré LLM potrebuje — nie celý váš riadok.

Časové limity

Koncové body nástrojov majú predvolený časový limit 10 sekúnd. Ak potrebujete viac času, spracujte to asynchrónne: vráťte {"status": "pending", "request_id": "..."} a výsledok zobrazte prostredníctvom samostatného volania nástroja.

Verzionovanie

Každý PATCH integrácie vytvorí novú revíziu. Skontrolujte GET /v1/integrations/{id}/versions, aby ste zistili, kto čo zmenil. Ak pokazíte schému nástroja, môžete ju manuálne vrátiť späť použitím PATCH so staršou snímkou.


Ďalšie kroky