新增: F-01阶段5模型路由调用点接入

This commit is contained in:
2026-06-17 00:33:44 +08:00
parent 5b7f342e14
commit 2ddfea67c7
10 changed files with 220 additions and 24 deletions

View File

@@ -5,6 +5,13 @@ use std::sync::Arc;
use tokio::sync::Mutex;
use df_ai::provider::{ChatMessage, CompletionRequest, LlmProvider, MessageRole};
// F-01 阶段5: 知识提炼 / 嵌入两路路由。
// - 提炼: TaskRequirements(Standard,无工具)— 在对话 provider 的 model_configs 池中选。
// - 嵌入: TaskRequirements(Capability::Embedding,无工具)— 在 embedding provider 的池中选,
// 池空兜底 config.embedding_model(行为不变,现有 KnowledgeConfig 配置即生效)。
use df_ai::router::{
select_model_id, IntelligenceTier, Modality, TaskRequirements,
};
use df_storage::crud::{AiConversationRepo, KnowledgeRepo};
use df_storage::db::Database;
use df_storage::models::{AiProviderRecord, KnowledgeRecord};
@@ -18,12 +25,19 @@ use crate::commands::err_str;
use super::{AiSession};
/// 按配置构建 embedding provider + model。None = 配置缺失/provider 不存在。
///
/// F-01 阶段5: model 选择路由优先 — 在 embedding provider 的 model_configs 池中按
/// TaskRequirements(needs_tool_use=false)选最优;池空(未拉取)兜底 config.embedding_model。
///
/// 注:TaskRequirements 无 capabilities 字段(router 仅按 needs_tool_use 过滤 ToolUse),
/// 嵌入模型由 embedding provider 的池构成(用户在 KnowledgeSettings 配 embedding provider,
/// 该 provider 的 model_configs 通常即嵌入模型),故 needs_tool_use=false 宽松过滤即可命中。
async fn resolve_embed_provider(
state: &AppState,
config: &crate::state::KnowledgeConfig,
) -> Option<(Box<dyn LlmProvider>, String)> {
let id = config.embedding_provider_id.as_ref()?;
let model = config.embedding_model.clone().unwrap_or_else(|| "embedding-3".to_string());
let fallback_model = config.embedding_model.clone().unwrap_or_else(|| "embedding-3".to_string());
let rec = match state.ai_providers.get_by_id(id).await {
Ok(Some(r)) => r,
_ => {
@@ -39,6 +53,16 @@ async fn resolve_embed_provider(
return None;
}
};
// 嵌入路由:needs_tool_use=false(排除 ToolUse 专要求,允许嵌入模型入选)。
// select_model_id None(池空/无匹配)→ 兜底 config.embedding_model(行为不变)。
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);
Some((provider, model))
}
@@ -314,8 +338,19 @@ async fn extract_knowledge_from_conversation(
ChatMessage::system(EXTRACTION_SYSTEM_PROMPT),
ChatMessage::user(&format!("请从以下对话中提炼可复用知识:\n\n{}", conv_text)),
];
// F-01 阶段5: 知识提炼路由 — TaskRequirements(Standard,无工具)。
// select_model_id None(池空/无匹配)→ 兜底 default_model(行为不变)。
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)
.unwrap_or_else(|| provider_config.default_model.clone());
let request = CompletionRequest {
model: provider_config.default_model.clone(),
model: extract_model,
messages: extract_messages,
temperature: Some(0.3),
max_tokens: Some(2048),