mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-01 21:02:12 +03:00
Integrated into release/v3.8.44 — converts Chat Completions json_schema response_format → Responses API text.format on the Codex path, and preserves existing text.format through verbosity normalization. Base redirected main→release; the openai-responses.ts split that landed this cycle was reconciled by re-applying the delta onto openai-responses/toResponses.ts. Validated locally: 48 translator-openai-responses-req + 8 codex-verbosity tests green. Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
67 lines
2.8 KiB
TypeScript
67 lines
2.8 KiB
TypeScript
/**
|
|
* Codex verbosity normalization — `normalizeCodexVerbosity`.
|
|
*
|
|
* GPT-5 verbosity is `verbosity` on Chat Completions and `text.verbosity` on the Responses
|
|
* API. The CodexExecutor allowlist drops `text`, so translated requests lose the hint. These
|
|
* tests pin the fold into a single validated `text:{verbosity}` (or its removal when invalid),
|
|
* which — paired with `text` added to the allowlist — lets verbosity reach the Codex backend.
|
|
*/
|
|
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import { normalizeCodexVerbosity } from "../../open-sse/services/codexVerbosity.ts";
|
|
|
|
test("chat-style top-level verbosity is lifted to text.verbosity and dropped", () => {
|
|
const body: Record<string, unknown> = { model: "gpt-5.5", verbosity: "low", input: [] };
|
|
normalizeCodexVerbosity(body);
|
|
assert.deepEqual(body.text, { verbosity: "low" });
|
|
assert.equal(body.verbosity, undefined);
|
|
});
|
|
|
|
test("existing Responses text.verbosity is preserved", () => {
|
|
const body: Record<string, unknown> = { text: { verbosity: "high" }, input: [] };
|
|
normalizeCodexVerbosity(body);
|
|
assert.deepEqual(body.text, { verbosity: "high" });
|
|
});
|
|
|
|
test("chat-style verbosity takes precedence when both shapes are present", () => {
|
|
const body: Record<string, unknown> = { verbosity: "medium", text: { verbosity: "high" } };
|
|
normalizeCodexVerbosity(body);
|
|
assert.deepEqual(body.text, { verbosity: "medium" });
|
|
assert.equal(body.verbosity, undefined);
|
|
});
|
|
|
|
test("invalid verbosity is dropped and text removed", () => {
|
|
const body: Record<string, unknown> = { verbosity: "ultra", input: [] };
|
|
normalizeCodexVerbosity(body);
|
|
assert.equal(body.text, undefined);
|
|
assert.equal(body.verbosity, undefined);
|
|
});
|
|
|
|
test("no verbosity + Responses text.format is preserved", () => {
|
|
const format = { type: "json_schema", name: "schema", schema: { type: "object" } };
|
|
const body: Record<string, unknown> = { text: { format }, input: [] };
|
|
normalizeCodexVerbosity(body);
|
|
assert.deepEqual(body.text, { format });
|
|
});
|
|
|
|
test("verbosity is merged with existing Responses text.format", () => {
|
|
const format = { type: "json_schema", name: "schema", schema: { type: "object" } };
|
|
const body: Record<string, unknown> = { verbosity: "low", text: { format }, input: [] };
|
|
normalizeCodexVerbosity(body);
|
|
assert.deepEqual(body.text, { format, verbosity: "low" });
|
|
assert.equal(body.verbosity, undefined);
|
|
});
|
|
|
|
test("verbosity is normalized case-insensitively", () => {
|
|
const body: Record<string, unknown> = { verbosity: "HIGH" };
|
|
normalizeCodexVerbosity(body);
|
|
assert.deepEqual(body.text, { verbosity: "high" });
|
|
});
|
|
|
|
test("body without any verbosity is left without a text field", () => {
|
|
const body: Record<string, unknown> = { model: "gpt-5.5", input: [] };
|
|
normalizeCodexVerbosity(body);
|
|
assert.equal(body.text, undefined);
|
|
assert.equal(body.model, "gpt-5.5");
|
|
});
|