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

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

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

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

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

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

КодСтрогостьЧто означает
array.input_shapeпредупреждениеНа вход цикла приходит не массив.
code.template_namespaceзависитВ коде ноды используется имя из шаблонов ({{ }}), которого в песочнице нет.
composite.in_countошибкаНеверное число входных границ у композита.
composite.no_subgraphошибкаУ композитной ноды пустое тело.
composite.out_countошибкаНеверное число выходных границ у композита.
config.key_is_portзависитКлюч конфигурации называет порт ноды, а не поле: значение будет отброшено.
config.placeholder_valueзависитВ поле оставлена заглушка вместо значения.
config.unknown_fieldзависитВ конфигурации есть поле, которого нет в схеме ноды.
exec.exit_no_exec_triggerошибкаНоду выхода нечем запустить.
exec.multi_exit_raceзависитНесколько выходов могут сработать в одном запуске и перетереть результат друг друга.
exec.no_execution_edgesзависитВ графе нет ни одного ребра исполнения — запускать нечего.
graph.barrier_unsatisfiableошибкаБарьер ждёт ветку, которая идёт из него же.
graph.cycleошибкаЦикл по рёбрам исполнения — планировщик такой граф не запустит.
graph.emptyошибкаВ сценарии нет ни одной ноды — запускать и публиковать нечего.
graph.multiple_entryошибкаВ графе больше одной ноды входа — вторая дублирует ту же работу.
graph.no_entryпредупреждениеВ графе нет ноды входа.
graph.no_exitпредупреждениеВ графе нет ноды выхода.
llm.parent_chainошибкаСуб-агент берёт модель у родителя, но цепочка родителей не собирается.
loop.escapes_bodyпредупреждениеНода вне тела цикла получает связь изнутри: активировать её этим ребром нельзя, и она будет пропущена.
loop.iterations_above_planпредупреждениеЧисло проходов больше, чем разрешает тариф: лишние будут отброшены молча.
node.config_invalidзависитКонфигурация ноды не проходит её собственную проверку.
node.not_activatedпредупреждениеНоду ничто не активирует — она никогда не выполнится.
port_type.mismatchпредупреждениеТипы данных портов расходятся; значение будет приведено или потеряно.
ref.trigger_context_off_messageзависитШаблон читает контекст триггера с порта сообщения: там его нет.
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ошибкаРебро приходит на порт, которого у ноды нет при текущей конфигурации.
wire.unordered_data_sourceзависитНода читает выход другой ноды, который к этому моменту ничем не гарантирован: значение придёт пустым — в гонке иногда, а если источник не запускается или запускается позже — всегда.

Что дальше