import { assertEquals } from "@std/assert"; import type { ImageContent, ToolResultMessage } from "@earendil-works/pi-ai"; import { isImageResult, toolResult } from "./tool-result.ts"; const first: ImageContent = { type: "image", data: "first-image-data", mimeType: "image/png" }; const second: ImageContent = { type: "image", data: "second-image-data", mimeType: "image/jpeg" }; const result = (content: ToolResultMessage["content"], isError = false): ToolResultMessage => ({ role: "toolResult", toolCallId: "image-call", toolName: "read", content, isError, timestamp: 0, }); Deno.test("tool results keep every image beside their text or error, and only real images count", () => { const text = (text: string) => ({ type: "text" as const, text }); assertEquals( toolResult(result([text("before"), first, text("between"), second])), { result: "before\nbetween", error: null, images: [first, second] }, ); assertEquals(toolResult(result([first])), { result: "", error: null, images: [first] }); assertEquals( toolResult(result([first, text("Script failed")], true)), { result: null, error: "Script failed", images: [first] }, ); assertEquals(toolResult(null), { result: null, error: null, images: [] }); assertEquals(toolResult(result([text("plain output")])), { result: "plain output", error: null, images: [], }); assertEquals(isImageResult({ ...first, id: "screenshot-id" }), true); for (const value of [null, "image", { type: "image", data: "bytes" }]) { assertEquals(isImageResult(value), false); } });