From d709dcd7abd2b155ae0f0a07fce35c7952a6a4f6 Mon Sep 17 00:00:00 2001 From: Kananosa Date: Wed, 29 Jul 2026 01:18:59 +0800 Subject: [PATCH] fix: fixed model mapping stop working in codex --- src-tauri/src/proxy/forwarder.rs | 6 ++++++ src-tauri/src/proxy/providers/codex.rs | 12 ++++++++++++ src-tauri/src/proxy/providers/mod.rs | 4 ++-- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src-tauri/src/proxy/forwarder.rs b/src-tauri/src/proxy/forwarder.rs index 8c9d10df3d..7517067d7f 100644 --- a/src-tauri/src/proxy/forwarder.rs +++ b/src-tauri/src/proxy/forwarder.rs @@ -1159,9 +1159,15 @@ impl RequestForwarder { // 应用模型映射(独立于格式转换) // Claude Desktop proxy 模式必须先把 Desktop 可见的 claude-* route // 映射成真实上游模型名,并且未知 route 要直接报错,不能使用默认模型兜底。 + // Codex catalogue 集成模式(Responses 原生直连)使用 catalog 模型,无需 env 映射。 let mapped_body = if matches!(app_type, AppType::ClaudeDesktop) { crate::claude_desktop_config::map_proxy_request_model(body.clone(), provider) .map_err(|e| ProxyError::InvalidRequest(e.to_string()))? + } else if matches!(app_type, AppType::Codex | AppType::GrokBuild) + && super::providers::codex_provider_has_catalog_model(provider) + { + // Codex catalogue provider 使用 catalog 模型,跳过 env 映射 + body.clone() } else { let (mapped_body, _original_model, _mapped_model) = super::model_mapper::apply_model_mapping(body.clone(), provider); diff --git a/src-tauri/src/proxy/providers/codex.rs b/src-tauri/src/proxy/providers/codex.rs index b3bff940e0..1cf06061ae 100644 --- a/src-tauri/src/proxy/providers/codex.rs +++ b/src-tauri/src/proxy/providers/codex.rs @@ -327,6 +327,18 @@ pub fn apply_codex_upstream_model(provider: &Provider, body: &mut JsonValue) -> Some(upstream_model) } +/// Check if the provider has a catalog with model mappings +/// This is used to skip env-based model mapping for providers that use catalog models +pub fn codex_provider_has_catalog_model(provider: &Provider) -> bool { + provider + .settings_config + .get("modelCatalog") + .and_then(|catalog| catalog.get("models")) + .and_then(|models| models.as_array()) + .map(|models| !models.is_empty()) + .unwrap_or(false) +} + pub fn resolve_codex_chat_reasoning_config( provider: &Provider, body: &JsonValue, diff --git a/src-tauri/src/proxy/providers/mod.rs b/src-tauri/src/proxy/providers/mod.rs index 625e1d0bbf..c2af56cb96 100644 --- a/src-tauri/src/proxy/providers/mod.rs +++ b/src-tauri/src/proxy/providers/mod.rs @@ -57,8 +57,8 @@ pub use claude::{ }; pub use codex::CodexAdapter; pub use codex::{ - apply_codex_chat_upstream_model, apply_codex_upstream_model, codex_provider_upstream_model, - inject_codex_chat_prompt_cache_key, is_codex_official_provider, + apply_codex_chat_upstream_model, apply_codex_upstream_model, codex_provider_has_catalog_model, + codex_provider_upstream_model, inject_codex_chat_prompt_cache_key, is_codex_official_provider, provider_needs_responses_namespace_flatten, resolve_codex_catalog_tool_profile, resolve_codex_chat_reasoning_config, should_convert_codex_responses_to_anthropic, should_convert_codex_responses_to_chat,