Что такое HTTP-инструмент?
HTTP-инструмент — это определение REST API, которое LLM может вызвать во время выполнения. Типовые сценарии использования:- Вызов эндпоинтов вашего бэкенда
- Запуск автоматизаций n8n
- Синхронизация данных с CRM
- Получение данных из внешних API: погода, цены, наличие и т. д.
- Запись, обновление и чтение данных через REST API
- какой инструмент вызвать
- когда его вызвать
- какие параметры отправить
- Ваших промптов: инструкций на уровне узла на простом английском или любом другом языке
- Названия инструмента
- Описания инструмента
- Определений параметров
Определение HTTP-инструмента
1. Название инструмента
- Должно быть понятным и отражать действие.
- Примеры:
capture_lead_interest,fetch_weather,create_crm_contactи т. д.
2. Описание инструмента
- Крайне важно
- По нему LLM решает, когда использовать инструмент.
- Пишите простым, явным английским: англоязычные описания и инструкции LLM распознаёт и вызывает надёжнее, чем русскоязычные.
3. Настройка эндпоинта
- Полный URL, который обязательно содержит
http://илиhttps:// - Поддерживает REST-методы
Частая ошибка: забыть
https:// в URL.4. Аутентификация и заголовки
- Добавьте пользовательские заголовки
- Прикрепите переиспользуемые учётные данные на вкладке Аутентификация у инструмента (см. раздел «Учётные данные» ниже)
- Работает с внутренними сервисами и сторонними API
5. Параметры
У каждого параметра должны быть:- Имя
- Тип
- Описание
- Признак обязательности
- Начинайте со строковых параметров, когда возможно
- Явно описывайте, что представляет собой значение
- Помечайте обязательными только действительно обязательные поля
- interest (string): “Set to true if the user clearly shows intent to buy or wants follow-up. Otherwise false.”
Размещение параметров (location)
По умолчанию размещение каждого параметра выбирается автоматически по HTTP-методу: дляPOST/PUT/PATCH параметры уходят в тело запроса, для GET/DELETE — в query-строку. Это поведение значения location: "auto" — дефолта, при котором инструмент собирает запрос ровно так же, как до появления этой настройки.
Через поле location (в REST API, SDK и MCP) отдельный параметр можно отправить в конкретное место запроса:
Правила валидации:
body и form запрещены для GET/DELETE (у них нет тела по спецификации), form требует body_type: "form". Имена параметров должны быть уникальны и не пересекаться с preset_parameters — иначе конфигурация отклоняется с 422.
Параметр, использованный в шаблоне URL (
/users/{{user_id}}), при location: "auto" по-прежнему отправляется и по обычному правилу метода — то есть может дублироваться в path и в body/query. Это осознанное поведение для обратной совместимости.6. Тип тела запроса (body_type)
Полеbody_type задаёт кодировку тела (в REST API, SDK и MCP; дефолт — json):
Режим
form нужен для API вида Renovatio, где все методы — POST с urlencoded-телом: скалярные параметры уходят обычными полями, а вложенные структуры (объект/массив) автоматически сериализуются в JSON-строку внутри form-поля — ровно как это делают такие API.
body_type: "form" можно задать свой заголовок Content-Type, но его media type обязан быть application/x-www-form-urlencoded (параметры вроде charset допускаются) — конфликтующий заголовок отклоняется с 422, потому что запрос ушёл бы с телом и заголовком, которые противоречат друг другу. Для body_type: "json" пользовательский Content-Type из заголовков остаётся нетронутым.
Raw-тело: body_template
Режимraw отправляет телом ровно то, что написано в body_template, с подстановкой переменных — для API с фиксированным форматом тела: XML/SOAP, обычный текст, экзотические JSON-схемы, подписанные полезные нагрузки. Типичный кейс — SOAP:
{{имя}}. Допускаются:
- краткие имена объявленных параметров и preset_parameters (
{{patient_name}},{{phone}}); - встроенные переменные
current_time,current_time_<часовой пояс>(IANA, напримерcurrent_time_Europe/Moscow),current_weekdayиcurrent_weekday_<часовой пояс>; - пути по группам рантайма:
initial_context.*,gathered_context.*,arguments.*(аргументы LLM),preset_arguments.*(разрешённые пресеты). Путиarguments.*иpreset_arguments.*проверяются на сохранении против объявленных параметров;initial_context.*/gathered_context.*— нет, их значения известны только на звонке.
Семантика кратких имён в raw-шаблоне отличается от шаблона URL. В URL краткое имя резолвится из объединения initial+gathered+arguments; в raw-шаблоне — из аргументов LLM, где одноимённый пресет перекрывает аргумент. Когда нужна точность, используйте полные пути:
{{arguments.x}} — это именно аргумент LLM, {{preset_arguments.x}} — именно пресет, {{initial_context.x}} — именно контекст.rawдоступен только дляPOST/PUT/PATCH— raw всегда отправляет тело; параметры при этом идут в query-строку (location: "auto"работает какquery, явныеbody/formзапрещены — тело занято шаблоном);credential_placement: "form"с raw тоже запрещён (доступныheaderиquery);- заголовок
Content-Typeобязателен (имя ищется без учёта регистра; дубли ключей разного регистра —422); media type может быть любым — тело ваше; - фильтр-синтаксис (
{{x | fallback:y}}) в raw-шаблоне не поддерживается и отклоняется; - исходный шаблон и отрендеренное UTF-8 тело ограничены 64 KiB каждое.
\n отсутствуют как класс — всё, что вы написали в шаблоне (и что пришло в значениях), уходит в тело байт-в-байт. Это защищает XML/SOAP и подписанные полезные нагрузки от «молчаливых улучшений», но означает, что необязательную переменную без значения в шаблон писать нельзя. Единственное исключение — сами пресеты: их value_template разрешается общим рендерером до входа в raw-тело, поэтому литеральный \n внутри value_template пресета превратится в настоящий перевод строки (для подписанных полезных нагрузок не используйте \n в value_template пресетов).
Учётные данные
Секрет, которым инструмент аутентифицируется, не является частью самого инструмента. Это отдельный переиспользуемый объект учётных данных, принадлежащий вашей организации; инструмент ссылается на него по UUID. Одни учётные данные могут обслуживать сразу несколько инструментов — HTTP-инструмент, MCP-инструмент, получение данных перед звонком — и их ротация обновляет все сразу.Создание учётных данных
Откройте инструмент, перейдите на вкладку Аутентификация и нажмите + рядом с выпадающим списком. Задайте имя (уникальное в организации — дубликат отклоняется с кодом409), необязательное описание и выберите тип:
То же самое доступно через API:
api_key требует header_name + api_key, bearer_token — token, basic_auth — username + password, custom_header — header_name + header_value.
Выбор учётных данных в инструменте
Выберите учётные данные в выпадающем списке на вкладке Аутентификация. Инструмент хранит только их UUID, а не копию секрета. Во время звонка Агентика находит учётные данные внутри вашей организации, собирает заголовок нужного типа и добавляет его к исходящему запросу.Размещение секрета (credential_placement)
По умолчанию (credential_placement: "header") секрет уходит заголовком авторизации — так, как описано выше. Некоторые API требуют ключ иначе: Renovatio ждёт его form-полем api_key в теле, некоторые сервисы — query-параметром вида ?api_key=…. Поле credential_placement (в REST API, SDK и MCP) задаёт, куда именно инжектируется секрет:
422 при сохранении): режимы form/query работают только с учётными данными типа API-ключ и требуют credential_uuid и непустой credential_field (латиница, цифры, _, ., -, до 128 символов); имя credential_field не может совпадать с именем параметра, preset-параметра или статического query-параметра из URL — иначе секрет был бы перезаписан пользовательскими данными.
Поведение на звонке тоже различается. Для header сохраняется прежнее поведение: если учётные данные не нашлись, запрос всё равно уйдёт без авторизации (апстрим ответит 401). Для form/query действует принцип fail-closed: учётные данные не найдены (включая чужую организацию), не того типа, без значения api_key — запрос не отправляется вообще, инструмент возвращает ошибку выполнения. Секрет инжектируется последним, после всех пользовательских параметров, и существует только в исходящем запросе: в определении инструмента, промпте и логах его нет. Ответ API перед возвратом агенту проходит редацию — если апстрим эхом вернул ключ (в JSON, в теле ответа или в сообщении ошибки), каждое его представление заменяется на [REDACTED].
При экспорте бандла credential_uuid вырезается, поэтому инструмент с размещением form/query импортируется со сброшенным в header размещением и очищенным credential_field (с заметкой в предупреждениях импорта) — после перепривязки учётных данных выберите размещение заново.
Ротация учётных данных
Поскольку инструменты ссылаются на UUID, ротация — это одно обновление: все инструменты, указывающие на эти учётные данные, подхватят новый секрет без правок:DELETE /api/v1/credentials/{credential_uuid} — мягкое удаление: учётные данные пропадают из списка выбора и перестают применяться к запросам.
Что хранится
Значения учётных данных хранятся на сервере в базе данных Агентики и используются только для сборки исходящего заголовка авторизации. API их не возвращает: все эндпоинты учётных данных — список, получение, создание, обновление — отдают только UUID, имя, описание, тип и временные метки. Эндпоинт, который читает секрет, отсутствует.Прикрепление инструментов к узлам воркфлоу
- К одному узлу можно прикрепить несколько инструментов
- Все созданные инструменты будут доступны для выбора в узле
- Инструменты можно вызывать, только когда они прикреплены к этому узлу
- LLM выберет, какой из них вызвать
Логика вызова инструментов: как думает LLM
LLM учитывает:- Произнесённое намерение пользователя
- Инструкции в промпте узла
- Название и описание инструмента
- Описания параметров
- Пропущенным вызовам инструментов
- Неверным параметрам
- Выдуманным значениям
Ключевые рекомендации
- Называйте инструменты понятно
- Пишите подробные описания, ориентированные на действие
- Сначала держите параметры простыми
- Всегда указывайте
http/httpsв URL - Используйте простой английский в инструкциях узла
- Прикрепляйте к каждому узлу только релевантные инструменты