AI-модель

Вузол, який викликає модель, — він резервує гроші виклику, надсилає виклик через пул провайдерів і після відповіді віддає холд на розрахунок.

7 хв читання

AI-модель викликає модель. Це єдиний вузол флоу, який витрачає гроші: він резервує очікувану вартість виклику у ваших бюджетах, надсилає виклик провайдерові й після відповіді віддає холд на розрахунок.

Вузол
AI-модель
Тип
ai_model
Категорія
Модель
Порти
  • Успіх success підключення обовʼязкове
  • Помилка error підключення необовʼязкове
  • Пул вичерпано rate_limit підключення необовʼязкове
  • Відмова deny підключення необовʼязкове
Завершує шлях
Ні

Що робить вузол

Коли виконання доходить до вузла, виклик проходить три кроки.

  1. Холд. Slen перевіряє політики, оцінює виклик — модель, повідомлення, стелю виходу — і резервує оцінку, помножену на множник запасу, у бюджетах, під які підпадає виклик. Виклик, зроблений для одного з ваших клієнтів, резервує ще й свою ціну в кредитах на рахунку клієнта того типу кредитів, який запит називає в context.credit_type. Холд пояснює стаття Як працює резервування бюджету.

  2. Виклик. Виклик робить підключення пулу провайдерів, спроба за спробою, як каже наступний розділ.

  3. Розрахунок. Коли провайдер відповів, виконання виходить через Успіх, а холд у фоні списується на суму, у скільки обійшовся виклик. cost.actual виконання стає відомим, коли це зроблено. Виклик, який не вдався або був відхилений, повертає свій холд.

Промпт — це messages із входу запиту, надіслані такими, якими прийшли. Вхід без непорожнього messages завершує виконання як failed з invalid_flow_input. Вузол додає модель, стелю виходу й температуру зі своїх налаштувань, а також список інструментів і формат відповіді, коли їх задано.

Яке підключення робить виклик

  • Вузол із вибраним пулом провайдерів викликає через цей пул.

  • Вузол без нього викликає через типовий пул провайдера моделі, а коли такого немає, — через одне підключення з однією спробою; яке саме, каже стаття Пули провайдерів.

  • Вузол може задати своє число спроб і те, що йде за лімітом запитів. І те, й інше головніше за налаштування пулу й діє, лише поки виклик іде через пул.

  • Пул, який вузол називає і який видалено або вимкнено, чи провайдер без підключення, здатного обслужити виклик, завершують виклик із provider_not_configured.

Коли виконання чекає на вузлі

Вузол може змусити виконання чекати. Тоді його статус — waiting, а запит, який його почав, отримав відповідь 202.

  • Очікування підключення. Коли вузол або його пул відповідає на ліміт запитів значенням queue, а жодне підключення не має місця для виклику, виконання чекає стільки, скільки попросив провайдер, або хвилину, і вузол пробує знову з новим холдом. Поки виконання чекає, нічого не зарезервовано. Після трьох очікувань за замовчуванням виклик завершується з pool_exhausted.

  • Виклик, який провайдер виконує у фоні. Коли сервіс для цього налаштовано, виклик виконання, надісланого в асинхронному режимі, може бути передано провайдерові, який уміє виконувати його у фоні. Виконання чекає, поки Slen питає провайдера, як іде виклик, і продовжується з відповіддю. Холд такого виклику за замовчуванням стоїть 30 хвилин від початку виклику; цей строк обмежує холд, а не виклик. Про кінець виклику повідомляють operation.completed, operation.failed або operation.uncertain.

    • Коли провайдера більше не вдається спитати, виконання закінчується як uncertain, а холд стоїть, поки не спливе.

    • Коли холд закрило інше списання, поки виклик чекав, виклик закінчується, не спитавши в провайдера відповіді, з background_hold_expired. Нічого не повертається, і провайдер може однаково виставити рахунок за виклик.

    • Коли провайдер усе ще називає виклик таким, що виконується, після того як виконання прочекало 72 години (за замовчуванням), виконання закривається як failed з parked_expired. Жодних подій про виклик не надсилається, і його операція залишається pending.

Політика перевитрати

У нового вузла політики перевитрати немає. Політика, вибрана в полі У разі перевищення, змушує Slen оцінити виклик удруге просто перед зверненням до провайдера й порівняти це число з холдом. Обидві оцінки отримано з того самого запиту з різницею в мить, тому політика практично ніколи не спрацьовує — і при цьому додає другу оцінку до кожного виклику. Коли вона все ж спрацьовує, виклик іде далі, зупиняється з overrun_stopped, чекає схвалення людини або переходить на дешевшу модель із другим холдом — як сказано в політиці. Запит, щодо якого вирішує людина, описує стаття Погодження.

