refactor(core): remove ai sdk option fields

This commit is contained in:
Dax Raad 2026-06-03 10:41:26 -04:00
commit 06337878e4
41 changed files with 378 additions and 235 deletions

View file

@ -33,8 +33,8 @@ function context(
id: providerID,
enabled: provider.enabled,
apiKey:
typeof provider.options.aisdk.provider.apiKey === "string"
? provider.options.aisdk.provider.apiKey
typeof provider.options.body.apiKey === "string"
? provider.options.body.apiKey
: undefined,
})
},

View file

@ -33,7 +33,7 @@ describe("CatalogV2", () => {
package: "@ai-sdk/openai-compatible",
url: "https://default.example.com",
}
provider.options.aisdk.provider.baseURL = "https://override.example.com"
provider.options.body.baseURL = "https://override.example.com"
}),
)
@ -62,7 +62,7 @@ describe("CatalogV2", () => {
})
catalog.model.update(providerID, modelID, (model) => {
model.endpoint = { type: "aisdk", package: "@ai-sdk/openai-compatible", url: "https://model.example.com" }
model.options.aisdk.provider.baseURL = "https://override.example.com"
model.options.body.baseURL = "https://override.example.com"
})
})
@ -117,14 +117,14 @@ describe("CatalogV2", () => {
if (!item) return
seen.push(item.provider.endpoint.type)
if (item?.provider.endpoint.type === "aisdk") seen.push(item.provider.endpoint.url)
seen.push(item?.provider.options.aisdk.provider.baseURL)
seen.push(item?.provider.options.body.baseURL)
}),
}),
})
yield* transform((catalog) =>
catalog.provider.update(providerID, (provider) => {
provider.endpoint = { type: "aisdk", package: "@ai-sdk/openai-compatible" }
provider.options.aisdk.provider.baseURL = "https://provider.example.com"
provider.options.body.baseURL = "https://provider.example.com"
}),
)
@ -199,22 +199,22 @@ describe("CatalogV2", () => {
provider.options.headers.provider = "provider"
provider.options.headers.shared = "provider"
provider.options.body.provider = true
provider.options.aisdk.provider.provider = true
provider.options.body.provider = true
})
catalog.model.update(providerID, modelID, (model) => {
model.options.headers.model = "model"
model.options.headers.shared = "model"
model.options.body.model = true
model.options.aisdk.provider.model = true
model.options.aisdk.request.request = true
model.options.body.model = true
model.options.body.request = true
})
})
const model = yield* catalog.model.get(providerID, modelID)
expect(model.options.headers).toEqual({ provider: "provider", shared: "model", model: "model" })
expect(model.options.body).toEqual({ provider: true, model: true })
expect(model.options.aisdk.provider).toEqual({ provider: true, model: true })
expect(model.options.aisdk.request).toEqual({ request: true })
expect(model.options.body).toEqual({ provider: true, model: true })
expect(model.options.body).toEqual({ request: true })
}),
)

View file

@ -109,8 +109,7 @@ describe("ConfigAgentPlugin.Plugin", () => {
steps: 12,
options: {
headers: { first: "one", shared: "first" },
body: { enabled: true },
aisdk: { provider: { profile: "review" }, request: { effort: "medium" } },
body: { enabled: true, profile: "review", effort: "medium" },
},
},
},
@ -123,8 +122,7 @@ describe("ConfigAgentPlugin.Plugin", () => {
reviewer: {
options: {
headers: { shared: "last", second: "two" },
body: { retries: 2 },
aisdk: { request: { effort: "high" } },
body: { retries: 2, effort: "high" },
},
},
},
@ -151,8 +149,7 @@ describe("ConfigAgentPlugin.Plugin", () => {
})
expect(reviewer.options).toEqual({
headers: { first: "one", shared: "last", second: "two" },
body: { enabled: true, retries: 2 },
aisdk: { provider: { profile: "review" }, request: { effort: "high" } },
body: { enabled: true, profile: "review", retries: 2, effort: "high" },
})
}),
)

