mirror of
https://github.com/openclaw/openclaw.git
synced 2026-04-19 06:37:28 +00:00
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:
committed by
Peter Steinberger
parent
c76288bdf1
commit
74193ff754
39
src/utils/provider-utils.test.ts
Normal file
39
src/utils/provider-utils.test.ts
Normal 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);
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -13,12 +13,12 @@ export function isReasoningTagProvider(provider: string | undefined | null): boo
|
|||||||
}
|
}
|
||||||
const normalized = provider.trim().toLowerCase();
|
const normalized = provider.trim().toLowerCase();
|
||||||
|
|
||||||
// Check for exact matches or known prefixes/substrings for reasoning providers
|
// Check for exact matches or known prefixes/substrings for reasoning providers.
|
||||||
if (
|
// Note: Ollama is intentionally excluded — its OpenAI-compatible endpoint
|
||||||
normalized === "ollama" ||
|
// handles reasoning natively via the `reasoning` field in streaming chunks,
|
||||||
normalized === "google-gemini-cli" ||
|
// so tag-based enforcement is unnecessary and causes all output to be
|
||||||
normalized === "google-generative-ai"
|
// discarded as "(no output)" (#2279).
|
||||||
) {
|
if (normalized === "google-gemini-cli" || normalized === "google-generative-ai") {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user