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 [isLoadingTagsModels, setIsLoadingTagsModels] = useState(false)
|
||||||
const [isLoadingEmbeddingsModels, setIsLoadingEmbeddingsModels] = 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
|
// Fetch Ollama models
|
||||||
const fetchOllamaModels = useCallback(async (type: 'tags' | 'embeddings', url: string) => {
|
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"
|
id="AI_PROVIDER_TAGS"
|
||||||
name="AI_PROVIDER_TAGS"
|
name="AI_PROVIDER_TAGS"
|
||||||
value={tagsProvider}
|
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"
|
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>
|
<option value="ollama">{t('admin.ai.providerOllamaOption')}</option>
|
||||||
@@ -417,7 +416,16 @@ export function AdminSettingsForm({ config }: { config: Record<string, string> }
|
|||||||
id="AI_PROVIDER_EMBEDDING"
|
id="AI_PROVIDER_EMBEDDING"
|
||||||
name="AI_PROVIDER_EMBEDDING"
|
name="AI_PROVIDER_EMBEDDING"
|
||||||
value={embeddingsProvider}
|
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"
|
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>
|
<option value="ollama">{t('admin.ai.providerOllamaOption')}</option>
|
||||||
|
|||||||
Reference in New Issue
Block a user