Skip to content

Commit e36d041

Browse files
dcramerclaude
andcommitted
ref(agents): Simplify OpenAI provider for gateway compatibility
Remove OpenAI-specific parameters that may cause issues with OpenAI-compatible gateways (Vercel AI Gateway, Azure OpenAI, etc.): - Remove reasoningEffort parameter (o1/o3 specific) - Remove structuredOutputs/strictJsonSchema provider options - Remove temperature override The baseURL configuration already supports custom endpoints. Users just need to set OPENAI_MODEL with the correct format for their provider (e.g., "openai/gpt-5" for Vercel AI Gateway). Co-Authored-By: Claude <noreply@anthropic.com>
1 parent c733a25 commit e36d041

4 files changed

Lines changed: 22 additions & 84 deletions

File tree

‎packages/mcp-core/src/internal/agents/anthropic-provider.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export function setAnthropicBaseUrl(baseUrl: string | undefined): void {
2020
* Retrieve an Anthropic language model configured from environment variables and explicit config.
2121
*
2222
* Configuration:
23+
* - ANTHROPIC_API_KEY: API key for authentication (required)
2324
* - ANTHROPIC_MODEL: Model to use (default: "claude-sonnet-4-5") - env var OK
2425
* - Base URL: Must be set via setAnthropicBaseUrl() - NOT from env vars (security risk)
2526
*/

‎packages/mcp-core/src/internal/agents/openai-provider.test.ts‎

Lines changed: 8 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -2,62 +2,23 @@ import { describe, it, expect, beforeEach, afterEach } from "vitest";
22
import { getOpenAIModel, setOpenAIBaseUrl } from "./openai-provider.js";
33

44
describe("openai-provider", () => {
5-
const originalEnv = process.env.OPENAI_REASONING_EFFORT;
5+
const originalModel = process.env.OPENAI_MODEL;
66

77
beforeEach(() => {
88
setOpenAIBaseUrl(undefined);
9+
// biome-ignore lint/performance/noDelete: Required to properly unset environment variable
10+
delete process.env.OPENAI_MODEL;
911
});
1012

1113
afterEach(() => {
12-
if (originalEnv === undefined) {
14+
if (originalModel === undefined) {
1315
// biome-ignore lint/performance/noDelete: Required to properly unset environment variable
14-
delete process.env.OPENAI_REASONING_EFFORT;
16+
delete process.env.OPENAI_MODEL;
1517
} else {
16-
process.env.OPENAI_REASONING_EFFORT = originalEnv;
18+
process.env.OPENAI_MODEL = originalModel;
1719
}
1820
});
1921

20-
describe("reasoning effort configuration", () => {
21-
it("uses default reasoning effort when env var is not set", () => {
22-
// biome-ignore lint/performance/noDelete: Required to properly unset environment variable
23-
delete process.env.OPENAI_REASONING_EFFORT;
24-
25-
const model = getOpenAIModel();
26-
27-
// The model object should be created with default reasoning effort
28-
expect(model).toBeDefined();
29-
expect(model.modelId).toBe("gpt-5");
30-
});
31-
32-
it("disables reasoning effort when env var is empty string", () => {
33-
process.env.OPENAI_REASONING_EFFORT = "";
34-
35-
const model = getOpenAIModel();
36-
37-
// The model object should be created without reasoning effort
38-
expect(model).toBeDefined();
39-
expect(model.modelId).toBe("gpt-5");
40-
});
41-
42-
it("uses specified reasoning effort when env var is set", () => {
43-
process.env.OPENAI_REASONING_EFFORT = "high";
44-
45-
const model = getOpenAIModel();
46-
47-
// The model object should be created with high reasoning effort
48-
expect(model).toBeDefined();
49-
expect(model.modelId).toBe("gpt-5");
50-
});
51-
52-
it("throws error for invalid reasoning effort value", () => {
53-
process.env.OPENAI_REASONING_EFFORT = "invalid";
54-
55-
expect(() => getOpenAIModel()).toThrow(
56-
'Invalid OPENAI_REASONING_EFFORT value: "invalid". Must be one of: "low", "medium", "high", or "" (empty string to disable). Default is "low".',
57-
);
58-
});
59-
});
60-
6122
describe("base URL configuration", () => {
6223
it("uses default base URL when not configured", () => {
6324
const model = getOpenAIModel();
@@ -90,14 +51,11 @@ describe("openai-provider", () => {
9051
});
9152

9253
it("uses OPENAI_MODEL env var when set", () => {
93-
process.env.OPENAI_MODEL = "gpt-4o";
54+
process.env.OPENAI_MODEL = "gpt-4-turbo";
9455

9556
const model = getOpenAIModel();
9657

97-
expect(model.modelId).toBe("gpt-4o");
98-
99-
// biome-ignore lint/performance/noDelete: Required to properly unset environment variable
100-
delete process.env.OPENAI_MODEL;
58+
expect(model.modelId).toBe("gpt-4-turbo");
10159
});
10260
});
10361
});

‎packages/mcp-core/src/internal/agents/openai-provider.ts‎

Lines changed: 11 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,6 @@ import { USER_AGENT } from "../../version";
44

55
// Default configuration constants
66
const DEFAULT_OPENAI_MODEL = "gpt-5";
7-
const VALID_REASONING_EFFORTS = ["low", "medium", "high"] as const;
8-
const DEFAULT_REASONING_EFFORT: (typeof VALID_REASONING_EFFORTS)[number] =
9-
"low";
10-
11-
type ReasoningEffort = (typeof VALID_REASONING_EFFORTS)[number];
127

138
// Module-level state for baseURL (set only via explicit configuration, not env vars)
149
let configuredBaseUrl: string | undefined;
@@ -24,45 +19,29 @@ export function setOpenAIBaseUrl(baseUrl: string | undefined): void {
2419
/**
2520
* Retrieve an OpenAI language model configured from environment variables and explicit config.
2621
*
22+
* Works with:
23+
* - OpenAI API directly (default)
24+
* - Any OpenAI-compatible API via custom base URL (Vercel AI Gateway, Azure OpenAI, etc.)
25+
*
2726
* Configuration:
27+
* - OPENAI_API_KEY: API key for authentication (required)
2828
* - OPENAI_MODEL: Model to use (default: "gpt-5") - env var OK
29-
* - OPENAI_REASONING_EFFORT: Reasoning effort for o1 models: "low", "medium", "high", or "" to disable (default: "low") - env var OK
3029
* - Base URL: Must be set via setOpenAIBaseUrl() - NOT from env vars (security risk)
30+
*
31+
* Note: Model name format depends on your provider:
32+
* - Direct OpenAI: "gpt-4o", "gpt-4-turbo", etc.
33+
* - Vercel AI Gateway: "openai/gpt-4o", "anthropic/claude-sonnet-4.5", etc.
34+
* - Other providers: Check their documentation
3135
*/
3236
export function getOpenAIModel(model?: string): LanguageModelV1 {
3337
const defaultModel = process.env.OPENAI_MODEL || DEFAULT_OPENAI_MODEL;
3438

35-
// Handle reasoning effort: empty string explicitly disables it, undefined uses default
36-
const envReasoningEffort = process.env.OPENAI_REASONING_EFFORT;
37-
let reasoningEffort: ReasoningEffort | undefined;
38-
39-
if (envReasoningEffort === "") {
40-
// Empty string explicitly disables reasoning effort
41-
reasoningEffort = undefined;
42-
} else if (envReasoningEffort === undefined) {
43-
// Not set - use default
44-
reasoningEffort = DEFAULT_REASONING_EFFORT;
45-
} else if (
46-
VALID_REASONING_EFFORTS.includes(envReasoningEffort as ReasoningEffort)
47-
) {
48-
// Valid value
49-
reasoningEffort = envReasoningEffort as ReasoningEffort;
50-
} else {
51-
// Invalid value - provide helpful error with all valid options
52-
const validValues = VALID_REASONING_EFFORTS.map((v) => `"${v}"`).join(", ");
53-
throw new Error(
54-
`Invalid OPENAI_REASONING_EFFORT value: "${envReasoningEffort}". Must be one of: ${validValues}, or "" (empty string to disable). Default is "${DEFAULT_REASONING_EFFORT}".`,
55-
);
56-
}
57-
5839
const factory = createOpenAI({
5940
...(configuredBaseUrl && { baseURL: configuredBaseUrl }),
6041
headers: {
6142
"User-Agent": USER_AGENT,
6243
},
6344
});
6445

65-
return factory(model ?? defaultModel, {
66-
...(reasoningEffort && { reasoningEffort }),
67-
});
46+
return factory(model ?? defaultModel);
6847
}

‎packages/mcp-core/src/internal/agents/provider-factory.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ function buildProvider(type: AgentProviderType): EmbeddedAgentProvider {
7777
strictJsonSchema: false,
7878
},
7979
}),
80-
// GPT-5 only supports temperature of 1
81-
getTemperature: () => 1,
80+
// Use default temperature (removed GPT-5 specific override)
81+
getTemperature: () => undefined,
8282
};
8383
}
8484
}

0 commit comments

Comments
 (0)