Skip to content

[Feature]: SubAgentTool.forwardEvent 方法实现疑问 #980

@QianzhenSun

Description

@QianzhenSun

SubAgentTool.forwardEvent 方法实现疑问

问题描述

SubAgentTool.forwardEvent 方法中,Event 对象包含 Msg,Msg 的 contentList<ContentBlock>,包含多种类型(TextBlock、ThinkingBlock、ToolUseContentBlock、ToolResultContentBlock 等)。

当前实现将 Event 序列化成 JSON 字符串,然后作为 TextBlock 的 text 传递,这样会导致 ContentBlock 的类型信息丢失。

问题代码

private void forwardEvent(Event event, ToolEmitter emitter, Agent agent, String sessionId) {
    try {
        String json = JsonUtils.getJsonCodec().toJson(event);  // ← 将整个 Event 序列化成 JSON
        Map<String, Object> metadata = new HashMap<>();
        metadata.put("subagent_event", event == null ? "" : event);
        metadata.put("subagent_name", agent.getName() == null ? "" : agent.getName());
        metadata.put("subagent_id", agent.getAgentId() == null ? "" : agent.getAgentId());
        metadata.put("subagent_session_id", sessionId == null ? "" : sessionId);
        emitter.emit(
                new ToolResultBlock(
                        null, null,
                        CollectionUtils.listOf(TextBlock.builder().text(json).build()),  // ← 将 JSON 字符串作为 TextBlock 的 text
                        metadata));
    } catch (Exception e) {
        logger.warn("Failed to serialize event to JSON: {}", e.getMessage());
    }
}

疑问点

  1. 为什么要将 Event 序列化成 JSON 字符串?

    • Event 包含 Msg 对象
    • Msg 的 contentList<ContentBlock>,有多种类型
    • 序列化后再作为 TextBlock 的 text,丢失了原始的类型信息
  2. 为什么不直接传递 Msg 的 content 列表?

    • 保留 ContentBlock 的类型信息
    • 便于后续的转换逻辑正确处理不同类型

建议方案

直接传递 Msg 的 content 列表,将 Event 类型信息放到 metadata:

private void forwardEvent(Event event, ToolEmitter emitter, Agent agent, String sessionId) {
    try {
        AgentMsg msg = event.getMessage();

        Map<String, Object> metadata = new HashMap<>();
        metadata.put("subagent_name", agent.getName() == null ? "" : agent.getName());
        metadata.put("subagent_id", agent.getAgentId() == null ? "" : agent.getAgentId());
        metadata.put("subagent_session_id", sessionId == null ? "" : sessionId);
        // 将 Event 类型信息放到 metadata
        metadata.put("subagent_event_type", event.getType().name());
        metadata.put("subagent_event_last", event.isLast());

        // 直接传递 Msg 的 content 列表,保留类型信息
        List<ContentBlock> outputBlocks = msg != null ? msg.getContent() : CollectionUtils.listOf();

        emitter.emit(new ToolResultBlock(null, null, outputBlocks, metadata));
    } catch (Exception e) {
        logger.warn("Failed to forward event: {}", e.getMessage());
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    Status

    Backlog

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions