修复: namespace 占位符发 LLM 前未展开 + key 含斜杠丢原文
This commit is contained in:
@@ -102,7 +102,7 @@ pub(super) async fn maybe_auto_compress(
|
||||
let _ = app_handle.emit("ai-chat-event", ev.clone());
|
||||
// L3 emit 双写:tunnel subscriber透传 miniapp
|
||||
let _ = app_handle.state::<AppState>().ai_event_bus.publish_event(ev);
|
||||
let (active_msgs, lang) = {
|
||||
let (mut active_msgs, lang) = {
|
||||
let mut session = session_arc.lock().await;
|
||||
let conv = session.conv(&conv_id);
|
||||
conv.messages.set_compressing(true);
|
||||
@@ -118,6 +118,22 @@ pub(super) async fn maybe_auto_compress(
|
||||
(active_msgs, lang)
|
||||
};
|
||||
|
||||
// T2-修复(方案A):展开 namespace 引用为真实内容,再喂压缩 LLM/关键词摘要。
|
||||
// 同 agentic/mod.rs 的 build_for_request 出口展开。未展开则压缩 LLM 只看到
|
||||
// "namespace://..." 占位符,摘要基于占位符丢主题。read_only None(重启后 namespace
|
||||
// 清空/残留引用)→ 保留占位符降级,非崩溃。
|
||||
{
|
||||
let session = session_arc.lock().await;
|
||||
for m in &mut active_msgs {
|
||||
if df_ai::namespace_store::is_namespace_ref(&m.content) {
|
||||
let path = m.content.clone();
|
||||
if let Some(original) = session.namespace_store.read_only(&path) {
|
||||
m.content = original.to_string();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 改进3 B:在 active_msgs move 进 compress_via_llm 前,先算关键词摘要兜底文本。
|
||||
// LLM 压缩失败时仍想保留用户反复提及的主题词(续接锚点),避免裸裁剪丢主题。
|
||||
// KEYWORD_FALLBACK_ENABLED=false → 跳过(回退原裸裁剪行为,排障/对比用)。
|
||||
|
||||
@@ -1209,7 +1209,21 @@ pub(crate) async fn run_agentic_loop(
|
||||
return;
|
||||
}
|
||||
};
|
||||
let (history_msgs, _trimmed) = conv.messages.build_for_request(sys_tokens);
|
||||
let (mut history_msgs, _trimmed) = conv.messages.build_for_request(sys_tokens);
|
||||
// T2-修复(方案A):发 LLM 前展开 namespace 引用为真实内容(view-only,仅本轮请求视图)。
|
||||
// push 时(audit/mod.rs)read_file/list_directory/grep/diff_files 等大结果被
|
||||
// namespace_store 引用化进 messages;持久化(conversation.rs)已展开写 DB,但发 LLM 的
|
||||
// 实时请求此前未展开 → LLM 每轮只看到 "namespace://..." 占位符,AI 实际拿不到工具结果。
|
||||
// 此处展开,namespace 退化为内存/持久化层优化,LLM 永远看真实内容。
|
||||
// read_only None(重启后 namespace 清空 / 跨会话残留引用)→ 保留占位符降级,非崩溃。
|
||||
for m in &mut history_msgs {
|
||||
if df_ai::namespace_store::is_namespace_ref(&m.content) {
|
||||
let path = m.content.clone();
|
||||
if let Some(original) = session.namespace_store.read_only(&path) {
|
||||
m.content = original.to_string();
|
||||
}
|
||||
}
|
||||
}
|
||||
let mut msgs = vec![ChatMessage::system(&system_prompt)];
|
||||
msgs.extend(history_msgs);
|
||||
msgs
|
||||
|
||||
Reference in New Issue
Block a user