|
1 | 1 | // Agent session SDK tests cover default tool wiring, prompt preservation, and |
2 | 2 | // session write-lock behavior. |
3 | 3 | import { Type } from "typebox"; |
4 | | -import { describe, expect, it } from "vitest"; |
| 4 | +import { beforeEach, describe, expect, it, vi } from "vitest"; |
| 5 | + |
| 6 | +const thinkingMocks = vi.hoisted(() => ({ |
| 7 | + resolveThinkingDefaultForModel: vi.fn(() => "medium"), |
| 8 | +})); |
| 9 | + |
| 10 | +vi.mock("../../auto-reply/thinking.js", () => ({ |
| 11 | + resolveThinkingDefaultForModel: thinkingMocks.resolveThinkingDefaultForModel, |
| 12 | +})); |
5 | 13 | import type { Model } from "../../llm/types.js"; |
6 | 14 | import { AuthStorage } from "./auth-storage.js"; |
7 | 15 | import { createExtensionRuntime } from "./extensions/loader.js"; |
@@ -316,3 +324,85 @@ describe("createAgentSession tool defaults", () => { |
316 | 324 | expect(events).toEqual(["lock:start", "lock:end"]); |
317 | 325 | }); |
318 | 326 | }); |
| 327 | + |
| 328 | +describe("createAgentSession thinking level defaults", () => { |
| 329 | + beforeEach(() => { |
| 330 | + thinkingMocks.resolveThinkingDefaultForModel.mockReset(); |
| 331 | + thinkingMocks.resolveThinkingDefaultForModel.mockReturnValue("medium"); |
| 332 | + }); |
| 333 | + |
| 334 | + it("uses the provider-specific thinking default for new sessions", async () => { |
| 335 | + thinkingMocks.resolveThinkingDefaultForModel.mockReturnValue("off"); |
| 336 | + |
| 337 | + const { session } = await createAgentSession({ |
| 338 | + model: { ...testModel, provider: "ollama", reasoning: true }, |
| 339 | + resourceLoader: createEmptyResourceLoader(), |
| 340 | + sessionManager: SessionManager.inMemory(), |
| 341 | + settingsManager: SettingsManager.inMemory(), |
| 342 | + modelRegistry: ModelRegistry.inMemory(AuthStorage.inMemory()), |
| 343 | + }); |
| 344 | + |
| 345 | + expect(session.thinkingLevel).toBe("off"); |
| 346 | + expect(thinkingMocks.resolveThinkingDefaultForModel).toHaveBeenCalledWith({ |
| 347 | + provider: "ollama", |
| 348 | + model: testModel.id, |
| 349 | + catalog: [{ provider: "ollama", id: testModel.id, reasoning: true }], |
| 350 | + }); |
| 351 | + }); |
| 352 | + |
| 353 | + it("settings default overrides provider thinking default", async () => { |
| 354 | + thinkingMocks.resolveThinkingDefaultForModel.mockReturnValue("off"); |
| 355 | + |
| 356 | + const { session } = await createAgentSession({ |
| 357 | + model: { ...testModel, provider: "ollama", reasoning: true }, |
| 358 | + resourceLoader: createEmptyResourceLoader(), |
| 359 | + sessionManager: SessionManager.inMemory(), |
| 360 | + settingsManager: SettingsManager.inMemory({ defaultThinkingLevel: "low" }), |
| 361 | + modelRegistry: ModelRegistry.inMemory(AuthStorage.inMemory()), |
| 362 | + }); |
| 363 | + |
| 364 | + // User-configured settings default beats provider default |
| 365 | + expect(session.thinkingLevel).toBe("low"); |
| 366 | + }); |
| 367 | + |
| 368 | + it("falls back to DEFAULT_THINKING_LEVEL for non-off provider defaults", async () => { |
| 369 | + // Non-off provider defaults (adaptive, high, low) preserve prior SDK behaviour |
| 370 | + // to avoid silent cost changes for DeepSeek, OpenRouter, xAI, and Anthropic users. |
| 371 | + for (const nonOffDefault of ["adaptive", "high", "low"] as const) { |
| 372 | + thinkingMocks.resolveThinkingDefaultForModel.mockReturnValue(nonOffDefault); |
| 373 | + |
| 374 | + const { session } = await createAgentSession({ |
| 375 | + model: { ...testModel, reasoning: true }, |
| 376 | + resourceLoader: createEmptyResourceLoader(), |
| 377 | + sessionManager: SessionManager.inMemory(), |
| 378 | + settingsManager: SettingsManager.inMemory(), |
| 379 | + modelRegistry: ModelRegistry.inMemory(AuthStorage.inMemory()), |
| 380 | + }); |
| 381 | + |
| 382 | + expect(session.thinkingLevel).toBe("medium"); |
| 383 | + } |
| 384 | + }); |
| 385 | + |
| 386 | + it("uses provider default for legacy sessions that have no thinking entry", async () => { |
| 387 | + // Sessions created before thinking-level tracking (no thinking_level_change entry) |
| 388 | + // should inherit the provider default, not the hard-coded global "medium". |
| 389 | + thinkingMocks.resolveThinkingDefaultForModel.mockReturnValue("off"); |
| 390 | + |
| 391 | + const sessionManager = SessionManager.inMemory(); |
| 392 | + sessionManager.appendMessage({ |
| 393 | + role: "user", |
| 394 | + content: "hello", |
| 395 | + timestamp: Date.now(), |
| 396 | + }); |
| 397 | + |
| 398 | + const { session } = await createAgentSession({ |
| 399 | + model: { ...testModel, provider: "ollama", reasoning: true }, |
| 400 | + resourceLoader: createEmptyResourceLoader(), |
| 401 | + sessionManager, |
| 402 | + settingsManager: SettingsManager.inMemory(), |
| 403 | + modelRegistry: ModelRegistry.inMemory(AuthStorage.inMemory()), |
| 404 | + }); |
| 405 | + |
| 406 | + expect(session.thinkingLevel).toBe("off"); |
| 407 | + }); |
| 408 | +}); |
0 commit comments