Add GPT-5.5 to Codex local model options (#5575)
## Related work This PR is the cleanest "add `gpt-5.5` to the codex-local catalog" change open against master. Several other PRs propose the same catalog/fast-mode update; they should close as duplicates once this lands: - #4646 — Add Codex gpt-5.5 model option - #6044 — feat(codex-local): add gpt-5.5 to model catalog, default reasoning to medium, cheap profile xhigh - #6045 — feat(codex-local): add gpt-5.5 to model catalog, default medium reasoning, xhigh cheap profile - #6595 — feat(adapters): add new Codex models (gpt-5.5, gpt-5.4-mini, gpt-5.3-codex, gpt-5.2) Related issues this enables (catalog-level surface area): - #5371 — codex_local default model selection persists `gpt-5.3-codex` instead of adapter default. This PR makes `gpt-5.5` selectable in the dropdown; a separate follow-up changes the *default* behavior so users who don't pick a model are subscription-compatible. - #5132 — opencode-local: hire-time default model fails on ChatGPT-OAuth accounts. Sibling adapter, same problem shape; not fixed here but worth tracking as a parallel for the opencode side. --- ## Thinking Path > - Paperclip orchestrates AI agents through adapter-backed local and remote runtimes. > - The `codex_local` adapter declares built-in model options that feed the server model list and, in turn, the agent configuration UI dropdown. > - GPT-5.5 is available in newer Codex environments but was missing from Paperclip's fallback `codex_local` model list. > - Operators could still type a manual model ID, but the default dropdown made the supported path look unavailable. > - Codex fast mode support is declared separately, so adding GPT-5.5 to the visible list should also include it in the supported fast-mode set. > - This pull request adds GPT-5.5 to the built-in Codex local model options and updates focused tests around argument generation and adapter model listing. > - The benefit is a clearer default setup path for agents using GPT-5.5 without changing existing defaults or migrations. ## What Changed - Added `gpt-5.5` to the `codex_local` fallback model list. - Added `gpt-5.5` to `CODEX_LOCAL_FAST_MODE_SUPPORTED_MODELS`. - Updated Codex argument tests to cover GPT-5.5 fast mode and preserve manual-model fast mode behavior. - Updated adapter model listing tests to assert the Codex fallback list includes GPT-5.5. ## Verification - `pnpm exec vitest run packages/adapters/codex-local/src/server/codex-args.test.ts server/src/__tests__/adapter-models.test.ts` - `git diff --check` - UI note: this is a dropdown data-source change rather than a layout/component change; the adapter model listing test covers the list consumed by the UI. ## Risks - Low risk. This only extends a static fallback model list and fast-mode allowlist. - Existing defaults remain unchanged (`gpt-5.3-codex`). - If a local Codex CLI does not support `gpt-5.5`, selecting it will still fail at execution time the same way any unavailable manual model would. > For core feature work, check [`ROADMAP.md`](ROADMAP.md) first and discuss it in `#dev` before opening the PR. Feature PRs that overlap with planned core work may need to be redirected — check the roadmap first. See `CONTRIBUTING.md`. ## Model Used - OpenAI Codex desktop coding agent, GPT-5-family model. The exact backing model ID was not exposed by the local runtime; the session used shell, Git, test execution, and GitHub CLI tool access. ## Checklist - [x] I have included a thinking path that traces from project context to this change - [x] I have specified the model used (with version and capability details) - [x] I have checked ROADMAP.md and confirmed this PR does not duplicate planned core work - [x] I have searched GitHub for duplicate or related PRs and linked them above - [x] I have either (a) linked existing issues with `Fixes: #` / `Closes #` / `Refs #` OR (b) described the issue in-PR following the relevant issue template - [x] I have run tests locally and they pass - [x] I have added or updated tests where applicable - [x] If this change affects the UI, I have included before/after screenshots - [x] I have updated relevant documentation to reflect my changes - [x] I have considered and documented any risks above - [x] All Paperclip CI gates are green - [x] Greptile is 5/5 with no open P2s, recommendations, or follow-ups - [x] I will address all Greptile and reviewer comments before requesting merge --------- Co-authored-by: apple <apple@appledeMacBook-Pro.local> Co-authored-by: Paperclip <noreply@paperclip.ing> Co-authored-by: Devin Foley <devin@paperclip.ing>
This commit is contained in:
@@ -7,7 +7,7 @@ export const SANDBOX_INSTALL_COMMAND = "npm install -g @openai/codex";
|
|||||||
|
|
||||||
export const DEFAULT_CODEX_LOCAL_MODEL = "gpt-5.3-codex";
|
export const DEFAULT_CODEX_LOCAL_MODEL = "gpt-5.3-codex";
|
||||||
export const DEFAULT_CODEX_LOCAL_BYPASS_APPROVALS_AND_SANDBOX = true;
|
export const DEFAULT_CODEX_LOCAL_BYPASS_APPROVALS_AND_SANDBOX = true;
|
||||||
export const CODEX_LOCAL_FAST_MODE_SUPPORTED_MODELS = ["gpt-5.4"] as const;
|
export const CODEX_LOCAL_FAST_MODE_SUPPORTED_MODELS = ["gpt-5.5", "gpt-5.4"] as const;
|
||||||
|
|
||||||
function normalizeModelId(model: string | null | undefined): string {
|
function normalizeModelId(model: string | null | undefined): string {
|
||||||
return typeof model === "string" ? model.trim() : "";
|
return typeof model === "string" ? model.trim() : "";
|
||||||
@@ -33,6 +33,7 @@ export function isCodexLocalFastModeSupported(model: string | null | undefined):
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const models = [
|
export const models = [
|
||||||
|
{ id: "gpt-5.5", label: "gpt-5.5" },
|
||||||
{ id: "gpt-5.4", label: "gpt-5.4" },
|
{ id: "gpt-5.4", label: "gpt-5.4" },
|
||||||
{ id: DEFAULT_CODEX_LOCAL_MODEL, label: DEFAULT_CODEX_LOCAL_MODEL },
|
{ id: DEFAULT_CODEX_LOCAL_MODEL, label: DEFAULT_CODEX_LOCAL_MODEL },
|
||||||
{ id: "gpt-5.3-codex-spark", label: "gpt-5.3-codex-spark" },
|
{ id: "gpt-5.3-codex-spark", label: "gpt-5.3-codex-spark" },
|
||||||
@@ -70,7 +71,7 @@ Core fields:
|
|||||||
- modelReasoningEffort (string, optional): reasoning effort override (minimal|low|medium|high|xhigh) passed via -c model_reasoning_effort=...
|
- modelReasoningEffort (string, optional): reasoning effort override (minimal|low|medium|high|xhigh) passed via -c model_reasoning_effort=...
|
||||||
- promptTemplate (string, optional): run prompt template
|
- promptTemplate (string, optional): run prompt template
|
||||||
- search (boolean, optional): run codex with --search
|
- search (boolean, optional): run codex with --search
|
||||||
- fastMode (boolean, optional): enable Codex Fast mode; supported on GPT-5.4 and passed through for manual model IDs
|
- fastMode (boolean, optional): enable Codex Fast mode; supported on GPT-5.5, GPT-5.4 and passed through for manual model IDs
|
||||||
- dangerouslyBypassApprovalsAndSandbox (boolean, optional): run with bypass flag
|
- dangerouslyBypassApprovalsAndSandbox (boolean, optional): run with bypass flag
|
||||||
- command (string, optional): defaults to "codex"
|
- command (string, optional): defaults to "codex"
|
||||||
- extraArgs (string[], optional): additional CLI args
|
- extraArgs (string[], optional): additional CLI args
|
||||||
@@ -89,6 +90,6 @@ Notes:
|
|||||||
- Paperclip injects desired local skills into the effective CODEX_HOME/skills/ directory at execution time so Codex can discover "$paperclip" and related skills without polluting the project working directory. In managed-home mode (the default) this is ~/.paperclip/instances/<id>/companies/<companyId>/codex-home/skills/; when CODEX_HOME is explicitly overridden in adapter config, that override is used instead.
|
- Paperclip injects desired local skills into the effective CODEX_HOME/skills/ directory at execution time so Codex can discover "$paperclip" and related skills without polluting the project working directory. In managed-home mode (the default) this is ~/.paperclip/instances/<id>/companies/<companyId>/codex-home/skills/; when CODEX_HOME is explicitly overridden in adapter config, that override is used instead.
|
||||||
- Unless explicitly overridden in adapter config, Paperclip runs Codex with a per-company managed CODEX_HOME under the active Paperclip instance and seeds auth/config from the shared Codex home (the CODEX_HOME env var, when set, or ~/.codex).
|
- Unless explicitly overridden in adapter config, Paperclip runs Codex with a per-company managed CODEX_HOME under the active Paperclip instance and seeds auth/config from the shared Codex home (the CODEX_HOME env var, when set, or ~/.codex).
|
||||||
- Some model/tool combinations reject certain effort levels (for example minimal with web search enabled).
|
- Some model/tool combinations reject certain effort levels (for example minimal with web search enabled).
|
||||||
- Fast mode is supported on GPT-5.4 and manual model IDs. When enabled for those models, Paperclip applies \`service_tier="fast"\` and \`features.fast_mode=true\`.
|
- Fast mode is supported on GPT-5.5, GPT-5.4 and manual model IDs. When enabled for those models, Paperclip applies \`service_tier="fast"\` and \`features.fast_mode=true\`.
|
||||||
- When Paperclip realizes a workspace/runtime for a run, it injects PAPERCLIP_WORKSPACE_* and PAPERCLIP_RUNTIME_* env vars for agent-side tooling.
|
- When Paperclip realizes a workspace/runtime for a run, it injects PAPERCLIP_WORKSPACE_* and PAPERCLIP_RUNTIME_* env vars for agent-side tooling.
|
||||||
`;
|
`;
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ describe("buildCodexExecArgs", () => {
|
|||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("enables Codex fast mode overrides for manual models", () => {
|
it("enables Codex fast mode overrides for GPT-5.5", () => {
|
||||||
const result = buildCodexExecArgs({
|
const result = buildCodexExecArgs({
|
||||||
model: "gpt-5.5",
|
model: "gpt-5.5",
|
||||||
fastMode: true,
|
fastMode: true,
|
||||||
@@ -48,6 +48,28 @@ describe("buildCodexExecArgs", () => {
|
|||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("enables Codex fast mode overrides for manual models", () => {
|
||||||
|
const result = buildCodexExecArgs({
|
||||||
|
model: "future-codex-model",
|
||||||
|
fastMode: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(result.fastModeRequested).toBe(true);
|
||||||
|
expect(result.fastModeApplied).toBe(true);
|
||||||
|
expect(result.fastModeIgnoredReason).toBeNull();
|
||||||
|
expect(result.args).toEqual([
|
||||||
|
"exec",
|
||||||
|
"--json",
|
||||||
|
"--model",
|
||||||
|
"future-codex-model",
|
||||||
|
"-c",
|
||||||
|
'service_tier="fast"',
|
||||||
|
"-c",
|
||||||
|
"features.fast_mode=true",
|
||||||
|
"-",
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
it("ignores fast mode for unsupported models", () => {
|
it("ignores fast mode for unsupported models", () => {
|
||||||
const result = buildCodexExecArgs({
|
const result = buildCodexExecArgs({
|
||||||
model: "gpt-5.3-codex",
|
model: "gpt-5.3-codex",
|
||||||
@@ -57,7 +79,7 @@ describe("buildCodexExecArgs", () => {
|
|||||||
expect(result.fastModeRequested).toBe(true);
|
expect(result.fastModeRequested).toBe(true);
|
||||||
expect(result.fastModeApplied).toBe(false);
|
expect(result.fastModeApplied).toBe(false);
|
||||||
expect(result.fastModeIgnoredReason).toContain(
|
expect(result.fastModeIgnoredReason).toContain(
|
||||||
"currently only supported on gpt-5.4 or manually configured model IDs",
|
"currently only supported on gpt-5.5, gpt-5.4 or manually configured model IDs",
|
||||||
);
|
);
|
||||||
expect(result.args).toEqual([
|
expect(result.args).toEqual([
|
||||||
"exec",
|
"exec",
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ describe("adapter model listing", () => {
|
|||||||
const models = await listAdapterModels("codex_local");
|
const models = await listAdapterModels("codex_local");
|
||||||
|
|
||||||
expect(models).toEqual(codexFallbackModels);
|
expect(models).toEqual(codexFallbackModels);
|
||||||
|
expect(models.some((model) => model.id === "gpt-5.5")).toBe(true);
|
||||||
expect(fetchSpy).not.toHaveBeenCalled();
|
expect(fetchSpy).not.toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user