diff --git a/core/llm/llms/OpenAI.test.ts b/core/llm/llms/OpenAI.test.ts index 943e9436903..4a9f5f92f6b 100644 --- a/core/llm/llms/OpenAI.test.ts +++ b/core/llm/llms/OpenAI.test.ts @@ -24,6 +24,13 @@ describe("OpenAI", () => { expect(openai.isOSeriesOrGpt5PlusModel("gpt-5.4-pro")).toBeTruthy(); expect(openai.isOSeriesOrGpt5PlusModel("gpt-6")).toBeTruthy(); expect(openai.isOSeriesOrGpt5PlusModel("gpt-7-turbo")).toBeTruthy(); + + // case-insensitive matching (e.g. Azure deployments named in upper case) + expect(openai.isOSeriesOrGpt5PlusModel("GPT-5")).toBeTruthy(); + expect(openai.isOSeriesOrGpt5PlusModel("GPT-5-mini")).toBeTruthy(); + expect(openai.isOSeriesOrGpt5PlusModel("Gpt-5.4")).toBeTruthy(); + expect(openai.isOSeriesOrGpt5PlusModel("O1")).toBeTruthy(); + expect(openai.isOSeriesOrGpt5PlusModel("O3-mini")).toBeTruthy(); }); test("should identify incorrect o-series models", () => { const openai = new OpenAI({ diff --git a/core/llm/llms/OpenAI.ts b/core/llm/llms/OpenAI.ts index c65b55dc1a5..c833f792570 100644 --- a/core/llm/llms/OpenAI.ts +++ b/core/llm/llms/OpenAI.ts @@ -219,7 +219,9 @@ class OpenAI extends BaseLLM { } public isOSeriesOrGpt5PlusModel(model?: string): boolean { - return !!model && (!!model.match(/^o[0-9]+/) || !!model.match(/gpt-[5-9]/)); + return ( + !!model && (!!model.match(/^o[0-9]+/i) || !!model.match(/gpt-[5-9]/i)) + ); } private isFireworksAiModel(model?: string): boolean { diff --git a/packages/openai-adapters/src/apis/OpenAI.ts b/packages/openai-adapters/src/apis/OpenAI.ts index d0f8d30ca3a..70655171aa7 100644 --- a/packages/openai-adapters/src/apis/OpenAI.ts +++ b/packages/openai-adapters/src/apis/OpenAI.ts @@ -67,7 +67,8 @@ export class OpenAIApi implements BaseLlmApi { // o-series models - only apply for official OpenAI API const isOfficialOpenAIAPI = this.apiBase === "https://api.openai.com/v1/"; if (isOfficialOpenAIAPI) { - if (body.model.startsWith("o") || body.model.includes("gpt-5")) { + const modelLower = body.model.toLowerCase(); + if (modelLower.startsWith("o") || modelLower.includes("gpt-5")) { // a) use max_completion_tokens instead of max_tokens body.max_completion_tokens = body.max_tokens; body.max_tokens = undefined; @@ -80,7 +81,7 @@ export class OpenAIApi implements BaseLlmApi { return message; }); } - if (body.tools?.length && !body.model.startsWith("o3")) { + if (body.tools?.length && !modelLower.startsWith("o3")) { body.parallel_tool_calls = false; } }