212 lines
6.6 KiB
TypeScript
212 lines
6.6 KiB
TypeScript
import { describe, expect, test } from "bun:test"
|
|
import { ConfigProviderOptionsV1 } from "@opencode-ai/core/v1/config/provider-options"
|
|
|
|
describe("ConfigProviderOptionsV1", () => {
|
|
test("keeps raw provider and request options unchanged", () => {
|
|
const lowerer = ConfigProviderOptionsV1.get("custom-provider")
|
|
|
|
expect(lowerer.provider({ apiKey: "secret", headers: { "x-test": "1" }, nested: { camelCase: true } })).toEqual({
|
|
body: { apiKey: "secret", headers: { "x-test": "1" }, nested: { camelCase: true } },
|
|
})
|
|
expect(lowerer.request({ nested: { camelCase: true } })).toEqual({ nested: { camelCase: true } })
|
|
})
|
|
|
|
test("falls back to raw lowering for prototype property package names", () => {
|
|
expect(ConfigProviderOptionsV1.get("toString").provider({ enabled: true })).toEqual({ body: { enabled: true } })
|
|
})
|
|
|
|
test("lowers OpenAI provider and request options", () => {
|
|
const lowerer = ConfigProviderOptionsV1.get("@ai-sdk/openai")
|
|
|
|
expect(
|
|
lowerer.provider({
|
|
apiKey: "secret",
|
|
baseURL: "https://openai.example/v1",
|
|
organization: "org",
|
|
project: "project",
|
|
headers: { "x-test": "1" },
|
|
body: { store: true },
|
|
timeout: 1000,
|
|
}),
|
|
).toEqual({
|
|
url: "https://openai.example/v1",
|
|
headers: {
|
|
Authorization: "Bearer secret",
|
|
"OpenAI-Organization": "org",
|
|
"OpenAI-Project": "project",
|
|
"x-test": "1",
|
|
},
|
|
body: { store: true },
|
|
settings: { timeout: 1000 },
|
|
})
|
|
expect(lowerer.request({ reasoningEffort: "high", nestedValue: { camelCase: true } })).toEqual({
|
|
reasoning_effort: "high",
|
|
nested_value: { camel_case: true },
|
|
})
|
|
})
|
|
|
|
test("lowers Anthropic provider and request options", () => {
|
|
const lowerer = ConfigProviderOptionsV1.get("@ai-sdk/anthropic")
|
|
|
|
expect(
|
|
lowerer.provider({
|
|
apiKey: "secret",
|
|
authToken: "token",
|
|
baseURL: "https://anthropic.example",
|
|
headers: { "x-test": "1" },
|
|
body: { beta: true },
|
|
generateId: "custom",
|
|
}),
|
|
).toEqual({
|
|
url: "https://anthropic.example",
|
|
headers: { "x-api-key": "secret", Authorization: "Bearer token", "x-test": "1" },
|
|
body: { beta: true },
|
|
settings: { generateId: "custom" },
|
|
})
|
|
expect(
|
|
lowerer.request({
|
|
effort: "high",
|
|
taskBudget: 1024,
|
|
metadata: { userId: "user", traceId: "trace" },
|
|
nestedValue: { camelCase: true },
|
|
}),
|
|
).toEqual({
|
|
output_config: { effort: "high", task_budget: 1024 },
|
|
metadata: { user_id: "user", trace_id: "trace" },
|
|
nested_value: { camel_case: true },
|
|
})
|
|
})
|
|
|
|
test("lowers Google provider and request options", () => {
|
|
const lowerer = ConfigProviderOptionsV1.get("@ai-sdk/google")
|
|
|
|
expect(
|
|
lowerer.provider({
|
|
apiKey: "secret",
|
|
baseURL: "https://google.example",
|
|
headers: { "x-test": "1" },
|
|
body: { trace: true },
|
|
project: "project",
|
|
}),
|
|
).toEqual({
|
|
url: "https://google.example",
|
|
headers: { "x-goog-api-key": "secret", "x-test": "1" },
|
|
body: { trace: true },
|
|
settings: { project: "project" },
|
|
})
|
|
expect(
|
|
lowerer.request({
|
|
thinkingConfig: { thinkingBudget: 1024 },
|
|
responseModalities: ["TEXT"],
|
|
mediaResolution: "high",
|
|
imageConfig: { aspectRatio: "16:9" },
|
|
safetySettings: ["safe"],
|
|
}),
|
|
).toEqual({
|
|
safetySettings: ["safe"],
|
|
generationConfig: {
|
|
thinkingConfig: { thinkingBudget: 1024 },
|
|
responseModalities: ["TEXT"],
|
|
mediaResolution: "high",
|
|
imageConfig: { aspectRatio: "16:9" },
|
|
},
|
|
})
|
|
})
|
|
|
|
test("lowers Azure provider options and uses OpenAI request lowering", () => {
|
|
const lowerer = ConfigProviderOptionsV1.get("@ai-sdk/azure")
|
|
|
|
expect(
|
|
lowerer.provider({
|
|
apiKey: "secret",
|
|
baseURL: "https://azure.example",
|
|
headers: { "x-test": "1" },
|
|
body: { trace: true },
|
|
resourceName: "resource",
|
|
}),
|
|
).toEqual({
|
|
url: "https://azure.example",
|
|
headers: { "api-key": "secret", "x-test": "1" },
|
|
body: { trace: true },
|
|
settings: { resourceName: "resource" },
|
|
})
|
|
expect(lowerer.request({ reasoningEffort: "high" })).toEqual({ reasoning_effort: "high" })
|
|
})
|
|
|
|
test("lowers Amazon Bedrock provider and request options", () => {
|
|
const lowerer = ConfigProviderOptionsV1.get("@ai-sdk/amazon-bedrock")
|
|
|
|
expect(
|
|
lowerer.provider({
|
|
headers: { "x-test": "1" },
|
|
body: { trace: true },
|
|
region: "us-east-1",
|
|
profile: "dev",
|
|
}),
|
|
).toEqual({
|
|
headers: { "x-test": "1" },
|
|
body: { trace: true },
|
|
settings: { region: "us-east-1", profile: "dev" },
|
|
})
|
|
expect(lowerer.request({ temperature: 0.2 })).toEqual({
|
|
additionalModelRequestFields: { temperature: 0.2 },
|
|
})
|
|
})
|
|
|
|
test("lowers OpenAI-compatible provider and request options", () => {
|
|
const lowerer = ConfigProviderOptionsV1.get("@ai-sdk/openai-compatible")
|
|
|
|
expect(
|
|
lowerer.provider({
|
|
baseURL: "https://compatible.example/v1",
|
|
headers: { "x-test": "1" },
|
|
body: { trace: true },
|
|
apiKey: "secret",
|
|
}),
|
|
).toEqual({
|
|
url: "https://compatible.example/v1",
|
|
headers: { "x-test": "1" },
|
|
body: { trace: true },
|
|
settings: { apiKey: "secret" },
|
|
})
|
|
expect(lowerer.request({ reasoningEffort: "high", serviceTier: "priority" })).toEqual({
|
|
reasoning_effort: "high",
|
|
serviceTier: "priority",
|
|
})
|
|
})
|
|
|
|
test.each([
|
|
"@ai-sdk/cerebras",
|
|
"@ai-sdk/deepinfra",
|
|
"@ai-sdk/groq",
|
|
"@ai-sdk/mistral",
|
|
"@ai-sdk/togetherai",
|
|
"@ai-sdk/xai",
|
|
"@openrouter/ai-sdk-provider",
|
|
"ai-gateway-provider",
|
|
"venice-ai-sdk-provider",
|
|
])("uses OpenAI-compatible lowering for %s", (packageName) => {
|
|
const lowerer = ConfigProviderOptionsV1.get(packageName)
|
|
|
|
expect(lowerer.provider({ baseURL: "https://example.test", apiKey: "secret" })).toEqual({
|
|
url: "https://example.test",
|
|
headers: undefined,
|
|
body: undefined,
|
|
settings: { apiKey: "secret" },
|
|
})
|
|
expect(lowerer.request({ reasoningEffort: "high" })).toEqual({ reasoning_effort: "high" })
|
|
})
|
|
|
|
test.each(["@ai-sdk/google-vertex", "@ai-sdk/google-vertex/anthropic"])(
|
|
"uses provider family lowering for %s",
|
|
(packageName) => {
|
|
const lowerer = ConfigProviderOptionsV1.get(packageName)
|
|
|
|
expect(lowerer.provider({ baseURL: "https://example.test", profile: "dev" })).toMatchObject({
|
|
url: "https://example.test",
|
|
settings: { profile: "dev" },
|
|
})
|
|
},
|
|
)
|
|
})
|