mirror of
https://github.com/ThearchyHelios/AgentLab.git
synced 2026-11-15 02:41:58 +00:00
66cc96b463
多条边汇入同一个节点时,编译器对每条入边各 add_edge 一次。LangGraph 对这种 接法的语义是"任一上游跑完就触发一次":两条支路一样长时,两次触发落在同一步 被合并,看不出问题;一长一短时,汇合节点先拿短支路的结果跑一次,长支路到了 再跑一次——模型调用、工具副作用、下游全部翻倍。循环体里更糟:每轮汇合两次, 循环节点就多推进一格,done 出口在循环跑到一半时就放行了,成果节点跑了 3 次。 README 写的"自动等待汇聚"只在支路等长时成立。 修法是给汇合节点加 defer(等图里其余待执行的任务都跑完再跑一次),而不是 屏障 add_edge([a, b], j):分支之后的二选一汇合,没走的那条永远不会到,屏障 会一直等,而 LangGraph 没有可执行任务时会安静结束——汇合节点和下游就被无声 跳过。代价写在 _join_nodes 的注释和 README 里:它也会等图里无关、恰好在跑的支路。 汇合 = 两个以上前向上游,循环回边不算。回边识别因此从 layout.py 挪到 schema.back_edges,加了 roots 参数:执行语义要从入口起 DFS,否则循环体里的 前向边可能被误判成回边;排版照旧按节点顺序起算,行为不变(check-canvas-layout 全过)。 新增 test_fan_in.py 5 例:长短支路、循环体内汇合(修前分别跑了 2 次和 4 次); 二选一汇合、被分支剪掉一路的汇合(守着别把修法做成屏障);回边不算汇合。 292 → 297 passed。内置模板里 ③④ 的成果节点是二选一汇合,行为不变。