| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- import { AISDK } from "@opencode-ai/core/aisdk"
- 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 { OpenAICompatiblePlugin } from "@opencode-ai/core/plugin/provider/openai-compatible"
- 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* OpenAICompatiblePlugin.effect(host)
- })
- describe("OpenAICompatiblePlugin", () => {
- it.effect("preserves explicit includeUsage false and defaults it to true", () =>
- Effect.gen(function* () {
- const plugin = yield* PluginV2.Service
- const aisdk = yield* AISDK.Service
- yield* addPlugin()
- const defaulted = yield* aisdk.runSDK({
- model: ModelV2.Info.make({
- ...ModelV2.Info.empty(ProviderV2.ID.make("custom"), ModelV2.ID.make("model")),
- api: { id: ModelV2.ID.make("model"), type: "aisdk", package: "test-provider" },
- }),
- package: "@ai-sdk/openai-compatible",
- options: { name: "custom" },
- })
- const disabled = yield* aisdk.runSDK({
- model: ModelV2.Info.make({
- ...ModelV2.Info.empty(ProviderV2.ID.make("custom"), ModelV2.ID.make("model")),
- api: { id: ModelV2.ID.make("model"), type: "aisdk", package: "test-provider" },
- }),
- package: "@ai-sdk/openai-compatible",
- options: { name: "custom", includeUsage: false },
- })
- expect(defaulted.options.includeUsage).toBe(true)
- expect(disabled.options.includeUsage).toBe(false)
- }),
- )
- it.effect("defaults includeUsage for OpenAI-compatible package matches", () =>
- 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"), ModelV2.ID.make("model")),
- api: { id: ModelV2.ID.make("model"), type: "aisdk", package: "test-provider" },
- }),
- package: "file:///tmp/@ai-sdk/openai-compatible-provider.js",
- options: { name: "custom" },
- })
- expect(result.options.includeUsage).toBe(true)
- }),
- )
- it.effect("uses the provider ID as the OpenAI-compatible provider name", () =>
- Effect.gen(function* () {
- const plugin = yield* PluginV2.Service
- const aisdk = yield* AISDK.Service
- const observed: string[] = []
- yield* addPlugin()
- yield* aisdk.hook.sdk((event) =>
- Effect.sync(() => {
- observed.push(event.sdk.languageModel("model").provider)
- }),
- )
- yield* aisdk.runSDK({
- model: ModelV2.Info.make({
- ...ModelV2.Info.empty(ProviderV2.ID.make("custom-provider"), ModelV2.ID.make("model")),
- api: { id: ModelV2.ID.make("model"), type: "aisdk", package: "test-provider" },
- }),
- package: "@ai-sdk/openai-compatible",
- options: { name: "custom-provider", baseURL: "https://example.com/v1" },
- })
- expect(observed).toEqual(["custom-provider.chat"])
- }),
- )
- it.effect("does not overwrite an SDK created by an earlier provider-specific plugin", () =>
- Effect.gen(function* () {
- const aisdk = yield* AISDK.Service
- const sentinel = { languageModel: (modelID: string) => ({ modelID }) }
- yield* aisdk.hook.sdk((event) => {
- event.sdk = sentinel
- })
- yield* addPlugin()
- const result = yield* aisdk.runSDK({
- model: ModelV2.Info.make({
- ...ModelV2.Info.empty(ProviderV2.ID.make("cloudflare-workers-ai"), ModelV2.ID.make("model")),
- api: { id: ModelV2.ID.make("model"), type: "aisdk", package: "test-provider" },
- }),
- package: "@ai-sdk/openai-compatible",
- options: { name: "cloudflare-workers-ai" },
- })
- expect(result.sdk).toBe(sentinel)
- }),
- )
- })
|