Files
openclaw/src/gateway/openai-http.image-budget.test.ts
Vincent Koc 9521e61a22 Gateway: follow up HEIC input image handling (#38146)
* Media: scope HEIC MIME sniffing

* Media: hermeticize HEIC input tests

* Gateway: fix HEIC image budget accounting

* Gateway: add HEIC image budget regression test

* Changelog: note HEIC follow-up fix
2026-03-06 11:53:59 -05:00

69 lines
1.8 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from "vitest";
const extractImageContentFromSourceMock = vi.fn();
vi.mock("../media/input-files.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../media/input-files.js")>();
return {
...actual,
extractImageContentFromSource: (...args: unknown[]) =>
extractImageContentFromSourceMock(...args),
};
});
import { __testOnlyOpenAiHttp } from "./openai-http.js";
describe("openai image budget accounting", () => {
beforeEach(() => {
vi.clearAllMocks();
});
it("counts normalized base64 image bytes against maxTotalImageBytes", async () => {
extractImageContentFromSourceMock.mockResolvedValueOnce({
type: "image",
data: Buffer.alloc(10, 1).toString("base64"),
mimeType: "image/jpeg",
});
const limits = __testOnlyOpenAiHttp.resolveOpenAiChatCompletionsLimits({
maxTotalImageBytes: 5,
});
await expect(
__testOnlyOpenAiHttp.resolveImagesForRequest(
{
urls: ["data:image/heic;base64,QUJD"],
},
limits,
),
).rejects.toThrow(/Total image payload too large/);
});
it("does not double-count unchanged base64 image payloads", async () => {
extractImageContentFromSourceMock.mockResolvedValueOnce({
type: "image",
data: "QUJDRA==",
mimeType: "image/jpeg",
});
const limits = __testOnlyOpenAiHttp.resolveOpenAiChatCompletionsLimits({
maxTotalImageBytes: 4,
});
await expect(
__testOnlyOpenAiHttp.resolveImagesForRequest(
{
urls: ["data:image/jpeg;base64,QUJDRA=="],
},
limits,
),
).resolves.toEqual([
{
type: "image",
data: "QUJDRA==",
mimeType: "image/jpeg",
},
]);
});
});