Skip to content

[Bug]: com.openjiuwen.harness.DeepAgent.stream() 仅返回占位 chunk 且忽略 session #107

Description

@openjiuwen-collaboration-bot

Checklist

  • 我已经搜索过相关问题,但没有得到预期的帮助。
  • 最新版本中该错误尚未修复。
  • 请注意,如果您提交的Bug描述缺少相应的环境信息和最小可复现的demo,我们将很难复现和解决该问题,从而降低收到反馈的可能性,甚至该问题将被关闭。

🐞 问题详细描述

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}

可以看到:

  1. 已绑定的 reactAgent 没有被调用。
  2. 返回结果只有输入参数和 final=true
  3. 没有任何真实的 Agent 输出。

本复现过程没有抛出异常,因此没有异常堆栈。问题表现为“返回成功形式的占位结果”,而不是显式报错。

Expected Result

期望 DeepAgent.stream()

  1. 调用已经绑定并初始化的 reactAgent
  2. 将 inputs 和 AgentSessionApi 传递给实际执行链路。
  3. 输出真实的模型增量、Tool 调用、Tool 结果和最终回复。
  4. 在发生 HITL 时输出中断事件,并支持通过同一 session 恢复。
  5. 仅在实际执行结束后输出最终结束事件。
  6. 不应在未执行 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,且包含:

final=true

或者:

type=deep_agent_chunk

相关测试:

src/test/java/com/openjiuwen/harness/DeepAgentPythonParityTest.java:134-163

这些断言可以被占位实现满足,但不能证明真实的模型、Tool 或中断流式执行已经可用。

建议补充以下测试:

  1. 已绑定的 ReactAgent 确实被调用。
  2. session 能够传递并写回状态。
  3. 模型增量按顺序输出。
  4. Tool 调用和 Tool 结果按顺序输出。
  5. ask_user 中断和恢复可用。
  6. RunnerStreaming 可以运行 DeepAgent。
  7. 最终 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

其他辅助信息

感谢您的贡献 🎉!

版本信息

感谢您的贡献 🎉!

感谢您的贡献 🎉!

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions