diff --git a/apps/nextjs/src/app/[locale]/manage/assistant/_components/assistant-configuration.tsx b/apps/nextjs/src/app/[locale]/manage/assistant/_components/assistant-configuration.tsx index ef9936c10..fa52a4501 100644 --- a/apps/nextjs/src/app/[locale]/manage/assistant/_components/assistant-configuration.tsx +++ b/apps/nextjs/src/app/[locale]/manage/assistant/_components/assistant-configuration.tsx @@ -72,13 +72,18 @@ export const AssistantConfiguration = () => { setEnabled(configuration?.enabled ?? false); }, [configuration]); + const destinationChanged = + configuration?.connectionConfigured === true && + (configuration.provider !== provider || configuration.baseUrl !== baseUrl.trim().replace(/\/$/, "")); + const { data: models, error: discoveryError, isFetching: isDiscovering, refetch: discoverModels, } = clientApi.assistant.discoverModels.useQuery(undefined, { - enabled: configuration?.connectionConfigured === true && configuration.modelDiscoveryPath !== null, + enabled: + configuration?.connectionConfigured === true && configuration.modelDiscoveryPath !== null && !destinationChanged, staleTime: 5 * 60_000, retry: false, }); @@ -104,17 +109,16 @@ export const AssistantConfiguration = () => { })), [t], ); - const selectedModel = models?.find((model) => model.id === modelId); + const selectedModel = destinationChanged ? undefined : models?.find((model) => model.id === modelId); - const destinationChanged = - configuration?.connectionConfigured === true && - (configuration.provider !== provider || configuration.baseUrl !== baseUrl.trim().replace(/\/$/, "")); const preset = assistantProviderPresets[provider]; const headerValuesValid = headers.every((header) => header.name.trim().length > 0 && header.value.length > 0); const hasEffectiveApiKey = apiKey.trim().length > 0 || (!destinationChanged && configuration?.apiKeyConfigured === true && !clearApiKey); const connectionValid = baseUrl.trim().length > 0 && headerValuesValid && (!preset.requiresApiKey || hasEffectiveApiKey); + const modelControlsDisabled = configuration?.connectionConfigured !== true || destinationChanged; + const canSaveConfiguration = !modelControlsDisabled && modelId.trim().length > 0; const updateConnection = clientApi.assistant.updateConnection.useMutation({ onSuccess: async ({ credentialsClearedForDestinationChange }) => { @@ -222,6 +226,11 @@ export const AssistantConfiguration = () => { }); }; + const saveAssistantConfiguration = () => { + if (!canSaveConfiguration) return; + saveConfiguration.mutate({ enabled, modelId: modelId.trim() }); + }; + return ( @@ -405,7 +414,7 @@ export const AssistantConfiguration = () => { size="compact-sm" leftSection={} loading={isDiscovering} - disabled={!configuration?.connectionConfigured || configuration.modelDiscoveryPath === null} + disabled={modelControlsDisabled || configuration?.modelDiscoveryPath === null} onClick={() => void discoverModels()} > {t("model.refresh")} @@ -415,18 +424,21 @@ export const AssistantConfiguration = () => { aria-label={t("model.title")} value={modelId} onChange={setModelId} - data={modelOptions} + data={modelControlsDisabled ? [] : modelOptions} + disabled={modelControlsDisabled} placeholder={t("model.placeholder")} description={ - discoveryError - ? t("model.manualFallback") - : models - ? t("model.discovered", { count: models.length }) - : t("model.manual") + modelControlsDisabled + ? t("model.saveConnectionFirst") + : discoveryError + ? t("model.manualFallback") + : models + ? t("model.discovered", { count: models.length }) + : t("model.manual") } limit={100} /> - {discoveryError && ( + {discoveryError && !modelControlsDisabled && ( } title={t("model.discoveryFailed")}> {discoveryError.message} @@ -464,16 +476,13 @@ export const AssistantConfiguration = () => { setEnabled(event.currentTarget.checked)} - disabled={!configuration?.connectionConfigured || modelId.trim().length === 0} + disabled={!canSaveConfiguration} label={t("enabled.label")} description={t("enabled.description")} /> - diff --git a/packages/translation/src/lang/en.json b/packages/translation/src/lang/en.json index 188141989..fc8b70a4e 100644 --- a/packages/translation/src/lang/en.json +++ b/packages/translation/src/lang/en.json @@ -5888,6 +5888,7 @@ "discoveryPathDescription": "Appended to the API base URL. Leave blank to disable discovery and use a manual model ID.", "manual": "Enter a model ID manually or save the connection to discover models.", "manualFallback": "Discovery is unavailable. You can still enter a model ID manually.", + "saveConnectionFirst": "Save the provider connection before choosing a model.", "discovered": "Discovered {count} models. Tool support depends on the selected endpoint and model.", "discoveryFailed": "Model discovery did not complete", "context": "{count} token context",