From 6b79bb83b196fa169c057b9c61189e7207d2427b Mon Sep 17 00:00:00 2001 From: Tarquinen <78942835+Tarquinen@users.noreply.github.com> Date: Wed, 21 Oct 2026 14:10:55 +0000 Subject: [PATCH 1/2] fix(core): let configured provider baseURL override catalog model endpoints --- packages/core/src/config/plugin/provider.ts | 9 ++++- packages/core/test/config/provider.test.ts | 43 +++++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/packages/core/src/config/plugin/provider.ts b/packages/core/src/config/plugin/provider.ts index 5ea1c70a58e7..21a1a87edb84 100644 --- a/packages/core/src/config/plugin/provider.ts +++ b/packages/core/src/config/plugin/provider.ts @@ -85,9 +85,16 @@ export const Plugin = define({ providers.models.update(providerID, id, (model) => { if (base) Object.assign(model, structuredClone(base)) if (item.package !== undefined) model.package = undefined - if (item.settings?.baseURL !== undefined && model.settings) delete model.settings.baseURL }) } + // A configured provider baseURL replaces every catalog per-model endpoint, not only those of configured + // models. Configured per-model settings are applied later and still win. + if (item.settings?.baseURL !== undefined) + for (const [id, model] of providers.get(providerID)?.models ?? []) + if (model.settings?.baseURL !== undefined) + providers.models.update(providerID, id, (model) => { + delete model.settings?.baseURL + }) next.set(item, { providerID, models: definitions }) } for (const [item, definition] of next) { diff --git a/packages/core/test/config/provider.test.ts b/packages/core/test/config/provider.test.ts index a4bab665fc20..16d22ba78ded 100644 --- a/packages/core/test/config/provider.test.ts +++ b/packages/core/test/config/provider.test.ts @@ -690,6 +690,49 @@ describe("ConfigProviderPlugin.Plugin", () => { }), ) + it.effect("routes every catalog model through a configured provider baseURL", () => + Effect.gen(function* () { + const providers = yield* Provider.Service + const models = yield* Model.Service + const providerID = Provider.ID.make("gateway") + yield* providers.transform((editor) => { + editor.update(providerID, (provider) => { + provider.package = "aisdk:@ai-sdk/openai-compatible" + provider.settings = { baseURL: "https://catalog.example/openai/v1" } + }) + editor.models.update(providerID, Model.ID.make("chat"), (model) => { + model.settings = { baseURL: "https://catalog.example/openai/v1" } + }) + editor.models.update(providerID, Model.ID.make("claude"), (model) => { + model.package = "aisdk:@ai-sdk/anthropic" + model.settings = { baseURL: "https://catalog.example/anthropic/v1" } + }) + editor.models.update(providerID, Model.ID.make("pinned"), (model) => { + model.settings = { baseURL: "https://catalog.example/openai/v1" } + }) + }) + yield* addPlugin([ + new Document({ + type: "document", + info: decode({ + providers: { + gateway: { + settings: { baseURL: "http://127.0.0.1:17322" }, + models: { pinned: { settings: { baseURL: "http://127.0.0.1:9000" } } }, + }, + }, + }), + }), + ]) + + const baseURL = (id: string) => + models.get(providerID, Model.ID.make(id)).pipe(Effect.map((model) => required(model).settings?.baseURL)) + expect(yield* baseURL("chat")).toBe("http://127.0.0.1:17322") + expect(yield* baseURL("claude")).toBe("http://127.0.0.1:17322") + expect(yield* baseURL("pinned")).toBe("http://127.0.0.1:9000") + }), + ) + it.effect("generates variants after rewriting a configured model package", () => Effect.gen(function* () { const models = yield* Model.Service From 29738ee017dc40fb8baa4d2e0b073bd7d38fde4c Mon Sep 17 00:00:00 2001 From: Tarquinen <78942835+Tarquinen@users.noreply.github.com> Date: Wed, 21 Oct 2026 14:39:02 +0000 Subject: [PATCH 2/2] test(core): simplify provider baseURL override test --- packages/core/test/config/provider.test.ts | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/packages/core/test/config/provider.test.ts b/packages/core/test/config/provider.test.ts index 16d22ba78ded..9337ab2a0c3c 100644 --- a/packages/core/test/config/provider.test.ts +++ b/packages/core/test/config/provider.test.ts @@ -690,26 +690,16 @@ describe("ConfigProviderPlugin.Plugin", () => { }), ) - it.effect("routes every catalog model through a configured provider baseURL", () => + it.effect("lets a configured provider baseURL override catalog model baseURLs", () => Effect.gen(function* () { const providers = yield* Provider.Service const models = yield* Model.Service const providerID = Provider.ID.make("gateway") yield* providers.transform((editor) => { - editor.update(providerID, (provider) => { - provider.package = "aisdk:@ai-sdk/openai-compatible" - provider.settings = { baseURL: "https://catalog.example/openai/v1" } - }) - editor.models.update(providerID, Model.ID.make("chat"), (model) => { - model.settings = { baseURL: "https://catalog.example/openai/v1" } - }) - editor.models.update(providerID, Model.ID.make("claude"), (model) => { - model.package = "aisdk:@ai-sdk/anthropic" - model.settings = { baseURL: "https://catalog.example/anthropic/v1" } - }) - editor.models.update(providerID, Model.ID.make("pinned"), (model) => { - model.settings = { baseURL: "https://catalog.example/openai/v1" } - }) + for (const id of ["chat", "pinned"]) + editor.models.update(providerID, Model.ID.make(id), (model) => { + model.settings = { baseURL: "https://catalog.example/v1" } + }) }) yield* addPlugin([ new Document({ @@ -728,7 +718,6 @@ describe("ConfigProviderPlugin.Plugin", () => { const baseURL = (id: string) => models.get(providerID, Model.ID.make(id)).pipe(Effect.map((model) => required(model).settings?.baseURL)) expect(yield* baseURL("chat")).toBe("http://127.0.0.1:17322") - expect(yield* baseURL("claude")).toBe("http://127.0.0.1:17322") expect(yield* baseURL("pinned")).toBe("http://127.0.0.1:9000") }), )