From 7c2199d84a5830f70a8250731a42ff958145b4d6 Mon Sep 17 00:00:00 2001 From: far-ouq <125839498+far-ouq@users.noreply.github.com> Date: Sat, 5 Sep 2026 19:29:29 -0400 Subject: [PATCH] fix(opencode): add GitLab reasoning variants (#47306) --- bun.lock | 6 +++--- packages/core/package.json | 2 +- packages/opencode/package.json | 2 +- packages/opencode/src/provider/transform.ts | 5 ++++- .../opencode/test/provider/transform.test.ts | 18 ++++++++++++++++-- 5 files changed, 25 insertions(+), 8 deletions(-) diff --git a/bun.lock b/bun.lock index 12e2a52f1b..ac048b9715 100644 --- a/bun.lock +++ b/bun.lock @@ -341,7 +341,7 @@ "drizzle-orm": "catalog:", "effect": "catalog:", "fuzzysort": "3.1.0", - "gitlab-ai-provider": "6.13.0", + "gitlab-ai-provider": "6.14.0", "glob": "13.0.5", "google-auth-library": "10.5.0", "gray-matter": "4.0.3", @@ -634,7 +634,7 @@ "drizzle-orm": "catalog:", "effect": "catalog:", "fuzzysort": "3.1.0", - "gitlab-ai-provider": "6.13.0", + "gitlab-ai-provider": "6.14.0", "glob": "13.0.5", "google-auth-library": "10.5.0", "gray-matter": "4.0.3", @@ -3845,7 +3845,7 @@ "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="], - "gitlab-ai-provider": ["gitlab-ai-provider@6.13.0", "", { "dependencies": { "@anthropic-ai/sdk": "^0.71.0", "@anycable/core": "^0.9.2", "graphql-request": "^6.1.0", "isomorphic-ws": "^5.0.0", "openai": "^6.16.0", "socket.io-client": "^4.8.1", "vscode-jsonrpc": "^8.2.1", "zod": "^3.25.76" }, "peerDependencies": { "@ai-sdk/provider": ">=3.0.0", "@ai-sdk/provider-utils": ">=4.0.0" } }, "sha512-JDZhNjvoiB7xBfesNegXNDg6ItKf9M2l8/DifuIyuvYmGgaZnDDbl89QrOKSoIzAOpo/+3Om0qviBPm84nGEbg=="], + "gitlab-ai-provider": ["gitlab-ai-provider@6.14.0", "", { "dependencies": { "@anthropic-ai/sdk": "^0.71.0", "@anycable/core": "^0.9.2", "graphql-request": "^6.1.0", "isomorphic-ws": "^5.0.0", "openai": "^6.16.0", "socket.io-client": "^4.8.1", "vscode-jsonrpc": "^8.2.1", "zod": "^3.25.76" }, "peerDependencies": { "@ai-sdk/provider": ">=3.0.0", "@ai-sdk/provider-utils": ">=4.0.0" } }, "sha512-qTkmFhcHXH0tjQN6i5D2lz9OpmYN0lwJdmFIXlsmy6IiYVV2dmsqMemlDNjpE5M8gdSC+61n4mByPzVsyBu0lg=="], "glob": ["glob@13.0.5", "", { "dependencies": { "minimatch": "^10.2.1", "minipass": "^7.1.2", "path-scurry": "^2.0.0" } }, "sha512-BzXxZg24Ibra1pbQ/zE7Kys4Ua1ks7Bn6pKLkVPZ9FZe4JQS6/Q7ef3LG1H+k7lUf5l4T3PLSyYyYJVYUvfgTw=="], diff --git a/packages/core/package.json b/packages/core/package.json index 276b0fe8f7..5e6ccd4c47 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -108,7 +108,7 @@ "drizzle-orm": "catalog:", "effect": "catalog:", "fuzzysort": "3.1.0", - "gitlab-ai-provider": "6.13.0", + "gitlab-ai-provider": "6.14.0", "glob": "13.0.5", "google-auth-library": "10.5.0", "gray-matter": "4.0.3", diff --git a/packages/opencode/package.json b/packages/opencode/package.json index b5c8e1d3ac..4d3710b62c 100644 --- a/packages/opencode/package.json +++ b/packages/opencode/package.json @@ -120,7 +120,7 @@ "drizzle-orm": "catalog:", "effect": "catalog:", "fuzzysort": "3.1.0", - "gitlab-ai-provider": "6.13.0", + "gitlab-ai-provider": "6.14.0", "glob": "13.0.5", "google-auth-library": "10.5.0", "gray-matter": "4.0.3", diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts index 89b9c88ae3..f0be2d1537 100644 --- a/packages/opencode/src/provider/transform.ts +++ b/packages/opencode/src/provider/transform.ts @@ -1824,11 +1824,14 @@ function reasoningEffort(model: Provider.Model, effort: string) { case "ai-gateway-provider": case "merge-gateway-ai-sdk-provider": return { reasoningEffort: effort } + case "gitlab-ai-provider": + if (model.family?.startsWith("gpt")) return { reasoningEffort: effort } + if (model.family?.startsWith("claude")) return { thinking: { type: "adaptive", effort } } + return case "@ai-sdk/cohere": case "@ai-sdk/perplexity": case "@ai-sdk/vercel": case "@ai-sdk/alibaba": - case "gitlab-ai-provider": return } } diff --git a/packages/opencode/test/provider/transform.test.ts b/packages/opencode/test/provider/transform.test.ts index 9d767581b7..2f3e4a10c6 100644 --- a/packages/opencode/test/provider/transform.test.ts +++ b/packages/opencode/test/provider/transform.test.ts @@ -3798,10 +3798,11 @@ describe("ProviderTransform sampling defaults - DeepSeek", () => { describe("ProviderTransform.reasoningVariants", () => { const model = (reasoning_options: ModelsDev.Model["reasoning_options"]) => ({ reasoning_options }) as ModelsDev.Model - const target = (npm: string, id = "test-model") => + const target = (npm: string, id = "test-model", family = "") => ({ id, providerID: "test", + family, api: { id, npm, url: "" }, capabilities: { reasoning: true }, limit: { output: 64_000 }, @@ -3951,6 +3952,19 @@ describe("ProviderTransform.reasoningVariants", () => { }) }) + test("maps GitLab model efforts to provider-specific options", () => { + const options = model([{ type: "effort", values: ["max"] }]) + const openai = target("gitlab-ai-provider", "duo-chat-gpt-5-6-sol", "gpt-sol") + const anthropic = target("gitlab-ai-provider", "duo-chat-opus-4-8", "claude-opus") + + expect(ProviderTransform.reasoningVariants(options, openai)).toEqual({ + max: { reasoningEffort: "max" }, + }) + expect(ProviderTransform.reasoningVariants(options, anthropic)).toEqual({ + max: { thinking: { type: "adaptive", effort: "max" } }, + }) + }) + test("uses adaptive reasoning config for Anthropic models on Bedrock", () => { expect( ProviderTransform.reasoningVariants( @@ -4150,7 +4164,7 @@ describe("ProviderTransform.reasoningVariants", () => { expect(ProviderTransform.reasoningVariants(effort, target("@ai-sdk/github-copilot", "gemini-3-pro"))).toEqual({}) }) - test.each(["@ai-sdk/cohere", "@ai-sdk/perplexity", "@ai-sdk/vercel", "@ai-sdk/alibaba", "gitlab-ai-provider"])( + test.each(["@ai-sdk/cohere", "@ai-sdk/perplexity", "@ai-sdk/vercel", "@ai-sdk/alibaba"])( "does not invent effort controls for %s", (npm) => { expect(ProviderTransform.reasoningVariants(model([{ type: "effort", values: ["high"] }]), target(npm))).toEqual(