diff --git a/packages/core/src/plugin/provider/alibaba.ts b/packages/core/src/plugin/provider/alibaba.ts index 47c7e6b25c..e38fc55cb4 100644 --- a/packages/core/src/plugin/provider/alibaba.ts +++ b/packages/core/src/plugin/provider/alibaba.ts @@ -1,16 +1,10 @@ -import { Effect } from "effect" -import { define } from "@opencode-ai/plugin/effect/plugin" +import { createProviderPlugin } from "./factory" -export const AlibabaPlugin = define({ +export const AlibabaPlugin = createProviderPlugin({ id: "opencode.provider.alibaba", - effect: Effect.fn(function* (ctx) { - yield* ctx.aisdk.hook( - "sdk", - Effect.fn(function* (evt) { - if (evt.package !== "@ai-sdk/alibaba") return - const mod = yield* Effect.promise(() => import("@ai-sdk/alibaba")) - evt.sdk = mod.createAlibaba(evt.options) - }), - ) - }), + package: "@ai-sdk/alibaba", + load: async (options) => { + const { createAlibaba } = await import("@ai-sdk/alibaba") + return createAlibaba(options) + }, }) diff --git a/packages/core/src/plugin/provider/cohere.ts b/packages/core/src/plugin/provider/cohere.ts index 7fffb9db4b..ba26432389 100644 --- a/packages/core/src/plugin/provider/cohere.ts +++ b/packages/core/src/plugin/provider/cohere.ts @@ -1,16 +1,10 @@ -import { Effect } from "effect" -import { define } from "@opencode-ai/plugin/effect/plugin" +import { createProviderPlugin } from "./factory" -export const CoherePlugin = define({ +export const CoherePlugin = createProviderPlugin({ id: "opencode.provider.cohere", - effect: Effect.fn(function* (ctx) { - yield* ctx.aisdk.hook( - "sdk", - Effect.fn(function* (evt) { - if (evt.package !== "@ai-sdk/cohere") return - const mod = yield* Effect.promise(() => import("@ai-sdk/cohere")) - evt.sdk = mod.createCohere(evt.options) - }), - ) - }), + package: "@ai-sdk/cohere", + load: async (options) => { + const { createCohere } = await import("@ai-sdk/cohere") + return createCohere(options) + }, }) diff --git a/packages/core/src/plugin/provider/deepinfra.ts b/packages/core/src/plugin/provider/deepinfra.ts index 6f76bf6c37..ce0afcdec0 100644 --- a/packages/core/src/plugin/provider/deepinfra.ts +++ b/packages/core/src/plugin/provider/deepinfra.ts @@ -1,16 +1,10 @@ -import { Effect } from "effect" -import { define } from "@opencode-ai/plugin/effect/plugin" +import { createProviderPlugin } from "./factory" -export const DeepInfraPlugin = define({ +export const DeepInfraPlugin = createProviderPlugin({ id: "opencode.provider.deepinfra", - effect: Effect.fn(function* (ctx) { - yield* ctx.aisdk.hook( - "sdk", - Effect.fn(function* (evt) { - if (evt.package !== "@ai-sdk/deepinfra") return - const mod = yield* Effect.promise(() => import("@ai-sdk/deepinfra")) - evt.sdk = mod.createDeepInfra(evt.options) - }), - ) - }), + package: "@ai-sdk/deepinfra", + load: async (options) => { + const { createDeepInfra } = await import("@ai-sdk/deepinfra") + return createDeepInfra(options) + }, }) diff --git a/packages/core/src/plugin/provider/factory.ts b/packages/core/src/plugin/provider/factory.ts new file mode 100644 index 0000000000..fe4b89a7c3 --- /dev/null +++ b/packages/core/src/plugin/provider/factory.ts @@ -0,0 +1,22 @@ +import { define } from "@opencode-ai/plugin/effect/plugin" +import type { AISDKHooks } from "@opencode-ai/plugin/effect/aisdk" +import { Effect } from "effect" + +export function createProviderPlugin(input: { + readonly id: string + readonly package: string + readonly load: (options: AISDKHooks["sdk"]["options"]) => Promise +}) { + return define({ + id: input.id, + effect: Effect.fn(function* (ctx) { + yield* ctx.aisdk.hook( + "sdk", + Effect.fn(function* (evt) { + if (evt.package !== input.package) return + evt.sdk = yield* Effect.promise(() => input.load(evt.options)) + }), + ) + }), + }) +} diff --git a/packages/core/src/plugin/provider/gateway.ts b/packages/core/src/plugin/provider/gateway.ts index 8ee5a6ccf3..205336f55a 100644 --- a/packages/core/src/plugin/provider/gateway.ts +++ b/packages/core/src/plugin/provider/gateway.ts @@ -1,16 +1,10 @@ -import { Effect } from "effect" -import { define } from "@opencode-ai/plugin/effect/plugin" +import { createProviderPlugin } from "./factory" -export const GatewayPlugin = define({ +export const GatewayPlugin = createProviderPlugin({ id: "opencode.provider.gateway", - effect: Effect.fn(function* (ctx) { - yield* ctx.aisdk.hook( - "sdk", - Effect.fn(function* (evt) { - if (evt.package !== "@ai-sdk/gateway") return - const mod = yield* Effect.promise(() => import("@ai-sdk/gateway")) - evt.sdk = mod.createGateway(evt.options) - }), - ) - }), + package: "@ai-sdk/gateway", + load: async (options) => { + const { createGateway } = await import("@ai-sdk/gateway") + return createGateway(options) + }, }) diff --git a/packages/core/src/plugin/provider/groq.ts b/packages/core/src/plugin/provider/groq.ts index f2f078979e..77a1c81172 100644 --- a/packages/core/src/plugin/provider/groq.ts +++ b/packages/core/src/plugin/provider/groq.ts @@ -1,16 +1,10 @@ -import { Effect } from "effect" -import { define } from "@opencode-ai/plugin/effect/plugin" +import { createProviderPlugin } from "./factory" -export const GroqPlugin = define({ +export const GroqPlugin = createProviderPlugin({ id: "opencode.provider.groq", - effect: Effect.fn(function* (ctx) { - yield* ctx.aisdk.hook( - "sdk", - Effect.fn(function* (evt) { - if (evt.package !== "@ai-sdk/groq") return - const mod = yield* Effect.promise(() => import("@ai-sdk/groq")) - evt.sdk = mod.createGroq(evt.options) - }), - ) - }), + package: "@ai-sdk/groq", + load: async (options) => { + const { createGroq } = await import("@ai-sdk/groq") + return createGroq(options) + }, }) diff --git a/packages/core/src/plugin/provider/mistral.ts b/packages/core/src/plugin/provider/mistral.ts index f7a42deb40..a72e6c768d 100644 --- a/packages/core/src/plugin/provider/mistral.ts +++ b/packages/core/src/plugin/provider/mistral.ts @@ -1,16 +1,10 @@ -import { Effect } from "effect" -import { define } from "@opencode-ai/plugin/effect/plugin" +import { createProviderPlugin } from "./factory" -export const MistralPlugin = define({ +export const MistralPlugin = createProviderPlugin({ id: "opencode.provider.mistral", - effect: Effect.fn(function* (ctx) { - yield* ctx.aisdk.hook( - "sdk", - Effect.fn(function* (evt) { - if (evt.package !== "@ai-sdk/mistral") return - const mod = yield* Effect.promise(() => import("@ai-sdk/mistral")) - evt.sdk = mod.createMistral(evt.options) - }), - ) - }), + package: "@ai-sdk/mistral", + load: async (options) => { + const { createMistral } = await import("@ai-sdk/mistral") + return createMistral(options) + }, }) diff --git a/packages/core/src/plugin/provider/perplexity.ts b/packages/core/src/plugin/provider/perplexity.ts index 37a390948a..d429b921de 100644 --- a/packages/core/src/plugin/provider/perplexity.ts +++ b/packages/core/src/plugin/provider/perplexity.ts @@ -1,16 +1,10 @@ -import { Effect } from "effect" -import { define } from "@opencode-ai/plugin/effect/plugin" +import { createProviderPlugin } from "./factory" -export const PerplexityPlugin = define({ +export const PerplexityPlugin = createProviderPlugin({ id: "opencode.provider.perplexity", - effect: Effect.fn(function* (ctx) { - yield* ctx.aisdk.hook( - "sdk", - Effect.fn(function* (evt) { - if (evt.package !== "@ai-sdk/perplexity") return - const mod = yield* Effect.promise(() => import("@ai-sdk/perplexity")) - evt.sdk = mod.createPerplexity(evt.options) - }), - ) - }), + package: "@ai-sdk/perplexity", + load: async (options) => { + const { createPerplexity } = await import("@ai-sdk/perplexity") + return createPerplexity(options) + }, }) diff --git a/packages/core/src/plugin/provider/togetherai.ts b/packages/core/src/plugin/provider/togetherai.ts index eb8a8f7642..ab0a603157 100644 --- a/packages/core/src/plugin/provider/togetherai.ts +++ b/packages/core/src/plugin/provider/togetherai.ts @@ -1,16 +1,10 @@ -import { Effect } from "effect" -import { define } from "@opencode-ai/plugin/effect/plugin" +import { createProviderPlugin } from "./factory" -export const TogetherAIPlugin = define({ +export const TogetherAIPlugin = createProviderPlugin({ id: "opencode.provider.togetherai", - effect: Effect.fn(function* (ctx) { - yield* ctx.aisdk.hook( - "sdk", - Effect.fn(function* (evt) { - if (evt.package !== "@ai-sdk/togetherai") return - const mod = yield* Effect.promise(() => import("@ai-sdk/togetherai")) - evt.sdk = mod.createTogetherAI(evt.options) - }), - ) - }), + package: "@ai-sdk/togetherai", + load: async (options) => { + const { createTogetherAI } = await import("@ai-sdk/togetherai") + return createTogetherAI(options) + }, }) diff --git a/packages/core/src/plugin/provider/venice.ts b/packages/core/src/plugin/provider/venice.ts index 1c140db5b2..b0186a021a 100644 --- a/packages/core/src/plugin/provider/venice.ts +++ b/packages/core/src/plugin/provider/venice.ts @@ -1,16 +1,10 @@ -import { Effect } from "effect" -import { define } from "@opencode-ai/plugin/effect/plugin" +import { createProviderPlugin } from "./factory" -export const VenicePlugin = define({ +export const VenicePlugin = createProviderPlugin({ id: "opencode.provider.venice", - effect: Effect.fn(function* (ctx) { - yield* ctx.aisdk.hook( - "sdk", - Effect.fn(function* (evt) { - if (evt.package !== "venice-ai-sdk-provider") return - const mod = yield* Effect.promise(() => import("venice-ai-sdk-provider")) - evt.sdk = mod.createVenice(evt.options) - }), - ) - }), + package: "venice-ai-sdk-provider", + load: async (options) => { + const { createVenice } = await import("venice-ai-sdk-provider") + return createVenice(options) + }, })