72 lines
2.3 KiB
JavaScript
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);
|
|
});
|
|
});
|