Compare commits

...
2 changed files with 78 additions and 0 deletions
@@ -38,6 +38,11 @@ function isDeepSeekFamily(input: ProviderOptionMatchInput): boolean {
return !!input.modelFamily?.trim().toLowerCase().includes("deepseek");
}
function isQwen3ModelId(input: ProviderOptionMatchInput): boolean {
const normalizedModelId = input.request.modelId.toLowerCase();
return normalizedModelId.includes("qwen3");
}
function resolveFamilyThinkingType(
input: ProviderOptionMatchInput,
defaultWhenUnset: "enabled" | "disabled" | undefined,
@@ -169,6 +174,32 @@ const openRouterReasoningRule: ProviderOptionRule = {
),
};
const ollamaQwen3ReasoningDisabledRule: ProviderOptionRule = {
id: "provider.ollama.qwen3.disable-reasoning",
phase: "provider-reasoning",
description:
"Ollama OpenAI-compatible Qwen3 models need reasoning_effort=none to disable default thinking.",
applies: (input) =>
input.request.providerId === "ollama" &&
isQwen3ModelId(input) &&
input.request.reasoning?.enabled === false,
suppresses: { genericThinking: true },
build: (input) => {
const bucketOptions = {
reasoningEffort: "none",
reasoning: { effort: "none" },
};
return {
...buildProviderAndAliasPatch({
providerId: input.request.providerId,
providerOptionsKey: input.providerOptionsKey,
bucketOptions,
}),
openaiCompatible: bucketOptions,
};
},
};
const geminiThinkingRule: ProviderOptionRule = {
id: "provider.google-gemini.thinking-config",
phase: "provider",
@@ -304,6 +335,7 @@ export const PROVIDER_OPTION_RULES: ReadonlyArray<ProviderOptionRule> = [
genericProviderFanoutRule,
clineGatewayReasoningRule,
openRouterReasoningRule,
ollamaQwen3ReasoningDisabledRule,
geminiThinkingRule,
clineReasoningDisabledThinkingRule,
kimiK26ThinkingRule,
@@ -735,6 +735,52 @@ describe("composeAiSdkProviderOptions: family/provider thinking patches", () =>
},
],
},
{
name: "ollama Qwen3 modelId reasoning.enabled=false -> effort none in provider buckets",
request: {
providerId: "ollama",
modelId: "qwen3-coder:30b",
reasoning: { enabled: false },
},
context: { family: "qwen" },
expect: [
{
bucket: "ollama",
has: {
reasoningEffort: "none",
reasoning: { effort: "none" },
},
lacks: ["thinking"],
},
{
bucket: "openaiCompatible",
has: {
reasoningEffort: "none",
reasoning: { effort: "none" },
},
lacks: ["thinking"],
},
],
},
{
name: "ollama non-Qwen3 modelId reasoning.enabled=false -> no effort-none override",
request: {
providerId: "ollama",
modelId: "llama3.1",
reasoning: { enabled: false },
},
context: { family: "llama" },
expect: [
{
bucket: "ollama",
lacks: ["reasoningEffort", "reasoning", "thinking"],
},
{
bucket: "openaiCompatible",
lacks: ["reasoningEffort", "reasoning", "thinking"],
},
],
},
{
name: "cline non-K2.6 Moonshot Kimi reasoning.enabled=false -> thinking.type=disabled",
request: {