From 848081edb1f9a4f4d643cdb1cc01e1d99bc61cfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20M=C3=BCller?= Date: Fri, 21 Aug 2026 16:08:23 +0200 Subject: [PATCH] Support /fast with OpenAI API-key authentication (#1609) * feat(coding-agent): support /fast with OpenAI API-key authentication (ENG-5425) Widens supportsFastMode() to admit GPT-5.4/GPT-5.5/GPT-5.6 on the openai provider (openai-responses API) in addition to ChatGPT auth, corrects the GPT-5.6 fast-pricing multiplier from 2.5x to 2x per OpenAI's current pricing table, and updates the /fast unavailable message. Resolves discussion #1595. * docs(ai): trim pricing comments to source reference only * chore: drop research scratch file from the branch * chore: restore package-lock.json from main (unrelated npm churn) * test: update fast-mode unavailable message assertion --- packages/ai/.changes/fast-mode-api-key.md | 1 + packages/ai/src/models.ts | 8 +++++--- .../ai/src/providers/openai-codex-responses.ts | 3 ++- packages/ai/src/providers/openai-responses.ts | 1 + packages/ai/test/fast-mode.test.ts | 11 +++++++++-- packages/ai/test/openai-codex-stream.test.ts | 2 +- .../coding-agent/.changes/fast-mode-api-key.md | 1 + .../src/modes/interactive/interactive-mode.ts | 3 ++- .../test/interactive-mode-effort-command.test.ts | 2 +- .../regressions/4620-fast-mode-settings.test.ts | 14 ++++++++++++++ 10 files changed, 37 insertions(+), 9 deletions(-) create mode 100644 packages/ai/.changes/fast-mode-api-key.md create mode 100644 packages/coding-agent/.changes/fast-mode-api-key.md diff --git a/packages/ai/.changes/fast-mode-api-key.md b/packages/ai/.changes/fast-mode-api-key.md new file mode 100644 index 000000000..8be2fd217 --- /dev/null +++ b/packages/ai/.changes/fast-mode-api-key.md @@ -0,0 +1 @@ +- Added Fast mode (service_tier `priority`) support for OpenAI API-key models GPT-5.4/GPT-5.5/GPT-5.6, and corrected the GPT-5.6 fast-pricing multiplier from 2.5x to 2x per OpenAI's pricing table ([#1595](https://github.com/PrimeIntellect-ai/prime-agent/discussions/1595)). diff --git a/packages/ai/src/models.ts b/packages/ai/src/models.ts index fc1910ce7..892fd608f 100644 --- a/packages/ai/src/models.ts +++ b/packages/ai/src/models.ts @@ -36,10 +36,12 @@ export function getModels( } export function supportsFastMode(model: Model): boolean { + const eligibleId = + model.id === "gpt-5.4" || model.id === "gpt-5.5" || model.id === "gpt-5.6" || model.id.startsWith("gpt-5.6-"); return ( - model.provider === "openai-codex" && - model.api === "openai-codex-responses" && - (model.id === "gpt-5.4" || model.id === "gpt-5.5" || model.id === "gpt-5.6" || model.id.startsWith("gpt-5.6-")) + eligibleId && + ((model.provider === "openai-codex" && model.api === "openai-codex-responses") || + (model.provider === "openai" && model.api === "openai-responses")) ); } diff --git a/packages/ai/src/providers/openai-codex-responses.ts b/packages/ai/src/providers/openai-codex-responses.ts index 01f0d7782..cf9f113a8 100644 --- a/packages/ai/src/providers/openai-codex-responses.ts +++ b/packages/ai/src/providers/openai-codex-responses.ts @@ -366,6 +366,7 @@ function buildRequestBody( return body; } +// Multipliers per https://developers.openai.com/api/docs/pricing (retrieved 2026-08-21) function getServiceTierCostMultiplier( model: Pick, "id">, serviceTier: ResponseCreateParamsStreaming["service_tier"] | undefined, @@ -374,7 +375,7 @@ function getServiceTierCostMultiplier( case "flex": return 0.5; case "priority": - return model.id.startsWith("gpt-5.5") || model.id.startsWith("gpt-5.6") ? 2.5 : 2; + return model.id.startsWith("gpt-5.5") ? 2.5 : 2; default: return 1; } diff --git a/packages/ai/src/providers/openai-responses.ts b/packages/ai/src/providers/openai-responses.ts index e0a4f7228..0370d63fc 100644 --- a/packages/ai/src/providers/openai-responses.ts +++ b/packages/ai/src/providers/openai-responses.ts @@ -265,6 +265,7 @@ function buildParams(model: Model<"openai-responses">, context: Context, options return params; } +// Multipliers per https://developers.openai.com/api/docs/pricing (retrieved 2026-08-21) function getServiceTierCostMultiplier( model: Pick, "id">, serviceTier: ResponseCreateParamsStreaming["service_tier"] | undefined, diff --git a/packages/ai/test/fast-mode.test.ts b/packages/ai/test/fast-mode.test.ts index 3f2185ec0..7c3203001 100644 --- a/packages/ai/test/fast-mode.test.ts +++ b/packages/ai/test/fast-mode.test.ts @@ -23,10 +23,17 @@ describe("Fast mode", () => { expect(supportsFastMode(model("openai-codex", id, "openai-codex-responses"))).toBe(true); }); - it("rejects unsupported models and API-key providers", () => { + it("rejects unsupported models and non-OpenAI gateways", () => { expect(supportsFastMode(model("openai-codex", "gpt-5.3-codex", "openai-codex-responses"))).toBe(false); expect(supportsFastMode(model("openai-codex", "gpt-5.4-mini", "openai-codex-responses"))).toBe(false); - expect(supportsFastMode(model("openai", "gpt-5.5", "openai-responses"))).toBe(false); + expect(supportsFastMode(model("openai", "gpt-5.1", "openai-responses"))).toBe(false); + expect(supportsFastMode(model("github-copilot", "gpt-5.5", "openai-responses"))).toBe(false); + }); + + it("admits API-key models and forwards priority", () => { + const testModel = model("openai", "gpt-5.5", "openai-responses"); + expect(supportsFastMode(testModel)).toBe(true); + expect(buildBaseOptions(testModel, { serviceTier: "priority" }).serviceTier).toBe("priority"); }); it("forwards priority through simple stream options", () => { diff --git a/packages/ai/test/openai-codex-stream.test.ts b/packages/ai/test/openai-codex-stream.test.ts index f2e6926a2..e05b9d983 100644 --- a/packages/ai/test/openai-codex-stream.test.ts +++ b/packages/ai/test/openai-codex-stream.test.ts @@ -567,7 +567,7 @@ describe("openai-codex streaming", () => { ["gpt-5.4", "priority", 2], ["gpt-5.5", "flex", 0.5], ["gpt-5.5", "priority", 2.5], - ["gpt-5.6-sol", "priority", 2.5], + ["gpt-5.6-sol", "priority", 2], ] as const)( "uses the client-sent %s service tier for %s when Codex echoes default", async (modelId, serviceTier, multiplier) => { diff --git a/packages/coding-agent/.changes/fast-mode-api-key.md b/packages/coding-agent/.changes/fast-mode-api-key.md new file mode 100644 index 000000000..771b537bf --- /dev/null +++ b/packages/coding-agent/.changes/fast-mode-api-key.md @@ -0,0 +1 @@ +- Enabled `/fast` with OpenAI API-key authentication for GPT-5.4/GPT-5.5/GPT-5.6 and updated the unavailable message ([#1595](https://github.com/PrimeIntellect-ai/prime-agent/discussions/1595)). diff --git a/packages/coding-agent/src/modes/interactive/interactive-mode.ts b/packages/coding-agent/src/modes/interactive/interactive-mode.ts index 2e73dda72..5b7f74cde 100644 --- a/packages/coding-agent/src/modes/interactive/interactive-mode.ts +++ b/packages/coding-agent/src/modes/interactive/interactive-mode.ts @@ -7854,7 +7854,8 @@ export class InteractiveMode { } private handleFastCommand(): void { - const unavailableMessage = "Fast mode requires GPT-5.4, GPT-5.5, or GPT-5.6 with ChatGPT authentication"; + const unavailableMessage = + "Fast mode requires GPT-5.4, GPT-5.5, or GPT-5.6 with ChatGPT or OpenAI API key authentication"; if (!this.currentModelSupportsFastMode()) { this.showStatus(unavailableMessage); return; diff --git a/packages/coding-agent/test/interactive-mode-effort-command.test.ts b/packages/coding-agent/test/interactive-mode-effort-command.test.ts index 2fd0ae6b0..380b07554 100644 --- a/packages/coding-agent/test/interactive-mode-effort-command.test.ts +++ b/packages/coding-agent/test/interactive-mode-effort-command.test.ts @@ -403,7 +403,7 @@ describe("InteractiveMode /effort", () => { expect(context.agentConnection.setServiceTier).not.toHaveBeenCalled(); expect(context.showStatus).toHaveBeenCalledWith( - "Fast mode requires GPT-5.4, GPT-5.5, or GPT-5.6 with ChatGPT authentication", + "Fast mode requires GPT-5.4, GPT-5.5, or GPT-5.6 with ChatGPT or OpenAI API key authentication", ); }); diff --git a/packages/coding-agent/test/suite/regressions/4620-fast-mode-settings.test.ts b/packages/coding-agent/test/suite/regressions/4620-fast-mode-settings.test.ts index 451172367..29d20c82f 100644 --- a/packages/coding-agent/test/suite/regressions/4620-fast-mode-settings.test.ts +++ b/packages/coding-agent/test/suite/regressions/4620-fast-mode-settings.test.ts @@ -79,6 +79,20 @@ describe("ENG-4620 fast mode settings", () => { expect(harness.session.serviceTier).toBe("priority"); }); + it("admits fast mode with OpenAI API-key models and clamps unsupported ones", async () => { + harness = await createHarness({ + api: "openai-responses", + provider: "openai", + models: [{ id: "gpt-5.5" }, { id: "gpt-4-turbo" }], + }); + + harness.session.setServiceTier("priority"); + expect(harness.session.serviceTier).toBe("priority"); + + await harness.session.setModel(harness.getModel("gpt-4-turbo")!); + expect(harness.session.serviceTier).toBe("default"); + }); + it("returns the effective service tier when cycling models", async () => { harness = await createHarness({ api: "openai-codex-responses", -- 2.54.0