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: