新增: 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

@@ -10,7 +10,10 @@
use std::cmp::Reverse;
use df_ai_core::model::{Capability, CostTier, IntelligenceTier, Modality, ModelConfig};
// 阶段5: 调用点经 `df_ai::router::{Modality, Capability, CostTier, IntelligenceTier}`
// 直接 import 维度枚举构造 TaskRequirements(对齐任务规格 import 风格),re-export 避免调用点
// 各自从 df_ai_core::model 取(跨 crate 路径冗长)。select/select_model_id 仅借用枚举,无重定义。
pub use df_ai_core::model::{Capability, CostTier, IntelligenceTier, Modality, ModelConfig};
/// 任务对模型的需求(5 维度,对齐设计 §6.1)。
///
@@ -63,6 +66,20 @@ impl ModelRouter {
}
}
/// 阶段5 调用点 helper — 路由选模型并直接返回 model_id(纯函数)。
///
/// 给定 TaskRequirements + 候选池,返回最优模型的 `model_id`。
/// 调用点用法:`provider.model_configs`(Vec<ModelConfig>)→ `select_model_id(&req, &pool)`
/// → `Option<String>`;None 时兜底 `provider.default_model`(行为不变,平滑过渡)。
///
/// 行为不变保证:
/// - 池空(用户未通过 Settings 拉取模型)→ 返回 None → 调用点兜底 default_model
/// - 池非空但无候选满足需求 → 返回 None → 兜底 default_model
/// - 池非空命中 → 返回 model_id(F-01 路由目标,拉取即启用路由)
pub fn select_model_id(req: &TaskRequirements, pool: &[ModelConfig]) -> Option<String> {
ModelRouter::select(req, pool).map(|m| m.model_id.clone())
}
#[cfg(test)]
mod tests {
use super::*;
@@ -94,6 +111,22 @@ mod tests {
}
}
// ── 阶段5 select_model_id helper ──
#[test]
fn select_model_id_empty_pool_returns_none() {
// 池空(用户未拉取模型)→ None,调用点兜底 default_model
let pool: Vec<ModelConfig> = vec![];
assert!(select_model_id(&req(), &pool).is_none());
}
#[test]
fn select_model_id_hit_returns_model_id() {
// 池非空命中 → 返回 model_id 字符串(非引用)
let pool = vec![model("glm-4-flash")];
assert_eq!(select_model_id(&req(), &pool).as_deref(), Some("glm-4-flash"));
}
// ── 步骤 1:enabled 过滤 ──
#[test]