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