From 8b757bf89fe85192efb3abb54175667f16b6c17b Mon Sep 17 00:00:00 2001
From: reanon <>
Date: Mon, 6 Oct 2025 21:01:39 +0200
Subject: [PATCH] gpt5pro
---
src/config.ts | 2 +-
src/info-page.ts | 3 ++
src/proxy/middleware/request/index.ts | 1 +
.../request/preprocessor-factory.ts | 2 ++
.../transform-outbound-payload.ts | 13 ++++++++
.../preprocessors/validate-context-size.ts | 2 ++
.../preprocessors/validate-streaming.ts | 30 +++++++++++++++++++
src/proxy/openai.ts | 1 +
src/service-info.ts | 2 ++
src/shared/models.ts | 6 ++++
src/shared/stats.ts | 2 ++
11 files changed, 63 insertions(+), 1 deletion(-)
create mode 100644 src/proxy/middleware/request/preprocessors/validate-streaming.ts
diff --git a/src/config.ts b/src/config.ts
index 4ad9f0f..16ff976 100644
--- a/src/config.ts
+++ b/src/config.ts
@@ -963,6 +963,6 @@ function parseCsv(val: string): string[] {
function getDefaultModelFamilies(): ModelFamily[] {
return MODEL_FAMILIES.filter(
- (f) => !f.includes("o1-pro") && !f.includes("o3-pro")
+ (f) => !f.includes("o1-pro") && !f.includes("o3-pro") && !f.includes("gpt5-pro")
) as ModelFamily[];
}
diff --git a/src/info-page.ts b/src/info-page.ts
index e34419d..f3e9af9 100644
--- a/src/info-page.ts
+++ b/src/info-page.ts
@@ -44,6 +44,7 @@ const MODEL_FAMILY_FRIENDLY_NAME: { [f in ModelFamily]: string } = {
gpt5: "GPT-5",
"gpt5-mini": "GPT-5 Mini",
"gpt5-nano": "GPT-5 Nano",
+ "gpt5-pro": "GPT-5 Pro",
"gpt5-chat-latest": "GPT-5 Chat Latest",
gpt45: "GPT-4.5",
o1: "OpenAI o1",
@@ -85,6 +86,7 @@ const MODEL_FAMILY_FRIENDLY_NAME: { [f in ModelFamily]: string } = {
"azure-gpt5": "Azure GPT-5",
"azure-gpt5-mini": "Azure GPT-5 Mini",
"azure-gpt5-nano": "Azure GPT-5 Nano",
+ "azure-gpt5-pro": "GPT-5 Pro (Azure)",
"azure-gpt5-chat-latest": "Azure GPT-5 Chat Latest",
"azure-o1": "Azure o1",
"azure-o1-mini": "Azure o1 mini",
@@ -402,3 +404,4 @@ if (config.enableInfoPageLogin) {
/* ─── Removed the public /status route : simply not added ─── */
export { infoPageRouter };
+
diff --git a/src/proxy/middleware/request/index.ts b/src/proxy/middleware/request/index.ts
index a578453..98bb57a 100644
--- a/src/proxy/middleware/request/index.ts
+++ b/src/proxy/middleware/request/index.ts
@@ -16,6 +16,7 @@ export { transformOutboundPayload } from "./preprocessors/transform-outbound-pay
export { validateContextSize } from "./preprocessors/validate-context-size";
export { validateModelFamily } from "./preprocessors/validate-model-family";
export { validateVision } from "./preprocessors/validate-vision";
+export { validateStreaming } from "./preprocessors/validate-streaming";
export { extractQwenExtraBody } from "./preprocessors/extract-qwen-extra-body";
// Proxy request mutators (runs every time request is dequeued, before proxying, usually for auth/signing)
diff --git a/src/proxy/middleware/request/preprocessor-factory.ts b/src/proxy/middleware/request/preprocessor-factory.ts
index 0f9e98b..50bba4d 100644
--- a/src/proxy/middleware/request/preprocessor-factory.ts
+++ b/src/proxy/middleware/request/preprocessor-factory.ts
@@ -12,6 +12,7 @@ import {
validateContextSize,
validateModelFamily,
validateVision,
+ validateStreaming,
applyQuotaLimits,
} from ".";
@@ -57,6 +58,7 @@ export const createPreprocessorMiddleware = (
...(afterTransform ?? []),
validateContextSize,
validateVision,
+ validateStreaming,
validateModelFamily,
applyQuotaLimits,
];
diff --git a/src/proxy/middleware/request/preprocessors/transform-outbound-payload.ts b/src/proxy/middleware/request/preprocessors/transform-outbound-payload.ts
index f31df02..8f5e2c8 100644
--- a/src/proxy/middleware/request/preprocessors/transform-outbound-payload.ts
+++ b/src/proxy/middleware/request/preprocessors/transform-outbound-payload.ts
@@ -102,6 +102,19 @@ function applyOpenAIResponsesTransform(req: Request): void {
}
}
+ // Handle reasoning_effort for models that require it
+ const model = req.body.model || "";
+ const isO3Pro = model === "o3-pro" || model.startsWith("o3-pro-");
+ const isGpt5Pro = model === "gpt-5-pro" || model.startsWith("gpt-5-pro-");
+
+ // o3-pro and gpt-5-pro default to and only support "high" reasoning effort
+ if (isO3Pro || isGpt5Pro) {
+ if (!req.body.reasoning_effort || req.body.reasoning_effort !== "high") {
+ req.body.reasoning_effort = "high";
+ req.log.info({ model, reasoning_effort: "high" }, "Set reasoning_effort to 'high' (required for this model)");
+ }
+ }
+
req.log.info({
originalModel: originalBody.model,
newFormat: "openai-responses"
diff --git a/src/proxy/middleware/request/preprocessors/validate-context-size.ts b/src/proxy/middleware/request/preprocessors/validate-context-size.ts
index f9ebb10..5f3fece 100644
--- a/src/proxy/middleware/request/preprocessors/validate-context-size.ts
+++ b/src/proxy/middleware/request/preprocessors/validate-context-size.ts
@@ -102,6 +102,8 @@ export const validateContextSize: RequestPreprocessor = async (req) => {
} else if (model.match(/^o1-pro(-\d{4}-\d{2}-\d{2})?$/)) {
modelMax = 200000;
} else if (model.match(/^o3-pro(-\d{4}-\d{2}-\d{2})?$/)) {
+ modelMax = 400000;
+ } else if (model.match(/^gpt-5-pro(-\d{4}-\d{2}-\d{2})?$/)) {
modelMax = 200000;
} else if (model.match(/^o1-preview(-\d{4}-\d{2}-\d{2})?$/)) {
modelMax = 128000;
diff --git a/src/proxy/middleware/request/preprocessors/validate-streaming.ts b/src/proxy/middleware/request/preprocessors/validate-streaming.ts
new file mode 100644
index 0000000..5ed72ed
--- /dev/null
+++ b/src/proxy/middleware/request/preprocessors/validate-streaming.ts
@@ -0,0 +1,30 @@
+import { BadRequestError } from "../../../../shared/errors";
+import { RequestPreprocessor } from "../index";
+
+/**
+ * Throws an error if streaming is requested for models that don't support it
+ * (o3-pro, o1-pro, gpt-5-pro and their variants).
+ */
+export const validateStreaming: RequestPreprocessor = (req) => {
+ const { model, stream } = req.body;
+
+ // Check if streaming is enabled
+ const isStreaming = stream === "true" || stream === true;
+ if (!isStreaming) {
+ return;
+ }
+
+ // Check if model is one of the non-streaming models
+ const modelStr = String(model).toLowerCase();
+ const nonStreamingModels = ["o3-pro", "o1-pro", "gpt-5-pro"];
+
+ const isNonStreamingModel = nonStreamingModels.some((modelName) =>
+ modelStr.includes(modelName)
+ );
+
+ if (isNonStreamingModel) {
+ throw new BadRequestError(
+ "Streaming is not supported for this model. The dev is too lazy to implement it. Please set stream=false."
+ );
+ }
+};
\ No newline at end of file
diff --git a/src/proxy/openai.ts b/src/proxy/openai.ts
index f8177ab..b4e4d79 100644
--- a/src/proxy/openai.ts
+++ b/src/proxy/openai.ts
@@ -371,6 +371,7 @@ const setupChunkedTransfer: RequestHandler = (req, res, next) => {
function shouldUseResponsesApi(model: string): boolean {
return model === "o1-pro" || model.startsWith("o1-pro") ||
model === "o3-pro" || model.startsWith("o3-pro") ||
+ model === "gpt-5-pro" || model.startsWith("gpt-5-pro") ||
model === "codex-mini-latest" || model.startsWith("codex-mini") ||
model === "gpt-5-codex-latest" || model.startsWith("gpt-5-codex");
}
diff --git a/src/service-info.ts b/src/service-info.ts
index efe6ed7..5b63dc9 100644
--- a/src/service-info.ts
+++ b/src/service-info.ts
@@ -56,6 +56,7 @@ const MODEL_FAMILY_ORDER: ModelFamily[] = [
"gpt5-mini",
"gpt5-nano",
"gpt5-chat-latest",
+ "gpt5-pro",
"o1",
"o1-mini",
"o1-pro",
@@ -80,6 +81,7 @@ const MODEL_FAMILY_ORDER: ModelFamily[] = [
"azure-gpt5-mini",
"azure-gpt5-nano",
"azure-gpt5-chat-latest",
+ "azure-gpt5-pro",
"azure-o1",
"azure-o1-mini",
"azure-o1-pro",
diff --git a/src/shared/models.ts b/src/shared/models.ts
index 7e8c638..992f810 100644
--- a/src/shared/models.ts
+++ b/src/shared/models.ts
@@ -36,6 +36,7 @@ export type OpenAIModelFamily =
| "gpt5-mini"
| "gpt5-nano"
| "gpt5-chat-latest"
+ | "gpt5-pro"
| "o1"
| "o1-mini"
| "o1-pro"
@@ -104,6 +105,7 @@ export const MODEL_FAMILIES = ((
"gpt5-mini",
"gpt5-nano",
"gpt5-chat-latest",
+ "gpt5-pro",
"o1",
"o1-mini",
"o1-pro",
@@ -144,6 +146,7 @@ export const MODEL_FAMILIES = ((
"azure-gpt5-mini",
"azure-gpt5-nano",
"azure-gpt5-chat-latest",
+ "azure-gpt5-pro",
"azure-dall-e",
"azure-o1",
"azure-o1-mini",
@@ -196,6 +199,7 @@ export const MODEL_FAMILY_SERVICE: {
"gpt5-mini": "openai",
"gpt5-nano": "openai",
"gpt5-chat-latest": "openai",
+ "gpt5-pro": "openai",
"o1": "openai",
"o1-mini": "openai",
"o1-pro": "openai",
@@ -229,6 +233,7 @@ export const MODEL_FAMILY_SERVICE: {
"azure-gpt5-mini": "azure",
"azure-gpt5-nano": "azure",
"azure-gpt5-chat-latest": "azure",
+ "azure-gpt5-pro": "azure",
"azure-dall-e": "azure",
"azure-o1": "azure",
"azure-o1-mini": "azure",
@@ -256,6 +261,7 @@ export const OPENAI_MODEL_FAMILY_MAP: { [regex: string]: OpenAIModelFamily } = {
"^gpt-5-mini(-\\d{4}-\\d{2}-\\d{2})?$": "gpt5-mini",
"^gpt-5-nano(-\\d{4}-\\d{2}-\\d{2})?$": "gpt5-nano",
"^gpt-5-chat-latest(-\\d{4}-\\d{2}-\\d{2})?$": "gpt5-chat-latest",
+ "^gpt-5-pro(-\\d{4}-\\d{2}-\\d{2})?$": "gpt5-pro",
"^gpt-4\\.5(-preview)?(-\\d{4}-\\d{2}-\\d{2})?$": "gpt45",
"^gpt-4\\.1(-\\d{4}-\\d{2}-\\d{2})?$": "gpt41",
"^gpt-4\\.1-mini(-\\d{4}-\\d{2}-\\d{2})?$": "gpt41-mini",
diff --git a/src/shared/stats.ts b/src/shared/stats.ts
index fa1e49c..054d75a 100644
--- a/src/shared/stats.ts
+++ b/src/shared/stats.ts
@@ -20,6 +20,8 @@ const MODEL_PRICING: Record