Функции во флоу — модель просит, ваш код выполняет

Задайте функцию у узла модели, прочитайте вызов, о котором просит модель, и продолжите разговор новым запуском.

4 мин чтения

Функция — это инструмент, который выполняет ваш код. Узел модели описывает её модели; когда модель просит её вызвать, запуск отвечает этим вызовом — именем функции и её аргументами, — а ваш код выполняет функцию и отправляет результат в следующем запуске. Эта страница показывает такой круг — от настроек до второго запроса.

Почему круг идёт вне флоу

Флоу идёт вперёд: ни одна связь не может вести обратно к узлу, который уже выполнился. Поэтому флоу вызывает модель один раз, а круг «модель → функция → модель» делает ваш код: один запуск просит, ваш код отвечает, следующий запуск продолжает. Узел модели сам функцию не выполняет.

Задайте функцию

В разделе Инструменты узла AI-модель нажмите Добавить функцию, затем заполните:

  • имя — латинские буквы, цифры, _ и -, до 64 символов, уникальное в узле;

  • описание — что делает функция и когда её вызывать; его читает модель;

  • аргументы — JSON Schema объекта ("type": "object"), не больше 16 КБ;

  • Строгие аргументы — должна ли модель держаться схемы в точности.

Выбор инструмента говорит, обязана ли модель воспользоваться инструментом: по умолчанию решает модель; её можно также попросить всегда использовать инструмент, никогда не использовать или всегда вызывать одну функцию. В настройках функция выглядит так:

JSON
{
  "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 перечисляет функции, которые попросила модель, — в одной форме у всех провайдеров:

JSON
{
  "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 переводит эту историю в форму провайдера модели.

JSON
{
  "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 с этим телом и своим ключом идемпотентности:

Terminal
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 во входе — Отправить запрос. Второй запуск отвечает текстом через Успех или просит другую функцию.

Что читать дальше