Функции во флоу — модель просит, ваш код выполняет
Задайте функцию у узла модели, прочитайте вызов, о котором просит модель, и продолжите разговор новым запуском.
4 мин чтения
Функция — это инструмент, который выполняет ваш код. Узел модели описывает её модели; когда модель просит её вызвать, запуск отвечает этим вызовом — именем функции и её аргументами, — а ваш код выполняет функцию и отправляет результат в следующем запуске. Эта страница показывает такой круг — от настроек до второго запроса.
Почему круг идёт вне флоу
Флоу идёт вперёд: ни одна связь не может вести обратно к узлу, который уже выполнился. Поэтому флоу вызывает модель один раз, а круг «модель → функция → модель» делает ваш код: один запуск просит, ваш код отвечает, следующий запуск продолжает. Узел модели сам функцию не выполняет.
Задайте функцию
В разделе Инструменты узла AI-модель нажмите Добавить функцию, затем заполните:
имя — латинские буквы, цифры,
_и-, до 64 символов, уникальное в узле;описание — что делает функция и когда её вызывать; его читает модель;
аргументы — JSON Schema объекта (
"type": "object"), не больше 16 КБ;Строгие аргументы — должна ли модель держаться схемы в точности.
Выбор инструмента говорит, обязана ли модель воспользоваться инструментом: по умолчанию решает модель; её можно также попросить всегда использовать инструмент, никогда не использовать или всегда вызывать одну функцию. В настройках функция выглядит так:
{
"type": "function",
"name": "get_weather",
"description": "The current weather in a city",
"parameters": { "type": "object", "properties": { "city": { "type": "string" } }, "required": ["city"] },
"strict": true
}Функции принимает каждая модель каталога. Gemini 2.5 принимает их только без встроенного инструмента рядом — Инструменты.
Подключите порт
Ответ, который просит вызвать функцию, выходит из узла через Вызов функции. Подключите его к Вернуть ответ: тогда запуск отвечает вызывающему коду этим вызовом. Без связи такой ответ выходит через Успех, как любой другой, а проверка флоу предупреждает об узле с функциями без такой связи (tool_calls_port_not_connected).
Шаблон Функция через вызывающего — это такой флоу, готовый к публикации, — Шаблоны AI-флоу.
- Запрос — По умолчанию → AI-модель
- AI-модель — Успех → Вернуть ответ
- AI-модель — Вызов функции → Вернуть ответ
Прочитайте вызов
У выхода узла finish_reason — tool_calls, а tool_calls перечисляет функции, которые попросила модель, — в одной форме у всех провайдеров:
{
"model": "gpt-4o-mini",
"content": null,
"finish_reason": "tool_calls",
"tool_calls": [
{ "id": "call_8fz2", "name": "get_weather", "arguments": { "city": "Kyiv" }, "arguments_json": "{\"city\":\"Kyiv\"}" }
]
}idназывает вызов; ваш ответ ссылается на него. Вызов, которому провайдер не дал id, получает его от Slen.arguments— разобранный объект, аarguments_json— текст, как его прислал провайдер. Когда этот текст — не валидный JSON,argumentsравенnull, а текст остаётся.Вызов модели, которая попросила функцию, оплачивается как любой другой вызов: его вход и выход. Сама функция у провайдера ничего не стоит.
Продолжите новым запуском
Выполните функцию, затем отправьте новый запрос к той же операции. Его input.messages несёт весь разговор: сообщения, которые вы отправили, ответ модели с её вызовом и сообщение с role tool, в котором результат лежит под id вызова. Slen переводит эту историю в форму провайдера модели.
{
"operation": "weather_assistant",
"input": {
"messages": [
{ "role": "user", "content": "What is the weather in Kyiv?" },
{ "role": "assistant", "content": null, "tool_calls": [{ "id": "call_8fz2", "type": "function", "function": { "name": "get_weather", "arguments": "{\"city\":\"Kyiv\"}" } }] },
{ "role": "tool", "tool_call_id": "call_8fz2", "content": "{\"temperature_c\": 12, \"sky\": \"cloudy\"}" }
]
}
}По HTTP это запрос POST /v1/operations/execute с этим телом и своим ключом идемпотентности:
curl https://api.slen.ai/v1/operations/execute \
-H "Authorization: Bearer $SLEN_API_KEY" \
-H "Idempotency-Key: weather-42:round-2" \
-H "Content-Type: application/json" \
-d @next-round.jsonИз SDK это тот же operations.execute(), что и первый запрос, с этими messages во входе — Отправить запрос. Второй запуск отвечает текстом через Успех или просит другую функцию.
Что читать дальше
Инструменты — встроенные инструменты, их цены и что ограничивает вызов.
AI-модель — порты и выход узла.
Вернуть ответ — чем отвечает запуск.
Отправить запрос — запрос к флоу из вашего приложения.