Коли використовувати

  • Він є в кожному флоу, який викликає модель: цей вузол і є виклик.

  • Поставте перед ним Перевірка бюджету, щоб відмовляти до того, як зарезервовано гроші, і Пошук у кеші, щоб відповідати на повторне питання без виклику.

  • Підключіть Відмова, Помилка і Пул вичерпано, щоб вибрати, що почує той, хто викликає: дешевшу модель через Запасний шлях, задану відповідь, відмову з власним кодом.

  • Флоу може викликати кілька моделей. Кожен виклик резервує й розраховується сам по собі та є окремою операцією, а cost.estimated виконання — це сума оцінок зроблених викликів.

Налаштування

НалаштуванняДля чого воно
modelМодель, яку викликає вузол, за її кодом у каталозі моделей. Обов’язкова. Виклик оцінюється за каталогом у момент, коли береться його холд.
pool_idПул провайдерів, через який іде виклик, за його ідентифікатором, записаним текстом. Без нього виклик іде через типовий пул провайдера моделі.
max_output_tokensНайбільше число вихідних токенів у відповіді. Ціле число, не менше за 1. Без нього відповідь обмежено 1024 токенами, якщо сервіс не налаштовано інакше. За цією стелею рахується розмір холду.
temperatureНаскільки провайдер може варіювати відповідь, від 0 до 2. Без неї провайдер бере своє значення за замовчуванням.
max_attemptsСкільки підключень пулу можна спробувати для виклику, від 1 до 5. Без нього діє число самого пулу.
on_rate_limitЩо йде за лімітом запитів провайдера — switch_connection, reject, queue або fallback_model. Без нього діє вибір самого пулу. Конструктор пропонує перші два; queue змушує виконання чекати на підключення.
on_provider_errorЩо йде за помилкою провайдера — switch_connection або reject. Без нього діє вибір самого пулу. Задається через API.
toolsІнструменти, які може викликати модель, — непорожній список у тому вигляді, який приймає провайдер. Задається через API.
response_formatФормат, якого має набути відповідь, — об’єкт із типом у тому вигляді, який приймає провайдер. Задається через API.
on_overrunЩо робить вузол, коли друга оцінка, зроблена просто перед зверненням до провайдера, виявляється більшою за холд, — continue, stop, require_approval або degrade. У нового вузла її немає. Обидві оцінки отримано з того самого запиту з різницею в мить, тому політика практично ніколи не спрацьовує.
overrun_toleranceНаскільки друга оцінка може перевищити холд, перш ніж спрацює політика перевитрати, від 1 до 10. 1.25 означає — не більше ніж на чверть понад холд. Без нього — 1.25.
degrade_to_modelДешевша модель, на яку переходить виклик, коли політика перевитрати — degrade. Обов’язкова для цієї політики й не може бути моделлю самого вузла.

У конструкторі на вкладці Налаштування — поля Модель, Температура, Максимум вихідних токенів і У разі перевищення. На вкладці Підключення — Пул провайдерів, Максимум спроб і У разі ліміту запитів (429). Вкладка Додатково показує весь конфіг вузла таким, яким його збережено, разом із ключами, для яких на вкладках немає полів: їх задають через API.

У нового вузла моделі немає, і флоу не публікується, поки її не вибрано. Порожнє поле Максимум вихідних токенів обмежує відповідь 1024 токенами, якщо сервіс не налаштовано інакше, і за цією стелею рахується розмір холду.

Порти

ПортВиконання виходить через нього, коли
УспіхПровайдер відповів. Обов’язковий
ВідмоваВиклик відхилено до звернення до провайдера: бюджетом (budget_exceeded, operation_limit_exceeded, concurrency_limit_exceeded), політикою (policy_denied), кредитами вашого клієнта (insufficient_credits), блокуванням вашого клієнта (customer_blocked) або політикою перевитрати (overrun_stopped)
Пул вичерпаноСпроби або підключення пулу закінчилися без відповіді (pool_exhausted)
ПомилкаПровайдер відповів помилкою, яка завершує виклик; виклик, який провайдер виконував у фоні, не вдався або закінчився без відповіді (background_hold_expired); або жодне підключення не може обслужити провайдера моделі (provider_not_configured)
  • Три останні порти необов’язкові. Коли в Пул вичерпано немає зв’язку, а в Помилка є, виконання йде на гілку Помилка. Що робить непідключений порт, сказано в статті Порти й розгалуження.

  • Коли провайдера викликали, а його відповідь загубилася, вузол не виходить через жоден порт: виконання закінчується як uncertain з operation_uncertain, а холд стоїть, поки не спливе. Не запускайте такий запит знову, наче він не вдався.

  • Виконання, яке закінчилося як rejected після того, як виклик відхилили, зберігає в cost.estimated оцінку відхиленого виклику: гроші, які відмова зберегла, а не витрачені. Відмова за кредитами вашого клієнта залишає його порожнім. Гілка Відмова, яка відповідає без виклику моделі, закінчується як completed з тією самою оцінкою й без фактичної вартості.

