From c8e5db435d73bc5a04d7d3670ac62660b4373165 Mon Sep 17 00:00:00 2001 From: Eliezer Steinbock <3090527+elie222@users.noreply.github.com> Date: Tue, 16 Sep 2025 15:25:53 +0300 Subject: [PATCH 1/2] Deprecate custom provider --- apps/web/env.ts | 1 + apps/web/utils/llms/config.ts | 1 - apps/web/utils/llms/model.test.ts | 24 ----------- apps/web/utils/llms/model.ts | 71 ++----------------------------- 4 files changed, 4 insertions(+), 93 deletions(-) diff --git a/apps/web/env.ts b/apps/web/env.ts index d122c3d336..2ec3c70df9 100644 --- a/apps/web/env.ts +++ b/apps/web/env.ts @@ -28,6 +28,7 @@ export const env = createEnv({ EMAIL_ENCRYPT_SALT: z.string(), DEFAULT_LLM_PROVIDER: z + // custom is deprecated .enum([...llmProviderEnum.options, "custom"]) .default("anthropic"), DEFAULT_LLM_MODEL: z.string().optional(), diff --git a/apps/web/utils/llms/config.ts b/apps/web/utils/llms/config.ts index c0f7e383a6..58af32a3d9 100644 --- a/apps/web/utils/llms/config.ts +++ b/apps/web/utils/llms/config.ts @@ -11,7 +11,6 @@ export const Provider = { GROQ: "groq", OPENROUTER: "openrouter", AI_GATEWAY: "aigateway", - CUSTOM: "custom", ...(supportsOllama ? { OLLAMA: "ollama" } : {}), }; diff --git a/apps/web/utils/llms/model.test.ts b/apps/web/utils/llms/model.test.ts index 2d10771519..af3ffa280f 100644 --- a/apps/web/utils/llms/model.test.ts +++ b/apps/web/utils/llms/model.test.ts @@ -314,29 +314,5 @@ describe("Models", () => { "Anthropic", ]); }); - - it("should preserve custom logic and not override with default provider options", () => { - const userAi: UserAIFields = { - aiApiKey: null, - aiProvider: null, - aiModel: null, - }; - - vi.mocked(env).DEFAULT_LLM_PROVIDER = "custom"; - vi.mocked(env).DEFAULT_OPENROUTER_PROVIDERS = "Should Not Override"; - vi.mocked(env).OPENROUTER_API_KEY = "test-openrouter-key"; - - const result = getModel(userAi, "default"); - expect(result.provider).toBe(Provider.OPENROUTER); - // Should have custom logic provider options, not the default ones - expect(result.providerOptions?.openrouter?.provider?.order).toEqual([ - "Google Vertex", - "Google AI Studio", - ]); - // Should NOT contain the DEFAULT_OPENROUTER_PROVIDERS value - expect(result.providerOptions?.openrouter?.provider?.order).not.toContain( - "Should Not Override", - ); - }); }); }); diff --git a/apps/web/utils/llms/model.ts b/apps/web/utils/llms/model.ts index d48b20a006..563e73938c 100644 --- a/apps/web/utils/llms/model.ts +++ b/apps/web/utils/llms/model.ts @@ -286,8 +286,7 @@ function selectDefaultModel(userAi: UserAIFields): SelectModel { let aiModel: string | null = null; const aiApiKey = userAi.aiApiKey; - const providerOptions: Record = - createOpenRouterProviderOptions(""); + const providerOptions: Record = {}; // If user has not api key set, then use default model // If they do they can use the model of their choice @@ -297,77 +296,13 @@ function selectDefaultModel(userAi: UserAIFields): SelectModel { } else { aiProvider = env.DEFAULT_LLM_PROVIDER; aiModel = env.DEFAULT_LLM_MODEL || null; - - // Allow custom logic in production with fallbacks that doesn't impact self-hosters - if (aiProvider === Provider.CUSTOM) { - // choose randomly between bedrock sonnet 3.7, sonnet 4, and openrouter - const models = [ - // { - // provider: Provider.ANTHROPIC, - // modelName: Model.CLAUDE_3_7_SONNET_BEDROCK, - // }, - // { - // provider: Provider.ANTHROPIC, - // modelName: Model.CLAUDE_4_SONNET_BEDROCK, - // }, - { - provider: Provider.OPENROUTER, - modelName: null, - }, - ]; - - const selectedProviderAndModel = - models[Math.floor(Math.random() * models.length)]; - - aiProvider = selectedProviderAndModel.provider; - aiModel = selectedProviderAndModel.modelName; - - if (aiProvider === Provider.OPENROUTER) { - function selectRandomModel() { - // to avoid rate limits, we'll select a random model - const models = [ - "google/gemini-2.5-pro", - // "anthropic/claude-sonnet-4", - // "anthropic/claude-3.7-sonnet", - ]; - return models[Math.floor(Math.random() * models.length)]; - } - aiModel = selectRandomModel() || null; - providerOptions.openrouter = { - models: [ - "google/gemini-2.5-pro", - // "anthropic/claude-sonnet-4", - // "anthropic/claude-3.7-sonnet", - ], - provider: { - // max 3 options - order: [ - "Google Vertex", - "Google AI Studio", - // "Anthropic", - // "Amazon Bedrock", - ], - }, - }; - } else { - return selectModel({ - aiProvider: Provider.ANTHROPIC, - aiModel, - aiApiKey: null, - }); - } - } } // Configure OpenRouter provider options if using OpenRouter for default model // (but not overriding custom logic which already sets its own provider options) - if ( - aiProvider === Provider.OPENROUTER && - env.DEFAULT_OPENROUTER_PROVIDERS && - !providerOptions.openrouter - ) { + if (aiProvider === Provider.OPENROUTER) { const openRouterOptions = createOpenRouterProviderOptions( - env.DEFAULT_OPENROUTER_PROVIDERS, + env.DEFAULT_OPENROUTER_PROVIDERS || "", ); Object.assign(providerOptions, openRouterOptions); } From 2bd90a45bd37646d20771c9c6966d425406c13f8 Mon Sep 17 00:00:00 2001 From: Eliezer Steinbock <3090527+elie222@users.noreply.github.com> Date: Tue, 16 Sep 2025 15:29:58 +0300 Subject: [PATCH 2/2] adjust override --- apps/web/utils/llms/model.ts | 14 +++++++++++--- version.txt | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/apps/web/utils/llms/model.ts b/apps/web/utils/llms/model.ts index 563e73938c..70d712ed47 100644 --- a/apps/web/utils/llms/model.ts +++ b/apps/web/utils/llms/model.ts @@ -298,13 +298,21 @@ function selectDefaultModel(userAi: UserAIFields): SelectModel { aiModel = env.DEFAULT_LLM_MODEL || null; } - // Configure OpenRouter provider options if using OpenRouter for default model - // (but not overriding custom logic which already sets its own provider options) if (aiProvider === Provider.OPENROUTER) { const openRouterOptions = createOpenRouterProviderOptions( env.DEFAULT_OPENROUTER_PROVIDERS || "", ); - Object.assign(providerOptions, openRouterOptions); + + // Preserve any custom options set earlier; always ensure reasoning exists. + const existingOpenRouterOptions = providerOptions.openrouter || {}; + providerOptions.openrouter = { + ...openRouterOptions.openrouter, + ...existingOpenRouterOptions, + reasoning: { + ...openRouterOptions.openrouter.reasoning, + ...(existingOpenRouterOptions.reasoning ?? {}), + }, + }; } return selectModel( diff --git a/version.txt b/version.txt index 9211bcd570..abeee4542d 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -v2.9.36 +v2.9.37