后端: - runtime: 拆分 AgentConfig/events/duplicate_detector 为独立模块 - error_recovery: 1499行单体拆为 classification(21种FailoverReason)/overflow/mod - executor: 提取 helpers.rs (PreparedCall/ToolExecutionResult/execute_single_tool) - skills: 新增 SkillCreator + SelfImprovePipeline(模式检测→自动生成SKILL.md→质量审查) - clients/llm: 拆分为 chat/embedding/types 三个子模块 - services/download: 1548行拆为 mod/headers(反爬+SSRF)/strategies(多级回退) - services/batch/asset: 1264行拆为 mod/helpers/process 前端: - 设计系统统一: sky/indigo → blueprint 色系, rounded-xl→lg, shadow-lg→sm - 删除 Vite 模板残留 App.css - GlobalDialog/PaperDetailModal/UncachedPaperModal 提取公共 BaseModal 组件
28 lines
871 B
Rust
28 lines
871 B
Rust
// src/agent/runtime/duplicate_detector.rs
|
|
//
|
|
// 同质调用检测器:检测连续重复的工具调用,防止死循环。
|
|
|
|
/// 同质调用检测器
|
|
#[derive(Debug, Default)]
|
|
pub struct DuplicateDetector {
|
|
last_call: Option<(String, String)>, // (tool_name, arguments)
|
|
consecutive_count: usize,
|
|
}
|
|
|
|
impl DuplicateDetector {
|
|
/// 记录一次调用,返回是否检测到死循环
|
|
pub fn record(&mut self, tool_name: &str, arguments: &str, threshold: usize) -> bool {
|
|
let key = (tool_name.to_string(), arguments.to_string());
|
|
if self.last_call.as_ref() == Some(&key) {
|
|
self.consecutive_count += 1;
|
|
if self.consecutive_count >= threshold {
|
|
return true;
|
|
}
|
|
} else {
|
|
self.last_call = Some(key);
|
|
self.consecutive_count = 1;
|
|
}
|
|
false
|
|
}
|
|
}
|