From d6cf4390ac7a5bebc3c28dfaba517b008499ca43 Mon Sep 17 00:00:00 2001 From: Jason Date: Fri, 23 Jan 2026 19:13:38 +0800 Subject: [PATCH] fix(form): backfill model fields when editing Claude provider Use lazy initialization in useState to parse model values from config on first render, matching the pattern used in useApiKeyState. This fixes an issue where model fields were not populated in edit mode. --- .../providers/forms/hooks/useModelState.ts | 57 +++++++++++++++++-- 1 file changed, 52 insertions(+), 5 deletions(-) diff --git a/src/components/providers/forms/hooks/useModelState.ts b/src/components/providers/forms/hooks/useModelState.ts index 5da7692f..518fe2c5 100644 --- a/src/components/providers/forms/hooks/useModelState.ts +++ b/src/components/providers/forms/hooks/useModelState.ts @@ -5,6 +5,42 @@ interface UseModelStateProps { onConfigChange: (config: string) => void; } +/** + * Parse model values from settings config JSON + */ +function parseModelsFromConfig(settingsConfig: string) { + try { + const cfg = settingsConfig ? JSON.parse(settingsConfig) : {}; + const env = cfg?.env || {}; + const model = + typeof env.ANTHROPIC_MODEL === "string" ? env.ANTHROPIC_MODEL : ""; + const reasoning = + typeof env.ANTHROPIC_REASONING_MODEL === "string" + ? env.ANTHROPIC_REASONING_MODEL + : ""; + const small = + typeof env.ANTHROPIC_SMALL_FAST_MODEL === "string" + ? env.ANTHROPIC_SMALL_FAST_MODEL + : ""; + const haiku = + typeof env.ANTHROPIC_DEFAULT_HAIKU_MODEL === "string" + ? env.ANTHROPIC_DEFAULT_HAIKU_MODEL + : small || model; + const sonnet = + typeof env.ANTHROPIC_DEFAULT_SONNET_MODEL === "string" + ? env.ANTHROPIC_DEFAULT_SONNET_MODEL + : model || small; + const opus = + typeof env.ANTHROPIC_DEFAULT_OPUS_MODEL === "string" + ? env.ANTHROPIC_DEFAULT_OPUS_MODEL + : model || small; + + return { model, reasoning, haiku, sonnet, opus }; + } catch { + return { model: "", reasoning: "", haiku: "", sonnet: "", opus: "" }; + } +} + /** * 管理模型选择状态 * 支持 ANTHROPIC_MODEL, ANTHROPIC_REASONING_MODEL 和各类型默认模型 @@ -13,11 +49,22 @@ export function useModelState({ settingsConfig, onConfigChange, }: UseModelStateProps) { - const [claudeModel, setClaudeModel] = useState(""); - const [reasoningModel, setReasoningModel] = useState(""); - const [defaultHaikuModel, setDefaultHaikuModel] = useState(""); - const [defaultSonnetModel, setDefaultSonnetModel] = useState(""); - const [defaultOpusModel, setDefaultOpusModel] = useState(""); + // Initialize state by parsing config directly (fixes edit mode backfill) + const [claudeModel, setClaudeModel] = useState( + () => parseModelsFromConfig(settingsConfig).model + ); + const [reasoningModel, setReasoningModel] = useState( + () => parseModelsFromConfig(settingsConfig).reasoning + ); + const [defaultHaikuModel, setDefaultHaikuModel] = useState( + () => parseModelsFromConfig(settingsConfig).haiku + ); + const [defaultSonnetModel, setDefaultSonnetModel] = useState( + () => parseModelsFromConfig(settingsConfig).sonnet + ); + const [defaultOpusModel, setDefaultOpusModel] = useState( + () => parseModelsFromConfig(settingsConfig).opus + ); const isUserEditingRef = useRef(false); const lastConfigRef = useRef(settingsConfig);