From a82e36955f4799b2d8900a4148a2ea5da0ee2c84 Mon Sep 17 00:00:00 2001 From: can1357 Date: Tue, 14 Jul 2026 23:08:55 +0200 Subject: [PATCH] test(agent): cover text-only model image replay --- .../test/nonvision-model-switch.test.ts | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 packages/coding-agent/test/nonvision-model-switch.test.ts diff --git a/packages/coding-agent/test/nonvision-model-switch.test.ts b/packages/coding-agent/test/nonvision-model-switch.test.ts new file mode 100644 index 000000000..a0609e081 --- /dev/null +++ b/packages/coding-agent/test/nonvision-model-switch.test.ts @@ -0,0 +1,60 @@ +import { describe, expect, it } from "bun:test"; +import * as path from "node:path"; +import { createMockModel, registerMockApi } from "@oh-my-pi/pi-ai/providers/mock"; +import { TempDir } from "@oh-my-pi/pi-utils"; +import { ModelRegistry } from "../src/config/model-registry"; +import { Settings } from "../src/config/settings"; +import { createAgentSession } from "../src/sdk"; +import { AuthStorage } from "../src/session/auth-storage"; +import { SessionManager } from "../src/session/session-manager"; + +registerMockApi(); + +describe("model switch from vision to text-only", () => { + it("omits historical images from the text-only provider request", async () => { + const dir = TempDir.createSync("@nonvision-history-"); + const auth = await AuthStorage.create(path.join(dir.path(), "auth.db")); + try { + auth.setRuntimeApiKey("mock", "test-key"); + const vision = createMockModel({ id: "vision", handler: () => ({ content: ["first"] }) }); + vision.input.push("image"); + const text = createMockModel({ id: "text", handler: () => ({ content: ["second"] }) }); + const settings = Settings.isolated({ + "compaction.enabled": false, + "images.blockImages": false, + "todo.enabled": false, + "retry.enabled": false, + }); + const { session } = await createAgentSession({ + cwd: dir.path(), + agentDir: dir.path(), + authStorage: auth, + modelRegistry: new ModelRegistry(auth, path.join(dir.path(), "models.yml")), + model: vision, + settings, + sessionManager: SessionManager.inMemory(dir.path()), + disableExtensionDiscovery: true, + enableMCP: false, + enableLsp: false, + skills: [], + rules: [], + contextFiles: [], + }); + try { + await session.prompt("see image", { images: [{ type: "image", data: "aaaa", mimeType: "image/png" }] }); + await session.setModel(text); + await session.prompt("now text only"); + + const messages = text.calls.at(-1)?.context.messages ?? []; + expect(messages.flatMap(message => (Array.isArray(message.content) ? message.content : []))).not.toContainEqual( + expect.objectContaining({ type: "image" }), + ); + } finally { + await session.dispose(); + } + } finally { + auth.close(); + dir.removeSync(); + } + }); +});