Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
103 commits
Select commit Hold shift + click to select a range
cf762b1
Merge pull request #2551 from lidge-jun/dev
lidge-jun Aug 25, 2026
678517f
release: v2.33.0-preview.20260825
lidge-jun Aug 25, 2026
4a5a749
merge dev into preview for the v2.34.0-preview.20260827 release
lidge-jun Aug 27, 2026
62dfc6c
Merge pull request #2757 from lidge-jun/codex/promote-preview-2340
lidge-jun Aug 27, 2026
809a06b
release: v2.34.0-preview.20260827
lidge-jun Aug 27, 2026
6667e34
merge dev into preview for the v2.35.0-preview release
Aug 28, 2026
e0e3234
Merge pull request #2825 from lidge-jun/codex/promote-preview-2350
lidge-jun Aug 28, 2026
dc1feaf
release: v2.36.0-preview.20260829
lidge-jun Aug 28, 2026
9f577ad
Merge pull request #2831 from lidge-jun/codex/release-preview-23600829
lidge-jun Aug 28, 2026
0df2ae4
merge preview into the promotion branch for v2.36.0-preview.20260830
lidge-jun Aug 30, 2026
dc3dd5b
Merge pull request #3001 from lidge-jun/codex/promote-preview-23600830
lidge-jun Aug 30, 2026
1e6497b
merge dev into the promotion branch for v2.38.0-preview.20260831
lidge-jun Aug 31, 2026
f86c975
merge dev into the promotion branch for v2.38.0-preview.20260831 (pic…
lidge-jun Aug 31, 2026
93704b4
Merge pull request #3072 from lidge-jun/codex/promote-preview-23800831
lidge-jun Aug 31, 2026
230cb19
Merge remote-tracking branch 'origin/dev' into codex/promote-preview-…
lidge-jun Sep 1, 2026
75f3895
merge dev into preview for v2.39.0-preview.20260901
lidge-jun Sep 1, 2026
84b48d6
merge dev into preview for v2.40.0-preview.20260902
Sep 2, 2026
7fd141f
Merge pull request #3260 from lidge-jun/codex/promote-preview-24000902
lidge-jun Sep 2, 2026
3224168
fix(release): pass the bump job's permissions through the reusable-wo…
lidge-jun Sep 2, 2026
49812c9
Merge pull request #3264 from lidge-jun/codex/promote-preview-relfix
lidge-jun Sep 2, 2026
798611e
merge dev into preview for v2.41.0-preview.20260903
Sep 3, 2026
d7de528
Merge pull request #3341 from lidge-jun/codex/promote-preview-2410-v2
lidge-jun Sep 3, 2026
1017867
Merge commit '1f00ff52b' into codex/promote-preview-2410-v3
Sep 3, 2026
491ffcf
Merge pull request #3347 from lidge-jun/codex/promote-preview-2410-v3
lidge-jun Sep 3, 2026
f2ed110
Merge commit '78c630a93' into codex/promote-preview-2410-v4
Sep 3, 2026
b064b8f
merge dev into preview for v2.42.0-preview.20260903
Sep 3, 2026
c779ae7
Merge pull request #3356 from lidge-jun/codex/promote-preview-2410-v4
lidge-jun Sep 3, 2026
bd85a6c
Merge pull request #3426 from lidge-jun/codex/promote-preview-2420-ba…
lidge-jun Sep 4, 2026
3959e6d
chore(release): promote main v2.42.0 onto preview and open 2.43.0-pre…
lidge-jun Sep 4, 2026
0748cf5
Merge pull request #3435 from lidge-jun/codex/promote-preview-2430
lidge-jun Sep 4, 2026
5c2d634
chore(release): promote verified dev candidate to 2.43.0 preview
invalid-email-address Sep 5, 2026
53c784c
Merge pull request #3677 from lidge-jun/codex/promote-preview-243-01a…
lidge-jun Sep 5, 2026
06ec553
Merge pull request #3678 from lidge-jun/codex/promote-main-243-01a07240
lidge-jun Sep 5, 2026
e609ada
chore(release): promote validated 2.44.0 candidate to preview
invalid-email-address Sep 6, 2026
f58fab8
Merge pull request #3784 from lidge-jun/codex/release-244-preview-07c0
lidge-jun Sep 6, 2026
116c2ac
Merge commit '44ea9576e27c6be8be7f13a86e32bb349368c54d' into codex/re…
invalid-email-address Sep 6, 2026
07b48da
Merge pull request #3785 from lidge-jun/codex/release-244-main-07c0
lidge-jun Sep 6, 2026
8b031f8
chore(release): promote validated 2.45.0-preview.20260907 to preview …
invalid-email-address Sep 6, 2026
bcdf559
chore(release): promote validated 2.45.0 to main [skip ci]
invalid-email-address Sep 6, 2026
15d0e8b
chore(release): promote 2.45.0-preview.20260907 (#3814)
lidge-jun Sep 6, 2026
b0900e5
chore(release): promote 2.45.0 to main (#3813)
lidge-jun Sep 6, 2026
3970601
chore(release): prepare 2.46.0 stable promotion
invalid-email-address Sep 7, 2026
6ccfe7e
chore(release): prepare 2.46.0-preview.20260907 promotion
invalid-email-address Sep 7, 2026
bba6322
Merge pull request #3851 from lidge-jun/codex/release-246-main
lidge-jun Sep 7, 2026
9ef2aaf
Merge pull request #3852 from lidge-jun/codex/release-246-preview
lidge-jun Sep 7, 2026
3d53e5f
release: prepare 2.47.0 from audited regression candidate
invalid-email-address Sep 7, 2026
63fb304
release: prepare 2.47.0-preview.20260908 from audited regression cand…
invalid-email-address Sep 7, 2026
665ef82
Merge commit '48ab3e1e66cfa6e0c873de2fafa4540ac61d6c7d' into codex/re…
invalid-email-address Sep 7, 2026
eda8754
Merge commit '48ab3e1e66cfa6e0c873de2fafa4540ac61d6c7d' into codex/re…
invalid-email-address Sep 7, 2026
d2ec06b
Merge commit '57252193b' into codex/release-247-preview
invalid-email-address Sep 7, 2026
f9e3515
Merge commit '57252193b' into codex/release-247-main
invalid-email-address Sep 7, 2026
7ef13dd
release: promote 2.47.0-preview.20260908 to preview (#3928)
lidge-jun Sep 7, 2026
6f71931
release: promote 2.47.0 to main (#3929)
lidge-jun Sep 7, 2026
09d1f04
Merge commit 'd0737cff3' into codex/release-247-preview-final
invalid-email-address Sep 7, 2026
9a60256
Merge commit 'd0737cff3' into codex/release-247-main-final
invalid-email-address Sep 7, 2026
8ad5ca0
Merge commit 'f48c322c0' into codex/release-247-preview-final
invalid-email-address Sep 7, 2026
9e9b1d3
Merge commit 'f48c322c0' into codex/release-247-main-final
invalid-email-address Sep 7, 2026
80b1f52
Merge commit '0d7652ad1' into codex/release-247-preview-final
invalid-email-address Sep 7, 2026
947bae9
Merge commit '0d7652ad1' into codex/release-247-main-final
invalid-email-address Sep 7, 2026
3bef206
release: apply final roster correction to preview (#3932)
lidge-jun Sep 7, 2026
f7f890f
release: apply final roster correction to main (#3933)
lidge-jun Sep 7, 2026
a5aaed6
release: promote 2.48.0 to preview
invalid-email-address Sep 8, 2026
544ebee
release: promote 2.48.0 to main
invalid-email-address Sep 8, 2026
954b99d
release: set preview channel version 2.48.0-preview.20260908
invalid-email-address Sep 8, 2026
d24ff57
release: set main channel version 2.48.0
invalid-email-address Sep 8, 2026
c71474e
Merge pull request #4010 from lidge-jun/codex/release-248-preview
lidge-jun Sep 8, 2026
9a27e86
Merge pull request #4011 from lidge-jun/codex/release-248-main
lidge-jun Sep 8, 2026
ad18c27
release: promote verified 2.49.0 product tree to preview
lidge-jun Sep 9, 2026
62849df
release: promote verified 2.49.0 product tree to main
lidge-jun Sep 9, 2026
a433d39
Merge pull request #4116 from lidge-jun/codex/release-249-preview-01a…
lidge-jun Sep 9, 2026
2f3f736
Merge pull request #4117 from lidge-jun/codex/release-249-main-01a08498
lidge-jun Sep 9, 2026
3a3de88
release: promote verified 2.50.0 product tree to main
lidge-jun Sep 10, 2026
2d4d7a2
Merge pull request #4195 from lidge-jun/codex/release-250-main-01a08a81
lidge-jun Sep 10, 2026
cf456e8
release: promote verified 2.51.0 product tree to main
lidge-jun Sep 11, 2026
c1af925
release: promote verified 2.52.0-preview.20260911 product tree to pre…
lidge-jun Sep 11, 2026
c155cc7
Merge pull request #4271 from lidge-jun/codex/release-251-main
lidge-jun Sep 11, 2026
69207f1
Merge pull request #4273 from lidge-jun/codex/release-252-preview
lidge-jun Sep 11, 2026
8d7e24e
release: promote verified 2.52.0-preview.20260912 product tree to pre…
lidge-jun Sep 12, 2026
9d4e45a
Merge pull request #4399 from lidge-jun/codex/release-2520-preview-20…
lidge-jun Sep 12, 2026
3608119
release: promote verified 2.52.0-preview.20260912 product tree to pre…
lidge-jun Sep 12, 2026
adb39cb
Merge pull request #4406 from lidge-jun/codex/release-2520-preview-20…
lidge-jun Sep 12, 2026
95c4875
release: promote verified 2.52.0 product tree to main
lidge-jun Sep 12, 2026
4d37c35
Merge pull request #4407 from lidge-jun/codex/release-2520-main
lidge-jun Sep 12, 2026
b06e54c
release: promote verified 2.53.0-preview.20260913 product tree to pre…
lidge-jun Sep 13, 2026
90ff8aa
Merge pull request #4504 from lidge-jun/codex/release-2530-preview-20…
lidge-jun Sep 13, 2026
641b05a
release: promote verified 2.53.0 product tree to main
lidge-jun Sep 13, 2026
aa05b3e
Merge pull request #4507 from lidge-jun/codex/release-2530-main
lidge-jun Sep 13, 2026
8e532c5
release: promote verified 2.54.0 product tree to main
lidge-jun Sep 13, 2026
f8d5fd9
release: promote verified 2.54.0-preview.20260914 product tree to pre…
lidge-jun Sep 13, 2026
9f7397e
Merge pull request #4540 from lidge-jun/codex/release-2540-main
lidge-jun Sep 13, 2026
4d633cb
Merge pull request #4541 from lidge-jun/codex/release-2540-preview-20…
lidge-jun Sep 13, 2026
02044b2
chore(release): promote 2.55.0-preview.20260914 to preview
lidge-jun Sep 14, 2026
704857f
release: promote the verified 2.55.0-preview.20260914 product tree to…
lidge-jun Sep 14, 2026
7bdd1b2
Merge pull request #4617 from lidge-jun/codex/260914-preview-2550
lidge-jun Sep 14, 2026
58c15b8
chore(release): promote the verified 2.55.0 product tree to main
lidge-jun Sep 14, 2026
f978400
release: promote the verified 2.55.0 product tree to main
lidge-jun Sep 14, 2026
1cc89cf
Merge pull request #4619 from lidge-jun/codex/260914-main-2550
lidge-jun Sep 14, 2026
e4a8539
Merge pull request #4694 from lidge-jun/codex/260915-main-2560-v2
lidge-jun Sep 15, 2026
44de45d
Merge pull request #4829 from lidge-jun/release/2.57.0
lidge-jun Sep 16, 2026
6fe4cd0
Merge pull request #4915 from lidge-jun/release/2.58.0
lidge-jun Sep 17, 2026
134c92a
Merge pull request #5074 from lidge-jun/release/2.59.0
lidge-jun Sep 18, 2026
7c625fc
Merge pull request #5249 from lidge-jun/release/2.60.0
lidge-jun Sep 20, 2026
eb623d4
fix(effort): run wire mapper on unpinned/unconfigured effort values
Haven2026 Sep 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 19 additions & 1 deletion src/adapters/openai-responses/reasoning.ts
Original file line number Diff line number Diff line change
Expand Up @@ -209,8 +209,26 @@ export function mapRoutedResponsesReasoningEffort(
modelId: string,
): unknown {
if (provider.authMode === "forward") return body;
if (configuredReasoningEfforts(provider, modelId) === undefined) return body;
if (!isPlainObject(body) || !isPlainObject(body.reasoning)) return body;
// An unconfigured provider still needs the wire mapper: it folds caller spellings
// outside the Codex ladder ("minimal"->"low", "ultra"->"max") and drops unknown
// values before they can hit a strict upstream's enum validator. Skipping this on
// `configuredReasoningEfforts === undefined` let those spellings leak through
// verbatim (observed: DeepSeek-channel 400 "Invalid option" on "minimal"/"ultra").
if (configuredReasoningEfforts(provider, modelId) === undefined) {
const effort = body.reasoning.effort;
// "none" and provider-wire spellings the mapper cannot rank ("enabled"/"disabled"/
// "adaptive") pass through verbatim — the mapper's undefined for those means
// "not a Codex rung", not "invalid", and downstream adapters translate them.
if (typeof effort !== "string" || effort === "none"
|| effort === "enabled" || effort === "disabled" || effort === "adaptive") return body;
const mappedUnconfigured = mapReasoningEffort(provider, modelId, effort);
if (mappedUnconfigured === effort) return body;
const nextReasoning = { ...body.reasoning };
if (mappedUnconfigured === undefined) delete nextReasoning.effort;
else nextReasoning.effort = mappedUnconfigured;
return { ...body, reasoning: Object.keys(nextReasoning).length > 0 ? nextReasoning : undefined };
}
const declaredEfforts = modelRecordValue(provider.modelReasoningEfforts, modelId) ?? provider.reasoningEfforts;
// An explicitly empty ladder means no effort control, not no reasoning output.
// Omit only effort so the upstream default applies; unknown/non-rankable ladders stay untouched.
Expand Down
17 changes: 16 additions & 1 deletion src/server/chat-native.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,22 @@ function normalizePinnedChatEffort(options: HandleNativeChatOptions): void {
const pinned = !compaction
? resolvePinnedEffort(route, selector, config)
: undefined;
let normalizeForWire = false;
// Run the wire mapper whenever a reasoning_effort is present on the body, not only
// after a pin/cap rewrite: mapReasoningEffort is the identity for valid ladder
// spellings and folds "minimal"->"low" / "ultra"->"max" before they can leak to a
// strict upstream. "none" is a real caller instruction (thinking disable), not an
// invalid spelling — keep it verbatim so downstream adapters can translate it to
// thinking:{type:"disabled"} instead of dropping the field (absent ≠ disabled).
const callerEffort = typeof chatBody.reasoning_effort === "string" ? chatBody.reasoning_effort : undefined;
// Compaction turns keep their exemption: they are maintenance, not agent turns, so
// their effort reaches the wire untouched just as pin/cap leave them alone.
// "none" and provider-wire spellings the mapper cannot rank ("enabled"/"disabled"/
// "adaptive" — consumed by thinkingToggleModels adapters) also pass through: only
// spellings the mapper can fold or clamp ("minimal", "ultra", unknown ranks) get
// rewritten, while values it returns undefined for would otherwise be deleted.
let normalizeForWire = !compaction && callerEffort !== undefined
&& callerEffort !== "none" && callerEffort !== "enabled"
&& callerEffort !== "disabled" && callerEffort !== "adaptive";
if (pinned !== undefined) {
logCtx.requestedEffort = from ? `${from}->${pinned}` : pinned;
if (pinned === "none") delete chatBody.reasoning_effort;
Expand Down
14 changes: 10 additions & 4 deletions tests/codex-integration/model-pinned-effort.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -435,10 +435,12 @@ describe("operator pins on the actual request wire", () => {
expect(wire.reasoning).toEqual({ effort: "max", summary: "auto" });
});

test("native Chat without pins caps spawned children and preserves unqualified caller spelling", async () => {
test("native Chat without pins caps spawned children and maps unqualified caller spelling through the wire map", async () => {
const c = config({ reasoningEfforts: ["low"], reasoningEffortMap: { max: "enabled" } }, { effortCap: "low", subagentEffortCap: "low" });
expect((await request(c, "chat", { reasoning_effort: "ultra" }, { "x-openai-subagent": "collab_spawn" })).reasoning_effort).toBe("low");
expect((await request(c, "chat", { reasoning_effort: "ultra" })).reasoning_effort).toBe("ultra");
// Unpinned main turns still run mapReasoningEffort: ultra folds to max, then the
// provider wire alias maps max -> enabled (was: verbatim "ultra" passthrough).
expect((await request(c, "chat", { reasoning_effort: "ultra" })).reasoning_effort).toBe("enabled");
expect(Object.hasOwn(await request(c, "chat", { reasoning_effort: undefined }), "reasoning_effort")).toBe(false);
});

Expand All @@ -448,14 +450,18 @@ describe("operator pins on the actual request wire", () => {
expect((await request(c, "chat", { tools, reasoning_effort: "ultra" })).reasoning_effort).toBe("medium");
expect((await request(c, "chat", { tools, reasoning_effort: "ultra" }, { "x-openai-subagent": "collab_spawn" })).reasoning_effort).toBe("low");
c.multiAgentMode = "v1";
expect((await request(c, "chat", { tools, reasoning_effort: "ultra" }, { "x-openai-subagent": "collab_spawn" })).reasoning_effort).toBe("ultra");
// Cap-exempt v1 turn: effort still passes through the wire mapper, so ultra folds
// to max (was: verbatim "ultra" passthrough).
expect((await request(c, "chat", { tools, reasoning_effort: "ultra" }, { "x-openai-subagent": "collab_spawn" })).reasoning_effort).toBe("max");
});

test("native Chat maps newly capped values and preserves lower, non-ladder and absent efforts", async () => {
const c = config({ reasoningEffortMap: { medium: "enabled", low: "disabled" } }, { subagentEffortCap: "medium" });
const headers = { "x-codex-turn-metadata": JSON.stringify({ subagent_kind: "thread_spawn" }) };
expect((await request(c, "chat", { reasoning_effort: "ultra" }, headers)).reasoning_effort).toBe("enabled");
expect((await request(c, "chat", { reasoning_effort: "low" }, headers)).reasoning_effort).toBe("low");
// A low value the cap leaves alone still resolves through the provider wire map:
// low -> disabled (was: verbatim "low" passthrough).
expect((await request(c, "chat", { reasoning_effort: "low" }, headers)).reasoning_effort).toBe("disabled");
expect((await request(c, "chat", { reasoning_effort: "enabled" }, headers)).reasoning_effort).toBe("enabled");
expect(Object.hasOwn(await request(c, "chat", { reasoning_effort: undefined }, headers), "reasoning_effort")).toBe(false);
c.providers.fixture!.pinnedReasoningEffort = "medium";
Expand Down
Loading