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

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

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 у вході — Надіслати запит. Другий запуск відповідає текстом через Успіх або просить іншу функцію.

Що читати далі