Как деплоить инструменты AI-агента как HTTP-функции
Разбираем, как оформить инструменты AI-агента в виде защищённых HTTP-функций: валидация, аутентификация, секреты, JSON-контракты и наблюдаемость.
AI-агенты становятся полезными, когда могут вызывать инструменты. Инструмент может искать в базе данных, создавать тикет в поддержку, отправлять сообщение в Slack, проверять наличие товара или запускать фоновую задачу.
Самый чистый способ выставить многие из этих инструментов — как HTTP-функции.
HTTP-функция даёт агенту стабильный контракт:
POST /tools/search-customer
POST /tools/create-invoice
POST /tools/summarize-document
POST /tools/start-enrichment-job
Каждый инструмент получает JSON, валидирует его, выполняет одно контролируемое действие и возвращает JSON. Этот паттерн прост, портируем и легко отлаживается.
Почему HTTP хорошо подходит для инструментов агента
HTTP — хорошая граница между моделью и вашими системами.
Модели не нужен прямой доступ к вашей базе данных. Ей не нужны ваши приватные API-ключи. Ей не нужно знать, как устроена ваша биллинговая система. Ей нужно знать лишь то, что инструмент существует, какой ввод он ожидает и какой вывод возвращает.
Функция бэкенда владеет опасными частями:
- аутентификация;
- валидация ввода;
- секреты;
- бизнес-правила;
- повторы;
- лимиты запросов;
- логирование;
- вызовы внешних API.
Так агент остаётся гибким, а контроль сохраняется.
Шаг 1: определите контракт инструмента
Начните с максимально маленького контракта.
Например, инструмент поиска клиента мог бы принимать:
{
"customerId": "cus_123"
}
И возвращать:
{
"ok": true,
"customer": {
"id": "cus_123",
"name": "Acme Inc.",
"plan": "Pro",
"status": "active"
}
}
Не возвращайте лишние данные. Агент должен получать нужную ему информацию, а не всю вашу внутреннюю запись.
Шаг 2: валидируйте ввод
Никогда не доверяйте вводу инструмента только потому, что он пришёл от агента.
Модель может выдать некорректный JSON, пропустить обязательные поля или запросить действие за пределами ожидаемой области. Ваша функция должна валидировать всё.
Простой чек-лист валидации:
- обязательные поля присутствуют;
- типы полей корректны;
- длины строк разумны;
- ID соответствуют ожидаемому формату;
- запрошенное действие разрешено;
- контекст пользователя или тенанта валиден.
Если валидация не прошла, верните предсказуемую ошибку:
{
"ok": false,
"error": {
"code": "INVALID_INPUT",
"message": "customerId is required"
}
}
Агенты работают лучше, когда ошибки структурированы.
Шаг 3: держите секреты на бэкенде
Функции-инструменту могут понадобиться API-ключи для Stripe, GitHub, Slack, OpenAI, базы данных или внутреннего сервиса. Они должны находиться в переменных окружения или в системе секретов.
Агент никогда не должен получать сырые учётные данные.
Вместо этого функция использует секреты внутри себя:
agent → tool function → external API
Модель видит результат, а не учётные данные.
Шаг 4: добавьте аутентификацию
Эндпоинты инструментов не должны быть открытыми, если только они не сделаны публичными намеренно.
Обычные варианты:
- аутентификация по API-ключу;
- bearer-токены;
- подписанные запросы;
- только внутренние маршруты;
- учётные данные с областью видимости по тенанту.
Для AI-агентов контекст тенанта особенно важен. Вызов инструмента для одного клиента не должен получать доступ к данным другого клиента.
Шаг 5: сделайте вывод инструмента предсказуемым
Не возвращайте произвольный текст, если вызывающая сторона ждёт структурированные данные. Возвращайте стабильную форму JSON.
Хорошо:
{
"ok": true,
"result": {
"summary": "The customer has 3 open tickets.",
"risk": "medium"
}
}
Плохо:
Looks like there are a few tickets, maybe medium risk.
Предсказуемый вывод помогает модели выбрать следующий шаг, а вашему бэкенду — обрабатывать ошибки.
Шаг 6: решите, когда использовать фоновые задачи
Одни инструменты должны отвечать напрямую. Другие — запускать задачу.
Прямой вызов инструмента:
search customer
check status
fetch small record
classify short text
Фоновая задача:
process large file
crawl website
generate report
sync thousands of records
run multi-step enrichment
Инструмент, запускающий задачу, может вернуть:
{
"ok": true,
"jobId": "job_abc123",
"status": "queued"
}
Агент или пользовательский интерфейс может проверить статус позже.
Шаг 7: логируйте каждый вызов инструмента
Когда что-то идёт не так, нужно знать:
- какой инструмент был вызван;
- какой ввод был передан;
- кто его вызвал;
- сколько он выполнялся;
- какой внешний API упал;
- какая ошибка была возвращена.
Логи не должны содержать чувствительные данные, но должны быть достаточно подробными, чтобы отлаживать рабочий процесс.
Где здесь Inquir Compute
Inquir Compute может размещать эти инструменты как serverless-функции с API-маршрутами, переменными окружения, логами и фоновым выполнением.
Практическая конфигурация могла бы выглядеть так:
/tools/search-customer → direct function
/tools/create-ticket → direct function
/tools/start-report → starts background job
/tools/check-report-status → status function
/tools/send-notification → controlled action function
Агент вызывает маршрут. Inquir запускает функцию. Вы держите логику изолированной и наблюдаемой.
Пример списка инструментов для AI-агента поддержки
GET /tools/customer/:id
POST /tools/tickets/search
POST /tools/tickets/draft-reply
POST /tools/tickets/escalate
POST /tools/notifications/slack
POST /tools/jobs/summarize-thread
Каждый инструмент невелик. Вместе они образуют полезный бэкенд агента.
Заключение
К инструментам AI-агента стоит относиться как к API бэкенда, а не как к расширениям промпта.
HTTP-функции — простой и надёжный способ выставить эти инструменты. Они дают аутентификацию, валидацию, секреты, логи и понятные контракты.
Модель может решать, что вызвать. Бэкенд решает, что безопасно выполнить.