Коды проверки графа

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

Строгость зависит от того, что вы делаете

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

В таблице такие коды помечены «зависит». Увидели предупреждение с таким кодом — считайте его ошибкой: на деплое оно ею и станет.

Полный список

КодСтрогостьЧто означает
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.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ошибкаРебро приходит на порт, которого у ноды нет при текущей конфигурации.

Что дальше