From 6e82f5d3b94661df7b0ad76a31c05074b5a3165b Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" <219766164+opencode-agent[bot]@users.noreply.github.com> Date: Fri, 7 Aug 2026 10:14:14 -0500 Subject: [PATCH] fix(core): connect custom providers (#40761) Co-authored-by: Dax Raad <826656+thdxr@users.noreply.github.com> Co-authored-by: Aiden Cline --- packages/core/src/config/plugin/provider.ts | 10 +++++--- packages/core/test/config/provider.test.ts | 27 +++++++++++++++++++++ 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/packages/core/src/config/plugin/provider.ts b/packages/core/src/config/plugin/provider.ts index aa5f4fa7d59..7da542c655b 100644 --- a/packages/core/src/config/plugin/provider.ts +++ b/packages/core/src/config/plugin/provider.ts @@ -13,12 +13,14 @@ export const Plugin = define({ const config = yield* Config.Service const loaded = { entries: yield* config.entries() } yield* ctx.integration.transform((integrations) => { - const configuredIntegrations = new Set( - configuredProviders(loaded.entries).flatMap(([id, provider]) => (provider.env === undefined ? [] : [id])), - ) for (const [id, provider] of configuredProviders(loaded.entries)) { const integrationID = id - if (!configuredIntegrations.has(id) && !integrations.get(integrationID)) continue + if (!integrations.get(integrationID)) { + integrations.method.update({ + integrationID, + method: { type: "key", label: "Manually enter API Key" }, + }) + } integrations.update(integrationID, (integration) => { integration.name = provider.name ?? integration.name }) diff --git a/packages/core/test/config/provider.test.ts b/packages/core/test/config/provider.test.ts index 2526843c27e..cf28a783362 100644 --- a/packages/core/test/config/provider.test.ts +++ b/packages/core/test/config/provider.test.ts @@ -50,6 +50,33 @@ function withEnv(vars: Record, effect: () = const decode = Schema.decodeUnknownSync(Info) describe("ConfigProviderPlugin.Plugin", () => { + it.effect("adds key auth for custom providers without env credentials", () => + Effect.gen(function* () { + const integrations = yield* Integration.Service + const entries = [ + new Document({ + type: "document", + info: decode({ + providers: { + litellm: { + package: "aisdk:@ai-sdk/openai-compatible", + models: { chat: {} }, + }, + }, + }), + }), + ] + + yield* addPlugin(entries) + + expect(yield* integrations.get(Integration.ID.make("litellm"))).toMatchObject({ + id: "litellm", + name: "litellm", + methods: [{ type: "key", label: "Manually enter API Key" }], + }) + }), + ) + it.effect("defaults custom models to agent capabilities", () => Effect.gen(function* () { const catalog = yield* Catalog.Service