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

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

View File

@ -1097,15 +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 assistant_message = ChatMessage::assistant(format!( // 从工具输出中提取有意义的终端内容
"{}\n\n当前等待中的工具: {}", // 跳过标记行、session_id 元数据、空行、以及提示行(取提示行之后的实际内容)
pending_result let content: String = pending_result
.output .output
.lines() .lines()
.next() .map(|l| l.trim())
.filter(|line| !line.trim().is_empty()) .filter(|line| {
.unwrap_or(DEFAULT_PENDING_ASSISTANT_MESSAGE), !line.is_empty()
tool_call.name, && !line.starts_with("__PICOBOT_")
&& !line.starts_with("[session_id:")
})
.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!(
"{}\n\n当前等待中的工具: {}",
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;