新增: 工具工作流补全(diff_files工具 + 技能清单注入 + 工作流进度共享 + human端到端测试 + 知识库MCP工具)
This commit is contained in:
@@ -151,6 +151,23 @@ pub const GOAL_MAX_CHARS: usize = 500;
|
||||
/// 防无限膨胀:每次发消息提取的目标追加到 pinned_goals vec,超上限时淘汰最早目标。
|
||||
pub const MAX_GOALS: usize = 5;
|
||||
|
||||
/// 技能清单注入开关:system_prompt 是否追加本机技能清单(名称+描述),让 LLM 感知可用技能(默认 true)。
|
||||
///
|
||||
/// 机制化:LLM 只读清单,用户请求命中某技能用途时能引导触发(/技能名),不做复杂执行逻辑。
|
||||
/// 清单来自 skills.rs 进程内缓存(skills/commands/plugins 三类去重)。false(回退)→ 整块跳过,
|
||||
/// system_prompt 零变化,退回改动前行为(单点回退,不影响 augmentation 的 / 联想)。
|
||||
pub const SKILL_LIST_INJECT_ENABLED: bool = true;
|
||||
|
||||
/// 技能清单注入最大条数(默认 20)。
|
||||
///
|
||||
/// 防本机大量技能全量进 system_prompt 占 sys_tokens 预算;取前 N 条(name 去重序),截断描述。
|
||||
pub const SKILL_LIST_MAX_ITEMS: usize = 20;
|
||||
|
||||
/// 技能清单单条描述截断长度(默认 80 字符)。
|
||||
///
|
||||
/// 清单只做提示,截断防长描述(部分技能 description 数百字)撑爆 prompt,截断后接省略号。
|
||||
pub const SKILL_DESC_MAX_CHARS: usize = 80;
|
||||
|
||||
/// G4 目标感知降级:话题标记 insert 当 pinned_goals 存在时跳过(默认 true)。
|
||||
///
|
||||
/// 治 R2(话题标记反向误导):G1 目标钉扎生效后每轮 system_prompt 已含目标,topic marker 的
|
||||
@@ -1044,6 +1061,45 @@ pub(crate) async fn run_agentic_loop(
|
||||
);
|
||||
system_prompt = format!("{}\n\n{}\n\n{}", system_prompt, env_prompt, behavior_prompt);
|
||||
|
||||
// 技能清单注入:把本机扫描到的技能(名称+描述)追加到 system_prompt,让 LLM 感知可用技能。
|
||||
//
|
||||
// 治「AI 不知道有技能可引导」:skills.rs 联想已做(前端 / 浮层),但 AI 本身对技能无感知,
|
||||
// 用户需求命中某技能(如"发布flux")时 AI 不会引导。机制化——只注入清单(不执行技能逻辑,
|
||||
// 执行仍由用户在 Claude Code 侧 / 技能名 触发),LLM 据此提示用户可用技能。
|
||||
// 清单来自 skills_cached() 进程内缓存(懒扫描一次,后续零开销);截断条数+描述防占预算。
|
||||
if SKILL_LIST_INJECT_ENABLED {
|
||||
let skills = crate::commands::ai::skills::skills_cached().await;
|
||||
if !skills.is_empty() {
|
||||
let lines: Vec<String> = skills
|
||||
.iter()
|
||||
.take(SKILL_LIST_MAX_ITEMS)
|
||||
.map(|s| {
|
||||
let desc_flat = s.description.replace('\n', " ");
|
||||
let desc: String = desc_flat.chars().take(SKILL_DESC_MAX_CHARS).collect();
|
||||
let desc = if desc_flat.chars().count() > SKILL_DESC_MAX_CHARS {
|
||||
format!("{}…", desc)
|
||||
} else {
|
||||
desc
|
||||
};
|
||||
format!("- {}: {}", s.name, desc)
|
||||
})
|
||||
.collect();
|
||||
if !lines.is_empty() {
|
||||
system_prompt = format!(
|
||||
"{}\n\n## 可用技能\n以下为本机 Claude 技能/命令(名称: 描述)。用户请求命中某技能用途时,提示用户输入 /技能名 触发,或引导其按需使用:\n{}",
|
||||
system_prompt,
|
||||
lines.join("\n")
|
||||
);
|
||||
tracing::debug!(
|
||||
conv_id = %conv_id,
|
||||
count = lines.len(),
|
||||
"[ai] 技能清单注入:已追加 {} 条技能到 system_prompt",
|
||||
lines.len()
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// T4: 工作流 DAG 注入 — 当会话关联工作流时,将活跃路径注入 system prompt
|
||||
{
|
||||
let session = session_arc.lock().await;
|
||||
|
||||
Reference in New Issue
Block a user