Files
decolua--9router/tests/unit/codex-fast-capacity.test.js
wehub-resource-sync 05fcd08057
Deploy GitBook to 9router.github.io / build-deploy (push) Failing after 2s
chore: import upstream snapshot with attribution
2026-07-13 12:21:01 +08:00

72 lines
2.3 KiB
JavaScript

import { describe, expect, it } from "vitest";
import { CodexExecutor } from "../../open-sse/executors/codex.js";
function streamFromText(text) {
const encoder = new TextEncoder();
return new ReadableStream({
start(controller) {
controller.enqueue(encoder.encode(text));
controller.close();
},
});
}
describe("Codex fast tier and capacity handling", () => {
it("maps Codex fast tier to priority and max reasoning to xhigh", () => {
const executor = new CodexExecutor();
const body = executor.transformRequest("gpt-5.5", {
model: "gpt-5.5",
input: "hi",
reasoning_effort: "max",
service_tier: "fast",
}, true, {});
expect(body.service_tier).toBe("priority");
expect(body.reasoning.effort).toBe("xhigh");
});
it("uses ChatGPT workspace header fallback", () => {
const executor = new CodexExecutor();
const headers = executor.buildHeaders({
accessToken: "token",
connectionId: "conn_1",
providerSpecificData: { chatgptAccountId: "acct_1" },
});
expect(headers["ChatGPT-Account-ID"]).toBe("acct_1");
});
it("classifies 200-SSE model capacity as account fallback", async () => {
const executor = new CodexExecutor();
const response = new Response(streamFromText([
"event: error",
'data: {"error":{"message":"Selected model is at capacity. Please try a different model."}}',
"",
].join("\n")), {
status: 200,
headers: { "Content-Type": "text/event-stream" },
});
const peek = await executor._peekSseTransientError(response);
expect(peek.accountFallback).toBe(true);
expect(peek.message).toBe("Selected model is at capacity. Please try a different model.");
});
it("reassembles normal SSE after peeking", async () => {
const executor = new CodexExecutor();
const text = [
"event: response.output_text.delta",
'data: {"type":"response.output_text.delta","delta":"OK"}',
"",
].join("\n");
const response = new Response(streamFromText(text), {
status: 200,
headers: { "Content-Type": "text/event-stream" },
});
const peek = await executor._peekSseTransientError(response);
expect(peek.matched).toBeNull();
await expect(new Response(peek.replacementBody).text()).resolves.toBe(text);
});
});