Създайте интеграция с инструмент (API)
Интеграцията на инструмент е HTTP крайна точка за многократна употреба, която агентът може да извика по време на разговор. Предоставяте на ThunderPhone описание на инструмента по JSON Schema и URL на крайна точка; агентът решава кога да я извика според разговора, а ThunderPhone изпраща изходящата HTTP заявка от своите сървъри и връща отговора на агента.
Това ръководство показва как да създадете инструмент за проверка на времето от начало до край.
Анатомия на инструмент
Две части:
- Схемата — дефиниция на функция в стил OpenAI
(
{type: "function", function: {name, description, parameters}}), която указва на LLM какво прави инструментът и какви аргументи приема. - Крайната точка — URL адресът, който сървърите на ThunderPhone извикват, когато LLM реши да използва инструмента. Заявката е JSON POST с избраните от LLM аргументи като тяло.
1. Изберете стратегия за съхранение
Прикачете еднократен инструмент към масива tools на агента. Лесно, но
не може да се използва повторно.
Съхранете инструмента като интеграция за многократна употреба и го свържете с много агенти. Препоръчително за всичко, което се използва повече от веднъж.
Това ръководство използва подхода със запазена интеграция.
2. Създайте интеграцията
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" }
]
}'
Запазете върнатия id (UUID).
3. Тествайте крайната точка в пясъчника
Преди да свържете интеграцията с агент, изпратете подписана заявка от сървърите на ThunderPhone, за да потвърдите свързаността:
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, ...}"
}
Този тест също така подсилва SSRF защитите на ThunderPhone — заявките към
localhost или частни IP диапазони връщат 400 code=url_not_allowed.
4. Свържете интеграцията с агент
При създаване или актуализиране на агент я прикачете чрез 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-..."]
}'
Можете да свържете много интеграции с един агент. Подканата на агента може
да ги реферира по име — „използвай get_weather, когато обаждащият се пита
за метеорологичните условия“ — или агентът може да ги открие неявно от
описанията на схемите.
5. Имплементирайте крайната точка
Когато агентът извика инструмента, ThunderPhone изпраща подписана POST заявка към
вашия 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"}
Вашият сървър отговаря с JSON, който се връща към LLM:
{"temperature_f": 64, "condition": "Partly cloudy", "wind_mph": 8}
LLM обработва този отговор и съобщава разбираемо обобщение на обаждащия се.
6. Тествайте цикъла
Стартирайте микрофонна сесия с агента и задайте въпроса, който вашият инструмент обработва („Какво е времето в 94110?“). Транскрипцията на разговора показва пълния цикъл:
{
"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." }
]
}
Можете да извлечете това чрез
GET /v1/calls/{call_id}/transcript;
потокът от необработени събития (с времеви данни за всеки запис и аудио отмествания) е на
GET /v1/calls/{call_id}/history.
Чести проблеми
Агентът никога не извиква инструмента
LLM решава въз основа на описанието на инструмента. Ако въпросът на обаждащия се
не съответства на описанието, моделът няма да извика
инструмента. Прецизирайте описанието (добавете често срещани синоними и
формулировки) или го споменете изрично в подканата на агента („Когато
обаждащият се пита за времето, използвай get_weather.").
Инструментът връща твърде много данни
Отговорите над 6 kB се съкращават в прегледа на транскрипцията. Връщайте само полетата, от които LLM се нуждае — не целия си запис.
Изчаквания
Крайните точки на инструментите имат 10-секундно изчакване по подразбиране. Ако ви е нужно повече време,
обработвайте асинхронно: върнете {"status": "pending", "request_id": "..."}
и покажете резултата чрез отделно извикване на инструмент.
Версиониране
Всеки PATCH на интеграция създава нова ревизия. Проверете
GET /v1/integrations/{id}/versions,
за да видите кой какво е променил. Ако нарушите схемата на инструмент, можете
да върнете предишна версия ръчно, като приложите с PATCH по-старо моментно състояние.
Следващи стъпки
CRUD, прехвърляне, хронология на версиите.
Пълна граматика на JSON схемата и договорът за подписаните крайни точки.
Приложете шаблона за подпис на webhook към крайните точки на инструменти.
Проверете целия цикъл на извикване на инструмент.