88//! "缺失/损坏回退内置默认"加载模式;密钥不在此层(DPAPI
99//! per-provider,ai_credentials.rs)。
1010//! @ai-context: 旧版(v0.11.5 及之前)单 Provider 配置(ai_settings.json 的
11- //! base_url/model + 单密钥)首启自动迁移为 SiliconFlow Provider
12- //! ——用户无感,4 处 AiClient::from_settings 调用点零改动。
11+ //! base_url/model + 单密钥)首启自动迁移为 DeepSeek Provider
12+ //! (v0.12.0 M4 默认链切换——旧 SiliconFlow 链路废除)——用户无感,
13+ //! 4 处 AiClient::from_settings 调用点零改动。
1314
1415use serde:: { Deserialize , Serialize } ;
1516
@@ -27,7 +28,8 @@ pub enum ProviderKind {
2728#[ derive( Debug , Clone , PartialEq , Serialize , Deserialize ) ]
2829#[ serde( rename_all = "camelCase" , default ) ]
2930pub struct AiProviderConfig {
30- /// 唯一 id(生成时 uuid/slug;迁移时固定 "legacy-siliconflow")
31+ /// 唯一 id(生成时 uuid/slug;迁移时固定 "legacy-deepseek"——v0.12.0 M4
32+ /// 迁移目标由 SiliconFlow 改为 DeepSeek 新默认链)
3133 pub id : String ,
3234 /// 显示名("SiliconFlow")
3335 pub name : String ,
@@ -149,20 +151,22 @@ pub fn preset_templates() -> Vec<AiProviderConfig> {
149151 fallback_order : Vec :: new ( ) ,
150152 } ;
151153 vec ! [
154+ // v0.12.0 M4(默认链 DeepSeek):DeepSeek 提首位——effective_default_id
155+ // 取第一个 enabled → 新装/迁移用户默认 Provider 即 DeepSeek。
156+ mk(
157+ "deepseek" ,
158+ "DeepSeek" ,
159+ "https://api.deepseek.com/v1" ,
160+ & [ "deepseek-v4-flash-vision-exp" , "deepseek-chat" , "deepseek-reasoner" ] ,
161+ "deepseek-v4-flash-vision-exp" ,
162+ ) ,
152163 mk(
153164 "siliconflow" ,
154165 "SiliconFlow" ,
155166 "https://api.siliconflow.cn/v1" ,
156167 & [ "deepseek-ai/DeepSeek-R1-0528-Qwen3-8B" , "deepseek-ai/DeepSeek-V3.2" ] ,
157168 "deepseek-ai/DeepSeek-R1-0528-Qwen3-8B" ,
158169 ) ,
159- mk(
160- "deepseek" ,
161- "DeepSeek" ,
162- "https://api.deepseek.com/v1" ,
163- & [ "deepseek-chat" , "deepseek-reasoner" ] ,
164- "deepseek-chat" ,
165- ) ,
166170 mk(
167171 "openrouter" ,
168172 "OpenRouter" ,
@@ -188,24 +192,28 @@ pub fn provider_scope(provider_id: &str) -> String {
188192 format ! ( "provider:{}" , provider_id)
189193}
190194
191- /// 旧配置迁移(首启):旧 ai_settings 的 base_url/model → SiliconFlow Provider 。
195+ /// 旧配置迁移(首启):旧版单 Provider 配置 → DeepSeek 默认链(v0.12.0 M4) 。
192196///
193197/// @ai-context: 迁移幂等——ai_providers.json 已存在时不触发(调用方判断);
194198/// 密钥迁移在 command 层(旧凭据条目 → provider:<id> 新条目)。
195- pub fn migrate_from_legacy ( legacy : & crate :: ai_settings:: AiSettings ) -> ( Vec < AiProviderConfig > , Option < String > ) {
196- let mut p = AiProviderConfig {
197- id : "legacy-siliconflow" . to_string ( ) ,
198- name : "SiliconFlow" . to_string ( ) ,
199- base_url : legacy. base_url . clone ( ) ,
200- default_model : legacy. model . clone ( ) ,
201- models : vec ! [ legacy. model. clone( ) ] ,
199+ /// @ai-context: v0.12.0 M4(默认链 DeepSeek):迁移目标由 SiliconFlow 改为
200+ /// DeepSeek 官方端点 + deepseek-v4-flash-vision-exp 默认模型——
201+ /// 旧 key 已废除,legacy.base_url/model(旧 SiliconFlow 链路)不再
202+ /// 沿用,直接生成 DeepSeek 默认 Provider(保可用不崩)。
203+ pub fn migrate_from_legacy ( _legacy : & crate :: ai_settings:: AiSettings ) -> ( Vec < AiProviderConfig > , Option < String > ) {
204+ // 取 DeepSeek 预设(id=="deepseek")为迁移模板——默认链目标。
205+ let ds = preset_templates ( )
206+ . into_iter ( )
207+ . find ( |p| p. id == "deepseek" )
208+ . expect ( "DeepSeek 预设必须存在(M4 默认链)" ) ;
209+ let p = AiProviderConfig {
210+ id : "legacy-deepseek" . to_string ( ) ,
211+ name : "DeepSeek" . to_string ( ) ,
212+ base_url : ds. base_url ,
213+ default_model : ds. default_model ,
214+ models : ds. models ,
202215 ..Default :: default ( )
203216 } ;
204- if p. validate ( ) . is_err ( ) {
205- // 旧配置非法 → 回退预设 SiliconFlow(保可用不崩)
206- p = preset_templates ( ) . remove ( 0 ) ;
207- p. id = "legacy-siliconflow" . to_string ( ) ;
208- }
209217 let default_id = p. id . clone ( ) ;
210218 ( vec ! [ p] , Some ( default_id) )
211219}
0 commit comments