优化: AI Chat全栈多批审查修复与架构清理(risk_level清理/路由解耦/工具渲染/测试补测/死代码)

This commit is contained in:
2026-06-18 22:57:19 +08:00
parent 0ca5d9805f
commit a2871a66e0
87 changed files with 5720 additions and 3012 deletions

View File

@@ -10,7 +10,7 @@ use df_ai::provider::{ChatMessage, CompletionRequest, LlmProvider, MessageRole};
// - 嵌入: TaskRequirements(Capability::Embedding,无工具)— 在 embedding provider 的池中选,
// 池空兜底 config.embedding_model(行为不变,现有 KnowledgeConfig 配置即生效)。
use df_ai::router::{
select_model_id, IntelligenceTier, Modality, TaskRequirements,
select_model_id, Modality, TaskRequirements,
};
use df_storage::crud::{AiConversationRepo, KnowledgeRepo};
use df_storage::db::Database;
@@ -58,8 +58,6 @@ async fn resolve_embed_provider(
let embed_req = TaskRequirements {
modalities: vec![Modality::Text],
needs_tool_use: false,
min_intelligence: IntelligenceTier::Lite,
max_cost: None,
estimated_context: 0,
};
let model = select_model_id(&embed_req, &rec.model_configs).unwrap_or(fallback_model);
@@ -129,7 +127,13 @@ async fn hybrid_search(
limit: usize,
config: &crate::state::KnowledgeConfig,
) -> Vec<df_storage::models::KnowledgeRecord> {
let keyword_results = state.knowledge.search(query, None, limit).await.unwrap_or_default();
let keyword_results = match state.knowledge.search(query, None, limit).await {
Ok(v) => v,
Err(e) => {
tracing::warn!(error = %e, "[ai] 知识关键词检索失败,降级空结果");
Vec::new()
}
};
if !config.vector_enabled {
return keyword_results;
@@ -138,7 +142,13 @@ async fn hybrid_search(
Some(v) => v,
None => return keyword_results, // embed 失败降级
};
let vector_results = state.knowledge.search_vector(&query_vec, limit).await.unwrap_or_default();
let vector_results = match state.knowledge.search_vector(&query_vec, limit).await {
Ok(v) => v,
Err(e) => {
tracing::warn!(error = %e, "[ai] 知识向量检索失败,降级空结果");
Vec::new()
}
};
merge_hybrid_results(keyword_results, vector_results, limit)
}
@@ -311,7 +321,13 @@ async fn extract_knowledge_from_conversation(
.filter(|t| !t.trim().is_empty())
.unwrap_or_else(|| "未命名对话".to_string());
let messages: Vec<ChatMessage> = serde_json::from_str(&conv.messages).unwrap_or_default();
let messages: Vec<ChatMessage> = match serde_json::from_str(&conv.messages) {
Ok(v) => v,
Err(e) => {
tracing::warn!(error = %e, "[ai] 对话消息 JSON 解析失败,降级空消息(知识提炼跳过)");
Vec::new()
}
};
// 过滤 user/assistant,取最后 6 条
let recent: Vec<&ChatMessage> = messages
.iter()
@@ -343,8 +359,6 @@ async fn extract_knowledge_from_conversation(
let extract_req = TaskRequirements {
modalities: vec![Modality::Text],
needs_tool_use: false,
min_intelligence: IntelligenceTier::Standard,
max_cost: None,
estimated_context: 0,
};
let extract_model = select_model_id(&extract_req, &provider_config.model_configs)