mirror of
https://github.com/openclaw/openclaw.git
synced 2026-02-19 18:39:20 -05: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();
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user