fix(claude-desktop): match proxy model route without [1M] suffix

Claude Desktop strips the [1M] suffix from model IDs when sending
requests, causing route lookup to fail with "model route is not
configured". Fall back to base-name comparison when exact match misses.
This commit is contained in:
Jason
2026-05-08 19:13:46 +08:00
parent 21b9eb0430
commit 1fa019026e
+22 -1
View File
@@ -586,7 +586,16 @@ pub fn map_proxy_request_model(mut body: Value, provider: &Provider) -> Result<V
})?;
let routes = proxy_model_routes(provider)?;
let Some(route) = routes.iter().find(|route| route.route_id == requested) else {
let route = routes
.iter()
.find(|r| r.route_id == requested)
.or_else(|| {
let base = strip_one_m_context_suffix(&requested);
routes
.iter()
.find(|r| strip_one_m_context_suffix(&r.route_id) == base)
});
let Some(route) = route else {
return Err(AppError::localized(
"claude_desktop.provider.route_unknown",
format!("Claude Desktop 模型路由未配置: {requested}"),
@@ -1179,6 +1188,18 @@ mod tests {
assert!(err.to_string().contains("claude-opus-4-7"));
}
#[test]
fn claude_desktop_proxy_maps_route_without_1m_suffix() {
let provider = proxy_provider("proxy");
let mapped = map_proxy_request_model(
json!({"model": "claude-sonnet-4-6", "messages": []}),
&provider,
)
.expect("base name should fallback-match the [1M] route");
assert_eq!(mapped["model"], json!("kimi-k2 [1M]"));
}
#[test]
fn claude_desktop_one_m_suffix_normalization_is_case_and_space_tolerant() {
assert!(is_claude_safe_model_id("claude-sonnet-4-6 [1m]"));