Инструменты узла модели — поиск, чтение страниц, код и функции
Дайте узлу модели встроенные инструменты и функции, узнайте, сколько стоит каждый и что ограничивает вызов, и разрешите запуску приносить свои инструменты.
12 мин чтения
Узел модели может дать модели инструменты. Настройки называют инструмент нейтральным именем — web_search, web_fetch, code_execution, функция, — а Slen переводит его в то, что принимает провайдер модели. Эта страница говорит, что такое каждый инструмент у каждого провайдера, что ограничивает цену вызова с инструментами и как запуск может принести свои инструменты.
Два вида инструментов
Встроенный инструмент выполняет провайдер внутри вызова: ищет в вебе, читает страницу, выполняет код, — и модель отвечает тем, что нашла. Поиск и страница стоят токенов, а некоторые инструменты сверх них стоят денег за вызов.
Функцию выполняет ваш код. Модель только просит её: ответ называет функцию и её аргументы, выполнение выходит через Вызов функции, а ваш код выполняет функцию и начинает следующий запуск с её результатом — Функции.
Узел хранит свои инструменты в настройках в такой форме:
{
"model": "claude-haiku-4-5",
"tools": [
{ "type": "web_search", "max_uses": 5, "allowed_domains": ["docs.example.com"], "user_location": { "country": "UA", "city": "Kyiv" } },
{ "type": "web_fetch", "max_uses": 3, "blocked_domains": ["ads.example.com"], "max_content_tokens": 20000 },
{ "type": "function", "name": "lookup_crm", "description": "Find a customer by email", "parameters": { "type": "object", "properties": { "email": { "type": "string" } } }, "strict": true }
],
"tool_choice": "auto",
"response_format": null,
"input_overrides": null
}Имена у каждого провайдера
| Нейтральное имя | Anthropic | OpenAI | Gemini |
|---|---|---|---|
web_search | веб-поиск | веб-поиск | Google Search |
web_fetch | чтение страниц | — | URL context |
code_execution | — | — | выполнение кода |
У OpenAI нет отдельного инструмента для чтения страницы: его веб-поиск сам открывает страницы. Выполнение кода есть только у Gemini: у Anthropic и OpenAI за него платят по времени контейнера, и вызов с ним нельзя ни оценить заранее, ни ограничить. Какие инструменты есть у модели и какие настройки принимает каждый, сказано в каталоге — Модели и цены, — и конструктор предлагает только их.
Задайте инструменты узла
1. Откройте узел
Откройте флоу на вкладке Конструктор и выберите узел AI-модель. На его вкладке Настройки под пределом ответа есть раздел Инструменты.
2. Включите инструмент
Встроенный инструмент, который есть у модели, — это строка с переключателем и ценой. Включённый инструмент начинает с лимита в 5 использований за вызов, если провайдер принимает лимит. Задайте лимит, сайты и местоположение, которые принимает провайдер.
3. Добавьте функцию
Нажмите Добавить функцию, затем дайте ей имя, описание и JSON Schema её аргументов — Функции.
4. Опубликуйте
Проверить и Опубликовать сверяют каждый инструмент с каталогом: инструмент, которого нет у модели, настройка, которую не принимает её провайдер, инструмент без нужного ему лимита останавливают публикацию.
Когда вы выбираете другую модель, инструменты, которых у неё нет, остаются в узле — серыми, с причиной, — и флоу не публикуется, пока вы их не выключите или не выберете модель, у которой они есть. Копия, созданная кнопкой Добавить запасную модель, сохраняет инструменты оригинала и проверяется так же.
Что ограничивает вызов
Цена вызова с инструментами заранее неизвестна: модель сама решает, сколько раз искать, и каждый поиск добавляется ко входу следующего круга. Что Slen может знать — это сколько вызов может стоить самое большее, его потолок:
без встроенных инструментов — вход вызова и
max_output_tokensпо ценам модели;со встроенными инструментами — каждый круг вызова по окну модели, платные вызовы инструментов до их лимитов и предел ответа. Модель с ценовым уровнем длинного контекста считается по этому уровню.
Панель показывает его как «Не дороже $X за вызов», когда черновик сохранён. Это число считается до того, как известен хоть какой-то вход: вместо входа берётся окно модели, по большей из цен входа и записи в кеш, для каждого круга серверных инструментов, с каждым платным вызовом и max_output_tokens — или пределом по умолчанию. Потолок реального вызова, вход которого известен, ниже. Он действует на вызов целиком, включая продолжения вызова Anthropic. Выход Оценка стоимости несёт его как ceiling рядом с estimated_cost. Инструменту, который принимает лимит, лимит нужен — max_uses, от 1 до 20, — потому что без него вызов ничем не ограничен.
Жёсткий бюджет пользуется потолком: вызов проходит, только если потраченное, потолки вызовов в полёте и потолок нового вызова укладываются в лимит — Бюджеты. Вызов без потолка жёсткий бюджет не пропускает. Нежёсткий бюджет, как всегда, пропускает вызов по его резерву.
Anthropic
web_searchпринимаетmax_uses,allowed_domainsилиblocked_domains— что-то одно, не оба — иuser_location. Поиск стоит $10 за 1 000 сверх его токенов. Неудачный поиск входит в лимит и не оплачивается.web_fetchпринимаетmax_uses, сайты иmax_content_tokens— сколько токенов одной страницы попадает во вход. Чтение страницы стоит только её токенов.Долгий вызов с инструментами может остановиться на полпути; Slen продолжает его сам до 3 раз в рамках одной попытки. Каждое продолжение получает только остаток лимитов вызова — поиски и страницы, оставшиеся от
max_uses, и токены, оставшиеся отmax_output_tokens, — и Slen не продолжает вызов, когда лимит исчерпан или когда ещё одна часть могла бы вывести вызов за его потолок. Если вызов так и не закончился, ответ — то, что написала модель, сfinish_reasonincomplete.contentвыхода — ответ после последнего поиска или страницы; то, что модель написала до него, —intermediate_text. Источники ответа —citations, а ошибка поиска или страницы внутри успешного вызова попадает вtool_errors— AI-модель.У модели Anthropic нет формата ответа: узел, который его просит, не публикуется.
{
"content": "The order ships on Monday.",
"finish_reason": "stop",
"intermediate_text": "Let me look up the delivery policy.",
"citations": [{ "url": "https://docs.example.com/delivery", "title": "Delivery", "cited_text": "Orders ship on the next working day." }],
"tool_errors": []
}OpenAI
web_searchпринимаетmax_uses,allowed_domainsиuser_location; запрещённые сайты не принимаются. Поиск стоит $10 за 1 000 вызовов сверх его токенов.У OpenAI один лимит на все встроенные инструменты вызова: Slen отправляет сумму лимитов узла. В потолке каждый из этих вызовов считается по цене самого дорогого инструмента.
gpt-5не принимает температуру: узел этой модели с температурой не публикуется — Модели и цены.Если в узле нет местоположения, OpenAI получает пустое приблизительное местоположение: иначе он считает, что пользователь в США. Его цитаты не несут процитированного текста —
cited_textравенnull.Собственный код OpenAI для отклонённого запроса —
context_length_exceededи подобные — лежит внутриerror.messageвыхода узла, в виде «OpenAI error (context_length_exceeded): …»; Условие находит его оператором содержит по путиnodes.<key>.output.error.message.
{ "error": { "class": "rejected", "code": "provider_error", "message": "OpenAI error (context_length_exceeded): Your input exceeds the context window of this model." } }Gemini
web_search— это Google Search,web_fetch— URL context, аcode_executionвыполняет код. Ни один из них не принимает настроек: у Gemini для них нет ни лимита, ни списка сайтов, ни местоположения.Gemini не умеет ограничивать свои поиски. Как это ограничивает вызов, зависит от того, как модель платит за Search. У модели, которая платит один раз за запрос с поиском, — Gemini 2.5 — потолок есть: $35 за 1 000 таких запросов, а выдача поиска не тарифицируется как вход. У модели, которая платит за каждый поисковый запрос, — Gemini 3 и новее — его нет: узел с Search на такой модели публикуется с предупреждением
ai_model_tool_without_ceiling, панель говорит, что потолок не гарантирован, а жёсткий бюджет вызов не пропускает.URL context и выполнение кода стоят только токенов. Вход, который они добавляют, ограничен окном модели, поэтому у вызова с ними потолок есть.
Gemini 2.5 не принимает встроенный инструмент вместе с функцией и формат ответа вместе с инструментом: такой узел не публикуется.
Поисковые подсказки. Google требует показывать конечному пользователю ответ, основанный на Google Search, вместе с его поисковыми подсказками, без изменений. Slen отдаёт их вашему вызывающему коду как
grounding.search_entry_pointвыхода и не хранит в трассе ответ, основанный на поиске Google.
{ "model": "gemini-2.5-flash", "tools": [{ "type": "web_search" }, { "type": "web_fetch" }, { "type": "code_execution" }] }{
"content": "Kyiv is cloudy today, 12 °C.",
"citations": [{ "url": "https://weather.example.com/kyiv", "title": "weather.example.com" }],
"grounding": { "search_entry_point": "<div class=\"container\">…</div>" }
}Бесплатные квоты провайдеров
Провайдеры дают часть использования бесплатно: Gemini — сколько-то запросов с Search в сутки, Anthropic — часы контейнера для кода в месяц. Slen считает каждый вызов платным, поэтому при малых объёмах его фактическая стоимость может быть выше начислений провайдера. Эта ошибка — в пользу бюджета.
Формат ответа
Формат ответа просит текст, любой JSON-объект (json_object) или JSON по схеме (json_schema). Конструктор перечисляет только форматы, которые есть у модели; у OpenAI и Gemini есть оба вида, у Anthropic — ни одного.
Инструменты из входа запуска
Вызывающий код, который переносит свой вызов в Slen, часто передаёт вместе с ним tools или response_format. По умолчанию флоу не передаёт их модели, и ответ запуска говорит об этом предупреждением — запуск не прерывается:
{
"warnings": [
{ "code": "input_key_ignored", "keys": ["tools", "temperature"], "message": "The input carries keys of a model call the flow does not pass to the model: tools, temperature" }
]
}Предупреждение есть в ответе POST /v1/operations/execute, GET /v1/executions/{id}/status и GET /v1/executions/{id}, а также в трассе. Оно называет ключи вызова модели, которые были во входе и которые никто не читает, из этих:
model, tools, tool_choice, response_format, temperature, top_p, max_tokens, max_output_tokens,
max_completion_tokens, stop, parallel_tool_calls, reasoning, text, instructions, system, generationConfigКлюч, который читает узел, — путь условия, настройка, — не называется, как и ключ ваших собственных данных.
Вместо этого их может принимать узел. В разделе Из входа запуска у панели три переключателя, они сохраняются как input_overrides:
Принимать инструменты (только сужать) — встроенные инструменты из
input.toolsзаменяют инструменты узла на этот запуск. Каждый должен быть инструментом, который есть у узла; его лимит не больше лимита узла, а если лимит не указан, берётся лимит узла;allowed_domainsможет только сузить список узла,blocked_domainsдобавляются к списку узла. Инструмента, которого вход не называет, в вызове нет, поэтому потолок запуска не больше потолка узла.Принимать функции — функции из
input.toolsдобавляются к функциям узла: всего не больше 32, имя, которого нет у узла, схема каждой не больше 16 КБ.Принимать формат ответа —
input.response_formatзаменяет формат узла; он должен быть у модели.
Как сравниваются сайты входа: каждое имя — в нижнем регистре и без точки на конце; сайт находится внутри другого, если это то же имя или его поддомен, а *.example.com покрывает поддомены example.com, но не само имя.
Каждый разрешённый сайт входа должен быть внутри одного из разрешённых сайтов узла:
docs.example.comпринимается подexample.com.Когда список разрешённых встречается с запрещёнными сайтами, отклоняется разрешённый сайт внутри запрещённого, и так же — запрещённый сайт ниже разрешённого: разрешённый
example.comс запрещённымads.example.com— это то, чего один список сказать не может. Запрещённый сайт вне всех разрешённых не нужен и ничего не меняет.
Когда переключатель выключен, узел этот ключ не читает: вызов идёт с собственными настройками узла, а предупреждение называет ключ.
Запуск, который нарушает одно из этих правил, заканчивается с 422 invalid_flow_input ещё до вызова модели, и error.details говорит, какой узел и почему:
{
"error": {
"code": "invalid_flow_input",
"message": "The input asks for a tool the node does not allow",
"details": { "node": "answer", "reason": "tool_not_allowed", "tool": "web_fetch" }
}
}reason — одно из этих значений:
tool_not_allowed, max_uses_exceeds_node, domain_not_allowed, functions_not_allowed,
response_format_not_allowed, not_supported_by_modelreason | Вход просит |
|---|---|
tool_not_allowed | встроенный инструмент, которого нет у узла, встроенные инструменты, когда узел принимает только функции, инструмент неверной формы или неверный выбор инструмента |
max_uses_exceeds_node | лимит выше, чем у узла |
domain_not_allowed | сайт вне разрешённых сайтов узла или разрешённые и запрещённые сайты, которые один список вместе сказать не может |
functions_not_allowed | функции, когда узел их не принимает, больше 32 функций или имя, которое у узла уже есть |
response_format_not_allowed | формат ответа, когда узел его не принимает, или формат неверной формы |
not_supported_by_model | то, чего модель не умеет с инструментами и форматом, которые получились у запуска |
Что читать дальше
Функции — задайте функцию, прочитайте вызов, продолжите новым запуском.
AI-модель — настройки, порты и выход узла.
Модели и цены — какие инструменты есть у каждой модели и сколько они стоят.
Бюджеты — жёсткий бюджет и худший случай вызова.