Что проверяется перед публикацией флоу

Проверки графа и настроек каждого узла, какие из них останавливают публикацию и какое сообщение конструктор показывает для каждой.

Проверить и Опубликовать проверяют черновик флоу, прежде чем он сможет выполняться. Каждая найденная проблема привязана к узлу или ко всему графу, и конструктор показывает её на узле и в начале панели узла. Эта страница перечисляет все проверки с сообщением, которое для каждой показывает конструктор.

Два вида проверок

  • Проверка графа касается формы флоу: один входной узел, подключённые порты, отсутствие циклов, модели и пулы, которые называет узел. У каждой свой код.

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

Что останавливает публикацию

Проблема — это error или warning. Ошибка останавливает публикацию: ничего не публикуется, пока её не исправят. Предупреждение — нет: оно говорит, что флоу будет работать не так, как вы, может быть, ждёте, — узел модели без ветки ошибки, пул без подключения, которое может обслужить модель.

В API тот же список — error.details.issues публикации, отклонённой с 422 и кодом flow_invalid, — Публикация, версии и откат. Откат заново проверяет только модели и пулы версии.

Проверки графа

В API запись issues несёт такой код в code, а severity говорит, мешает ли он публикации: error мешает, warning — нет.

КодУровеньСообщение в конструкторе
invalid_graph_shapeerrorВ графе значение неверного типа по пути {path}: там ожидается {expected}.
duplicate_node_keyerrorКлюч «{node}» используется больше чем одним узлом.
invalid_node_keyerrorКлюч «{node}» должен быть длиной от 1 до {max} символов: строчные латинские буквы, цифры, подчёркивания и дефисы.
unknown_node_typeerrorУ «{node}» неизвестный тип ({type}).
node_type_not_supportederrorТип {type} узла «{node}» пока нельзя опубликовать.
node_type_frozenerrorТип {type} узла «{node}» заморожен: флоу, опубликованные с ним, продолжают работать, но новая версия не может его содержать. Удалите узел, чтобы опубликовать.
no_entry_nodeerrorВо флоу нет входного узла, с которого он начинается.
multiple_entry_nodeserrorВходной узел может быть только один — «{node}» один из нескольких.
unknown_edge_sourceerrorСвязь начинается в «{node}», которого не существует.
unknown_edge_targeterrorСвязь из «{node}» указывает на «{target}», которого не существует.
unknown_porterrorУ «{node}» нет ветки «{port}».
duplicate_port_edgeerrorУ ветки «{port}» узла «{node}» больше одной связи.
port_not_connectederrorВетка «{port}» узла «{node}» никуда не ведёт.
error_port_not_connectedwarningУ «{node}» нет ветки ошибки — ошибка провайдера завалит всю операцию.
deny_port_not_connectedwarningУ «{node}» нет ветки отказа — отказ вернётся вызывающему как 402 или 403, а не пойдёт по ветке.
cycle_detectederrorСвязь возвращается обратно в «{node}» — флоу должен идти вперёд.
unreachable_nodewarningДо «{node}» нельзя дойти от входного узла.
path_without_terminalerrorПуть через «{node}» заканчивается без ответа и без отказа.
invalid_node_configerror«{node}» настроен неверно.
unknown_modelerrorМодели {model} узла «{node}» нет в каталоге.
unknown_poolerrorПул узла «{node}» не существует.
pool_provider_mismatcherrorПул узла «{node}» обслуживает {serves}, а модели нужен {needs}.
pool_without_connectionswarningВ пуле узла «{node}» нет ни одного включённого подключения.
pool_cannot_serve_modelwarningНи одно включённое подключение в пуле узла «{node}» не может обслужить {model} — каждый вызов завершится ошибкой, пока такое не появится.
pool_disabledwarningПул узла «{node}» выключен — каждый вызов завершится ошибкой, пока его не включат.
park_inside_finance_chainerror«{node}» резервирует бюджет, но ждёт до вызова модели — ожидающий запуск не держит резерв.
misplaced_finance_nodeerror«{node}» ({type}) не входит в корректную цепочку оценка → проверка → резерв → модель → списание.
ambiguous_finance_chainerror«{node}» ({type}) ведёт больше чем к одной модели — оценка, проверка и резерв относятся к пути ровно одного вызова модели.
cache_write_without_lookupwarningНад «{node}» нет узла поиска в кеше, поэтому он ничего не сохранит.
  • node_type_frozen отклоняет HTTP-запрос, который заморожен, если сервис не настроен иначе. Версия, опубликованная с ним, продолжает работать — HTTP-запрос.

  • misplaced_finance_node, ambiguous_finance_chain и park_inside_finance_chain касаются финансовой цепочки — узлов, которые стоят вокруг вызова AI-модель. Что спрашивает каждая из этих проверок, говорит статья Финансовая цепочка.

  • cache_write_without_lookup — предупреждение: Запись в кеш без Поиск в кеше выше ничего не сохраняет.

