Skip to content

Comments

fix(graph): subagent overallState history#4306

Open
mengnankkkk wants to merge 2 commits intoalibaba:mainfrom
mengnankkkk:hotfix/fix_history
Open

fix(graph): subagent overallState history#4306
mengnankkkk wants to merge 2 commits intoalibaba:mainfrom
mengnankkkk:hotfix/fix_history

Conversation

@mengnankkkk
Copy link
Collaborator

Describe what this PR does / why we need it

因为子图和主图共享的是一个overallState 所以,子图返回的是完整的状态,这部分父图已经有了!所以应该是增量添加,不是全量添加,这样就解决了对应的重复问题了

Does this pull request fix one issue?

Close #4305

Describe how you did it

Describe how to verify it

Special notes for reviews

@github-actions github-actions bot added the area/graph SAA Grpah module label Feb 14, 2026
@mengnankkkk mengnankkkk changed the title fix: subagent overallState history fix(graph): subagent overallState history Feb 17, 2026
@chrisis58
Copy link

chrisis58 commented Feb 17, 2026

@mengnankkkk 按照当前的实现方式,是不是另外添加一个接口:

public interface DeltaAwareKeyStrategy extends KeyStrategy {

    Object computeDelta(Object currentValue, Object newValue);
}

然后再在 NodeExecutor 中判断 instanceof 更合适?这样子可以把逻辑分到具体的 strategy 中实现,也便于后续扩展。

@chrisis58
Copy link

另外还有一个问题,如 文档 | 使用编译的子图作为并行节点 所示:

StateGraph workflow = new StateGraph(keyStrategyFactory)
      .addNode("A", makeNode("A"))
      .addNode("A1", node_async(state -> subgraphA1.invoke(state.data()).orElseThrow().data()))
      .addNode("A2", makeNode("A2"))
      // 通过以下方式并行的子图无法处理 delta 的情况
      .addNode("A3", node_async(state -> subgraphA3.invoke(state.data()).orElseThrow().data()))
      .addNode("B", makeNode("B"))
      .addEdge("A", "A1")
      .addEdge("A", "A2")
      .addEdge("A", "A3")
      .addEdge("A1", "B")
      .addEdge("A2", "B")
      .addEdge("A3", "B")
      .addEdge(START, "A")
      .addEdge("B", END);

通过适配器模式进行子图的并行运行时,当前的处理方法可能无法覆盖这种情况。

@chrisis58
Copy link

注意到问题的根本原因是子图的返回是全量数据,而非增量数据。

所以,是不是可以转变一下思路,不从最终的结果反推 delta,而是一开始就在 OverallState 中记录 delta 呢?

  1. 在 OverallState 内部新增一个暂存区 deltaData,与现有的全量 data 容器并存。
  2. 每次节点产生 partialState 并调用 updateState 时,不仅基于对应的 KeyStrategy 更新 data,同时使用完全一样的 KeyStrategy 逻辑同步更新 deltaData。
  3. 暴露一个获取并清空当前增量的 API(如新增 consumeDelta)。
  4. 将数据获取的粒度交给下游:下游可以自行决定是读取全量的 data,还是精准截取本次生命周期的增量 delta。

如果大家认为“内建 Delta 视图”的方案可行,我很乐意分担这部分的开发工作。不管是作为当前 PR 的补充提交,还是等这个 PR 合并后,我再拉一个独立的重构 PR 都可以。

期待各位的专业意见!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/graph SAA Grpah module

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG] data duplication when using APPEND strategy in nested subgraphs

2 participants