Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

### Fixed

- Accept the `ultra` Codex reasoning effort when the selected model advertises support for it.
- Recheck persisted Codex subscription authentication with a fresh client after a failed completion check; distinguish provider failure from unavailable verification and log only safe outcome categories.
- Show every reported Codex allowance bucket, with the legacy usage response as a fallback, and accept Windows line endings in the nested security-test fixtures.
- Run module-mocked security suites in the default test command and reject silently skipped nested test runs.
Expand Down
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -106,8 +106,9 @@ unset, or `inherit`. Codex never inherits `BOT_MODEL` or `CLAUDE_*` settings.
Models must be explicit IDs. Claudify does not select a replacement model. If
OpenAI reports rerouting during a turn, Claudify rejects the result without
retrying or bypassing the reroute; usage or an action may already have occurred.
Effort accepts `none`, `minimal`, `low`, `medium`, `high`, `xhigh`, or `max`, but
the selected account/model must advertise support for the chosen value.
Effort accepts `none`, `minimal`, `low`, `medium`, `high`, `xhigh`, `max`, or
`ultra`, but the selected account/model must advertise support for the chosen
value.
`default` omits the effort override. Model availability and effort support are
checked before inference. API-key accounts are refused, even if API credentials
exist elsewhere on the host.
Expand Down
1 change: 1 addition & 0 deletions src/codexConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ const efforts = new Set([
"high",
"xhigh",
"max",
"ultra",
]);
function model(
value: string | undefined,
Expand Down
6 changes: 5 additions & 1 deletion src/model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,11 @@ const codexRunner = createCodexRunner({
export const runModel: ModelRunner = (args, input, options, imagePaths) => {
if (BOT_PROVIDER === "codex")
return codexRunner(args, input, options, imagePaths);
if (options.effort === "none" || options.effort === "minimal")
if (
options.effort === "none"
|| options.effort === "minimal"
|| options.effort === "ultra"
)
throw new Error("Unsupported Claude effort.");
return runClaude(args, input, {
...options,
Expand Down
3 changes: 2 additions & 1 deletion src/modelTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ export type ModelEffort =
| "medium"
| "high"
| "xhigh"
| "max";
| "max"
| "ultra";
export interface ModelRunOptions {
workload: ClaudeWorkload;
model?: string;
Expand Down
7 changes: 7 additions & 0 deletions tests/codexConfig.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,13 @@ test("Codex defaults to Luna and never inherits legacy Claude models", async ()
});
assert.equal(custom.workloads.response.model, "gpt-5.6-sol");
assert.equal(custom.workloads["profile-update"].effort, "low");
const ultra = resolveCodexConfig({
CODEX_MODEL: "gpt-5.6-sol",
CODEX_EFFORT: "ultra",
CODEX_SUMMARY_EFFORT: "ultra",
});
assert.equal(ultra.workloads.response.effort, "ultra");
assert.equal(ultra.workloads["daily-summary"].effort, "ultra");
const adaptive = resolveCodexConfig({
CODEX_EFFORT: "high",
CODEX_RESPONSE_SIMPLE_EFFORT: "inherit",
Expand Down