clamp session-id to 64 chars for openai-codex (#6653)

fixes #6630
This commit is contained in:
David Brailovsky
2026-07-14 21:09:29 +02:00
committed by GitHub
parent 9d09075c53
commit dcfe36c797
2 changed files with 51 additions and 2 deletions
@@ -640,6 +640,54 @@ describe("openai-codex streaming", () => {
expect(capturedPayload?.prompt_cache_key).toBe("x".repeat(64));
});
it("clamps Codex session-id header to 64 characters", async () => {
const token = mockToken();
const sessionId = "x".repeat(67);
let capturedHeaders: Headers | undefined;
const encoder = new TextEncoder();
vi.stubGlobal(
"fetch",
vi.fn(async (_input: string | URL, init?: RequestInit) => {
capturedHeaders = init?.headers instanceof Headers ? init.headers : undefined;
return new Response(
new ReadableStream<Uint8Array>({
start(controller) {
controller.enqueue(encoder.encode(buildSSEPayload({ status: "completed" })));
controller.close();
},
}),
{ status: 200, headers: { "content-type": "text/event-stream" } },
);
}),
);
const model: Model<"openai-codex-responses"> = {
id: "gpt-5.1-codex",
name: "GPT-5.1 Codex",
api: "openai-codex-responses",
provider: "openai-codex",
baseUrl: "https://chatgpt.com/backend-api",
reasoning: true,
input: ["text"],
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
contextWindow: 400000,
maxTokens: 128000,
};
const context: Context = {
systemPrompt: "You are a helpful assistant.",
messages: [{ role: "user", content: "Say hello", timestamp: Date.now() }],
};
await streamOpenAICodexResponses(model, context, {
apiKey: token,
transport: "sse",
sessionId,
}).result();
expect(capturedHeaders?.get("session-id")).toBe("x".repeat(64));
expect(capturedHeaders?.get("x-client-request-id")).toBe("x".repeat(64));
});
it("preserves gpt-5.5 xhigh reasoning effort from simple options", async () => {
const tempDir = mkdtempSync(join(tmpdir(), "pi-codex-stream-"));
process.env.PI_CODING_AGENT_DIR = tempDir;