Коды проверки графа
Кнопка Проверить в редакторе прогоняет граф через тот же валидатор, что стоит перед запуском и перед публикацией. Каждая находка приходит с кодом — по нему и стоит искать.
Строгость зависит от того, что вы делаете
Одно и то же правило может быть советом в редакторе и отказом на публикации. Черновику позволено быть недоделанным: вы ещё дорисовываете граф, и жаловаться на каждый неподключённый порт бессмысленно. Но граф, который вот-вот уйдёт в прод, обязан быть исполнимым, поэтому у части правил на этом рубеже строгость поднимается.
В таблице такие коды помечены «зависит». Увидели предупреждение с таким кодом — считайте его ошибкой: на деплое оно ею и станет.
Полный список
| Код | Строгость | Что означает |
|---|---|---|
array.input_shape | предупреждение | На вход цикла приходит не массив. |
composite.in_count | ошибка | Неверное число входных границ у композита. |
composite.no_subgraph | ошибка | У композитной ноды пустое тело. |
composite.out_count | ошибка | Неверное число выходных границ у композита. |
config.unknown_field | предупреждение | В конфигурации есть поле, которого нет в схеме ноды. |
exec.exit_no_exec_trigger | ошибка | Ноду выхода нечем запустить. |
exec.multi_exit_race | зависит | Несколько выходов могут сработать в одном запуске и перетереть результат друг друга. |
exec.no_execution_edges | зависит | В графе нет ни одного ребра исполнения — запускать нечего. |
graph.barrier_unsatisfiable | ошибка | Барьер ждёт ветку, которая идёт из него же. |
graph.cycle | ошибка | Цикл по рёбрам исполнения — планировщик такой граф не запустит. |
graph.multiple_entry | ошибка | В графе больше одной ноды входа — вторая дублирует ту же работу. |
graph.no_entry | предупреждение | В графе нет ноды входа. |
graph.no_exit | предупреждение | В графе нет ноды выхода. |
llm.no_link | ошибка | Нода ждёт модель, но связь link_llm не подключена. |
llm.parent_chain | ошибка | Суб-агент берёт модель у родителя, но цепочка родителей не собирается. |
node.config_invalid | зависит | Конфигурация ноды не проходит её собственную проверку. |
node.not_activated | предупреждение | Ноду ничто не активирует — она никогда не выполнится. |
port_type.mismatch | предупреждение | Типы данных портов расходятся; значение будет приведено или потеряно. |
ref.undefined_var | предупреждение | Шаблон ссылается на необъявленную переменную. |
ref.unknown_node | предупреждение | Шаблон ссылается на ноду, которой нет в графе. |
struct.bad_node_id | ошибка | Недопустимый id ноды. |
struct.duplicate_edge_id | ошибка | Два ребра с одним id. |
struct.duplicate_node_id | ошибка | Две ноды с одним id. |
struct.edge_bad_channel | ошибка | Недопустимый канал ребра (exec/data). |
struct.edge_dangling_source | ошибка | Ребро выходит из несуществующей ноды. |
struct.edge_dangling_target | ошибка | Ребро входит в несуществующую ноду. |
struct.edge_missing_type | ошибка | У ребра не указан тип провода. |
struct.edge_unknown_type | ошибка | Неизвестный тип провода у ребра. |
struct.missing_node_id | ошибка | У ноды нет id. |
struct.schema_version | ошибка | Неподдерживаемая версия схемы графа. |
subgraph.missing_entry_edge | ошибка | Внутри подграфа нет ребра от входной границы. |
subgraph.missing_exit_edge | ошибка | Внутри подграфа нет ребра к выходной границе. |
subgraph.nested_iteration_shell | ошибка | Цикл вложен в цикл там, где это не поддерживается. |
var.duplicate_name | ошибка | Две переменные с одинаковым именем. |
wire.andjoin_partial_payload | предупреждение | Во взаимоисключающие ветви входит один порт: дойдёт значение только одной. |
wire.annotation_edge | предупреждение | Ребро упирается в заметку: у неё нет портов, ребро ничего не несёт и снимается до запуска. |
wire.concurrent_stream_merge | предупреждение | Два параллельных потока пишут в один ответ и перемешаются. |
wire.fanin_ambiguous | ошибка | В один порт приходит несколько значений, и порядок не определён. |
wire.fanin_needs_barrier | ошибка | Ветви могут сработать в одном запуске и подраться за порт — нужен wait_all. |
wire.handle_name_split_suffix | предупреждение | Имя порта заканчивается на _exec/_data и путается с разделёнными портами. |
wire.on_error_disabled | ошибка | Ветка ошибки нарисована, но выход ошибки у ноды выключен. |
wire.on_error_not_exposed | ошибка | У ноды нет выхода ошибки — включите expose_error_output. |
wire.on_error_payload_type_mismatch | предупреждение | Ветка ошибки ждёт данные не того типа. |
wire.port_incompatible | ошибка | Порты несовместимы по типу провода. |
wire.port_not_accepted | ошибка | Целевой порт не принимает такой тип данных. |
wire.required_port_not_wired | зависит | Обязательный порт ни к чему не подключён. |
wire.resource_no_source | зависит | Нода не знает, откуда брать ресурс (базу знаний, подключение): нет ни порта, ни поля. |
wire.source_handle_missing | ошибка | Ребро выходит из порта, которого у ноды нет. |
wire.stream_swallowed_by_barrier | предупреждение | Поток токенов упирается в барьер и до чата не доходит. |
wire.streaming_fanout | ошибка | Поток токенов разветвлён на несколько приёмников. |
wire.target_handle_missing | ошибка | Ребро приходит на порт, которого у ноды нет при текущей конфигурации. |
Что дальше
- Порядок исполнения — почему «нода не активирована» вообще возможна.
- Границы графа — про
graph.multiple_entryиexec.multi_exit_race. - Провода — про совместимость портов и коды
wire.*.