fix(admin): model selection resets after save and provider switch
Three bugs fixed: - Removed the useEffect that synced state from config prop on every re-render, which caused a race condition resetting model state after revalidatePath triggered a server re-render. - Reset selected model to a sensible default when switching providers, preventing stale model names from one provider appearing in another provider's model list (which made the select show the first option). - Model select FormData names already fixed in previous commit to match provider-specific field names (AI_MODEL_TAGS_OLLAMA etc). Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -57,16 +57,6 @@ export function AdminSettingsForm({ config }: { config: Record<string, string> }
|
||||
const [isLoadingTagsModels, setIsLoadingTagsModels] = useState(false)
|
||||
const [isLoadingEmbeddingsModels, setIsLoadingEmbeddingsModels] = useState(false)
|
||||
|
||||
// Sync state with config
|
||||
useEffect(() => {
|
||||
setAllowRegister(config.ALLOW_REGISTRATION !== 'false')
|
||||
setSmtpSecure(config.SMTP_SECURE === 'true')
|
||||
setSmtpIgnoreCert(config.SMTP_IGNORE_CERT === 'true')
|
||||
setTagsProvider((config.AI_PROVIDER_TAGS as AIProvider) || 'ollama')
|
||||
setEmbeddingsProvider((config.AI_PROVIDER_EMBEDDING as AIProvider) || 'ollama')
|
||||
setSelectedTagsModel(config.AI_MODEL_TAGS || '')
|
||||
setSelectedEmbeddingModel(config.AI_MODEL_EMBEDDING || '')
|
||||
}, [config])
|
||||
|
||||
// Fetch Ollama models
|
||||
const fetchOllamaModels = useCallback(async (type: 'tags' | 'embeddings', url: string) => {
|
||||
@@ -287,7 +277,16 @@ export function AdminSettingsForm({ config }: { config: Record<string, string> }
|
||||
id="AI_PROVIDER_TAGS"
|
||||
name="AI_PROVIDER_TAGS"
|
||||
value={tagsProvider}
|
||||
onChange={(e) => setTagsProvider(e.target.value as AIProvider)}
|
||||
onChange={(e) => {
|
||||
const newProvider = e.target.value as AIProvider
|
||||
setTagsProvider(newProvider)
|
||||
const defaultModels: Record<string, string> = {
|
||||
ollama: '',
|
||||
openai: MODELS_2026.openai.tags[0],
|
||||
custom: MODELS_2026.custom.tags[0],
|
||||
}
|
||||
setSelectedTagsModel(defaultModels[newProvider] || '')
|
||||
}}
|
||||
className="flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2"
|
||||
>
|
||||
<option value="ollama">{t('admin.ai.providerOllamaOption')}</option>
|
||||
@@ -417,7 +416,16 @@ export function AdminSettingsForm({ config }: { config: Record<string, string> }
|
||||
id="AI_PROVIDER_EMBEDDING"
|
||||
name="AI_PROVIDER_EMBEDDING"
|
||||
value={embeddingsProvider}
|
||||
onChange={(e) => setEmbeddingsProvider(e.target.value as AIProvider)}
|
||||
onChange={(e) => {
|
||||
const newProvider = e.target.value as AIProvider
|
||||
setEmbeddingsProvider(newProvider)
|
||||
const defaultModels: Record<string, string> = {
|
||||
ollama: '',
|
||||
openai: MODELS_2026.openai.embeddings[0],
|
||||
custom: MODELS_2026.custom.embeddings[0],
|
||||
}
|
||||
setSelectedEmbeddingModel(defaultModels[newProvider] || '')
|
||||
}}
|
||||
className="flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2"
|
||||
>
|
||||
<option value="ollama">{t('admin.ai.providerOllamaOption')}</option>
|
||||
|
||||
Reference in New Issue
Block a user