Skip to main content
Интеграция инструмента — это повторно используемая HTTP-конечная точка, которую агент может вызывать во время звонка. Вы предоставляете ThunderPhone описание инструмента в формате JSON-схемы и URL конечной точки; агент решает, когда вызвать его, на основе разговора, а ThunderPhone выполняет исходящий HTTP-запрос со своих серверов и возвращает ответ агенту.
Панель управления покрывает большинство задач с инструментами без этого API: Подключения → Приложения подключает Slack, HubSpot, Salesforce, Google Calendar, Google Sheets и Cal.com несколькими OAuth-кликами; Подключения → API превращает любой HTTP API в действие агента (вставьте команду cURL, и мастер на основе ИИ создаст черновик инструмента со встроенной функцией «Тестовый запрос»); а Подключения → MCP добавляет MCP-серверы. См. Подключения. В этом руководстве описан базовый API, лежащий в основе раздела API.
В этом руководстве пошагово рассматривается создание инструмента для получения погоды.

Структура инструмента

Две части:
  1. Схема — определение функции в стиле OpenAI ({type: "function", function: {name, description, parameters}}), которое сообщает LLM, что делает инструмент и какие аргументы он принимает.
  2. Конечная точка — URL, который серверы ThunderPhone вызывают, когда LLM решает использовать инструмент. Запрос представляет собой JSON POST, а тело содержит аргументы, выбранные LLM.

1. Выберите стратегию хранения

Встроенный в агента

Добавьте разовый инструмент в массив tools агента. Это просто, но не подходит для повторного использования.

Сохранённая интеграция

Сохраните инструмент как повторно используемую интеграцию и привяжите его к нескольким агентам. Рекомендуется для всего, что используется более одного раза.
В этом руководстве используется путь с сохранённой интеграцией.

2. Создайте интеграцию

Сохраните возвращённый id (UUID).
Уделите особое внимание description инструмента и каждого параметра. LLM использует эти строки во время выполнения, чтобы решить, следует ли и как вызывать инструмент. Нечёткие описания → нечёткие вызовы инструмента.

3. Протестируйте конечную точку в песочнице

Прежде чем привязывать интеграцию к агенту, отправьте подписанный запрос с серверов ThunderPhone, чтобы подтвердить подключение:
Response
Этот тест также усиливает SSRF-защиту ThunderPhone — запросы к localhost или диапазонам частных IP-адресов возвращают 400 code=url_not_allowed.

4. Привяжите интеграцию к агенту

Добавьте integration_ids при создании или обновлении агента:
К одному агенту можно привязать несколько интеграций. В промпте агента на них можно ссылаться по имени — «используй get_weather, когда звонящий спрашивает о погодных условиях» — либо агент может неявно обнаружить их по описаниям схем.

5. Реализуйте эндпоинт

Когда агент вызывает инструмент, ThunderPhone отправляет подписанный POST на ваш endpoint_url:
Ваш сервер отвечает JSON, который передаётся обратно в LLM:
LLM обрабатывает этот ответ и сообщает звонящему краткую информацию понятным языком.
Подпись вычисляется по необработанному телу запроса с использованием того же secret, что и для вашего эндпоинта вебхуков. Проверяйте её — эндпоинты инструментов доступны из интернета и подвержены тем же рискам подмены, что и вебхуки. См. Проверка подписей вебхуков.

6. Протестируйте цикл

Запустите сеанс с микрофоном для агента и задайте вопрос, который обрабатывает ваш инструмент («Какая погода в 94110?»). В расшифровке звонка отображается полный цикл:
Получить её можно через GET /v1/calls/{call_id}/transcript; поток необработанных событий (со временем для каждой записи и смещениями аудио) доступен по адресу GET /v1/calls/{call_id}/history.

Распространённые проблемы

LLM принимает решение на основе описания инструмента. Если вопрос звонящего не соответствует описанию, модель не вызовет инструмент. Уточните описание (добавьте распространённые синонимы и формулировки) или явно укажите это в промпте агента («Когда звонящий спрашивает о погоде, используй get_weather.»).
Ответы размером более 6 кБ обрезаются в предпросмотре расшифровки. Возвращайте только поля, нужные LLM, а не всю запись.
Для эндпоинтов инструментов по умолчанию установлен тайм-аут 10 секунд. Если нужно больше времени, обрабатывайте запрос асинхронно: верните {"status": "pending", "request_id": "..."} и передайте результат через отдельный вызов инструмента.
Каждый PATCH интеграции создаёт новую ревизию. Проверьте GET /v1/integrations/{id}/versions, чтобы узнать, кто и что изменил. Если вы нарушили схему инструмента, можно вручную откатить изменения, передав через PATCH более ранний снимок.

Следующие шаги

Справочник по интеграциям

CRUD, передача, история версий.

Спецификация инструментов-функций

Полная грамматика схемы JSON и контракт подписанного эндпоинта.

Проверка подписей

Применяйте шаблон подписи вебхука к эндпоинтам инструментов.

API расшифровки и истории

Просматривайте полный цикл вызова инструмента.