fix(agent): 优化等待工具输出内容的提取逻辑

- 跳过标记行、session_id元数据和空行
- 跳过提示行,提取提示行之后的实际内容
- 限制提取内容最多20行,防止消息过长
- 当提取内容为空时,使用默认提示消息
- 改善助手消息的显示内容格式
This commit is contained in:
ooodc 2026-06-13 14:12:09 +08:00
parent c5f4209d33
commit 4598370fd2

View File

@ -1097,20 +1097,29 @@ impl AgentLoop {
.zip(tool_results.iter()) .zip(tool_results.iter())
.find(|(_, result)| result.state == ToolExecutionState::PendingUserAction) .find(|(_, result)| result.state == ToolExecutionState::PendingUserAction)
{ {
// 从工具输出中提取有意义的内容,跳过内部标记和元数据行 // 从工具输出中提取有意义的终端内容
let content_line = pending_result // 跳过标记行、session_id 元数据、空行、以及提示行(取提示行之后的实际内容)
let content: String = pending_result
.output .output
.lines() .lines()
.map(|l| l.trim()) .map(|l| l.trim())
.find(|line| { .filter(|line| {
!line.is_empty() !line.is_empty()
&& !line.starts_with("__PICOBOT_") && !line.starts_with("__PICOBOT_")
&& !line.starts_with("[session_id:") && !line.starts_with("[session_id:")
}) })
.unwrap_or(DEFAULT_PENDING_ASSISTANT_MESSAGE); .skip(1) // 跳过第一行(提示行,如"进程正在等待输入..."
.take(20) // 最多取 20 行避免过长
.collect::<Vec<_>>()
.join("\n");
let display_content = if content.is_empty() {
DEFAULT_PENDING_ASSISTANT_MESSAGE
} else {
&content
};
let assistant_message = ChatMessage::assistant(format!( let assistant_message = ChatMessage::assistant(format!(
"{}\n\n当前等待中的工具: {}", "{}\n\n当前等待中的工具: {}",
content_line, tool_call.name, display_content, tool_call.name,
)); ));
emitted_messages.push(assistant_message.clone()); emitted_messages.push(assistant_message.clone());
self.emit_live_tool_call_message(assistant_message.clone()).await; self.emit_live_tool_call_message(assistant_message.clone()).await;