diff --git a/src/shared/services/opencodeConfig.ts b/src/shared/services/opencodeConfig.ts index 65bd044f14..4e196163fa 100644 --- a/src/shared/services/opencodeConfig.ts +++ b/src/shared/services/opencodeConfig.ts @@ -4,14 +4,6 @@ type OpenCodeConfigInput = { model?: string; }; -type OpenCodeProviderConfig = { - name: string; - api: "openai"; - baseURL: string; - apiKey: string; - models: string[]; -}; - const OPENCODE_DEFAULT_MODELS = [ "claude-opus-4-5-thinking", "claude-sonnet-4-5-thinking", @@ -28,7 +20,7 @@ export const buildOpenCodeProviderConfig = ({ baseUrl, apiKey, model, -}: OpenCodeConfigInput): OpenCodeProviderConfig => { +}: OpenCodeConfigInput): Record => { const normalizedBaseUrl = String(baseUrl || "") .trim() .replace(/\/+$/, ""); @@ -36,12 +28,21 @@ export const buildOpenCodeProviderConfig = ({ const uniqueModels = [...new Set([normalizedModel, ...OPENCODE_DEFAULT_MODELS].filter(Boolean))]; + const modelsRecord: Record = {}; + for (const m of uniqueModels) { + if (m) { + modelsRecord[m] = { name: m }; + } + } + return { + npm: "@ai-sdk/openai-compatible", name: "OmniRoute", - api: "openai", - baseURL: normalizedBaseUrl, - apiKey: apiKey || "sk_omniroute", - models: uniqueModels, + options: { + baseURL: normalizedBaseUrl, + apiKey: apiKey || "sk_omniroute", + }, + models: modelsRecord, }; }; diff --git a/tests/unit/t40-opencode-cli-tools-integration.test.mjs b/tests/unit/t40-opencode-cli-tools-integration.test.mjs index f8d79dc477..ebd6c27963 100644 --- a/tests/unit/t40-opencode-cli-tools-integration.test.mjs +++ b/tests/unit/t40-opencode-cli-tools-integration.test.mjs @@ -49,9 +49,9 @@ test("T40: OpenCode config generator includes endpoint and selected API key", () apiKey: "sk_test_opencode", model: "claude-sonnet-4-5-thinking", }); - assert.equal(providerConfig.baseURL, "http://localhost:20128/v1"); - assert.equal(providerConfig.apiKey, "sk_test_opencode"); - assert.ok(providerConfig.models.includes("claude-sonnet-4-5-thinking")); + assert.equal(providerConfig.options.baseURL, "http://localhost:20128/v1"); + assert.equal(providerConfig.options.apiKey, "sk_test_opencode"); + assert.ok(providerConfig.models["claude-sonnet-4-5-thinking"]); const mergedConfig = mergeOpenCodeConfig( { provider: { custom: { name: "Custom Provider" } } }, @@ -62,8 +62,8 @@ test("T40: OpenCode config generator includes endpoint and selected API key", () } ); assert.ok(mergedConfig.provider.custom); - assert.equal(mergedConfig.provider.omniroute.baseURL, "http://localhost:20128/v1"); - assert.equal(mergedConfig.provider.omniroute.apiKey, "sk_test_opencode"); + assert.equal(mergedConfig.provider.omniroute.options.baseURL, "http://localhost:20128/v1"); + assert.equal(mergedConfig.provider.omniroute.options.apiKey, "sk_test_opencode"); }); test("T40: Windsurf card documents current official limitations honestly", () => {