Что проверяется перед публикацией флоу
Проверки графа и настроек каждого узла, какие из них останавливают публикацию и какое сообщение конструктор показывает для каждой.
Проверить и Опубликовать проверяют черновик флоу, прежде чем он сможет выполняться. Каждая найденная проблема привязана к узлу или ко всему графу, и конструктор показывает её на узле и в начале панели узла. Эта страница перечисляет все проверки с сообщением, которое для каждой показывает конструктор.
Два вида проверок
Проверка графа касается формы флоу: один входной узел, подключённые порты, отсутствие циклов, модели и пулы, которые называет узел. У каждой свой код.
Проверка настроек узла касается конфигурации одного узла: слишком длинная задержка, путь, который ничего не читает. Все они приходят под одним кодом графа,
invalid_node_config, и говорят, какая проверка не прошла.
Что останавливает публикацию
Проблема — это error или warning. Ошибка останавливает публикацию: ничего не публикуется, пока её не исправят. Предупреждение — нет: оно говорит, что флоу будет работать не так, как вы, может быть, ждёте, — узел модели без ветки ошибки, пул без подключения, которое может обслужить модель.
В API тот же список — error.details.issues публикации, отклонённой с 422 и кодом flow_invalid, — Публикация, версии и откат. Откат заново проверяет только модели и пулы версии.
Проверки графа
В API запись issues несёт такой код в code, а severity говорит, мешает ли он публикации: error мешает, warning — нет.
| Код | Уровень | Сообщение в конструкторе |
|---|---|---|
invalid_graph_shape | error | В графе значение неверного типа по пути {path}: там ожидается {expected}. |
duplicate_node_key | error | Ключ «{node}» используется больше чем одним узлом. |
invalid_node_key | error | Ключ «{node}» должен быть длиной от 1 до {max} символов: строчные латинские буквы, цифры, подчёркивания и дефисы. |
unknown_node_type | error | У «{node}» неизвестный тип ({type}). |
node_type_not_supported | error | Тип {type} узла «{node}» пока нельзя опубликовать. |
node_type_frozen | error | Тип {type} узла «{node}» заморожен: флоу, опубликованные с ним, продолжают работать, но новая версия не может его содержать. Удалите узел, чтобы опубликовать. |
no_entry_node | error | Во флоу нет входного узла, с которого он начинается. |
multiple_entry_nodes | error | Входной узел может быть только один — «{node}» один из нескольких. |
unknown_edge_source | error | Связь начинается в «{node}», которого не существует. |
unknown_edge_target | error | Связь из «{node}» указывает на «{target}», которого не существует. |
unknown_port | error | У «{node}» нет ветки «{port}». |
duplicate_port_edge | error | У ветки «{port}» узла «{node}» больше одной связи. |
port_not_connected | error | Ветка «{port}» узла «{node}» никуда не ведёт. |
error_port_not_connected | warning | У «{node}» нет ветки ошибки — ошибка провайдера завалит всю операцию. |
deny_port_not_connected | warning | У «{node}» нет ветки отказа — отказ вернётся вызывающему как 402 или 403, а не пойдёт по ветке. |
cycle_detected | error | Связь возвращается обратно в «{node}» — флоу должен идти вперёд. |
unreachable_node | warning | До «{node}» нельзя дойти от входного узла. |
path_without_terminal | error | Путь через «{node}» заканчивается без ответа и без отказа. |
invalid_node_config | error | «{node}» настроен неверно. |
unknown_model | error | Модели {model} узла «{node}» нет в каталоге. |
unknown_pool | error | Пул узла «{node}» не существует. |
pool_provider_mismatch | error | Пул узла «{node}» обслуживает {serves}, а модели нужен {needs}. |
pool_without_connections | warning | В пуле узла «{node}» нет ни одного включённого подключения. |
pool_cannot_serve_model | warning | Ни одно включённое подключение в пуле узла «{node}» не может обслужить {model} — каждый вызов завершится ошибкой, пока такое не появится. |
pool_disabled | warning | Пул узла «{node}» выключен — каждый вызов завершится ошибкой, пока его не включат. |
park_inside_finance_chain | error | «{node}» резервирует бюджет, но ждёт до вызова модели — ожидающий запуск не держит резерв. |
misplaced_finance_node | error | «{node}» ({type}) не входит в корректную цепочку оценка → проверка → резерв → модель → списание. |
ambiguous_finance_chain | error | «{node}» ({type}) ведёт больше чем к одной модели — оценка, проверка и резерв относятся к пути ровно одного вызова модели. |
cache_write_without_lookup | warning | Над «{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_allowed | Url узла «{node}» отсутствует в списке разрешённых (разрешены: {hosts}). |
http_scheme_not_https | «{node}» должен вызывать https. |
http_port_not_allowed | «{node}» может вызывать только порт 443. |
http_url_has_credentials | Url узла «{node}» содержит учётные данные. |
http_host_is_address_literal | «{node}» должен вызывать имя хоста, а не адрес. |
http_url_unparseable | Url узла «{node}» невозможно разобрать. |
http_url_bad_placeholder | В url узла «{node}» есть подстановка, которая не называет значения во входных данных, контексте или выходе узла, — вызов падал бы при каждом запуске. |
http_url_unknown_node | Url узла «{node}» читает «{path}», но узла «{ref}» во флоу нет. |
http_url_later_node | Url узла «{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