View file

@ -1,10 +1,12 @@
import path from "path"
import fs from "fs/promises"
import { describe, expect } from "bun:test"
import { Effect, Layer } from "effect"
import { Effect, Layer, Schema } from "effect"
import { FastCheck } from "effect/testing"
import { Config } from "@opencode-ai/core/config"
import { ConfigProvider } from "@opencode-ai/core/config/provider"
import { ConfigMigrateV1 } from "@opencode-ai/core/v1/config/migrate"
import { ConfigV1 } from "@opencode-ai/core/v1/config/config"
import { FSUtil } from "@opencode-ai/core/fs-util"
import { Global } from "@opencode-ai/core/global"
import { Location } from "@opencode-ai/core/location"
@ -45,10 +47,6 @@ const provider = {
options: {
headers: {},
body: {},
aisdk: {
provider: {},
request: {},
},
},
models: {},
}
@ -62,6 +60,17 @@ describe("Config", () => {
}),
)
it.effect("migrates arbitrary v1 configuration into valid v2 configuration", () =>
Effect.sync(() => {
FastCheck.assert(
FastCheck.property(Schema.toArbitrary(ConfigV1.Info), (info) => {
Schema.decodeUnknownSync(Config.Info)(ConfigMigrateV1.migrate(info), { errors: "all" })
}),
{ numRuns: 100 },
)
}),
)
it.live("returns an empty configuration when directory files do not exist", () =>
Effect.acquireRelease(
Effect.promise(() => tmpdir()),
@ -188,7 +197,7 @@ describe("Config", () => {
variant: "high",
options: {
headers: { "x-agent": "reviewer" },
aisdk: { request: { reasoningEffort: "high" } },
body: { reasoningEffort: "high" },
},
description: "Review changes for correctness",
system: "Find regressions.",
@ -271,7 +280,7 @@ describe("Config", () => {
variant: "high",
options: {
headers: { "x-agent": "reviewer" },
aisdk: { request: { reasoningEffort: "high" } },
body: { reasoningEffort: "high" },
},
description: "Review changes for correctness",
system: "Find regressions.",
@ -379,6 +388,24 @@ describe("Config", () => {
skills: { paths: ["./skills"], urls: ["https://example.com/.well-known/skills/"] },
reference: { docs: { path: "../docs" } },
attachment: { image: { auto_resize: false, max_width: 1200 } },
provider: {
custom: {
options: { apiKey: "secret" },
models: {
model: {
options: { reasoningEffort: "high" },
variants: { fast: { temperature: 0.2 } },
},
},
},
openai: {
npm: "@ai-sdk/openai",
options: { apiKey: "secret", organization: "org" },
models: {
model: { options: { reasoningEffort: "high", serviceTier: "priority" } },
},
},
},
compaction: { auto: true, tail_turns: 3, preserve_recent_tokens: 2000, reserved: 10000 },
experimental: { mcp_timeout: 5000 },
mcp: {
@ -420,6 +447,19 @@ describe("Config", () => {
expect(documents[0]?.info.skills).toEqual(["./skills", "https://example.com/.well-known/skills/"])
expect(documents[0]?.info.references).toEqual({ docs: { path: "../docs" } })
expect(documents[0]?.info.attachments).toEqual({ image: { auto_resize: false, max_width: 1200 } })
expect(documents[0]?.info.providers?.custom).toMatchObject({
options: { body: { apiKey: "secret" } },
models: {
model: {
options: { body: { reasoningEffort: "high" } },
variants: [{ id: "fast", body: { temperature: 0.2 } }],
},
},
})
expect(documents[0]?.info.providers?.openai).toMatchObject({
options: { headers: { Authorization: "Bearer secret", "OpenAI-Organization": "org" } },
models: { model: { options: { body: { reasoning_effort: "high", service_tier: "priority" } } } },
})
expect(documents[0]?.info.compaction).toEqual({
auto: true,
prune: undefined,

View file

@ -30,8 +30,7 @@ describe("AmazonBedrockPlugin", () => {
endpoint: { type: "aisdk", package: "@ai-sdk/amazon-bedrock" },
options: {
headers: {},
body: {},
aisdk: { provider: { endpoint: "https://bedrock.example" }, request: {} },
body: { endpoint: "https://bedrock.example" },
},
})
catalog.provider.update(bedrock.id, (item) => {
@ -45,7 +44,7 @@ describe("AmazonBedrockPlugin", () => {
package: "@ai-sdk/amazon-bedrock",
url: "https://bedrock.example",
})
expect(result.options.aisdk.provider.endpoint).toBeUndefined()
expect(result.options.body.endpoint).toBeUndefined()
}),
)

View file

@ -16,7 +16,7 @@ describe("AnthropicPlugin", () => {
yield* transform((catalog) => {
const item = provider("anthropic", {
endpoint: { type: "aisdk", package: "@ai-sdk/anthropic" },
options: { headers: { Existing: "1" }, body: {}, aisdk: { provider: {}, request: {} } },
options: { headers: { Existing: "1" }, body: {}, },
})
catalog.provider.update(item.id, (draft) => {
draft.endpoint = item.endpoint

View file

@ -25,8 +25,8 @@ describe("AzureCognitiveServicesPlugin", () => {
package: "@ai-sdk/openai-compatible",
url: "https://cognitive.cognitiveservices.azure.com/openai",
})
expect(result.options.aisdk.provider.baseURL).toBeUndefined()
expect(result.options.aisdk.provider.resourceName).toBeUndefined()
expect(result.options.body.baseURL).toBeUndefined()
expect(result.options.body.resourceName).toBeUndefined()
}),
),
)
@ -52,9 +52,9 @@ describe("AzureCognitiveServicesPlugin", () => {
})
const azure = yield* catalog.provider.get(ProviderV2.ID.make("azure-cognitive-services"))
const openai = yield* catalog.provider.get(ProviderV2.ID.openai)
expect(azure.options.aisdk.provider.baseURL).toBeUndefined()
expect(azure.options.body.baseURL).toBeUndefined()
expect(azure.endpoint).toEqual({ type: "aisdk", package: "@ai-sdk/openai-compatible" })
expect(openai.options.aisdk.provider.baseURL).toBeUndefined()
expect(openai.options.body.baseURL).toBeUndefined()
expect(openai.endpoint).toEqual({ type: "aisdk", package: "test-provider" })
}),
),

View file

@ -37,7 +37,7 @@ describe("AzurePlugin", () => {
item.endpoint = { type: "aisdk", package: "@ai-sdk/azure" }
})
})
expect((yield* catalog.provider.get(ProviderV2.ID.azure)).options.aisdk.provider.resourceName).toBe("from-env")
expect((yield* catalog.provider.get(ProviderV2.ID.azure)).options.body.resourceName).toBe("from-env")
}),
),
)
@ -52,7 +52,7 @@ describe("AzurePlugin", () => {
yield* transform((catalog) => {
const azure = provider("azure", {
endpoint: { type: "aisdk", package: "@ai-sdk/azure" },
options: { headers: {}, body: {}, aisdk: { provider: { resourceName: "from-config" }, request: {} } },
options: { headers: {}, body: { resourceName: "from-config" }, },
})
catalog.provider.update(azure.id, (item) => {
item.endpoint = azure.endpoint
@ -60,10 +60,10 @@ describe("AzurePlugin", () => {
})
catalog.provider.update(ProviderV2.ID.openai, () => {})
})
expect((yield* catalog.provider.get(ProviderV2.ID.azure)).options.aisdk.provider.resourceName).toBe(
expect((yield* catalog.provider.get(ProviderV2.ID.azure)).options.body.resourceName).toBe(
"from-config",
)
expect((yield* catalog.provider.get(ProviderV2.ID.openai)).options.aisdk.provider.resourceName).toBeUndefined()
expect((yield* catalog.provider.get(ProviderV2.ID.openai)).options.body.resourceName).toBeUndefined()
}),
),
)
@ -103,7 +103,7 @@ describe("AzurePlugin", () => {
item.endpoint = { type: "aisdk", package: "@ai-sdk/azure" }
})
})
expect((yield* catalog.provider.get(ProviderV2.ID.azure)).options.aisdk.provider.resourceName).toBe(
expect((yield* catalog.provider.get(ProviderV2.ID.azure)).options.body.resourceName).toBe(
"from-account",
)
}),
@ -120,14 +120,14 @@ describe("AzurePlugin", () => {
yield* transform((catalog) => {
const azure = provider("azure", {
endpoint: { type: "aisdk", package: "@ai-sdk/azure" },
options: { headers: {}, body: {}, aisdk: { provider: { resourceName: "" }, request: {} } },
options: { headers: {}, body: { resourceName: "" }, },
})
catalog.provider.update(azure.id, (item) => {
item.endpoint = azure.endpoint
item.options = azure.options
})
})
expect((yield* catalog.provider.get(ProviderV2.ID.azure)).options.aisdk.provider.resourceName).toBe("from-env")
expect((yield* catalog.provider.get(ProviderV2.ID.azure)).options.body.resourceName).toBe("from-env")
}),
),
)
@ -142,14 +142,14 @@ describe("AzurePlugin", () => {
yield* transform((catalog) => {
const azure = provider("azure", {
endpoint: { type: "aisdk", package: "@ai-sdk/azure" },
options: { headers: {}, body: {}, aisdk: { provider: { resourceName: " " }, request: {} } },
options: { headers: {}, body: { resourceName: " " }, },
})
catalog.provider.update(azure.id, (item) => {
item.endpoint = azure.endpoint
item.options = azure.options
})
})
expect((yield* catalog.provider.get(ProviderV2.ID.azure)).options.aisdk.provider.resourceName).toBe("from-env")
expect((yield* catalog.provider.get(ProviderV2.ID.azure)).options.body.resourceName).toBe("from-env")
}),
),
)
@ -227,7 +227,7 @@ describe("AzurePlugin", () => {
"aisdk.language",
{
model: model("azure", "deployment", {
options: { headers: {}, body: {}, aisdk: { provider: {}, request: { useCompletionUrls: true } } },
options: { headers: {}, body: { useCompletionUrls: true }, },
}),
sdk: fakeSelectorSdk(calls),
options: {},

View file

@ -174,7 +174,7 @@ describe("CloudflareWorkersAIPlugin", () => {
yield* transform((catalog) =>
catalog.provider.update(ProviderV2.ID.make("cloudflare-workers-ai"), (provider) => {
provider.endpoint = { type: "aisdk", package: "test-provider" }
provider.options.aisdk.provider.accountId = "configured-acct"
provider.options.body.accountId = "configured-acct"
}),
)
expect((yield* catalog.provider.get(ProviderV2.ID.make("cloudflare-workers-ai"))).endpoint).toEqual({

View file

@ -190,7 +190,7 @@ describe("GitLabPlugin", () => {
{
model: model("gitlab", "claude"),
package: "gitlab-ai-provider",
options: provider.options.aisdk.provider,
options: provider.options.body,
},
{},
)
@ -238,7 +238,7 @@ describe("GitLabPlugin", () => {
{
model: model("gitlab", "claude"),
package: "gitlab-ai-provider",
options: provider.options.aisdk.provider,
options: provider.options.body,
},
{},
)
@ -258,8 +258,7 @@ describe("GitLabPlugin", () => {
model: model("gitlab", "duo-workflow-custom", {
options: {
headers: {},
body: {},
aisdk: { provider: {}, request: { workflowRef: "ref", workflowDefinition: "definition" } },
body: { workflowRef: "ref", workflowDefinition: "definition" },
},
}),
sdk: {
@ -322,8 +321,7 @@ describe("GitLabPlugin", () => {
model: model("gitlab", "duo-workflow-custom", {
options: {
headers: {},
body: {},
aisdk: { provider: {}, request: { featureFlags: { request_flag: true } } },
body: { featureFlags: { request_flag: true } },
},
}),
sdk: {
@ -350,7 +348,7 @@ describe("GitLabPlugin", () => {
"aisdk.language",
{
model: model("gitlab", "claude", {
options: { headers: { h: "v" }, body: {}, aisdk: { provider: {}, request: {} } },
options: { headers: { h: "v" }, body: {}, },
}),
sdk: {
workflowChat: () => undefined,

View file

@ -29,8 +29,8 @@ describe("GoogleVertexAnthropicPlugin", () => {
}),
)
const provider = yield* catalog.provider.get(ProviderV2.ID.make("google-vertex-anthropic"))
expect(provider.options.aisdk.provider.project).toBe("cloud-project")
expect(provider.options.aisdk.provider.location).toBe("cloud-location")
expect(provider.options.body.project).toBe("cloud-project")
expect(provider.options.body.location).toBe("cloud-location")
}),
),
)
@ -45,13 +45,13 @@ describe("GoogleVertexAnthropicPlugin", () => {
yield* transform((catalog) =>
catalog.provider.update(ProviderV2.ID.make("google-vertex-anthropic"), (provider) => {
provider.endpoint = { type: "aisdk", package: "@ai-sdk/google-vertex/anthropic" }
provider.options.aisdk.provider.project = "configured-project"
provider.options.aisdk.provider.location = "configured-location"
provider.options.body.project = "configured-project"
provider.options.body.location = "configured-location"
}),
)
const provider = yield* catalog.provider.get(ProviderV2.ID.make("google-vertex-anthropic"))
expect(provider.options.aisdk.provider.project).toBe("configured-project")
expect(provider.options.aisdk.provider.location).toBe("configured-location")
expect(provider.options.body.project).toBe("configured-project")
expect(provider.options.body.location).toBe("configured-location")
}),
),
)

View file

@ -61,8 +61,8 @@ describe("GoogleVertexPlugin", () => {
}),
)
const provider = yield* catalog.provider.get(ProviderV2.ID.make("google-vertex"))
expect(provider.options.aisdk.provider.project).toBe("google-cloud-project")
expect(provider.options.aisdk.provider.location).toBe("google-vertex-location")
expect(provider.options.body.project).toBe("google-cloud-project")
expect(provider.options.body.location).toBe("google-vertex-location")
expect(provider.endpoint).toEqual({
type: "aisdk",
package: "@ai-sdk/openai-compatible",
@ -112,7 +112,7 @@ describe("GoogleVertexPlugin", () => {
{},
)
expect(provider.options.aisdk.provider.project).toBe("vertex-project")
expect(provider.options.body.project).toBe("vertex-project")
expect(provider.endpoint).toEqual({
type: "aisdk",
package: "@ai-sdk/openai-compatible",
@ -147,13 +147,13 @@ describe("GoogleVertexPlugin", () => {
package: "@ai-sdk/openai-compatible",
url: "https://${GOOGLE_VERTEX_ENDPOINT}/v1/projects/${GOOGLE_VERTEX_PROJECT}/locations/${GOOGLE_VERTEX_LOCATION}",
}
provider.options.aisdk.provider.project = "config-project"
provider.options.aisdk.provider.location = "global"
provider.options.body.project = "config-project"
provider.options.body.location = "global"
}),
)
const provider = yield* catalog.provider.get(ProviderV2.ID.make("google-vertex"))
expect(provider.options.aisdk.provider.project).toBe("config-project")
expect(provider.options.aisdk.provider.location).toBe("global")
expect(provider.options.body.project).toBe("config-project")
expect(provider.options.body.location).toBe("global")
expect(provider.endpoint).toEqual({
type: "aisdk",
package: "@ai-sdk/openai-compatible",
@ -176,8 +176,8 @@ describe("GoogleVertexPlugin", () => {
package: "@ai-sdk/openai-compatible",
url: "https://${GOOGLE_VERTEX_ENDPOINT}/v1/projects/${GOOGLE_VERTEX_PROJECT}/locations/${GOOGLE_VERTEX_LOCATION}",
}
provider.options.aisdk.provider.project = "config-project"
provider.options.aisdk.provider.location = "eu"
provider.options.body.project = "config-project"
provider.options.body.location = "eu"
}),
)
const provider = yield* catalog.provider.get(ProviderV2.ID.make("google-vertex"))
@ -208,12 +208,12 @@ describe("GoogleVertexPlugin", () => {
yield* transform((catalog) =>
catalog.provider.update(ProviderV2.ID.make("google-vertex"), (provider) => {
provider.endpoint = { type: "aisdk", package: "@ai-sdk/google-vertex" }
provider.options.aisdk.provider.project = "config-project"
provider.options.body.project = "config-project"
}),
)
const provider = yield* catalog.provider.get(ProviderV2.ID.make("google-vertex"))
expect(provider.options.aisdk.provider.project).toBe("config-project")
expect(provider.options.aisdk.provider.location).toBe("us-central1")
expect(provider.options.body.project).toBe("config-project")
expect(provider.options.body.location).toBe("us-central1")
}),
),
)

View file

@ -58,11 +58,7 @@ describe("GooglePlugin", () => {
},
options: {
headers: {},
body: {},
aisdk: {
provider: { apiKey: "test" },
request: {},
},
body: { apiKey: "test" },
},
}),
)

View file

@ -89,11 +89,7 @@ describe("GroqPlugin", () => {
},
options: {
headers: {},
body: {},
aisdk: {
provider: { apiKey: "test" },
request: {},
},
body: { apiKey: "test" },
},
}),
)

View file

@ -65,10 +65,6 @@ export function provider(providerID: string, options?: Partial<ProviderV2.Info>)
options: {
headers: {},
body: {},
aisdk: {
provider: {},
request: {},
},
...options?.options,
},
})
@ -86,10 +82,6 @@ export function model(providerID: string, modelID: string, options?: Partial<Mod
options: {
headers: {},
body: {},
aisdk: {
provider: {},
request: {},
},
...options?.options,
},
})

View file

@ -26,7 +26,7 @@ describe("KiloPlugin", () => {
yield* transform((catalog) => {
const kilo = provider("kilo", {
endpoint: { type: "aisdk", package: "@ai-sdk/openai-compatible", url: "https://api.kilo.ai/api/gateway" },
options: { headers: { Existing: "value" }, body: {}, aisdk: { provider: {}, request: {} } },
options: { headers: { Existing: "value" }, body: {}, },
})
catalog.provider.update(kilo.id, (draft) => {
draft.endpoint = kilo.endpoint

View file

@ -27,7 +27,7 @@ describe("LLMGatewayPlugin", () => {
const llmgateway = provider("llmgateway", {
enabled: { via: "env", name: "LLMGATEWAY_API_KEY" },
endpoint: { type: "aisdk", package: "@ai-sdk/openai-compatible", url: "https://api.llmgateway.io/v1" },
options: { headers: { Existing: "value" }, body: {}, aisdk: { provider: {}, request: {} } },
options: { headers: { Existing: "value" }, body: {}, },
})
catalog.provider.update(llmgateway.id, (draft) => {
draft.enabled = llmgateway.enabled

View file

@ -26,7 +26,7 @@ describe("NvidiaPlugin", () => {
yield* transform((catalog) => {
const nvidia = provider("nvidia", {
endpoint: { type: "aisdk", package: "@ai-sdk/openai-compatible", url: "https://integrate.api.nvidia.com/v1" },
options: { headers: { Existing: "value" }, body: {}, aisdk: { provider: {}, request: {} } },
options: { headers: { Existing: "value" }, body: {}, },
})
catalog.provider.update(nvidia.id, (draft) => {
draft.endpoint = nvidia.endpoint
@ -53,7 +53,7 @@ describe("NvidiaPlugin", () => {
yield* transform((catalog) => {
const item = provider("nvidia", {
endpoint: { type: "aisdk", package: "@ai-sdk/openai-compatible", url: "https://integrate.api.nvidia.com/v1" },
options: { headers: {}, body: {}, aisdk: { provider: {}, request: {} } },
options: { headers: {}, body: {}, },
})
catalog.provider.update(item.id, (draft) => {
draft.endpoint = item.endpoint
@ -80,8 +80,7 @@ describe("NvidiaPlugin", () => {
endpoint: { type: "aisdk", package: "@ai-sdk/openai-compatible", url: "https://integrate.api.nvidia.com/v1" },
options: {
headers: { "X-BILLING-INVOKE-ORIGIN": "CustomOrigin" },
body: {},
aisdk: { provider: { baseURL: "https://integrate.api.nvidia.com/v1" }, request: {} },
body: { baseURL: "https://integrate.api.nvidia.com/v1" },
},
})
catalog.provider.update(item.id, (draft) => {

View file

@ -33,7 +33,7 @@ describe("OpencodePlugin", () => {
draft.cost = [...paid.cost]
})
})
expect((yield* catalog.provider.get(ProviderV2.ID.opencode)).options.aisdk.provider.apiKey).toBe("public")
expect((yield* catalog.provider.get(ProviderV2.ID.opencode)).options.body.apiKey).toBe("public")
expect((yield* catalog.model.get(ProviderV2.ID.opencode, ModelV2.ID.make("paid"))).enabled).toBe(false)
}),
),
@ -54,7 +54,7 @@ describe("OpencodePlugin", () => {
draft.cost = [...free.cost]
})
})
expect((yield* catalog.provider.get(ProviderV2.ID.opencode)).options.aisdk.provider.apiKey).toBe("public")
expect((yield* catalog.provider.get(ProviderV2.ID.opencode)).options.body.apiKey).toBe("public")
expect((yield* catalog.model.get(ProviderV2.ID.opencode, ModelV2.ID.make("free"))).enabled).toBe(true)
}),
),
@ -75,7 +75,7 @@ describe("OpencodePlugin", () => {
draft.cost = [...outputOnly.cost]
})
})
expect((yield* catalog.provider.get(ProviderV2.ID.opencode)).options.aisdk.provider.apiKey).toBe("public")
expect((yield* catalog.provider.get(ProviderV2.ID.opencode)).options.body.apiKey).toBe("public")
expect((yield* catalog.model.get(ProviderV2.ID.opencode, ModelV2.ID.make("output-only"))).enabled).toBe(true)
}),
),
@ -96,7 +96,7 @@ describe("OpencodePlugin", () => {
draft.cost = [...paid.cost]
})
})
expect((yield* catalog.provider.get(ProviderV2.ID.opencode)).options.aisdk.provider.apiKey).toBeUndefined()
expect((yield* catalog.provider.get(ProviderV2.ID.opencode)).options.body.apiKey).toBeUndefined()
expect((yield* catalog.model.get(ProviderV2.ID.opencode, ModelV2.ID.make("paid"))).enabled).toBe(true)
}),
),
@ -119,7 +119,7 @@ describe("OpencodePlugin", () => {
draft.cost = [...paid.cost]
})
})
expect((yield* catalog.provider.get(ProviderV2.ID.opencode)).options.aisdk.provider.apiKey).toBeUndefined()
expect((yield* catalog.provider.get(ProviderV2.ID.opencode)).options.body.apiKey).toBeUndefined()
expect((yield* catalog.model.get(ProviderV2.ID.opencode, ModelV2.ID.make("paid"))).enabled).toBe(true)
}),
),
@ -136,11 +136,7 @@ describe("OpencodePlugin", () => {
const item = provider("opencode", {
options: {
headers: {},
body: {},
aisdk: {
provider: { apiKey: "configured" },
request: {},
},
body: { apiKey: "configured" },
},
})
catalog.provider.update(item.id, (draft) => {
@ -151,7 +147,7 @@ describe("OpencodePlugin", () => {
draft.cost = [...paid.cost]
})
})
expect((yield* catalog.provider.get(ProviderV2.ID.opencode)).options.aisdk.provider.apiKey).toBe("configured")
expect((yield* catalog.provider.get(ProviderV2.ID.opencode)).options.body.apiKey).toBe("configured")
expect((yield* catalog.model.get(ProviderV2.ID.opencode, ModelV2.ID.make("paid"))).enabled).toBe(true)
}),
),
@ -174,7 +170,7 @@ describe("OpencodePlugin", () => {
draft.cost = [...paid.cost]
})
})
expect((yield* catalog.provider.get(ProviderV2.ID.opencode)).options.aisdk.provider.apiKey).toBeUndefined()
expect((yield* catalog.provider.get(ProviderV2.ID.opencode)).options.body.apiKey).toBeUndefined()
expect((yield* catalog.model.get(ProviderV2.ID.opencode, ModelV2.ID.make("paid"))).enabled).toBe(true)
}),
),
@ -195,7 +191,7 @@ describe("OpencodePlugin", () => {
draft.cost = [...paid.cost]
})
})
expect((yield* catalog.provider.get(ProviderV2.ID.openai)).options.aisdk.provider.apiKey).toBeUndefined()
expect((yield* catalog.provider.get(ProviderV2.ID.openai)).options.body.apiKey).toBeUndefined()
expect((yield* catalog.model.get(ProviderV2.ID.openai, ModelV2.ID.make("paid"))).enabled).toBe(true)
}),
),

