@@ -155,6 +155,29 @@ pub fn setup_app_state(app: &mut tauri::App) -> Result<(), String> {
155155 crate :: ai_settings:: AiSettings :: load ( & ai_settings_path) ,
156156 ) ) ;
157157 let ai_credentials = crate :: ai_credentials:: platform_store ( & data_dir. join ( "ai_credentials.bin" ) ) ;
158+ // v0.11.6 M1:AI Provider 装配——首启迁移(ai_providers.json 不存在且
159+ // 旧配置非默认值 → 生成 SiliconFlow Provider);密钥迁移同处完成
160+ // (旧凭据条目 → provider:legacy-siliconflow 新条目)
161+ let ai_providers_path = data_dir. join ( "ai_providers.json" ) ;
162+ let ai_providers = std:: sync:: Arc :: new ( std:: sync:: Mutex :: new (
163+ crate :: ai_provider:: AiProviderStore :: load ( & ai_providers_path) ,
164+ ) ) ;
165+ {
166+ let mut store = ai_providers. lock ( ) . map_err ( |e| e. to_string ( ) ) ?;
167+ if store. providers . is_empty ( ) {
168+ let legacy = ai_settings. lock ( ) . map_err ( |e| e. to_string ( ) ) ?. clone ( ) ;
169+ let ( providers, default_id) = crate :: ai_provider:: migrate_from_legacy ( & legacy) ;
170+ store. providers = providers;
171+ store. default_provider_id = default_id;
172+ // 密钥迁移:旧凭据存在且新 scope 不存在 → 复制(旧条目保留供回退)
173+ if let Ok ( Some ( key) ) = ai_credentials. load_key ( "default" ) {
174+ if ai_credentials. load_key ( "provider:legacy-siliconflow" ) . ok ( ) . flatten ( ) . is_none ( ) {
175+ let _ = ai_credentials. save_key ( "provider:legacy-siliconflow" , & key) ;
176+ }
177+ }
178+ store. save ( & ai_providers_path) ?;
179+ }
180+ }
158181 // v0.8.0 M2(REQ-145):AI 异步任务注册表 + id 序列(spawn_blocking 后台
159182 // 执行,前端轮询/事件双通道——禁止同步阻塞 30s+ 长会话精修)
160183 let ai_tasks = crate :: commands_ai_refine:: task_registry ( ) ;
@@ -238,6 +261,9 @@ pub fn setup_app_state(app: &mut tauri::App) -> Result<(), String> {
238261 ai_settings,
239262 ai_settings_path,
240263 ai_credentials,
264+ // v0.11.6 M1:AI Provider 存储 + 配置路径
265+ ai_providers,
266+ ai_providers_path,
241267 // v0.8.0 M2(REQ-145):AI 异步任务注册表 + id 序列
242268 ai_tasks,
243269 ai_task_seq,
0 commit comments