Checklist
🐞 问题详细描述
com.openjiuwen.harness.DeepAgent 已经提供公开的 stream() 方法,但当前实现不会执行已绑定的 reactAgent,只会立即返回一个带有 final=true 的占位 chunk。
带 AgentSessionApi 参数的重载同样直接委托给无 session 的方法,导致传入的 session 被完全忽略。
相关代码:
src/main/java/com/openjiuwen/harness/DeepAgent.java:463-473
当前实现:
public Iterator<Map<String, Object>> stream(Map<String, Object> inputs) {
Map<String, Object> chunk = new LinkedHashMap<>();
chunk.put("type", "deep_agent_chunk");
chunk.put("input", normalizeInputs(inputs));
chunk.put("final", true);
return List.of(chunk).iterator();
}
public Iterator<Map<String, Object>> stream(
Map<String, Object> inputs,
AgentSessionApi session) {
return stream(inputs);
}
这会使调用方收到一个看似执行成功的结束事件,但实际上没有发生以下行为:
- 没有执行模型推理。
- 没有调用底层
reactAgent。
- 没有模型文本增量。
- 没有 Tool 调用和 Tool 结果事件。
- 没有 Todo 或任务进度事件。
- 没有
ask_user 等 HITL 中断事件。
- 没有读取或写回传入的 session。
Minimal Reproducible Demo
以下代码只依赖当前仓库代码,不需要访问模型服务或其他外部组件:
import com.openjiuwen.core.singleagent.schema.AgentCard;
import com.openjiuwen.harness.DeepAgent;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class DeepAgentStreamRepro {
private static boolean reactStreamCalled;
public static void main(String[] args) {
DeepAgent agent = new DeepAgent(
new AgentCard(
"test-agent",
"test-agent",
"DeepAgent stream reproduction"
)
);
agent.setReactAgent(new FakeReactAgent(), true);
Iterator<Map<String, Object>> chunks =
agent.stream(Map.of("query", "hello"));
System.out.println("reactStreamCalled=" + reactStreamCalled);
chunks.forEachRemaining(System.out::println);
}
public static class FakeReactAgent {
public Iterator<Map<String, Object>> stream(
Map<String, Object> inputs) {
reactStreamCalled = true;
return List.of(
Map.of(
"type", "model_output",
"content", "hello"
)
).iterator();
}
}
}
Actual Result
reactStreamCalled=false
{type=deep_agent_chunk, input={query=hello}, final=true}
可以看到:
- 已绑定的
reactAgent 没有被调用。
- 返回结果只有输入参数和
final=true。
- 没有任何真实的 Agent 输出。
本复现过程没有抛出异常,因此没有异常堆栈。问题表现为“返回成功形式的占位结果”,而不是显式报错。
Expected Result
期望 DeepAgent.stream():
- 调用已经绑定并初始化的
reactAgent。
- 将 inputs 和
AgentSessionApi 传递给实际执行链路。
- 输出真实的模型增量、Tool 调用、Tool 结果和最终回复。
- 在发生 HITL 时输出中断事件,并支持通过同一 session 恢复。
- 仅在实际执行结束后输出最终结束事件。
- 不应在未执行 Agent 的情况下直接返回
final=true。
Related Runner Streaming Inconsistency
该问题还会影响通过 Runner 使用 DeepAgent 的场景。
非流式 Runner.runAgent() 已支持 duck-typed Agent:
src/main/java/com/openjiuwen/core/runner/Runner.java:492-498
但 Runner.runAgentStreaming() 当前只处理:
RemoteAgent
BaseAgent
- legacy
BaseAgent
相关代码:
src/main/java/com/openjiuwen/core/runner/Runner.java:503-528
流式分支没有与非流式入口对应的 duck-typed Agent 处理逻辑。
当前 CLI 的 LocalBackend 已通过以下入口调用新版 DeepAgent:
Runner.runAgentStreaming(agent, Map.of("query", query), ...);
相关代码:
src/main/java/com/openjiuwen/harness/cli/agent/LocalBackend.java:53-60
建议同时确认:
DeepAgent.stream() 应如何调用底层 reactAgent。
- RunnerStreaming 是否需要补充 duck-typed Agent 流式分支。
- 或者 DeepAgent 是否应实现 Runner 可直接识别的统一 Agent 接口。
Test Coverage Observation
当前测试主要断言流式入口返回单个 chunk,且包含:
或者:
相关测试:
src/test/java/com/openjiuwen/harness/DeepAgentPythonParityTest.java:134-163
这些断言可以被占位实现满足,但不能证明真实的模型、Tool 或中断流式执行已经可用。
建议补充以下测试:
- 已绑定的 ReactAgent 确实被调用。
- session 能够传递并写回状态。
- 模型增量按顺序输出。
- Tool 调用和 Tool 结果按顺序输出。
ask_user 中断和恢复可用。
- RunnerStreaming 可以运行 DeepAgent。
- 最终 chunk 在真实执行结束后产生。
详细的环境信息描述
- Repository:
openJiuwen/agent-core-java
- Branch:
develop
- Commit:
406188a1b4214a01a58ad5952e58293d57882d23
- Project version:
0.1.14
- OS: macOS 26.3.1
- Architecture: Apple Silicon / aarch64
- JDK: Eclipse Temurin OpenJDK 17.0.19
- Maven: Apache Maven 3.9.16
- Default locale:
zh_CN_#Hans
- Platform encoding: UTF-8
其他辅助信息
感谢您的贡献 🎉!
版本信息
感谢您的贡献 🎉!
感谢您的贡献 🎉!
Checklist
🐞 问题详细描述
com.openjiuwen.harness.DeepAgent已经提供公开的stream()方法,但当前实现不会执行已绑定的reactAgent,只会立即返回一个带有final=true的占位 chunk。带
AgentSessionApi参数的重载同样直接委托给无 session 的方法,导致传入的 session 被完全忽略。相关代码:
当前实现:
这会使调用方收到一个看似执行成功的结束事件,但实际上没有发生以下行为:
reactAgent。ask_user等 HITL 中断事件。Minimal Reproducible Demo
以下代码只依赖当前仓库代码,不需要访问模型服务或其他外部组件:
Actual Result
可以看到:
reactAgent没有被调用。final=true。本复现过程没有抛出异常,因此没有异常堆栈。问题表现为“返回成功形式的占位结果”,而不是显式报错。
Expected Result
期望
DeepAgent.stream():reactAgent。AgentSessionApi传递给实际执行链路。final=true。Related Runner Streaming Inconsistency
该问题还会影响通过 Runner 使用 DeepAgent 的场景。
非流式
Runner.runAgent()已支持 duck-typed Agent:但
Runner.runAgentStreaming()当前只处理:RemoteAgentBaseAgentBaseAgent相关代码:
流式分支没有与非流式入口对应的 duck-typed Agent 处理逻辑。
当前 CLI 的
LocalBackend已通过以下入口调用新版 DeepAgent:相关代码:
建议同时确认:
DeepAgent.stream()应如何调用底层reactAgent。Test Coverage Observation
当前测试主要断言流式入口返回单个 chunk,且包含:
或者:
相关测试:
这些断言可以被占位实现满足,但不能证明真实的模型、Tool 或中断流式执行已经可用。
建议补充以下测试:
ask_user中断和恢复可用。详细的环境信息描述
openJiuwen/agent-core-javadevelop406188a1b4214a01a58ad5952e58293d57882d230.1.14zh_CN_#Hans其他辅助信息
感谢您的贡献 🎉!
版本信息
感谢您的贡献 🎉!
感谢您的贡献 🎉!