View file

@ -27,7 +27,7 @@ describe("OpenRouterPlugin", () => {
yield* transform((catalog) => {
const openrouter = provider("openrouter", {
endpoint: { type: "aisdk", package: "@openrouter/ai-sdk-provider" },
options: { headers: { Existing: "value" }, body: {}, aisdk: { provider: {}, request: {} } },
options: { headers: { Existing: "value" }, body: {}, },
})
catalog.provider.update(openrouter.id, (item) => {
item.endpoint = openrouter.endpoint

View file

@ -16,7 +16,7 @@ describe("VercelPlugin", () => {
yield* transform((catalog) => {
const item = provider("vercel", {
endpoint: { type: "aisdk", package: "@ai-sdk/vercel" },
options: { headers: { Existing: "1" }, body: {}, aisdk: { provider: {}, request: {} } },
options: { headers: { Existing: "1" }, body: {}, },
})
catalog.provider.update(item.id, (draft) => {
draft.endpoint = item.endpoint

View file

@ -46,7 +46,7 @@ describe("ZenmuxPlugin", () => {
yield* transform((catalog) => {
const item = provider("zenmux", {
endpoint: { type: "aisdk", package: "@ai-sdk/openai-compatible", url: "https://zenmux.ai/api/v1" },
options: { headers: { Existing: "value" }, body: {}, aisdk: { provider: {}, request: {} } },
options: { headers: { Existing: "value" }, body: {}, },
})
catalog.provider.update(item.id, (draft) => {
draft.endpoint = item.endpoint
@ -74,7 +74,6 @@ describe("ZenmuxPlugin", () => {
options: {
headers: { "HTTP-Referer": "https://example.com/", "X-Title": "custom-title" },
body: {},
aisdk: { provider: {}, request: {} },
},
})
catalog.provider.update(item.id, (draft) => {
@ -101,7 +100,6 @@ describe("ZenmuxPlugin", () => {
options: {
headers: { "HTTP-Referer": "https://example.com/", "X-Title": "custom-title" },
body: {},
aisdk: { provider: {}, request: {} },
},
})
catalog.provider.update(item.id, (draft) => {