From d3c853de94e68aa111d4a463605d2bf3454ad125 Mon Sep 17 00:00:00 2001 From: hex2077 Date: Sun, 25 Jan 2026 23:23:15 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=9B=B4=E6=96=B0Codex=E7=AD=96?= =?UTF-8?q?=E7=95=A5=E4=BB=A5=E9=80=82=E9=85=8D=E6=96=B0=E7=9A=84Responses?= =?UTF-8?q?=20API=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将Codex的provider策略从OpenAIStrategy切换为ResponsesAPIStrategy,以适配新的API接口。 更新请求头信息,包括版本号、beta特性标志和连接设置。 调整消息转换逻辑,将assistant角色映射为developer角色。 优化token刷新逻辑,确保在刷新成功后重置provider状态。 --- src/converters/strategies/CodexConverter.js | 2 +- src/providers/openai/codex-core.js | 34 ++++++++++----------- src/utils/provider-strategies.js | 3 +- 3 files changed, 19 insertions(+), 20 deletions(-) diff --git a/src/converters/strategies/CodexConverter.js b/src/converters/strategies/CodexConverter.js index 7663dbd..9dd07b1 100644 --- a/src/converters/strategies/CodexConverter.js +++ b/src/converters/strategies/CodexConverter.js @@ -130,7 +130,7 @@ export class CodexConverter extends BaseConverter { if (msg.role === 'user' || msg.role === 'assistant') { input.push({ type: 'message', - role: msg.role, + role: msg.role === 'assistant' ? 'developer' : msg.role, content: this.convertMessageContent(msg.content, msg.role) }); diff --git a/src/providers/openai/codex-core.js b/src/providers/openai/codex-core.js index 75b8bd8..a7abcde 100644 --- a/src/providers/openai/codex-core.js +++ b/src/providers/openai/codex-core.js @@ -117,12 +117,6 @@ export class CodexApiService { } logger.info('[Codex] Token expiring soon or refresh requested, refreshing...'); await this.refreshAccessToken(); - - // 刷新成功,重置 PoolManager 中的刷新状态并标记为健康 - const poolManager = getProviderPoolManager(); - if (poolManager && this.uuid) { - poolManager.resetProviderRefreshStatus(MODEL_PROVIDER.CODEX_API, this.uuid); - } } } @@ -239,17 +233,18 @@ export class CodexApiService { */ buildHeaders(cacheId) { return { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${this.accessToken}`, - 'Openai-Beta': 'responses=experimental', - 'Version': '0.21.0', - 'User-Agent': 'codex_cli_rs/0.50.0 (Mac OS 26.0.1; arm64) Apple_Terminal/464', - 'Originator': 'codex_cli_rs', - 'Chatgpt-Account-Id': this.accountId, - 'Accept': 'text/event-stream', - 'Connection': 'Keep-Alive', - 'Conversation_id': cacheId, - 'Session_id': cacheId + 'version': '0.89.0', + 'x-codex-beta-features': 'powershell_utf8', + 'x-oai-web-search-eligible': 'true', + 'session_id': cacheId, + 'accept': 'text/event-stream', + 'authorization': `Bearer ${this.accessToken}`, + 'chatgpt-account-id': this.accountId, + 'content-type': 'application/json', + 'user-agent': 'codex_cli_rs/0.89.0 (Windows 10.0.26100; x86_64) WindowsTerminal', + 'originator': 'codex_cli_rs', + 'host': 'chatgpt.com', + 'Connection': 'close' }; } @@ -294,6 +289,11 @@ export class CodexApiService { // 保存更新的凭据 await this.saveCredentials(); + // 刷新成功,重置 PoolManager 中的刷新状态并标记为健康 + const poolManager = getProviderPoolManager(); + if (poolManager && this.uuid) { + poolManager.resetProviderRefreshStatus(MODEL_PROVIDER.CODEX_API, this.uuid); + } logger.info('[Codex] Token refreshed successfully'); } catch (error) { logger.error('[Codex] Failed to refresh token:', error.message); diff --git a/src/utils/provider-strategies.js b/src/utils/provider-strategies.js index 976c950..b4495c7 100644 --- a/src/utils/provider-strategies.js +++ b/src/utils/provider-strategies.js @@ -20,8 +20,7 @@ class ProviderStrategyFactory { case MODEL_PROTOCOL_PREFIX.CLAUDE: return new ClaudeStrategy(); case MODEL_PROTOCOL_PREFIX.CODEX: - // Codex 使用 OpenAI 策略(因为它基于 OpenAI 格式) - return new OpenAIStrategy(); + return new ResponsesAPIStrategy(); case MODEL_PROTOCOL_PREFIX.FORWARD: return new ForwardStrategy(); default: