From d8b6464934b3371538f6b5c05d0a65aa50ebe989 Mon Sep 17 00:00:00 2001 From: sternelee Date: Thu, 4 Jun 2026 14:13:11 +0800 Subject: [PATCH] fix(provider): avoid clearing compatible profile on model set; profile-specific cache for reasoning models - Prevent set_active_provider(OpenRouter) from shadowing active compatible profiles - Use profile_id namespace for disk cache lookup to skip blocking API calls - Respect explicit thinking_enabled=true even without provider features - Add kimi-for-coding to Kimi model detection --- crates/jcode-base/src/provider/mod.rs | 4 +++- crates/jcode-base/src/provider/openrouter.rs | 11 +++++++++++ .../src/provider/openrouter_provider_impl.rs | 3 ++- crates/jcode-provider-openrouter/src/lib.rs | 2 +- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/crates/jcode-base/src/provider/mod.rs b/crates/jcode-base/src/provider/mod.rs index 65b49289e..cc660c767 100644 --- a/crates/jcode-base/src/provider/mod.rs +++ b/crates/jcode-base/src/provider/mod.rs @@ -698,7 +698,9 @@ impl MultiProvider { }; provider.set_model(model)?; registry.set_active_compatible_profile(profile_id); - self.set_active_provider(ActiveProvider::OpenRouter); + // NOTE: Do NOT call set_active_provider(ActiveProvider::OpenRouter) here + // because it clears the active compatible profile we just set above. + // The compatible profile mechanism handles routing independently. Ok(()) } diff --git a/crates/jcode-base/src/provider/openrouter.rs b/crates/jcode-base/src/provider/openrouter.rs index ba3dc097c..9885f5807 100644 --- a/crates/jcode-base/src/provider/openrouter.rs +++ b/crates/jcode-base/src/provider/openrouter.rs @@ -1472,6 +1472,17 @@ impl OpenRouterProvider { pub(crate) fn load_usable_model_disk_cache_entry( &self, ) -> Option { + // For direct OpenAI-compatible profiles (e.g. DeepSeek), try the + // profile-specific namespace first so we don't fall through to a + // blocking fetch_models_from_api call every time. + if let Some(profile_id) = self.profile_id.as_deref() { + if let Some(entry) = + jcode_provider_openrouter::load_disk_cache_entry_for_namespace(profile_id) + && self.model_disk_cache_source_matches(&entry) + { + return Some(entry); + } + } load_disk_cache_entry().filter(|entry| self.model_disk_cache_source_matches(entry)) } diff --git a/crates/jcode-base/src/provider/openrouter_provider_impl.rs b/crates/jcode-base/src/provider/openrouter_provider_impl.rs index cd6e6ba9f..b33eab4a9 100644 --- a/crates/jcode-base/src/provider/openrouter_provider_impl.rs +++ b/crates/jcode-base/src/provider/openrouter_provider_impl.rs @@ -21,7 +21,8 @@ impl Provider for OpenRouterProvider { None } }); - let allow_reasoning = self.supports_provider_features && thinking_enabled != Some(false); + let allow_reasoning = (self.supports_provider_features || thinking_enabled == Some(true)) + && thinking_enabled != Some(false); let include_reasoning_content = thinking_enabled == Some(true) || (allow_reasoning && Self::is_kimi_model(&model)); diff --git a/crates/jcode-provider-openrouter/src/lib.rs b/crates/jcode-provider-openrouter/src/lib.rs index a9fa17f71..d8674190d 100644 --- a/crates/jcode-provider-openrouter/src/lib.rs +++ b/crates/jcode-provider-openrouter/src/lib.rs @@ -714,7 +714,7 @@ pub fn parse_provider_routing_from_env() -> ProviderRouting { pub fn is_kimi_model(model: &str) -> bool { let lower = model.to_lowercase(); - lower.contains("moonshotai/") || lower.contains("kimi-k2") || lower.contains("kimi-k2.5") + lower.contains("moonshotai/") || lower.contains("kimi-k2") || lower.contains("kimi-k2.5") || lower.contains("kimi-for-coding") } pub fn rank_providers_from_endpoints(endpoints: &[EndpointInfo]) -> Vec {