mirror of
https://github.com/farion1231/cc-switch.git
synced 2026-07-24 12:44:18 +08:00
ad030da3b1
Fixes #3701. `query_zhipu` was hard-coded to `https://api.z.ai`, so a user who configured the mainland China preset (`Zhipu GLM` on `open.bigmodel.cn`) could not retrieve usage once the international endpoint became unreachable from their network (or vice versa). The two endpoints share the same quota path (`/api/monitor/usage/quota/limit`) and return JSON in the same shape, and — crucially — each user only ever uses one of them: the quota host is the same host they're already running coding on. So we can route by the configured `base_url` and skip the cross-host fallback entirely. What this PR changes -------------------- A single helper that maps the user's `base_url` to the matching quota host, and `query_zhipu` rebuilt to take `base_url` and pick the right host: fn zhipu_quota_base(base_url: &str) -> &'static str { if base_url.contains("bigmodel.cn") { "https://open.bigmodel.cn" } else { "https://api.z.ai" } } async fn query_zhipu(base_url: &str, api_key: &str) -> SubscriptionQuota { let url = format!( "{}/api/monitor/usage/quota/limit", zhipu_quota_base(base_url), ); // ... original 401/403 -> Expired / make_error / parse path, unchanged } The dispatcher already distinguishes `ZhipuCn` from `ZhipuEn` via `detect_provider()` and routes the call through `query_zhipu(base_url, api_key)` in the same match arm. Why no cross-host fallback -------------------------- Farion's review pointed out that adding a fallback would be over-engineered and actively harmful: 1. Reachability is determined by the preset the user chose. Their configured host is the host they are already using to run coding; if it were unreachable, the user could not have reached the "query usage" step at all. 2. The fallback path required distinguishing "both 401/403" (genuine bad key) from "one 401/403 + one network error" (regional block), which silently misclassified the second case as a generic query failure and hid the upstream "Session expired" UX for invalid keys. 3. It also cost the worst-case ~10s+10s≈20s serial timeout for users on a working primary. With the URL-based routing in place, 401/403 returns to the original `CredentialStatus::Expired` semantics — same UX as `query_kimi` and `query_minimax`. Files changed ------------- - `src-tauri/src/services/coding_plan.rs` — 1 file, +35 / -20 Testing ------- - 3 new `zhipu_quota_base_*` routing tests - 15 existing `coding_plan` parser tests still pass - `cargo fmt --check` clean - `cargo clippy --lib --no-deps -- -D warnings` clean Co-authored-by: Yongmao Luo <yongmao.luo@columbia.edu> Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>