fix(ollama): remove Ollama from isReasoningTagProvider (#2279)

Ollama's OpenAI-compatible endpoint handles reasoning natively via the
`reasoning` field in streaming chunks. Treating Ollama as a
reasoning-tag provider incorrectly forces <think>/<final> tag
enforcement, which causes stripBlockTags() to discard all output
(since Ollama models don't emit <final> tags), resulting in
'(no output)' for every Ollama model.

This fix removes 'ollama' from the isReasoningTagProvider() check,
allowing Ollama models to work correctly through the standard
content/reasoning field separation.
This commit is contained in:
Glucksberg
2026-02-14 12:49:01 +00:00
committed by Peter Steinberger
parent c76288bdf1
commit 74193ff754
2 changed files with 45 additions and 6 deletions

View File

@@ -0,0 +1,39 @@
import { describe, expect, it } from "vitest";
import { isReasoningTagProvider } from "./provider-utils.js";
describe("isReasoningTagProvider", () => {
it("returns false for ollama — native reasoning field, no tags needed (#2279)", () => {
expect(isReasoningTagProvider("ollama")).toBe(false);
expect(isReasoningTagProvider("Ollama")).toBe(false);
});
it("returns true for google-gemini-cli", () => {
expect(isReasoningTagProvider("google-gemini-cli")).toBe(true);
});
it("returns true for google-generative-ai", () => {
expect(isReasoningTagProvider("google-generative-ai")).toBe(true);
});
it("returns true for google-antigravity", () => {
expect(isReasoningTagProvider("google-antigravity")).toBe(true);
expect(isReasoningTagProvider("google-antigravity/gemini-3")).toBe(true);
});
it("returns true for minimax", () => {
expect(isReasoningTagProvider("minimax")).toBe(true);
expect(isReasoningTagProvider("minimax-cn")).toBe(true);
});
it("returns false for null/undefined/empty", () => {
expect(isReasoningTagProvider(null)).toBe(false);
expect(isReasoningTagProvider(undefined)).toBe(false);
expect(isReasoningTagProvider("")).toBe(false);
});
it("returns false for standard providers", () => {
expect(isReasoningTagProvider("anthropic")).toBe(false);
expect(isReasoningTagProvider("openai")).toBe(false);
expect(isReasoningTagProvider("openrouter")).toBe(false);
});
});

View File

@@ -13,12 +13,12 @@ export function isReasoningTagProvider(provider: string | undefined | null): boo
}
const normalized = provider.trim().toLowerCase();
// Check for exact matches or known prefixes/substrings for reasoning providers
if (
normalized === "ollama" ||
normalized === "google-gemini-cli" ||
normalized === "google-generative-ai"
) {
// Check for exact matches or known prefixes/substrings for reasoning providers.
// Note: Ollama is intentionally excluded — its OpenAI-compatible endpoint
// handles reasoning natively via the `reasoning` field in streaming chunks,
// so tag-based enforcement is unnecessary and causes all output to be
// discarded as "(no output)" (#2279).
if (normalized === "google-gemini-cli" || normalized === "google-generative-ai") {
return true;
}