From a2f8632fecd73212fee897a090f00052b889822d Mon Sep 17 00:00:00 2001 From: Michel-Liao Date: Sun, 30 Aug 2026 19:06:46 -0400 Subject: [PATCH 1/2] fix(server): respect disabled text generation providers --- apps/server/src/serverSettings.test.ts | 48 ++++++++++++++++++++++++++ apps/server/src/serverSettings.ts | 28 +++++++++++---- 2 files changed, 70 insertions(+), 6 deletions(-) diff --git a/apps/server/src/serverSettings.test.ts b/apps/server/src/serverSettings.test.ts index 521865839bde..6d7d1ee88401 100644 --- a/apps/server/src/serverSettings.test.ts +++ b/apps/server/src/serverSettings.test.ts @@ -368,6 +368,54 @@ it.layer(NodeServices.layer)("server settings", (it) => { }).pipe(Effect.provide(makeServerSettingsLayer())), ); + it.effect("prefers enabled provider instances for text generation fallbacks", () => + Effect.gen(function* () { + const serverSettings = yield* ServerSettingsModule.ServerSettingsService; + const claudeInstanceId = ProviderInstanceId.make("claude_work"); + + const instanceFallback = yield* serverSettings.updateSettings({ + providerInstances: { + [ProviderInstanceId.make("codex")]: { + driver: ProviderDriverKind.make("codex"), + enabled: false, + config: {}, + }, + [claudeInstanceId]: { + driver: ProviderDriverKind.make("claudeAgent"), + enabled: true, + config: {}, + }, + }, + }); + + assert.deepEqual(instanceFallback.textGenerationModelSelection, { + instanceId: claudeInstanceId, + model: "claude-haiku-4-5", + }); + }).pipe(Effect.provide(makeServerSettingsLayer())), + ); + + it.effect("skips disabled instance drivers when falling back to legacy providers", () => + Effect.gen(function* () { + const serverSettings = yield* ServerSettingsModule.ServerSettingsService; + + const legacyFallback = yield* serverSettings.updateSettings({ + providerInstances: { + [ProviderInstanceId.make("codex")]: { + driver: ProviderDriverKind.make("codex"), + enabled: false, + config: {}, + }, + }, + }); + + assert.deepEqual(legacyFallback.textGenerationModelSelection, { + instanceId: ProviderInstanceId.make("claudeAgent"), + model: "claude-haiku-4-5", + }); + }).pipe(Effect.provide(makeServerSettingsLayer())), + ); + it.effect("preserves enabled text generation selections for non-built-in drivers", () => Effect.gen(function* () { const serverSettings = yield* ServerSettingsModule.ServerSettingsService; diff --git a/apps/server/src/serverSettings.ts b/apps/server/src/serverSettings.ts index 5a8650b7e405..59f3e8beceae 100644 --- a/apps/server/src/serverSettings.ts +++ b/apps/server/src/serverSettings.ts @@ -20,6 +20,7 @@ import { type ProviderInstanceEnvironmentVariable, ProviderDriverKind, ProviderInstanceId, + resolveProviderInstanceEnabled, ServerSettings, ServerSettingsError, type ServerSettingsPatch, @@ -299,19 +300,34 @@ function resolveTextGenerationProvider(settings: ServerSettings): ServerSettings } function fallbackTextGenerationProvider(settings: ServerSettings): ServerSettings { - const fallbackEntry = Object.entries(settings.providers).find(([, provider]) => provider.enabled); - const fallback = fallbackEntry ? ProviderDriverKind.make(fallbackEntry[0]) : undefined; - if (!fallback) { + const providerInstanceEntries = Object.entries(settings.providerInstances); + const enabledInstance = providerInstanceEntries.find(([, instance]) => + resolveProviderInstanceEnabled(instance), + ); + const configuredDrivers = new Set(providerInstanceEntries.map(([, instance]) => instance.driver)); + const enabledLegacyProvider = Object.entries(settings.providers).find( + ([driver, provider]) => + provider.enabled && !configuredDrivers.has(ProviderDriverKind.make(driver)), + ); + const fallbackDriver = + enabledInstance?.[1].driver ?? + (enabledLegacyProvider ? ProviderDriverKind.make(enabledLegacyProvider[0]) : undefined); + const fallbackInstanceId = enabledInstance + ? ProviderInstanceId.make(enabledInstance[0]) + : fallbackDriver + ? ProviderInstanceId.make(fallbackDriver) + : undefined; + if (!fallbackDriver || !fallbackInstanceId) { return settings; } return { ...settings, textGenerationModelSelection: { - instanceId: ProviderInstanceId.make(fallback), + instanceId: fallbackInstanceId, model: - DEFAULT_TEXT_GENERATION_MODEL_BY_PROVIDER[fallback] ?? - DEFAULT_MODEL_BY_PROVIDER[fallback] ?? + DEFAULT_TEXT_GENERATION_MODEL_BY_PROVIDER[fallbackDriver] ?? + DEFAULT_MODEL_BY_PROVIDER[fallbackDriver] ?? DEFAULT_TEXT_GENERATION_MODEL, } satisfies ModelSelection, }; From 687c8bb210e5578ad900e8a1a1b1905ed2700e80 Mon Sep 17 00:00:00 2001 From: Michel-Liao Date: Sun, 30 Aug 2026 19:18:55 -0400 Subject: [PATCH 2/2] fix(server): narrow provider fallback selection --- apps/server/src/serverSettings.test.ts | 30 ++++---------------------- apps/server/src/serverSettings.ts | 30 ++++++++------------------ 2 files changed, 13 insertions(+), 47 deletions(-) diff --git a/apps/server/src/serverSettings.test.ts b/apps/server/src/serverSettings.test.ts index 6d7d1ee88401..0b2d48f1d8ff 100644 --- a/apps/server/src/serverSettings.test.ts +++ b/apps/server/src/serverSettings.test.ts @@ -368,47 +368,25 @@ it.layer(NodeServices.layer)("server settings", (it) => { }).pipe(Effect.provide(makeServerSettingsLayer())), ); - it.effect("prefers enabled provider instances for text generation fallbacks", () => + it.effect("skips a legacy fallback when its explicit default instance is disabled", () => Effect.gen(function* () { const serverSettings = yield* ServerSettingsModule.ServerSettingsService; - const claudeInstanceId = ProviderInstanceId.make("claude_work"); - const instanceFallback = yield* serverSettings.updateSettings({ + const legacyFallback = yield* serverSettings.updateSettings({ providerInstances: { [ProviderInstanceId.make("codex")]: { driver: ProviderDriverKind.make("codex"), enabled: false, config: {}, }, - [claudeInstanceId]: { - driver: ProviderDriverKind.make("claudeAgent"), + [ProviderInstanceId.make("unavailable_custom")]: { + driver: ProviderDriverKind.make("unknown"), enabled: true, config: {}, }, }, }); - assert.deepEqual(instanceFallback.textGenerationModelSelection, { - instanceId: claudeInstanceId, - model: "claude-haiku-4-5", - }); - }).pipe(Effect.provide(makeServerSettingsLayer())), - ); - - it.effect("skips disabled instance drivers when falling back to legacy providers", () => - Effect.gen(function* () { - const serverSettings = yield* ServerSettingsModule.ServerSettingsService; - - const legacyFallback = yield* serverSettings.updateSettings({ - providerInstances: { - [ProviderInstanceId.make("codex")]: { - driver: ProviderDriverKind.make("codex"), - enabled: false, - config: {}, - }, - }, - }); - assert.deepEqual(legacyFallback.textGenerationModelSelection, { instanceId: ProviderInstanceId.make("claudeAgent"), model: "claude-haiku-4-5", diff --git a/apps/server/src/serverSettings.ts b/apps/server/src/serverSettings.ts index 59f3e8beceae..a9eef949a64d 100644 --- a/apps/server/src/serverSettings.ts +++ b/apps/server/src/serverSettings.ts @@ -300,34 +300,22 @@ function resolveTextGenerationProvider(settings: ServerSettings): ServerSettings } function fallbackTextGenerationProvider(settings: ServerSettings): ServerSettings { - const providerInstanceEntries = Object.entries(settings.providerInstances); - const enabledInstance = providerInstanceEntries.find(([, instance]) => - resolveProviderInstanceEnabled(instance), - ); - const configuredDrivers = new Set(providerInstanceEntries.map(([, instance]) => instance.driver)); - const enabledLegacyProvider = Object.entries(settings.providers).find( - ([driver, provider]) => - provider.enabled && !configuredDrivers.has(ProviderDriverKind.make(driver)), - ); - const fallbackDriver = - enabledInstance?.[1].driver ?? - (enabledLegacyProvider ? ProviderDriverKind.make(enabledLegacyProvider[0]) : undefined); - const fallbackInstanceId = enabledInstance - ? ProviderInstanceId.make(enabledInstance[0]) - : fallbackDriver - ? ProviderInstanceId.make(fallbackDriver) - : undefined; - if (!fallbackDriver || !fallbackInstanceId) { + const fallbackEntry = Object.entries(settings.providers).find(([driver, provider]) => { + const instance = settings.providerInstances[ProviderInstanceId.make(driver)]; + return provider.enabled && (instance === undefined || resolveProviderInstanceEnabled(instance)); + }); + const fallback = fallbackEntry ? ProviderDriverKind.make(fallbackEntry[0]) : undefined; + if (!fallback) { return settings; } return { ...settings, textGenerationModelSelection: { - instanceId: fallbackInstanceId, + instanceId: ProviderInstanceId.make(fallback), model: - DEFAULT_TEXT_GENERATION_MODEL_BY_PROVIDER[fallbackDriver] ?? - DEFAULT_MODEL_BY_PROVIDER[fallbackDriver] ?? + DEFAULT_TEXT_GENERATION_MODEL_BY_PROVIDER[fallback] ?? + DEFAULT_MODEL_BY_PROVIDER[fallback] ?? DEFAULT_TEXT_GENERATION_MODEL, } satisfies ModelSelection, };