From 2af6fd42c3ba48fd9286b9ec0dffcc5b596143eb Mon Sep 17 00:00:00 2001 From: claude-code-best Date: Sun, 26 Apr 2026 22:08:03 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=B0=86=20modelType=20openai-resp?= =?UTF-8?q?onses=20=E9=87=8D=E5=91=BD=E5=90=8D=E4=B8=BA=20codex?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 --- src/commands/provider.ts | 16 +++++++------- src/services/api/claude.ts | 2 +- src/services/api/codex/client.ts | 2 +- src/services/api/codex/index.ts | 2 +- src/services/langfuse/tracing.ts | 2 +- src/utils/auth.ts | 2 +- src/utils/model/__tests__/providers.test.ts | 12 +++++------ src/utils/model/configs.ts | 24 ++++++++++----------- src/utils/model/providers.ts | 6 +++--- src/utils/settings/__tests__/config.test.ts | 6 +++--- src/utils/settings/types.ts | 6 +++--- src/utils/status.tsx | 4 ++-- 12 files changed, 42 insertions(+), 42 deletions(-) diff --git a/src/commands/provider.ts b/src/commands/provider.ts index b09b1f7b8..1e628ccea 100644 --- a/src/commands/provider.ts +++ b/src/commands/provider.ts @@ -15,7 +15,7 @@ function getEnvVarForProvider(provider: string): string { return 'CLAUDE_CODE_USE_FOUNDRY' case 'gemini': return 'CLAUDE_CODE_USE_GEMINI' - case 'openai-responses': + case 'codex': return 'CLAUDE_CODE_USE_CODEX' case 'grok': return 'CLAUDE_CODE_USE_GROK' @@ -66,7 +66,7 @@ const call: LocalCommandCall = async (args, context) => { const validProviders = [ 'anthropic', 'openai', - 'openai-responses', + 'codex', 'gemini', 'grok', 'bedrock', @@ -97,11 +97,11 @@ const call: LocalCommandCall = async (args, context) => { } } - if (arg === 'openai-responses') { + if (arg === 'codex') { const mergedEnv = getMergedEnv() const hasKey = !!mergedEnv.CODEX_API_KEY if (!hasKey) { - updateSettingsForSource('userSettings', { modelType: 'openai-responses' }) + updateSettingsForSource('userSettings', { modelType: 'codex' }) return { type: 'text', value: `Switched to OpenAI Responses provider.\nWarning: Missing env var: CODEX_API_KEY\nConfigure via /login, settings.json env, or set manually.`, @@ -139,7 +139,7 @@ const call: LocalCommandCall = async (args, context) => { // Handle different provider types // - 'anthropic', 'openai', 'gemini' are stored in settings.json (persistent) // - 'bedrock', 'vertex', 'foundry' are env-only (do NOT touch settings.json) - if (arg === 'anthropic' || arg === 'openai' || arg === 'openai-responses' || arg === 'gemini' || arg === 'grok') { + if (arg === 'anthropic' || arg === 'openai' || arg === 'codex' || arg === 'gemini' || arg === 'grok') { // Clear any cloud provider env vars to avoid conflicts delete process.env.CLAUDE_CODE_USE_BEDROCK delete process.env.CLAUDE_CODE_USE_VERTEX @@ -153,7 +153,7 @@ const call: LocalCommandCall = async (args, context) => { // Ensure settings.env gets applied to process.env applyConfigEnvironmentVariables() const message = - arg === 'openai-responses' && !getMergedEnv().CODEX_IMGBB_API_KEY + arg === 'codex' && !getMergedEnv().CODEX_IMGBB_API_KEY ? `API provider set to ${arg}.\nOptional: set CODEX_IMGBB_API_KEY to enable local image uploads for image understanding.` : `API provider set to ${arg}.` return { type: 'text', value: message } @@ -178,9 +178,9 @@ const provider = { type: 'local', name: 'provider', description: - 'Switch API provider (anthropic/openai/openai-responses/gemini/grok/bedrock/vertex/foundry)', + 'Switch API provider (anthropic/openai/codex/gemini/grok/bedrock/vertex/foundry)', aliases: ['api'], - argumentHint: '[anthropic|openai|openai-responses|gemini|grok|bedrock|vertex|foundry|unset]', + argumentHint: '[anthropic|openai|codex|gemini|grok|bedrock|vertex|foundry|unset]', supportsNonInteractive: true, load: () => Promise.resolve({ call }), } satisfies Command diff --git a/src/services/api/claude.ts b/src/services/api/claude.ts index b1b647a5b..4e7d096c5 100644 --- a/src/services/api/claude.ts +++ b/src/services/api/claude.ts @@ -1347,7 +1347,7 @@ async function* queryModel( return } - if (getAPIProvider() === 'openai-responses') { + if (getAPIProvider() === 'codex') { const { queryModelCodex } = await import('./codex/index.js') yield* queryModelCodex(messagesForAPI, systemPrompt, filteredTools, signal, options) return diff --git a/src/services/api/codex/client.ts b/src/services/api/codex/client.ts index e16a93da4..82e2a1f1e 100644 --- a/src/services/api/codex/client.ts +++ b/src/services/api/codex/client.ts @@ -13,7 +13,7 @@ function wrapFetchForUsage(base: typeof fetch): typeof fetch { ): Promise => { const res = await base(...args) try { - updateProviderBuckets('openai-responses', openaiAdapter.parseHeaders(res.headers)) + updateProviderBuckets('codex', openaiAdapter.parseHeaders(res.headers)) } catch { // Usage tracking must not affect the request path. } diff --git a/src/services/api/codex/index.ts b/src/services/api/codex/index.ts index 133cd4ac2..81e9ecfb5 100644 --- a/src/services/api/codex/index.ts +++ b/src/services/api/codex/index.ts @@ -262,7 +262,7 @@ export async function* queryModelCodex( model, provider: process.env.CODEX_LOGIN_METHOD === 'chatgpt_subscription' ? 'codex-chatgpt' - : 'openai-responses', + : 'codex', input: convertMessagesToLangfuse(messagesForAPI, systemPrompt), output: convertOutputToLangfuse(collectedMessages), usage: totalUsage, diff --git a/src/services/langfuse/tracing.ts b/src/services/langfuse/tracing.ts index c9c8b6012..d164c5bb5 100644 --- a/src/services/langfuse/tracing.ts +++ b/src/services/langfuse/tracing.ts @@ -57,7 +57,7 @@ const PROVIDER_GENERATION_NAMES: Record = { vertex: 'ChatVertexAnthropic', foundry: 'ChatFoundry', openai: 'ChatOpenAI', - 'openai-responses': 'ChatOpenAIResponses', + 'codex': 'ChatOpenAIResponses', 'codex-chatgpt': 'ChatCodex', gemini: 'ChatGoogleGenerativeAI', grok: 'ChatXAI', diff --git a/src/utils/auth.ts b/src/utils/auth.ts index 166eddd02..930ea69ce 100644 --- a/src/utils/auth.ts +++ b/src/utils/auth.ts @@ -119,7 +119,7 @@ export function isAnthropicAuthEnabled(): boolean { isEnvTruthy(process.env.CLAUDE_CODE_USE_FOUNDRY) || isEnvTruthy(process.env.CLAUDE_CODE_USE_CODEX) || (settings as any).modelType === 'openai' || - (settings as any).modelType === 'openai-responses' || + (settings as any).modelType === 'codex' || (settings as any).modelType === 'gemini' || !!process.env.OPENAI_BASE_URL || !!process.env.CODEX_BASE_URL || diff --git a/src/utils/model/__tests__/providers.test.ts b/src/utils/model/__tests__/providers.test.ts index 05c793310..95bdb881d 100644 --- a/src/utils/model/__tests__/providers.test.ts +++ b/src/utils/model/__tests__/providers.test.ts @@ -1,7 +1,7 @@ import { describe, expect, test, beforeEach, afterEach } from "bun:test"; import { mock } from "bun:test"; -let mockedModelType: "gemini" | "openai-responses" | undefined; +let mockedModelType: "gemini" | "codex" | undefined; mock.module("../../settings/settings.js", () => ({ getInitialSettings: () => @@ -53,9 +53,9 @@ describe("getAPIProvider", () => { expect(getAPIProvider()).toBe("gemini"); }); - test('returns "openai-responses" when modelType is openai-responses', () => { - mockedModelType = "openai-responses"; - expect(getAPIProvider()).toBe("openai-responses"); + test('returns "codex" when modelType is codex', () => { + mockedModelType = "codex"; + expect(getAPIProvider()).toBe("codex"); }); test("modelType takes precedence over environment variables", () => { @@ -69,9 +69,9 @@ describe("getAPIProvider", () => { expect(getAPIProvider()).toBe("gemini"); }); - test('returns "openai-responses" when CLAUDE_CODE_USE_CODEX is set', () => { + test('returns "codex" when CLAUDE_CODE_USE_CODEX is set', () => { process.env.CLAUDE_CODE_USE_CODEX = "1"; - expect(getAPIProvider()).toBe("openai-responses"); + expect(getAPIProvider()).toBe("codex"); }); test('returns "bedrock" when CLAUDE_CODE_USE_BEDROCK is set', () => { diff --git a/src/utils/model/configs.ts b/src/utils/model/configs.ts index bf071f167..f2b5c7e3a 100644 --- a/src/utils/model/configs.ts +++ b/src/utils/model/configs.ts @@ -12,7 +12,7 @@ export const CLAUDE_3_7_SONNET_CONFIG = { vertex: 'claude-3-7-sonnet@20250219', foundry: 'claude-3-7-sonnet', openai: 'claude-3-7-sonnet-20250219', - 'openai-responses': 'claude-3-7-sonnet-20250219', + 'codex': 'claude-3-7-sonnet-20250219', gemini: 'claude-3-7-sonnet-20250219', grok: 'claude-3-7-sonnet-20250219', } as const satisfies ModelConfig @@ -23,7 +23,7 @@ export const CLAUDE_3_5_V2_SONNET_CONFIG = { vertex: 'claude-3-5-sonnet-v2@20241022', foundry: 'claude-3-5-sonnet', openai: 'claude-3-5-sonnet-20241022', - 'openai-responses': 'claude-3-5-sonnet-20241022', + 'codex': 'claude-3-5-sonnet-20241022', gemini: 'claude-3-5-sonnet-20241022', grok: 'claude-3-5-sonnet-20241022', } as const satisfies ModelConfig @@ -34,7 +34,7 @@ export const CLAUDE_3_5_HAIKU_CONFIG = { vertex: 'claude-3-5-haiku@20241022', foundry: 'claude-3-5-haiku', openai: 'claude-3-5-haiku-20241022', - 'openai-responses': 'claude-3-5-haiku-20241022', + 'codex': 'claude-3-5-haiku-20241022', gemini: 'claude-3-5-haiku-20241022', grok: 'claude-3-5-haiku-20241022', } as const satisfies ModelConfig @@ -45,7 +45,7 @@ export const CLAUDE_HAIKU_4_5_CONFIG = { vertex: 'claude-haiku-4-5@20251001', foundry: 'claude-haiku-4-5', openai: 'claude-haiku-4-5-20251001', - 'openai-responses': 'claude-haiku-4-5-20251001', + 'codex': 'claude-haiku-4-5-20251001', gemini: 'claude-haiku-4-5-20251001', grok: 'claude-haiku-4-5-20251001', } as const satisfies ModelConfig @@ -56,7 +56,7 @@ export const CLAUDE_SONNET_4_CONFIG = { vertex: 'claude-sonnet-4@20250514', foundry: 'claude-sonnet-4', openai: 'claude-sonnet-4-20250514', - 'openai-responses': 'claude-sonnet-4-20250514', + 'codex': 'claude-sonnet-4-20250514', gemini: 'claude-sonnet-4-20250514', grok: 'claude-sonnet-4-20250514', } as const satisfies ModelConfig @@ -67,7 +67,7 @@ export const CLAUDE_SONNET_4_5_CONFIG = { vertex: 'claude-sonnet-4-5@20250929', foundry: 'claude-sonnet-4-5', openai: 'claude-sonnet-4-5-20250929', - 'openai-responses': 'claude-sonnet-4-5-20250929', + 'codex': 'claude-sonnet-4-5-20250929', gemini: 'claude-sonnet-4-5-20250929', grok: 'claude-sonnet-4-5-20250929', } as const satisfies ModelConfig @@ -78,7 +78,7 @@ export const CLAUDE_OPUS_4_CONFIG = { vertex: 'claude-opus-4@20250514', foundry: 'claude-opus-4', openai: 'claude-opus-4-20250514', - 'openai-responses': 'claude-opus-4-20250514', + 'codex': 'claude-opus-4-20250514', gemini: 'claude-opus-4-20250514', grok: 'claude-opus-4-20250514', } as const satisfies ModelConfig @@ -89,7 +89,7 @@ export const CLAUDE_OPUS_4_1_CONFIG = { vertex: 'claude-opus-4-1@20250805', foundry: 'claude-opus-4-1', openai: 'claude-opus-4-1-20250805', - 'openai-responses': 'claude-opus-4-1-20250805', + 'codex': 'claude-opus-4-1-20250805', gemini: 'claude-opus-4-1-20250805', grok: 'claude-opus-4-1-20250805', } as const satisfies ModelConfig @@ -100,7 +100,7 @@ export const CLAUDE_OPUS_4_5_CONFIG = { vertex: 'claude-opus-4-5@20251101', foundry: 'claude-opus-4-5', openai: 'claude-opus-4-5-20251101', - 'openai-responses': 'claude-opus-4-5-20251101', + 'codex': 'claude-opus-4-5-20251101', gemini: 'claude-opus-4-5-20251101', grok: 'claude-opus-4-5-20251101', } as const satisfies ModelConfig @@ -111,7 +111,7 @@ export const CLAUDE_OPUS_4_6_CONFIG = { vertex: 'claude-opus-4-6', foundry: 'claude-opus-4-6', openai: 'claude-opus-4-6', - 'openai-responses': 'claude-opus-4-6', + 'codex': 'claude-opus-4-6', gemini: 'claude-opus-4-6', grok: 'claude-opus-4-6', } as const satisfies ModelConfig @@ -122,7 +122,7 @@ export const CLAUDE_OPUS_4_7_CONFIG = { vertex: 'claude-opus-4-7', foundry: 'claude-opus-4-7', openai: 'claude-opus-4-7', - 'openai-responses': 'claude-opus-4-7', + 'codex': 'claude-opus-4-7', gemini: 'claude-opus-4-7', grok: 'claude-opus-4-7', } as const satisfies ModelConfig @@ -133,7 +133,7 @@ export const CLAUDE_SONNET_4_6_CONFIG = { vertex: 'claude-sonnet-4-6', foundry: 'claude-sonnet-4-6', openai: 'claude-sonnet-4-6', - 'openai-responses': 'claude-sonnet-4-6', + 'codex': 'claude-sonnet-4-6', gemini: 'claude-sonnet-4-6', grok: 'claude-sonnet-4-6', } as const satisfies ModelConfig diff --git a/src/utils/model/providers.ts b/src/utils/model/providers.ts index 5c68ccc4a..d04f88f70 100644 --- a/src/utils/model/providers.ts +++ b/src/utils/model/providers.ts @@ -8,14 +8,14 @@ export type APIProvider = | 'vertex' | 'foundry' | 'openai' - | 'openai-responses' + | 'codex' | 'gemini' | 'grok' export function getAPIProvider(): APIProvider { const modelType = getInitialSettings().modelType if (modelType === 'openai') return 'openai' - if (modelType === 'openai-responses') return 'openai-responses' + if (modelType === 'codex') return 'codex' if (modelType === 'gemini') return 'gemini' if (modelType === 'grok') return 'grok' @@ -24,7 +24,7 @@ export function getAPIProvider(): APIProvider { if (isEnvTruthy(process.env.CLAUDE_CODE_USE_FOUNDRY)) return 'foundry' if (isEnvTruthy(process.env.CLAUDE_CODE_USE_OPENAI)) return 'openai' - if (isEnvTruthy(process.env.CLAUDE_CODE_USE_CODEX)) return 'openai-responses' + if (isEnvTruthy(process.env.CLAUDE_CODE_USE_CODEX)) return 'codex' if (isEnvTruthy(process.env.CLAUDE_CODE_USE_GEMINI)) return 'gemini' if (isEnvTruthy(process.env.CLAUDE_CODE_USE_GROK)) return 'grok' diff --git a/src/utils/settings/__tests__/config.test.ts b/src/utils/settings/__tests__/config.test.ts index 6d21464fb..f084bb8fe 100644 --- a/src/utils/settings/__tests__/config.test.ts +++ b/src/utils/settings/__tests__/config.test.ts @@ -482,9 +482,9 @@ describe("gemini settings", () => { }); }); -describe("openai-responses settings", () => { - test("accepts openai-responses modelType", () => { - const result = SettingsSchema().safeParse({ modelType: "openai-responses" }); +describe("codex settings", () => { + test("accepts codex modelType", () => { + const result = SettingsSchema().safeParse({ modelType: "codex" }); expect(result.success).toBe(true); }); }); diff --git a/src/utils/settings/types.ts b/src/utils/settings/types.ts index 548b6770c..d422ee89e 100644 --- a/src/utils/settings/types.ts +++ b/src/utils/settings/types.ts @@ -369,11 +369,11 @@ export const SettingsSchema = lazySchema(() => .optional() .describe('Tool usage permissions configuration'), modelType: z - .enum(['anthropic', 'openai', 'openai-responses', 'gemini', 'grok']) + .enum(['anthropic', 'openai', 'codex', 'gemini', 'grok']) .optional() .describe( - 'API provider type. "anthropic" uses the Anthropic API (default), "openai" uses the OpenAI Chat Completions API, "openai-responses" uses the OpenAI Responses API, "gemini" uses the Gemini API, and "grok" uses the xAI Grok API (OpenAI-compatible). ' + - 'When set to "openai", configure OPENAI_API_KEY, OPENAI_BASE_URL, and OPENAI_MODEL. When set to "openai-responses", configure CODEX_API_KEY, CODEX_BASE_URL, and CODEX_MODEL. When set to "gemini", configure GEMINI_API_KEY and optional GEMINI_BASE_URL. When set to "grok", configure GROK_API_KEY (or XAI_API_KEY), optional GROK_BASE_URL, GROK_MODEL, and GROK_MODEL_MAP.', + 'API provider type. "anthropic" uses the Anthropic API (default), "openai" uses the OpenAI Chat Completions API, "codex" uses the OpenAI Responses API, "gemini" uses the Gemini API, and "grok" uses the xAI Grok API (OpenAI-compatible). ' + + 'When set to "openai", configure OPENAI_API_KEY, OPENAI_BASE_URL, and OPENAI_MODEL. When set to "codex", configure CODEX_API_KEY, CODEX_BASE_URL, and CODEX_MODEL. When set to "gemini", configure GEMINI_API_KEY and optional GEMINI_BASE_URL. When set to "grok", configure GROK_API_KEY (or XAI_API_KEY), optional GROK_BASE_URL, GROK_MODEL, and GROK_MODEL_MAP.', ), model: z .string() diff --git a/src/utils/status.tsx b/src/utils/status.tsx index 01755198c..115487118 100644 --- a/src/utils/status.tsx +++ b/src/utils/status.tsx @@ -342,7 +342,7 @@ export function buildAPIProviderProperties(): Property[] { gemini: 'Gemini API', grok: 'Grok API', openai: 'OpenAI API', - 'openai-responses': 'OpenAI Responses API', + 'codex': 'OpenAI Responses API', }[apiProvider] properties.push({ label: 'API provider', @@ -445,7 +445,7 @@ export function buildAPIProviderProperties(): Property[] { label: 'OpenAI base URL', value: openaiBaseUrl, }) - } else if (apiProvider === 'openai-responses') { + } else if (apiProvider === 'codex') { const codexBaseUrl = process.env.CODEX_BASE_URL properties.push({ label: 'OpenAI Responses base URL',