SubAgentTool.forwardEvent 方法实现疑问
问题描述
在 SubAgentTool.forwardEvent 方法中,Event 对象包含 Msg,Msg 的 content 是 List<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());
}
}
疑问点
-
为什么要将 Event 序列化成 JSON 字符串?
- Event 包含 Msg 对象
- Msg 的
content 是 List<ContentBlock>,有多种类型
- 序列化后再作为 TextBlock 的 text,丢失了原始的类型信息
-
为什么不直接传递 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());
}
}
SubAgentTool.forwardEvent 方法实现疑问
问题描述
在
SubAgentTool.forwardEvent方法中,Event 对象包含 Msg,Msg 的content是List<ContentBlock>,包含多种类型(TextBlock、ThinkingBlock、ToolUseContentBlock、ToolResultContentBlock 等)。当前实现将 Event 序列化成 JSON 字符串,然后作为 TextBlock 的 text 传递,这样会导致 ContentBlock 的类型信息丢失。
问题代码
疑问点
为什么要将 Event 序列化成 JSON 字符串?
content是List<ContentBlock>,有多种类型为什么不直接传递 Msg 的 content 列表?
建议方案
直接传递 Msg 的 content 列表,将 Event 类型信息放到 metadata: