Skip to content

Commit 5e692ce

Browse files
committed
fix(goal): ai_goal_plan 客户端构造改用 Provider 存储——401 密钥无效根治(REQ-254)
- 根因:from_settings 只读旧字段(SiliconFlow 默认端点 + SILICONFLOW_API_KEY), 用户配置的 Provider Store 默认 Provider(DeepSeek 链:端点/模型/密钥)被完全绕过 → 以错误端点+空密钥调用 → HTTP 401 - 修复:与精修同口径 from_settings_with_store(resolve_default_provider_key + ai_providers 存储);Provider 未配置时回退旧字段(兼容迁移态,行为同精修)
1 parent b91a13d commit 5e692ce

1 file changed

Lines changed: 10 additions & 2 deletions

File tree

‎app/src-tauri/src/commands_goals_plan.rs‎

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,19 @@ pub async fn ai_goal_plan(
136136
};
137137
let honest_note = crate::budget_allocator::honest_truncation_note(truncated).to_string();
138138
let model = settings.model.clone();
139-
// ③ 调用(spawn_blocking:网络不阻塞异步运行时;密钥经 Provider 解析)
139+
// ③ 调用(spawn_blocking:网络不阻塞异步运行时;密钥/端点经 Provider 存储
140+
// 默认 Provider 解析——与精修同口径 from_settings_with_store,
141+
// 修复 2026-09-02:原 from_settings 只读旧字段(SiliconFlow 端点),
142+
// 用户配置的 DeepSeek Provider 被绕过 → 401 密钥无效)
140143
let plan = {
141144
let stored_key = crate::commands_ai_providers::resolve_default_provider_key(&state)
142145
.map_err(|e| e.to_string())?;
143-
let client = crate::ai_client::AiClient::from_settings(&settings, stored_key);
146+
let store = state
147+
.ai_providers
148+
.lock()
149+
.map_err(|e| format!("AI Provider 存储锁中毒: {}", e))?
150+
.clone();
151+
let client = crate::ai_client::AiClient::from_settings_with_store(&settings, stored_key, &store);
144152
let adapter = GoalPlanAdapter::new(client);
145153
tauri::async_runtime::spawn_blocking(move || adapter.plan(&ctx_text))
146154
.await

0 commit comments

Comments
 (0)