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",