refactor(core): share AI SDK provider factory (#41796)

This commit is contained in:
Kit Langton
2026-08-11 13:07:14 -04:00
committed by GitHub
parent 9e082c2d43
commit 2c1596ca80
10 changed files with 85 additions and 117 deletions
+7 -13
View File
@@ -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)
},
})
+7 -13
View File
@@ -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)
},
})
+7 -13
View File
@@ -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)
},
})
@@ -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<unknown>
}) {
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))
}),
)
}),
})
}
+7 -13
View File
@@ -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)
},
})
+7 -13
View File
@@ -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)
},
})
+7 -13
View File
@@ -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)
},
})
@@ -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)
},
})
@@ -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)
},
})
+7 -13
View File
@@ -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)
},
})