Skip to content

Commit 68ec783

Browse files
committed
fix(agents): project thinking catalog compat
1 parent 9a6c71a commit 68ec783

2 files changed

Lines changed: 64 additions & 11 deletions

File tree

src/agents/sessions/sdk.test.ts

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ describe("createAgentSession thinking level defaults", () => {
339339
provider: "ollama",
340340
reasoning: true,
341341
params: { canonicalModelId: "qwen3:8b" },
342-
compat: { thinkingFormat: "ollama" },
342+
compat: { thinkingFormat: "qwen" },
343343
} satisfies Model;
344344
const { session } = await createAgentSession({
345345
model: ollamaModel,
@@ -353,7 +353,16 @@ describe("createAgentSession thinking level defaults", () => {
353353
expect(thinkingMocks.resolveThinkingDefaultForModel).toHaveBeenCalledWith({
354354
provider: "ollama",
355355
model: testModel.id,
356-
catalog: [ollamaModel],
356+
catalog: [
357+
{
358+
provider: "ollama",
359+
id: testModel.id,
360+
api: ollamaModel.api,
361+
reasoning: true,
362+
params: { canonicalModelId: "qwen3:8b" },
363+
compat: { thinkingFormat: "qwen" },
364+
},
365+
],
357366
});
358367
});
359368

@@ -393,7 +402,14 @@ describe("createAgentSession thinking level defaults", () => {
393402
expect(thinkingMocks.resolveThinkingDefaultForModel).toHaveBeenCalledWith({
394403
provider: "ollama",
395404
model: testModel.id,
396-
catalog: [customOllamaModel],
405+
catalog: [
406+
{
407+
provider: "ollama",
408+
id: testModel.id,
409+
api: "ollama",
410+
reasoning: true,
411+
},
412+
],
397413
});
398414
});
399415

src/agents/sessions/sdk.ts

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
* Selects models, wires built-in/custom tools, loads resources, and creates AgentSession instances.
55
*/
66
import { join } from "node:path";
7-
import { resolveThinkingDefaultForModel } from "../../auto-reply/thinking.js";
7+
import {
8+
resolveThinkingDefaultForModel,
9+
type ThinkingCatalogEntry,
10+
} from "../../auto-reply/thinking.js";
811
import { clampThinkingLevel } from "../../llm/model-utils.js";
912
import { streamSimple } from "../../llm/stream.js";
1013
import type { Message, Model } from "../../llm/types.js";
@@ -42,6 +45,28 @@ import {
4245
withFileMutationQueue,
4346
} from "./tools/index.js";
4447

48+
type ThinkingCatalogCompat = NonNullable<ThinkingCatalogEntry["compat"]>;
49+
50+
function projectThinkingCatalogCompat(compat: Model["compat"]) {
51+
if (!compat || typeof compat !== "object") {
52+
return undefined;
53+
}
54+
const record = compat as Record<string, unknown>;
55+
const projected: ThinkingCatalogCompat = {};
56+
if (typeof record.thinkingFormat === "string") {
57+
projected.thinkingFormat = record.thinkingFormat;
58+
}
59+
if (record.supportedReasoningEfforts === null) {
60+
projected.supportedReasoningEfforts = null;
61+
} else if (
62+
Array.isArray(record.supportedReasoningEfforts) &&
63+
record.supportedReasoningEfforts.every((effort) => typeof effort === "string")
64+
) {
65+
projected.supportedReasoningEfforts = record.supportedReasoningEfforts;
66+
}
67+
return Object.keys(projected).length > 0 ? projected : undefined;
68+
}
69+
4570
export interface CreateAgentSessionOptions {
4671
/** Working directory for project-local discovery. Default: process.cwd() */
4772
cwd?: string;
@@ -272,13 +297,25 @@ export async function createAgentSession(
272297
// Use "off" when a provider explicitly opts out of thinking (e.g. Ollama). Non-off
273298
// provider defaults (high, low, adaptive) fall back to DEFAULT_THINKING_LEVEL to avoid
274299
// silent cost changes for DeepSeek, OpenRouter, xAI, and other providers.
275-
const resolvedProviderDefault = model
276-
? resolveThinkingDefaultForModel({
277-
provider: model.api === "ollama" ? "ollama" : model.provider,
278-
model: model.id,
279-
catalog: [model],
280-
})
281-
: undefined;
300+
const modelThinkingProvider = model?.api === "ollama" ? "ollama" : model?.provider;
301+
const modelThinkingCompat = model ? projectThinkingCatalogCompat(model.compat) : undefined;
302+
const resolvedProviderDefault =
303+
model && modelThinkingProvider
304+
? resolveThinkingDefaultForModel({
305+
provider: modelThinkingProvider,
306+
model: model.id,
307+
catalog: [
308+
{
309+
provider: modelThinkingProvider,
310+
id: model.id,
311+
api: model.api,
312+
reasoning: model.reasoning,
313+
...(model.params ? { params: model.params } : {}),
314+
...(modelThinkingCompat ? { compat: modelThinkingCompat } : {}),
315+
},
316+
],
317+
})
318+
: undefined;
282319
const modelThinkingDefault: ThinkingLevel =
283320
resolvedProviderDefault === "off" ? "off" : DEFAULT_THINKING_LEVEL;
284321

0 commit comments

Comments
 (0)