Вихід

Коли провайдер відповів, вузол залишає відповідь наступним вузлам.

JSON
{
  "model": "gpt-4o-mini",
  "content": "Thank you for your order. It ships on Monday.",
  "finish_reason": "stop",
  "tool_calls": null,
  "usage": { "input_tokens": 1180, "output_tokens": 212, "cached_input_tokens": 0 }
}

Наступний вузол читає її за шляхом nodes.<key>.output.content, де <key> — ключ цього вузла у флоу. Повернути відповідь за замовчуванням відповідає виходом останньої моделі.

Коли виконання виходить через Відмова, Пул вичерпано або Помилка, вузол залишає натомість те, чим закінчився виклик:

JSON
{ "error_code": "budget_exceeded", "http_status": 402, "message": "Budget 74438200973595008 (monthly) exceeded" }

Помилки

Налаштування вузла перевіряються під час перевірки флоу та під час його публікації.

В API запис issues називає таку перевірку в params.detail; його code — invalid_node_config.

ПеревіркаПовідомлення в конструкторі
ai_model_needs_modelВузлу «{node}» потрібна модель.
ai_model_invalid_pool_idПул вузла «{node}» має бути заданий своїм ідентифікатором — текстом.
ai_model_invalid_max_output_tokensЛіміт вихідних токенів «{node}» має бути цілим числом, не менше 1.
ai_model_invalid_max_attemptsЛіміт спроб «{node}» має бути цілим числом від 1 до {max}.
ai_model_invalid_temperatureТемпература «{node}» має бути числом від {min} до {max}.
ai_model_unsupported_on_rate_limit«{node}» використовує неіснуючу поведінку при ліміті запитів.
ai_model_unsupported_on_provider_error«{node}» використовує неіснуючу поведінку при помилці провайдера.
ai_model_tools_not_listІнструменти «{node}» мають бути непорожнім списком.
ai_model_unusable_toolУ «{node}» є інструмент, який не є ані іменованою функцією, ані типізованим інструментом провайдера.
ai_model_invalid_response_formatФормат відповіді «{node}» має бути обʼєктом із полем type.
ai_model_unsupported_on_overrun«{node}» використовує неіснуючу політику перевитрати.
ai_model_invalid_overrun_toleranceДопуск перевитрати «{node}» має бути між {min} і {max}.
ai_model_needs_degrade_model«{node}» знижує модель при перевитраті, але не вказує, на яку.
ai_model_degrades_to_same_model«{node}» знижує до моделі, яку вже використовує.

Перевірка читає й те, що називає вузол. Модель, якої немає в каталозі (unknown_model), пул, якого не існує (unknown_pool), і пул іншого провайдера, що не приймає інших провайдерів (pool_provider_mismatch), зупиняють публікацію. Пул, який вимкнено, не має увімкнених підключень або не має жодного, здатного обслужити модель, — це попередження (pool_disabled, pool_without_connections, pool_cannot_serve_model), як і вузол без гілки Помилка (error_port_not_connected).

Що відбувається з викликом, який відхилено або який не вдався, сказано вище в розділі Порти; що означає кожен код і що з ним робити — у статті Коди помилок.

Приклад

  • Запит — Типовий → AI-модель
  • AI-модель — Успіх → Повернути відповідь
  • AI-модель — Пул вичерпано → Запасний шлях
  • AI-модель — Помилка → Запасний шлях
  • Запасний шлях — Типовий → AI-модель
  • AI-модель — Успіх → Повернути відповідь
  • AI-модель — Відмова → Відхилити запит

AI-модель резервує гроші й викликає модель, а його відповідь іде в Повернути відповідь. Коли пул вичерпано або провайдер дав збій, виконання проходить Запасний шлях до другого AI-модель з дешевшою моделлю та своїм холдом. Коли виклик відхилено, Відхилити запит завершує запит зі своїм кодом.

Зібрано з openapi b070e1f, sdk contract 5cc7055, php ae4a53b, node 84bc62d