diff options
| author | Ruben De Smet <[email protected]> | 2026-04-21 22:45:06 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-04-21 16:45:06 -0400 |
| commit | 1a20703469e46e4cc3682843d549b0f3235946d1 (patch) | |
| tree | 1a795c1da6db30353f41e0da8dcdf1b292f397ee | |
| parent | 8751f48a752473ef0684dd1d6856c1571ef5a7da (diff) | |
| download | opencode-1a20703469e46e4cc3682843d549b0f3235946d1.tar.gz opencode-1a20703469e46e4cc3682843d549b0f3235946d1.zip | |
feat: add Mistral Small reasoning variant support (issue #19479) (#23735)
| -rw-r--r-- | packages/opencode/src/provider/transform.ts | 10 | ||||
| -rw-r--r-- | packages/opencode/test/provider/transform.test.ts | 35 |
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({}) |
