优化: aichat效率批(save无变化捷径/断路器尾窗/system缓存指纹/会话列表刷新收敛) + 新增 LLM prompt caching(cache_control开关默认关/system稳定段易变段分离治缓存命中率) + 销账
This commit is contained in:
@@ -351,6 +351,39 @@ pub(crate) async fn build_knowledge_context(
|
||||
out
|
||||
}
|
||||
|
||||
/// 取末条 active user 消息文本 + id,构建知识库上下文段(DRY:注入 [`inject_knowledge_into_prompt`]
|
||||
/// 与 Anthropic prompt caching 易变段共用)。
|
||||
///
|
||||
/// 同一条消息取 text + id(②口径修复):单次反向扫描,避免 text 过滤 is_active 而 id 不过滤
|
||||
/// 导致两值取自不同消息。auto_inject 关 / 无命中返回空串。
|
||||
pub(crate) async fn build_knowledge_context_for_conv(
|
||||
state: &AppState,
|
||||
conv_id: &str,
|
||||
config: &crate::state::KnowledgeConfig,
|
||||
) -> String {
|
||||
let (last_user_text, user_message_id) = {
|
||||
let __lock_t = std::time::Instant::now();
|
||||
let session = state.ai_session.lock().await;
|
||||
let msgs = session
|
||||
.conv_read(conv_id)
|
||||
.map(|c| c.messages.all_messages_clone())
|
||||
.unwrap_or_default();
|
||||
let found = msgs
|
||||
.iter()
|
||||
.rev()
|
||||
.find(|m| matches!(m.role, MessageRole::User) && m.is_active());
|
||||
let __hold = __lock_t.elapsed();
|
||||
if __hold > std::time::Duration::from_millis(30) {
|
||||
eprintln!("[LOCK-SLOW] build_knowledge_context_for_conv 持锁 {:?} (含 lock 等待)", __hold);
|
||||
}
|
||||
match found {
|
||||
Some(m) => (m.content.clone(), m.id.clone()),
|
||||
None => (String::new(), None),
|
||||
}
|
||||
};
|
||||
build_knowledge_context(state, conv_id, &last_user_text, config, user_message_id.as_deref()).await
|
||||
}
|
||||
|
||||
/// 知识注入 system prompt 的单一入口(DRY:F-09 agentic + chat 五处合一)。
|
||||
///
|
||||
/// 把原本散落在 `try_continue_agent_loop`(agentic/mod.rs)+ `ai_chat_send` /
|
||||
@@ -378,30 +411,7 @@ pub(crate) async fn inject_knowledge_into_prompt(
|
||||
system_prompt: String,
|
||||
config: &crate::state::KnowledgeConfig,
|
||||
) -> String {
|
||||
// 同一条消息取 text + id(②口径修复):单次反向扫描,避免 text 过滤 is_active 而 id 不过滤
|
||||
// 导致两值取自不同消息。
|
||||
let (last_user_text, user_message_id) = {
|
||||
let __lock_t = std::time::Instant::now();
|
||||
let session = state.ai_session.lock().await;
|
||||
let msgs = session
|
||||
.conv_read(conv_id)
|
||||
.map(|c| c.messages.all_messages_clone())
|
||||
.unwrap_or_default();
|
||||
let found = msgs
|
||||
.iter()
|
||||
.rev()
|
||||
.find(|m| matches!(m.role, MessageRole::User) && m.is_active());
|
||||
let __hold = __lock_t.elapsed();
|
||||
if __hold > std::time::Duration::from_millis(30) {
|
||||
eprintln!("[LOCK-SLOW] build_system_prompt_with_knowledge:383 持锁 {:?} (含 lock 等待)", __hold);
|
||||
}
|
||||
match found {
|
||||
Some(m) => (m.content.clone(), m.id.clone()),
|
||||
None => (String::new(), None),
|
||||
}
|
||||
};
|
||||
let knowledge_context =
|
||||
build_knowledge_context(state, conv_id, &last_user_text, config, user_message_id.as_deref()).await;
|
||||
let knowledge_context = build_knowledge_context_for_conv(state, conv_id, config).await;
|
||||
if knowledge_context.is_empty() {
|
||||
system_prompt
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user