From 36979c96419c574a737ad9186863c3718f8115c1 Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" <219766164+opencode-agent[bot]@users.noreply.github.com> Date: Wed, 22 Jul 2026 16:50:33 -0500 Subject: [PATCH] test(core): consolidate provider factory coverage (#38390) Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> --- .../core/test/plugin/provider-alibaba.test.ts | 96 ----------- .../core/test/plugin/provider-cohere.test.ts | 127 -------------- .../test/plugin/provider-deepinfra.test.ts | 161 ------------------ .../core/test/plugin/provider-factory.test.ts | 60 +++++++ .../core/test/plugin/provider-gateway.test.ts | 115 ------------- .../core/test/plugin/provider-groq.test.ts | 122 ------------- .../core/test/plugin/provider-mistral.test.ts | 134 --------------- .../test/plugin/provider-perplexity.test.ts | 127 -------------- .../test/plugin/provider-togetherai.test.ts | 132 -------------- .../core/test/plugin/provider-venice.test.ts | 120 ------------- 10 files changed, 60 insertions(+), 1134 deletions(-) delete mode 100644 packages/core/test/plugin/provider-alibaba.test.ts delete mode 100644 packages/core/test/plugin/provider-cohere.test.ts delete mode 100644 packages/core/test/plugin/provider-deepinfra.test.ts create mode 100644 packages/core/test/plugin/provider-factory.test.ts delete mode 100644 packages/core/test/plugin/provider-gateway.test.ts delete mode 100644 packages/core/test/plugin/provider-groq.test.ts delete mode 100644 packages/core/test/plugin/provider-mistral.test.ts delete mode 100644 packages/core/test/plugin/provider-perplexity.test.ts delete mode 100644 packages/core/test/plugin/provider-togetherai.test.ts delete mode 100644 packages/core/test/plugin/provider-venice.test.ts diff --git a/packages/core/test/plugin/provider-alibaba.test.ts b/packages/core/test/plugin/provider-alibaba.test.ts deleted file mode 100644 index bb7f922e52..0000000000 --- a/packages/core/test/plugin/provider-alibaba.test.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { AISDK } from "@opencode-ai/core/aisdk" -import { describe, expect } from "bun:test" -import { createAlibaba } from "@ai-sdk/alibaba" -import { Effect } from "effect" -import { ModelV2 } from "@opencode-ai/core/model" -import { PluginV2 } from "@opencode-ai/core/plugin" -import { PluginHost } from "@opencode-ai/core/plugin/host" -import { AlibabaPlugin } from "@opencode-ai/core/plugin/provider/alibaba" -import { ProviderV2 } from "@opencode-ai/core/provider" -import { testEffect } from "../lib/effect" -import { PluginTestLayer } from "./fixture" - -const it = testEffect(PluginTestLayer) - -const addPlugin = Effect.fn(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - const host = yield* PluginHost.make(plugin) - yield* AlibabaPlugin.effect(host) -}) - -describe("AlibabaPlugin", () => { - it.effect("creates an Alibaba SDK for @ai-sdk/alibaba", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const result = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("alibaba"), ModelV2.ID.make("qwen")), - modelID: ModelV2.ID.make("qwen"), - package: "aisdk:test-provider", - }), - package: "@ai-sdk/alibaba", - options: { name: "alibaba" }, - }) - expect(result.sdk).toBeDefined() - }), - ) - - it.effect("ignores non-Alibaba SDK packages", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const result = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("alibaba"), ModelV2.ID.make("qwen")), - modelID: ModelV2.ID.make("qwen"), - package: "aisdk:test-provider", - }), - package: "@ai-sdk/openai-compatible", - options: { name: "alibaba" }, - }) - expect(result.sdk).toBeUndefined() - }), - ) - - it.effect("matches the old bundled Alibaba SDK provider naming", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const result = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("custom-alibaba"), ModelV2.ID.make("qwen")), - modelID: ModelV2.ID.make("qwen"), - package: "aisdk:test-provider", - }), - package: "@ai-sdk/alibaba", - options: { name: "custom-alibaba", apiKey: "test" }, - }) - const expected = createAlibaba({ apiKey: "test", ...{ name: "custom-alibaba" } }).languageModel("qwen") - const actual = result.sdk?.languageModel("qwen") - expect(actual?.provider).toBe(expected.provider) - expect(actual?.modelId).toBe(expected.modelId) - }), - ) - - it.effect("uses the default languageModel(modelID) behavior", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const item = ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("alibaba"), ModelV2.ID.make("alias")), - modelID: ModelV2.ID.make("qwen-plus"), - package: "aisdk:test-provider", - }) - const result = yield* aisdk.runSDK({ model: item, package: "@ai-sdk/alibaba", options: {} }) - const language = result.sdk?.languageModel(item.modelID ?? item.id) - expect(language?.modelId).toBe("qwen-plus") - expect(language?.provider).toBe("alibaba.chat") - }), - ) -}) diff --git a/packages/core/test/plugin/provider-cohere.test.ts b/packages/core/test/plugin/provider-cohere.test.ts deleted file mode 100644 index a4109f74bd..0000000000 --- a/packages/core/test/plugin/provider-cohere.test.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { AISDK } from "@opencode-ai/core/aisdk" -import { describe, expect, mock } from "bun:test" -import { Effect } from "effect" -import { ModelV2 } from "@opencode-ai/core/model" -import { PluginV2 } from "@opencode-ai/core/plugin" -import { PluginHost } from "@opencode-ai/core/plugin/host" -import { CoherePlugin } from "@opencode-ai/core/plugin/provider/cohere" -import { ProviderV2 } from "@opencode-ai/core/provider" -import type { LanguageModelV3 } from "@ai-sdk/provider" -import { testEffect } from "../lib/effect" -import { PluginTestLayer } from "./fixture" - -const cohereOptions: Record[] = [] -const it = testEffect(PluginTestLayer) - -const addPlugin = Effect.fn(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - const host = yield* PluginHost.make(plugin) - yield* CoherePlugin.effect(host) -}) - -function fakeSelectorSdk(calls: string[]) { - const make = (method: string) => (id: string) => { - calls.push(`${method}:${id}`) - return { modelId: id, provider: method, specificationVersion: "v3" } as unknown as LanguageModelV3 - } - return { - responses: make("responses"), - messages: make("messages"), - chat: make("chat"), - languageModel: make("languageModel"), - } -} - -void mock.module("@ai-sdk/cohere", () => ({ - createCohere: (options: Record) => { - cohereOptions.push({ ...options }) - return { - languageModel: (modelID: string) => ({ - modelID, - provider: `${options.name ?? "cohere"}.chat`, - specificationVersion: "v3", - }), - } - }, -})) - -describe("CoherePlugin", () => { - it.effect("creates a Cohere SDK only for @ai-sdk/cohere", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - - const ignored = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("cohere"), ModelV2.ID.make("command")), - modelID: ModelV2.ID.make("command"), - package: "aisdk:test-provider", - }), - package: "@ai-sdk/openai-compatible", - options: { name: "cohere" }, - }) - expect(ignored.sdk).toBeUndefined() - - const result = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("cohere"), ModelV2.ID.make("command")), - modelID: ModelV2.ID.make("command"), - package: "aisdk:test-provider", - }), - package: "@ai-sdk/cohere", - options: { name: "cohere" }, - }) - expect(result.sdk).toBeDefined() - }), - ) - - it.effect("uses the model provider ID as the bundled SDK name", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const result = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("custom-cohere"), ModelV2.ID.make("command-r-plus")), - modelID: ModelV2.ID.make("command-r-plus"), - package: "aisdk:test-provider", - }), - package: "@ai-sdk/cohere", - options: { name: "custom-cohere", apiKey: "test", baseURL: "https://cohere.example" }, - }) - - expect(cohereOptions.at(-1)).toEqual({ - name: "custom-cohere", - apiKey: "test", - baseURL: "https://cohere.example", - }) - expect(result.sdk?.languageModel("command-r-plus").provider).toBe("custom-cohere.chat") - }), - ) - - it.effect("leaves language selection to the default languageModel fallback", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - const calls: string[] = [] - const sdk = fakeSelectorSdk(calls) - yield* addPlugin() - const result = yield* aisdk.runLanguage({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("cohere"), ModelV2.ID.make("alias")), - modelID: ModelV2.ID.make("command-r-plus"), - package: "aisdk:test-provider", - }), - sdk, - options: {}, - }) - - expect(result.language).toBeUndefined() - expect(calls).toEqual([]) - expect(result.language ?? sdk.languageModel("command-r-plus")).toBeDefined() - expect(calls).toEqual(["languageModel:command-r-plus"]) - }), - ) -}) diff --git a/packages/core/test/plugin/provider-deepinfra.test.ts b/packages/core/test/plugin/provider-deepinfra.test.ts deleted file mode 100644 index 14c41e550d..0000000000 --- a/packages/core/test/plugin/provider-deepinfra.test.ts +++ /dev/null @@ -1,161 +0,0 @@ -import { AISDK } from "@opencode-ai/core/aisdk" -import { describe, expect, mock } from "bun:test" -import { Effect } from "effect" -import { ModelV2 } from "@opencode-ai/core/model" -import { PluginV2 } from "@opencode-ai/core/plugin" -import { PluginHost } from "@opencode-ai/core/plugin/host" -import { DeepInfraPlugin } from "@opencode-ai/core/plugin/provider/deepinfra" -import { ProviderV2 } from "@opencode-ai/core/provider" -import { testEffect } from "../lib/effect" -import { PluginTestLayer } from "./fixture" - -const it = testEffect(PluginTestLayer) -const deepinfraOptions: Record[] = [] -const deepinfraLanguageModels: string[] = [] - -const addPlugin = Effect.fn(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - const host = yield* PluginHost.make(plugin) - yield* DeepInfraPlugin.effect(host) -}) - -void mock.module("@ai-sdk/deepinfra", () => ({ - createDeepInfra: (options: Record) => { - const captured = { ...options } - deepinfraOptions.push(captured) - return { - languageModel: (modelID: string) => { - deepinfraLanguageModels.push(modelID) - return { modelID, provider: `${captured.name ?? "deepinfra"}.chat`, specificationVersion: "v3" } - }, - } - }, -})) - -function resetDeepInfraMock() { - deepinfraOptions.length = 0 - deepinfraLanguageModels.length = 0 -} - -describe("DeepInfraPlugin", () => { - it.effect("creates a DeepInfra SDK for @ai-sdk/deepinfra", () => - Effect.gen(function* () { - resetDeepInfraMock() - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const result = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("deepinfra"), ModelV2.ID.make("model")), - modelID: ModelV2.ID.make("model"), - package: "aisdk:@ai-sdk/deepinfra", - }), - package: "@ai-sdk/deepinfra", - options: { name: "deepinfra" }, - }) - expect(result.sdk).toBeDefined() - }), - ) - - it.effect("passes the model provider ID as the bundled DeepInfra SDK name", () => - Effect.gen(function* () { - resetDeepInfraMock() - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const result = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("custom-deepinfra"), ModelV2.ID.make("model")), - modelID: ModelV2.ID.make("model"), - package: "aisdk:@ai-sdk/deepinfra", - }), - package: "@ai-sdk/deepinfra", - options: { name: "custom-deepinfra", apiKey: "test" }, - }) - expect(result.sdk.languageModel("model").provider).toBe("custom-deepinfra.chat") - expect(deepinfraOptions).toEqual([{ name: "custom-deepinfra", apiKey: "test" }]) - }), - ) - - it.effect("uses the canonical provider ID as the bundled DeepInfra SDK name", () => - Effect.gen(function* () { - resetDeepInfraMock() - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const result = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("deepinfra"), ModelV2.ID.make("model")), - modelID: ModelV2.ID.make("model"), - package: "aisdk:@ai-sdk/deepinfra", - }), - package: "@ai-sdk/deepinfra", - options: { name: "deepinfra", apiKey: "test" }, - }) - expect(result.sdk.languageModel("model").provider).toBe("deepinfra.chat") - expect(deepinfraOptions).toEqual([{ name: "deepinfra", apiKey: "test" }]) - }), - ) - - it.effect("matches only the exact bundled DeepInfra package", () => - Effect.gen(function* () { - resetDeepInfraMock() - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const packages = [ - "unmatched-package", - "@ai-sdk/deepinfra-compatible", - "file:///tmp/@ai-sdk/deepinfra-provider.js", - ] - yield* Effect.forEach(packages, (item) => - Effect.gen(function* () { - const ignored = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("deepinfra"), ModelV2.ID.make("model")), - modelID: ModelV2.ID.make("model"), - package: "aisdk:@ai-sdk/deepinfra", - }), - package: item, - options: { name: "deepinfra" }, - }) - expect(ignored.sdk).toBeUndefined() - }), - ) - const result = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("deepinfra"), ModelV2.ID.make("model")), - modelID: ModelV2.ID.make("model"), - package: "aisdk:@ai-sdk/deepinfra", - }), - package: "@ai-sdk/deepinfra", - options: { name: "deepinfra" }, - }) - expect(result.sdk).toBeDefined() - expect(deepinfraOptions).toEqual([{ name: "deepinfra" }]) - }), - ) - - it.effect("uses the default languageModel selection for DeepInfra models", () => - Effect.gen(function* () { - resetDeepInfraMock() - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const sdkEvent = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("deepinfra"), ModelV2.ID.make("meta-llama/Llama-3.3-70B-Instruct")), - modelID: ModelV2.ID.make("meta-llama/Llama-3.3-70B-Instruct"), - package: "aisdk:@ai-sdk/deepinfra", - }), - package: "@ai-sdk/deepinfra", - options: { name: "deepinfra" }, - }) - const result = yield* aisdk.runLanguage({ model: sdkEvent.model, sdk: sdkEvent.sdk, options: sdkEvent.options }) - const language = result.language ?? result.sdk.languageModel(result.model.modelID ?? result.model.id) - expect(language.provider).toBe("deepinfra.chat") - expect(deepinfraLanguageModels).toEqual(["meta-llama/Llama-3.3-70B-Instruct"]) - }), - ) -}) diff --git a/packages/core/test/plugin/provider-factory.test.ts b/packages/core/test/plugin/provider-factory.test.ts new file mode 100644 index 0000000000..a884fd0ce0 --- /dev/null +++ b/packages/core/test/plugin/provider-factory.test.ts @@ -0,0 +1,60 @@ +import { expect } from "bun:test" +import { Effect } from "effect" +import { AISDK } from "@opencode-ai/core/aisdk" +import { ModelV2 } from "@opencode-ai/core/model" +import { PluginV2 } from "@opencode-ai/core/plugin" +import { PluginHost } from "@opencode-ai/core/plugin/host" +import { AlibabaPlugin } from "@opencode-ai/core/plugin/provider/alibaba" +import { CoherePlugin } from "@opencode-ai/core/plugin/provider/cohere" +import { DeepInfraPlugin } from "@opencode-ai/core/plugin/provider/deepinfra" +import { GatewayPlugin } from "@opencode-ai/core/plugin/provider/gateway" +import { GroqPlugin } from "@opencode-ai/core/plugin/provider/groq" +import { MistralPlugin } from "@opencode-ai/core/plugin/provider/mistral" +import { PerplexityPlugin } from "@opencode-ai/core/plugin/provider/perplexity" +import { TogetherAIPlugin } from "@opencode-ai/core/plugin/provider/togetherai" +import { VenicePlugin } from "@opencode-ai/core/plugin/provider/venice" +import { ProviderV2 } from "@opencode-ai/core/provider" +import { testEffect } from "../lib/effect" +import { PluginTestLayer } from "./fixture" + +const modelID = ModelV2.ID.make("test-model") +const options = { name: "custom-provider", apiKey: "test", baseURL: "https://example.test" } +const providers = [ + { id: "alibaba", plugin: AlibabaPlugin, package: "@ai-sdk/alibaba", provider: "alibaba.chat" }, + { id: "cohere", plugin: CoherePlugin, package: "@ai-sdk/cohere", provider: "cohere.chat" }, + { id: "deepinfra", plugin: DeepInfraPlugin, package: "@ai-sdk/deepinfra", provider: "deepinfra.chat" }, + { id: "gateway", plugin: GatewayPlugin, package: "@ai-sdk/gateway", provider: "gateway" }, + { id: "groq", plugin: GroqPlugin, package: "@ai-sdk/groq", provider: "groq.chat" }, + { id: "mistral", plugin: MistralPlugin, package: "@ai-sdk/mistral", provider: "mistral.chat" }, + { id: "perplexity", plugin: PerplexityPlugin, package: "@ai-sdk/perplexity", provider: "perplexity" }, + { id: "togetherai", plugin: TogetherAIPlugin, package: "@ai-sdk/togetherai", provider: "togetherai.chat" }, + { id: "venice", plugin: VenicePlugin, package: "venice-ai-sdk-provider", provider: "custom-provider.chat" }, +] as const + +const it = testEffect(PluginTestLayer) + +providers.forEach((item) => + it.effect(`${item.id} loads only its exact package`, () => + Effect.gen(function* () { + const plugin = yield* PluginV2.Service + const aisdk = yield* AISDK.Service + const host = yield* PluginHost.make(plugin) + yield* item.plugin.effect(host) + const model = ModelV2.Info.make({ + ...ModelV2.Info.empty(ProviderV2.ID.make(item.id), modelID), + modelID, + package: ProviderV2.aisdk(item.package), + }) + const matched = yield* aisdk.runSDK({ model, package: item.package, options }) + const ignored = yield* aisdk.runSDK({ model, package: `${item.package}/unsupported`, options }) + const language = matched.sdk?.languageModel(modelID) + + expect({ + provider: language?.provider, + modelID: language?.modelId, + version: language?.specificationVersion, + ignored: ignored.sdk === undefined, + }).toEqual({ provider: item.provider, modelID: "test-model", version: "v3", ignored: true }) + }), + ), +) diff --git a/packages/core/test/plugin/provider-gateway.test.ts b/packages/core/test/plugin/provider-gateway.test.ts deleted file mode 100644 index 722bbde9b6..0000000000 --- a/packages/core/test/plugin/provider-gateway.test.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { AISDK } from "@opencode-ai/core/aisdk" -import { describe, expect, mock } from "bun:test" -import { Effect } from "effect" -import { ModelV2 } from "@opencode-ai/core/model" -import { PluginV2 } from "@opencode-ai/core/plugin" -import { PluginHost } from "@opencode-ai/core/plugin/host" -import { GatewayPlugin } from "@opencode-ai/core/plugin/provider/gateway" -import { ProviderV2 } from "@opencode-ai/core/provider" -import { testEffect } from "../lib/effect" -import { PluginTestLayer } from "./fixture" - -const gatewayCalls: Record[] = [] -const vercelGatewayModels = ["anthropic/claude-sonnet-4", "openai/gpt-5", "google/gemini-2.5-pro"] -const it = testEffect(PluginTestLayer) - -const addPlugin = Effect.fn(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - const host = yield* PluginHost.make(plugin) - yield* GatewayPlugin.effect(host) -}) - -mock.module("@ai-sdk/gateway", () => ({ - createGateway(options: Record) { - gatewayCalls.push({ ...options }) - return { - languageModel(modelID: string) { - return { - modelId: modelID, - provider: options.name, - specificationVersion: "v3", - } - }, - } - }, -})) - -describe("GatewayPlugin", () => { - it.effect("creates a Gateway SDK for @ai-sdk/gateway", () => - Effect.gen(function* () { - gatewayCalls.length = 0 - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const result = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("gateway"), ModelV2.ID.make("model")), - modelID: ModelV2.ID.make("model"), - package: "aisdk:test-provider", - }), - package: "@ai-sdk/gateway", - options: { name: "gateway" }, - }) - expect(result.sdk).toBeDefined() - expect(gatewayCalls).toHaveLength(1) - }), - ) - - it.effect("passes the model providerID as the Gateway SDK name", () => - Effect.gen(function* () { - gatewayCalls.length = 0 - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - - const result = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("vercel"), ModelV2.ID.make("anthropic/claude-sonnet-4")), - modelID: ModelV2.ID.make("anthropic/claude-sonnet-4"), - package: "aisdk:test-provider", - }), - package: "@ai-sdk/gateway", - options: { name: "vercel", apiKey: "test-key" }, - }) - - expect(gatewayCalls).toEqual([{ name: "vercel", apiKey: "test-key" }]) - expect(result.sdk.languageModel("anthropic/claude-sonnet-4").provider).toBe("vercel") - }), - ) - - it.effect("matches Vercel AI Gateway models by their @ai-sdk/gateway package", () => - Effect.gen(function* () { - gatewayCalls.length = 0 - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - - for (const modelID of vercelGatewayModels) { - const ignored = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("vercel"), ModelV2.ID.make(modelID)), - modelID: ModelV2.ID.make(modelID), - package: "aisdk:test-provider", - }), - package: "@ai-sdk/vercel", - options: { name: "vercel" }, - }) - expect(ignored.sdk).toBeUndefined() - - const result = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("vercel"), ModelV2.ID.make(modelID)), - modelID: ModelV2.ID.make(modelID), - package: "aisdk:test-provider", - }), - package: "@ai-sdk/gateway", - options: { name: "vercel" }, - }) - expect(result.sdk).toBeDefined() - } - - expect(gatewayCalls).toHaveLength(3) - }), - ) -}) diff --git a/packages/core/test/plugin/provider-groq.test.ts b/packages/core/test/plugin/provider-groq.test.ts deleted file mode 100644 index b8900384b7..0000000000 --- a/packages/core/test/plugin/provider-groq.test.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { AISDK } from "@opencode-ai/core/aisdk" -import { describe, expect } from "bun:test" -import { createGroq } from "@ai-sdk/groq" -import { Effect } from "effect" -import { ModelV2 } from "@opencode-ai/core/model" -import { PluginV2 } from "@opencode-ai/core/plugin" -import { PluginHost } from "@opencode-ai/core/plugin/host" -import { GroqPlugin } from "@opencode-ai/core/plugin/provider/groq" -import { ProviderV2 } from "@opencode-ai/core/provider" -import { testEffect } from "../lib/effect" -import { PluginTestLayer } from "./fixture" - -const it = testEffect(PluginTestLayer) - -const addPlugin = Effect.fn(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - const host = yield* PluginHost.make(plugin) - yield* GroqPlugin.effect(host) -}) - -describe("GroqPlugin", () => { - it.effect("creates a Groq SDK for @ai-sdk/groq", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const result = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("groq"), ModelV2.ID.make("llama")), - modelID: ModelV2.ID.make("llama"), - package: "aisdk:@ai-sdk/groq", - }), - package: "@ai-sdk/groq", - options: { name: "groq" }, - }) - expect(result.sdk).toBeDefined() - }), - ) - - it.effect("ignores non-Groq SDK packages", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const result = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("groq"), ModelV2.ID.make("llama")), - modelID: ModelV2.ID.make("llama"), - package: "aisdk:@ai-sdk/groq", - }), - package: "@ai-sdk/openai-compatible", - options: { name: "groq" }, - }) - expect(result.sdk).toBeUndefined() - }), - ) - - it.effect("only matches the bundled @ai-sdk/groq package exactly", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const result = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("groq"), ModelV2.ID.make("llama")), - modelID: ModelV2.ID.make("llama"), - package: "aisdk:@ai-sdk/groq", - }), - package: "@ai-sdk/groq/compat", - options: { name: "groq" }, - }) - expect(result.sdk).toBeUndefined() - }), - ) - - it.effect("matches the old bundled Groq SDK provider naming", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const result = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("custom-groq"), ModelV2.ID.make("llama")), - modelID: ModelV2.ID.make("llama"), - package: "aisdk:@ai-sdk/groq", - }), - package: "@ai-sdk/groq", - options: { name: "custom-groq", apiKey: "test" }, - }) - const expected = createGroq({ name: "custom-groq", apiKey: "test" } as Parameters[0] & { - name: string - }).languageModel("llama") - const actual = result.sdk?.languageModel("llama") - expect(actual?.provider).toBe(expected.provider) - expect(actual?.modelId).toBe(expected.modelId) - }), - ) - - it.effect("uses the default languageModel(modelID) behavior", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const sdk = createGroq({ name: "groq", apiKey: "test" } as Parameters[0] & { - name: string - }) - const result = yield* aisdk.runLanguage({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("groq"), ModelV2.ID.make("alias")), - modelID: ModelV2.ID.make("llama-api"), - package: "aisdk:@ai-sdk/groq", - }), - sdk, - options: { name: "groq", apiKey: "test" }, - }) - const language = result.language ?? sdk.languageModel(result.model.modelID ?? result.model.id) - expect(language.modelId).toBe("llama-api") - expect(language.provider).toBe("groq.chat") - }), - ) -}) diff --git a/packages/core/test/plugin/provider-mistral.test.ts b/packages/core/test/plugin/provider-mistral.test.ts deleted file mode 100644 index 182873482c..0000000000 --- a/packages/core/test/plugin/provider-mistral.test.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { AISDK } from "@opencode-ai/core/aisdk" -import type { LanguageModelV3 } from "@ai-sdk/provider" -import { describe, expect } from "bun:test" -import { Effect } from "effect" -import { ModelV2 } from "@opencode-ai/core/model" -import { PluginV2 } from "@opencode-ai/core/plugin" -import { PluginHost } from "@opencode-ai/core/plugin/host" -import { MistralPlugin } from "@opencode-ai/core/plugin/provider/mistral" -import { ProviderV2 } from "@opencode-ai/core/provider" -import { testEffect } from "../lib/effect" -import { PluginTestLayer } from "./fixture" - -const it = testEffect(PluginTestLayer) - -const addPlugin = Effect.fn(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - const host = yield* PluginHost.make(plugin) - yield* MistralPlugin.effect(host) -}) - -describe("MistralPlugin", () => { - it.effect("creates a Mistral SDK for @ai-sdk/mistral", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const result = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("mistral"), ModelV2.ID.make("mistral-large")), - modelID: ModelV2.ID.make("mistral-large"), - package: "aisdk:test-provider", - }), - package: "@ai-sdk/mistral", - options: { name: "mistral" }, - }) - expect(result.sdk).toBeDefined() - }), - ) - - it.effect("ignores non-Mistral SDK packages", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const result = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("mistral"), ModelV2.ID.make("mistral-large")), - modelID: ModelV2.ID.make("mistral-large"), - package: "aisdk:test-provider", - }), - package: "@ai-sdk/openai-compatible", - options: { name: "mistral" }, - }) - expect(result.sdk).toBeUndefined() - }), - ) - - it.effect("matches the old bundled Mistral SDK provider name for the bundled provider ID", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - const providers: string[] = [] - yield* addPlugin() - yield* aisdk.hook.sdk((event) => - Effect.sync(() => { - providers.push(event.sdk.languageModel("mistral-large").provider) - }), - ) - const result = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("mistral"), ModelV2.ID.make("mistral-large")), - modelID: ModelV2.ID.make("mistral-large"), - package: "aisdk:test-provider", - }), - package: "@ai-sdk/mistral", - options: { name: "mistral" }, - }) - expect(result.sdk).toBeDefined() - expect(providers).toEqual(["mistral.chat"]) - }), - ) - - it.effect("matches the old bundled Mistral SDK provider name for custom provider IDs", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - const providers: string[] = [] - yield* addPlugin() - yield* aisdk.hook.sdk((event) => - Effect.sync(() => { - providers.push(event.sdk.languageModel("mistral-large").provider) - }), - ) - yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("custom-mistral"), ModelV2.ID.make("mistral-large")), - modelID: ModelV2.ID.make("mistral-large"), - package: "aisdk:test-provider", - }), - package: "@ai-sdk/mistral", - options: { name: "custom-mistral" }, - }) - expect(providers).toEqual(["mistral.chat"]) - }), - ) - - it.effect("leaves Mistral language selection on the default sdk.languageModel(modelID) path", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - const calls: string[] = [] - const sdk = { - languageModel: (id: string) => { - calls.push(`languageModel:${id}`) - return { modelId: id, provider: "languageModel", specificationVersion: "v3" } as unknown as LanguageModelV3 - }, - } - yield* addPlugin() - const result = yield* aisdk.runLanguage({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("mistral"), ModelV2.ID.make("alias")), - modelID: ModelV2.ID.make("mistral-large"), - package: "aisdk:test-provider", - }), - sdk, - options: {}, - }) - const language = result.language ?? sdk.languageModel(result.model.modelID ?? result.model.id) - expect(calls).toEqual(["languageModel:mistral-large"]) - expect(language).toBeDefined() - }), - ) -}) diff --git a/packages/core/test/plugin/provider-perplexity.test.ts b/packages/core/test/plugin/provider-perplexity.test.ts deleted file mode 100644 index d66f5dd71c..0000000000 --- a/packages/core/test/plugin/provider-perplexity.test.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { AISDK } from "@opencode-ai/core/aisdk" -import { describe, expect } from "bun:test" -import type { LanguageModelV3 } from "@ai-sdk/provider" -import { Effect } from "effect" -import { ModelV2 } from "@opencode-ai/core/model" -import { PluginV2 } from "@opencode-ai/core/plugin" -import { PluginHost } from "@opencode-ai/core/plugin/host" -import { PerplexityPlugin } from "@opencode-ai/core/plugin/provider/perplexity" -import { ProviderV2 } from "@opencode-ai/core/provider" -import { testEffect } from "../lib/effect" -import { PluginTestLayer } from "./fixture" - -const it = testEffect(PluginTestLayer) - -const addPlugin = Effect.fn(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - const host = yield* PluginHost.make(plugin) - yield* PerplexityPlugin.effect(host) -}) - -function fakeSelectorSdk(calls: string[]) { - const make = (method: string) => (id: string) => { - calls.push(`${method}:${id}`) - return { modelId: id, provider: method, specificationVersion: "v3" } as unknown as LanguageModelV3 - } - return { - responses: make("responses"), - messages: make("messages"), - chat: make("chat"), - languageModel: make("languageModel"), - } -} - -describe("PerplexityPlugin", () => { - it.effect("creates a Perplexity SDK for the exact @ai-sdk/perplexity package", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const result = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("perplexity"), ModelV2.ID.make("sonar")), - modelID: ModelV2.ID.make("sonar"), - package: "aisdk:test-provider", - }), - package: "@ai-sdk/perplexity", - options: { name: "perplexity" }, - }) - expect(result.sdk).toBeDefined() - }), - ) - - it.effect("ignores packages that are not the bundled Perplexity package", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const result = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("perplexity"), ModelV2.ID.make("sonar")), - modelID: ModelV2.ID.make("sonar"), - package: "aisdk:test-provider", - }), - package: "@ai-sdk/perplexity-compatible", - options: { name: "perplexity" }, - }) - expect(result.sdk).toBeUndefined() - }), - ) - - it.effect("uses the Perplexity provider ID as the SDK name for the bundled provider", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const result = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("perplexity"), ModelV2.ID.make("sonar")), - modelID: ModelV2.ID.make("sonar"), - package: "aisdk:test-provider", - }), - package: "@ai-sdk/perplexity", - options: { name: "perplexity" }, - }) - expect(result.sdk.languageModel("sonar").provider).toBe("perplexity") - }), - ) - - it.effect("creates bundled Perplexity SDKs for custom provider IDs", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const result = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("custom-perplexity"), ModelV2.ID.make("sonar")), - modelID: ModelV2.ID.make("sonar"), - package: "aisdk:test-provider", - }), - package: "@ai-sdk/perplexity", - options: { name: "custom-perplexity" }, - }) - expect(result.sdk.languageModel("sonar").provider).toBe("perplexity") - }), - ) - - it.effect("leaves Perplexity language selection to the default languageModel fallback", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - const calls: string[] = [] - yield* addPlugin() - const result = yield* aisdk.runLanguage({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("perplexity"), ModelV2.ID.make("alias")), - modelID: ModelV2.ID.make("sonar"), - package: "aisdk:test-provider", - }), - sdk: fakeSelectorSdk(calls), - options: {}, - }) - expect(calls).toEqual([]) - expect(result.language).toBeUndefined() - }), - ) -}) diff --git a/packages/core/test/plugin/provider-togetherai.test.ts b/packages/core/test/plugin/provider-togetherai.test.ts deleted file mode 100644 index 1fffb03156..0000000000 --- a/packages/core/test/plugin/provider-togetherai.test.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { AISDK } from "@opencode-ai/core/aisdk" -import { describe, expect } from "bun:test" -import type { LanguageModelV3 } from "@ai-sdk/provider" -import { Effect } from "effect" -import { ModelV2 } from "@opencode-ai/core/model" -import { PluginV2 } from "@opencode-ai/core/plugin" -import { PluginHost } from "@opencode-ai/core/plugin/host" -import { TogetherAIPlugin } from "@opencode-ai/core/plugin/provider/togetherai" -import { ProviderV2 } from "@opencode-ai/core/provider" -import { testEffect } from "../lib/effect" -import { PluginTestLayer } from "./fixture" - -const it = testEffect(PluginTestLayer) - -const addPlugin = Effect.fn(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - const host = yield* PluginHost.make(plugin) - yield* TogetherAIPlugin.effect(host) -}) - -function fakeSelectorSdk(calls: string[]) { - const make = (method: string) => (id: string) => { - calls.push(`${method}:${id}`) - return { modelId: id, provider: method, specificationVersion: "v3" } as unknown as LanguageModelV3 - } - return { - responses: make("responses"), - messages: make("messages"), - chat: make("chat"), - languageModel: make("languageModel"), - } -} - -describe("TogetherAIPlugin", () => { - it.effect("creates a TogetherAI SDK for @ai-sdk/togetherai", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const result = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("togetherai"), ModelV2.ID.make("model")), - modelID: ModelV2.ID.make("model"), - package: "aisdk:test-provider", - }), - package: "@ai-sdk/togetherai", - options: { name: "togetherai" }, - }) - expect(result.sdk).toBeDefined() - }), - ) - - it.effect("matches the old bundled provider package exactly", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - - const ignored = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("togetherai"), ModelV2.ID.make("model")), - modelID: ModelV2.ID.make("model"), - package: "aisdk:test-provider", - }), - package: "file:///tmp/@ai-sdk/togetherai-provider.js", - options: { name: "togetherai" }, - }) - expect(ignored.sdk).toBeUndefined() - - const result = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("togetherai"), ModelV2.ID.make("model")), - modelID: ModelV2.ID.make("model"), - package: "aisdk:test-provider", - }), - package: "@ai-sdk/togetherai", - options: { name: "togetherai" }, - }) - expect(result.sdk).toBeDefined() - }), - ) - - it.effect("creates bundled TogetherAI SDKs for custom provider IDs", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - - const result = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("custom-togetherai"), ModelV2.ID.make("model")), - modelID: ModelV2.ID.make("model"), - package: "aisdk:test-provider", - }), - package: "@ai-sdk/togetherai", - options: { name: "custom-togetherai" }, - }) - - expect(result.sdk.languageModel("model").provider).toBe("togetherai.chat") - }), - ) - - it.effect("defaults language selection to sdk.languageModel with the model API ID", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - const calls: string[] = [] - yield* addPlugin() - - const result = yield* aisdk.runLanguage({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty( - ProviderV2.ID.make("togetherai"), - ModelV2.ID.make("meta-llama/Llama-3.3-70B-Instruct-Turbo"), - ), - modelID: ModelV2.ID.make("meta-llama/Llama-3.3-70B-Instruct-Turbo"), - package: "aisdk:test-provider", - }), - sdk: { languageModel: fakeSelectorSdk(calls).languageModel }, - options: {}, - }) - - expect(result.language).toBeUndefined() - expect(calls).toEqual([]) - expect( - result.language ?? fakeSelectorSdk(calls).languageModel(result.model.modelID ?? result.model.id), - ).toBeDefined() - expect(calls).toEqual(["languageModel:meta-llama/Llama-3.3-70B-Instruct-Turbo"]) - }), - ) -}) diff --git a/packages/core/test/plugin/provider-venice.test.ts b/packages/core/test/plugin/provider-venice.test.ts deleted file mode 100644 index 057d2c6ded..0000000000 --- a/packages/core/test/plugin/provider-venice.test.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { AISDK } from "@opencode-ai/core/aisdk" -import { describe, expect } from "bun:test" -import type { LanguageModelV3 } from "@ai-sdk/provider" -import { Effect } from "effect" -import { ModelV2 } from "@opencode-ai/core/model" -import { PluginV2 } from "@opencode-ai/core/plugin" -import { PluginHost } from "@opencode-ai/core/plugin/host" -import { VenicePlugin } from "@opencode-ai/core/plugin/provider/venice" -import { ProviderV2 } from "@opencode-ai/core/provider" -import { testEffect } from "../lib/effect" -import { PluginTestLayer } from "./fixture" - -const it = testEffect(PluginTestLayer) - -const addPlugin = Effect.fn(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - const host = yield* PluginHost.make(plugin) - yield* VenicePlugin.effect(host) -}) - -function fakeSelectorSdk(calls: string[]) { - const make = (method: string) => (id: string) => { - calls.push(`${method}:${id}`) - return { modelId: id, provider: method, specificationVersion: "v3" } as unknown as LanguageModelV3 - } - return { - responses: make("responses"), - messages: make("messages"), - chat: make("chat"), - languageModel: make("languageModel"), - } -} - -describe("VenicePlugin", () => { - it.effect("creates a Venice SDK for venice-ai-sdk-provider", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const result = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("venice"), ModelV2.ID.make("model")), - modelID: ModelV2.ID.make("model"), - package: "aisdk:test-provider", - }), - package: "venice-ai-sdk-provider", - options: { name: "venice" }, - }) - expect(result.sdk).toBeDefined() - }), - ) - - it.effect("uses the model provider ID as the bundled Venice SDK name", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const result = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("custom-venice"), ModelV2.ID.make("model")), - modelID: ModelV2.ID.make("model"), - package: "aisdk:test-provider", - }), - package: "venice-ai-sdk-provider", - options: { name: "custom-venice", apiKey: "test" }, - }) - expect(result.sdk).toBeDefined() - expect(result.sdk.languageModel("model").provider).toBe("custom-venice.chat") - }), - ) - - it.effect("only handles the bundled venice-ai-sdk-provider package", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - yield* addPlugin() - const similar = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("venice"), ModelV2.ID.make("model")), - modelID: ModelV2.ID.make("model"), - package: "aisdk:test-provider", - }), - package: "file:///tmp/venice-ai-sdk-provider.js", - options: { name: "venice" }, - }) - const other = yield* aisdk.runSDK({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("venice"), ModelV2.ID.make("model")), - modelID: ModelV2.ID.make("model"), - package: "aisdk:test-provider", - }), - package: "@ai-sdk/openai-compatible", - options: { name: "venice" }, - }) - expect(similar.sdk).toBeUndefined() - expect(other.sdk).toBeUndefined() - }), - ) - - it.effect("leaves Venice language selection to the default languageModel fallback", () => - Effect.gen(function* () { - const plugin = yield* PluginV2.Service - const aisdk = yield* AISDK.Service - const calls: string[] = [] - yield* addPlugin() - const result = yield* aisdk.runLanguage({ - model: ModelV2.Info.make({ - ...ModelV2.Info.empty(ProviderV2.ID.make("venice"), ModelV2.ID.make("alias")), - modelID: ModelV2.ID.make("alias"), - package: "aisdk:test-provider", - }), - sdk: fakeSelectorSdk(calls), - options: {}, - }) - expect(calls).toEqual([]) - expect(result.language).toBeUndefined() - }), - ) -})