Проверки настроек узла

В API запись issues называет такую проверку в params.detail; её code — invalid_node_config.

ПроверкаСообщение в конструкторе
queue_invalid_delayЗадержка «{node}» должна быть целым числом секунд, не меньше 1.
queue_delay_too_longЗадержка «{node}» дольше, чем хранится ожидающее выполнение: не больше {max} секунд.
require_approval_invalid_expires_hoursСрок решения «{node}» должен быть целым числом часов, не меньше 1.
require_approval_expires_too_lateСрок решения «{node}» дольше, чем хранится ожидающее выполнение: не больше {max} ч.
cache_unsupported_scope«{node}» использует несуществующую область кеша.
cache_key_fields_not_listПоля ключа «{node}» должны быть списком путей во входных данных.
cache_key_fields_empty_entryОдно из полей ключа «{node}» пустое.
cache_key_fields_rooted_path«{node}» строит ключ кеша по «{path}», но поля ключа читаются только внутри входных данных: путь там не начинается с «{root}».
cache_key_fields_padded_path«{node}» строит ключ кеша по «{path}», а у пути пробелы по краям: поля ключа читаются ровно так, как написаны.
cache_invalid_ttlВремя жизни «{node}» должно быть целым числом секунд, не меньше 1.
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}» понижает до модели, которую уже использует.
condition_needs_fieldУзлу «{node}» нужно поле для проверки.
condition_field_bad_path«{node}» проверяет «{path}» — это не путь во входные данные, контекст или узлы.
condition_field_unknown_node«{node}» проверяет «{path}», но узла «{ref}» во флоу нет.
condition_field_later_node«{node}» проверяет «{path}», но «{ref}» не выполняется раньше него — его выхода там ещё нет.
condition_unsupported_operator«{node}» использует несуществующий оператор.
condition_needs_valueУзлу «{node}» нужно значение для сравнения.
condition_value_not_numberЗначение узла «{node}» должно быть числом: его оператор ({operator}) сравнивает числа.
condition_value_not_listЗначение узла «{node}» должно быть непустым списком: его оператор проверяет, что поле входит в список.
reject_needs_error_codeУзлу «{node}» нужен код ошибки.
reject_invalid_error_codeКод ошибки «{node}» должен быть длиной от 1 до {max} символов: строчные латинские буквы, цифры, точки и подчёркивания.
reject_invalid_messageСообщение «{node}» должно быть текстом не длиннее {max} символов.
return_unsupported_source«{node}» отвечает из источника, которого не существует.
return_literal_not_object«{node}» отвечает фиксированным значением, и это значение должно быть объектом.
return_needs_node«{node}» отвечает выходом узла и должен назвать другой узел флоу.
return_unknown_node«{node}» отвечает выходом узла «{ref}», но узла «{ref}» во флоу нет.
return_terminal_node«{node}» отвечает выходом узла «{ref}», но «{ref}» сам завершает флоу и никогда не выполняется раньше этого ответа. Назовите узел, который выполняется раньше.
log_unsupported_level«{node}» использует уровень, которого не существует.
log_invalid_messageСообщение «{node}» должно быть текстом не длиннее {max} символов.
transform_needs_fieldУзлу «{node}» нужно хотя бы одно собираемое поле.
transform_too_many_fields«{node}» собирает больше {max} полей.
transform_field_not_objectУ «{node}» есть поле, которое не является объектом.
transform_field_without_nameУ «{node}» есть поле без пригодного названия: сначала латинская буква или подчёркивание, дальше буквы, цифры и подчёркивания, не длиннее 64 символов.
transform_field_both_sourcesУ поля «{field}» узла «{node}» указаны и путь, и фиксированное значение.
transform_field_without_sourceПолю «{field}» узла «{node}» нужен либо путь, либо фиксированное значение.
transform_field_bad_pathПоле «{field}» узла «{node}» читает «{path}» — это не путь во входные данные, контекст или узлы.
transform_field_repeated«{node}» собирает поле «{field}» больше одного раза.
transform_field_unknown_nodeПоле «{field}» узла «{node}» читает «{path}», но узла «{ref}» во флоу нет.
transform_field_later_nodeПоле «{field}» узла «{node}» читает «{path}», но «{ref}» не выполняется раньше него.
budget_check_unsupported_mode«{node}» использует несуществующий режим бюджета.
budget_check_unsupported_window«{node}» использует несуществующее окно бюджета.
budget_check_invalid_default_limitЛимит по умолчанию «{node}» — недопустимая сумма.
budget_check_allocations_not_listАллокации «{node}» должны быть списком.
budget_check_needs_allocationУзлу «{node}» нужна хотя бы одна аллокация или лимит по умолчанию.
budget_check_allocation_not_objectУ «{node}» есть аллокация, которая не является объектом.
budget_check_allocation_without_modelУ «{node}» есть аллокация без выбранной модели.
budget_check_duplicate_model«{node}» выделяет бюджет на {model} дважды.
budget_check_invalid_limitЛимит для {model} на «{node}» — недопустимая сумма.
budget_check_unknown_modelМодели {model} нет в каталоге.
http_needs_urlУзлу «{node}» нужен url.
http_templated_host«{node}» не может подставлять хост через шаблон.
http_egress_not_configured«{node}» не может вызывать наружу: не настроен ни один исходящий хост.
http_host_not_allowedUrl узла «{node}» отсутствует в списке разрешённых (разрешены: {hosts}).
http_scheme_not_https«{node}» должен вызывать https.
http_port_not_allowed«{node}» может вызывать только порт 443.
http_url_has_credentialsUrl узла «{node}» содержит учётные данные.
http_host_is_address_literal«{node}» должен вызывать имя хоста, а не адрес.
http_url_unparseableUrl узла «{node}» невозможно разобрать.
http_url_bad_placeholderВ url узла «{node}» есть подстановка, которая не называет значения во входных данных, контексте или выходе узла, — вызов падал бы при каждом запуске.
http_url_unknown_nodeUrl узла «{node}» читает «{path}», но узла «{ref}» во флоу нет.
http_url_later_nodeUrl узла «{node}» читает «{path}», но «{ref}» не выполняется раньше него.
http_unsupported_method«{node}» использует неподдерживаемый метод.
http_headers_not_mapЗаголовки «{node}» должны быть набором пар «имя — значение».
http_too_many_headers«{node}» задаёт больше {max} заголовков.
http_header_unusable_nameУ «{node}» есть заголовок с недопустимым именем.
http_header_forbidden«{node}» не может задавать «{header}»: граф хранится открытым текстом, поэтому такие данные не останутся секретом.
http_header_needs_valueЗаголовку «{header}» узла «{node}» нужно текстовое значение.
http_invalid_timeout«{node}» может ждать от 1 до {max} секунд.
http_invalid_max_bytes«{node}» может прочитать не больше {max} байт.
http_invalid_body_fromПуть тела запроса «{node}» должен указывать внутрь выполнения.
http_body_from_unknown_nodeТело запроса «{node}» читается из «{path}», но узла «{ref}» во флоу нет.
http_body_from_later_nodeТело запроса «{node}» читается из «{path}», но «{ref}» не выполняется раньше него.

Статья каждого узла перечисляет проверки его собственных настроек в разделе «Ошибки».

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

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