Порты и ветвление: как флоу выбирает путь

Порт — это именованный выход узла. Какие порты обязательно подключать и что происходит, когда узел выходит через неподключённый.

2 мин чтения

Узел заканчивает работу, выходя через один из своих портов — именованных выходов. Связь начинается в порту и ведёт к следующему узлу, поэтому порт, через который вышел узел, и есть ветка, по которой идёт флоу.

Один порт — одна связь

У большинства узлов один порт, По умолчанию. Они делают свою работу и передают выполнение дальше. У узла, который принимает решение, есть порт на каждый исход.

  • Запрос — По умолчанию → Условие
  • Условие — Выполнено → AI-модель
  • Условие — Не выполнено → Отклонить запрос
  • AI-модель — Успех → Вернуть ответ

Здесь Условие выходит через Выполнено или через Не выполнено, и каждый из двух портов ведёт к своему узлу.

  • У порта не больше одной связи. Вторая связь из того же порта — ошибка, и флоу не публикуется.

  • В один узел может приходить несколько связей. Ветки снова сходятся там, где это удобно для флоу.

  • API называет порт по коду — met, not_met, rate_limit. Конструктор показывает его название на вашем языке.

Обязательные и необязательные порты

Обязательный порт должен быть подключён. Флоу, в котором обязательный порт никуда не ведёт, не публикуется.

Большинство портов обязательные. Необязательные — это порты, через которые узел выходит, когда вызов отклонён или завершился ошибкой.

  • AI-модель — Ошибка, Пул исчерпан и Отказ необязательные. Обязателен только Успех.

  • Проверка бюджета — Отказ необязательный.

  • HTTP-запрос — Ошибка необязательный.

Порт, который никуда не ведёт

Необязательный порт можно оставить без связи. Когда узел выходит через такой порт, идти некуда, и то, что обработала бы ветка, становится ответом на весь запрос.

  • Отказ возвращается вызывающему как отказ. Когда Проверка бюджета отказывает, а ветки Отказ у него нет, вызывающий получает budget_exceeded или policy_denied, и выполнение заканчивается со статусом rejected.

  • Ошибка возвращается вызывающему как эта ошибка, и выполнение заканчивается со статусом failed.

У одного порта есть запасной выход. Когда попытки вызова модели закончились без ответа, AI-модель выходит через порт Пул исчерпан. Когда у этого порта нет связи, а у порта Ошибка она есть, выполнение идёт по ветке Ошибка. Когда не подключён ни один из них, вызывающий получает ошибку pool_exhausted.

О двух таких портах проверка при публикации предупреждает, потому что без них меняется то, что получает ваше приложение.

  • AI-модель без ветки Ошибка — ошибка провайдера завершает ошибкой всю операцию.

  • Проверка бюджета без ветки Отказ — отказ уходит вызывающему, а не идёт по ветке.

Предупреждение публикацию не останавливает.

unrouted_port — это код выполнения, которое вышло из узла через порт без связи и не имело ни ошибки, ни отказа, чтобы ответить ими. Проверка обязательных портов нужна затем, чтобы опубликованный флоу до него не доходил.

Узлы без портов

У Вернуть ответ и Отклонить запрос портов нет, потому что они заканчивают путь. Каждый путь флоу должен закончиться в одном из них. Любой другой узел, до которого доходит путь и из которого не выходит ни одна связь, — ошибка, и флоу не публикуется.

Порты всех узлов

ПортКлючУзлы
По умолчаниюdefault
  • Запрос подключение обязательно
  • Оценка стоимости подключение обязательно
  • Проверка бюджета «Разрешить» подключение обязательно
  • Резерв бюджета подключение обязательно
  • Списание и возврат подключение обязательно
  • Заметка в трассировке подключение обязательно
  • Преобразование подключение обязательно
  • Запись в кеш подключение обязательно
  • Запасной путь подключение обязательно
  • Очередь подключение обязательно
  • HTTP-запрос подключение обязательно
Успехsuccess
  • AI-модель подключение обязательно
Ошибкаerror
  • AI-модель
  • HTTP-запрос
Пул исчерпанrate_limit
  • AI-модель
Отказdeny
  • Проверка бюджета
  • AI-модель
Выполненоmet
  • Условие подключение обязательно
Не выполненоnot_met
  • Условие подключение обязательно
Попаданиеhit
  • Поиск в кеше подключение обязательно
Промахmiss
  • Поиск в кеше подключение обязательно
Одобреноapproved
  • Требуется одобрение подключение обязательно
Отклоненоrejected
  • Требуется одобрение подключение обязательно

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

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