// #1998 — Headroom compression treated a Codex (openai-responses) body.input // array as OpenAI messages: it sent Responses items to /v1/compress and then // assigned the returned OpenAI messages back to body.input, violating the // Responses format contract. body.input must stay Responses-shaped. import { describe, it, expect, vi, afterEach } from "vitest"; import { compressWithHeadroom } from "../../open-sse/rtk/headroom.js"; describe("compressWithHeadroom openai-responses format (#1998)", () => { afterEach(() => { vi.restoreAllMocks(); }); it("keeps body.input in Responses format after compressing an openai-responses request", async () => { // Headroom always returns compressed OpenAI-style messages. global.fetch = vi.fn(async () => ({ ok: true, json: async () => ({ messages: [{ role: "user", content: "compressed text" }], tokens_before: 100, tokens_after: 90, tokens_saved: 10, }), })); const body = { input: [ { type: "message", role: "user", content: [{ type: "input_text", text: "a long original message ".repeat(20) }], }, ], }; const data = await compressWithHeadroom(body, { enabled: true, url: "http://headroom.test", model: "gpt-5", format: "openai-responses", }); expect(data).not.toBeNull(); // body.input must remain Responses items (type:"message" + content array), // NOT the raw OpenAI messages ({ role, content: "" }) the bug produced. expect(Array.isArray(body.input)).toBe(true); expect(body.input[0]).toMatchObject({ type: "message", role: "user" }); expect(Array.isArray(body.input[0].content)).toBe(true); expect(typeof body.input[0].content).not.toBe("string"); }); });