summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRuben De Smet <[email protected]>2026-04-21 22:45:06 +0200
committerGitHub <[email protected]>2026-04-21 16:45:06 -0400
commit1a20703469e46e4cc3682843d549b0f3235946d1 (patch)
tree1a795c1da6db30353f41e0da8dcdf1b292f397ee
parent8751f48a752473ef0684dd1d6856c1571ef5a7da (diff)
downloadopencode-1a20703469e46e4cc3682843d549b0f3235946d1.tar.gz
opencode-1a20703469e46e4cc3682843d549b0f3235946d1.zip
feat: add Mistral Small reasoning variant support (issue #19479) (#23735)
-rw-r--r--packages/opencode/src/provider/transform.ts10
-rw-r--r--packages/opencode/test/provider/transform.test.ts35
2 files changed, 42 insertions, 3 deletions
diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts
index 863f01273..1d84c7c93 100644
--- a/packages/opencode/src/provider/transform.ts
+++ b/packages/opencode/src/provider/transform.ts
@@ -408,7 +408,6 @@ export function variants(model: Provider.Model): Record<string, Record<string, a
id.includes("deepseek") ||
id.includes("minimax") ||
id.includes("glm") ||
- id.includes("mistral") ||
id.includes("kimi") ||
id.includes("k2p") ||
id.includes("qwen") ||
@@ -713,7 +712,14 @@ export function variants(model: Provider.Model): Record<string, Record<string, a
case "@ai-sdk/mistral":
// https://v5.ai-sdk.dev/providers/ai-sdk-providers/mistral
- return {}
+ // https://docs.mistral.ai/capabilities/reasoning/adjustable
+ if (!model.capabilities.reasoning) return {}
+ // Only Mistral Small 4 supports reasoning (mistral-small-2603, mistral-small-latest)
+ const mistralId = model.api.id.toLowerCase()
+ if (!mistralId.includes("mistral-small-2603") && !mistralId.includes("mistral-small-latest")) return {}
+ return {
+ high: { reasoningEffort: "high" },
+ }
case "@ai-sdk/cohere":
// https://v5.ai-sdk.dev/providers/ai-sdk-providers/cohere
diff --git a/packages/opencode/test/provider/transform.test.ts b/packages/opencode/test/provider/transform.test.ts
index 7a7631710..791fcdedc 100644
--- a/packages/opencode/test/provider/transform.test.ts
+++ b/packages/opencode/test/provider/transform.test.ts
@@ -2113,7 +2113,39 @@ describe("ProviderTransform.variants", () => {
expect(result).toEqual({})
})
- test("mistral returns empty object", () => {
+ test("mistral with reasoning returns variants", () => {
+ const model = createMockModel({
+ id: "mistral/mistral-small-latest",
+ providerID: "mistral",
+ api: {
+ id: "mistral-small-latest",
+ url: "https://api.mistral.com",
+ npm: "@ai-sdk/mistral",
+ },
+ capabilities: { reasoning: true },
+ })
+ const result = ProviderTransform.variants(model)
+ expect(result).toEqual({
+ high: { reasoningEffort: "high" },
+ })
+ })
+
+ test("mistral without reasoning returns empty object", () => {
+ const model = createMockModel({
+ id: "mistral/mistral-large",
+ providerID: "mistral",
+ api: {
+ id: "mistral-large-latest",
+ url: "https://api.mistral.com",
+ npm: "@ai-sdk/mistral",
+ },
+ capabilities: { reasoning: false },
+ })
+ const result = ProviderTransform.variants(model)
+ expect(result).toEqual({})
+ })
+
+ test("mistral large with reasoning returns empty object (only small supports reasoning)", () => {
const model = createMockModel({
id: "mistral/mistral-large",
providerID: "mistral",
@@ -2122,6 +2154,7 @@ describe("ProviderTransform.variants", () => {
url: "https://api.mistral.com",
npm: "@ai-sdk/mistral",
},
+ capabilities: { reasoning: true },
})
const result = ProviderTransform.variants(model)
expect(result).toEqual({})