mirror of
https://github.com/farion1231/cc-switch.git
synced 2026-08-04 03:32:25 +08:00
95c917b337
智谱团队套餐(Team Plan)的额度查询与个人版不同:同一 quota 端点加 `?type=2`,需额外 `bigmodel-organization` / `bigmodel-project` 请求头 (api_key + 组织 ID + 项目 ID 三者缺一不可),且仅存在于国内站 open.bigmodel.cn。参考 token-monitor/src/shared/zaiTeamLimits.js 实现。 - Backend (services/coding_plan.rs): 新增 query_zhipu_team(固定 CN 站、 ?type=2、org/project 头);抽出 zhipu_quota_from_body 与个人版共用解析; 入口 get_coding_plan_quota 靠显式 coding_plan_provider == "zhipu_team" 路由(base_url 与个人版智谱相同,detect_provider 无法区分)。新字段经 UsageScript、IPC 命令、后台查询路径(query_provider_usage_inner)透传。 - Frontend: UsageScriptModal 新增「Zhipu GLM Team」选项 + 组织/项目 ID 输入;模板切换时保留 team 字段;测试与保存逻辑按 team 传参。 - i18n: en/zh/zh-TW/ja 四个 locale 更新。 - Tests: 凭据校验/路由(缺任一凭据 → NotFound,标识大小写不敏感)+ 本地 server 验证 ?type=2 与 org/project 请求头形状。 Co-authored-by: XuZhanXin <1239576606@qq.com> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
105 lines
3.6 KiB
TypeScript
105 lines
3.6 KiB
TypeScript
/**
|
|
* Coding Plan 供应商的 base_url 路由表。
|
|
*
|
|
* 与后端 `src-tauri/src/services/coding_plan.rs::detect_provider` 保持一致:
|
|
* 后端靠 `url.contains(...)` 做子串判断,前端这里用 RegExp 做同效匹配。
|
|
* 新增供应商时改这一处即可(UsageScriptModal 下拉 + useProviderActions
|
|
* 新建自动注入 + 托盘识别全部复用)。
|
|
*/
|
|
import { createUsageScript } from "@/types";
|
|
import { TEMPLATE_TYPES } from "@/config/constants";
|
|
|
|
export interface CodingPlanProviderEntry {
|
|
/** 与后端 QuotaTier 的 `codingPlanProvider` 取值对齐 */
|
|
id: "kimi" | "zhipu" | "zhipu_team" | "minimax" | "zenmux" | "volcengine";
|
|
/** UsageScriptModal 下拉显示用 */
|
|
label: string;
|
|
/** base_url 匹配规则 */
|
|
pattern: RegExp;
|
|
}
|
|
|
|
export const CODING_PLAN_PROVIDERS: readonly CodingPlanProviderEntry[] = [
|
|
{ id: "kimi", label: "Kimi For Coding", pattern: /api\.kimi\.com\/coding/i },
|
|
{
|
|
id: "zhipu",
|
|
label: "Zhipu GLM (智谱)",
|
|
pattern: /bigmodel\.cn|api\.z\.ai/i,
|
|
},
|
|
{
|
|
// 智谱团队套餐(Team Plan)。base_url 与个人版智谱(open.bigmodel.cn)相同,
|
|
// 无法靠 base_url 自动区分——靠显式 codingPlanProvider === "zhipu_team" 路由。
|
|
// 个人版 zhipu 排在前面,detectCodingPlanProvider 首匹配仍命中个人版,
|
|
// 故团队版永不被 injectCodingPlanUsageScript 自动注入(必须用户手动选)。
|
|
// pattern 仅占位(下拉展示用),实际不参与自动检测。
|
|
id: "zhipu_team",
|
|
label: "Zhipu GLM Team (智谱团队)",
|
|
pattern: /bigmodel\.cn/i,
|
|
},
|
|
{
|
|
id: "minimax",
|
|
label: "MiniMax",
|
|
pattern: /api\.minimaxi?\.com|api\.minimax\.io/i,
|
|
},
|
|
{
|
|
id: "zenmux",
|
|
label: "ZenMux",
|
|
pattern: /zenmux\./i,
|
|
},
|
|
{
|
|
// 火山方舟 Agent Plan / Coding Plan。base_url 形如
|
|
// ark.cn-beijing.volces.com/api/coding[/v3];与后端 detect_provider 的
|
|
// `volces.com/api/coding` 子串判断同效。
|
|
id: "volcengine",
|
|
label: "火山方舟 (Volcengine)",
|
|
pattern: /volces\.com\/api\/coding/i,
|
|
},
|
|
] as const;
|
|
|
|
/** 根据 Base URL 自动检测 Coding Plan 供应商;未命中返回 null */
|
|
export function detectCodingPlanProvider(
|
|
baseUrl: string | undefined | null,
|
|
): CodingPlanProviderEntry["id"] | null {
|
|
if (!baseUrl) return null;
|
|
for (const cp of CODING_PLAN_PROVIDERS) {
|
|
if (cp.pattern.test(baseUrl)) return cp.id;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* 新建 Claude 供应商时,若 `ANTHROPIC_BASE_URL` 命中 Coding Plan 路由表,
|
|
* 自动把 `meta.usage_script` 标记为 token_plan 并启用。
|
|
*
|
|
* - 仅在 `meta.usage_script` 完全缺失时注入,不覆盖用户/UsageScriptModal 已有配置
|
|
* - 仅对 Claude app 生效:后端 `commands/provider.rs` 的 token_plan 分支只处理 Claude
|
|
* supplier 的 `settings_config.env.ANTHROPIC_BASE_URL`
|
|
* - code 置空:Rust 端走专用 `coding_plan::get_coding_plan_quota`,不执行 JS 脚本
|
|
*/
|
|
export function injectCodingPlanUsageScript<
|
|
T extends {
|
|
settingsConfig?: Record<string, any>;
|
|
meta?: Record<string, any>;
|
|
},
|
|
>(appId: string, provider: T): T {
|
|
if (appId !== "claude") return provider;
|
|
if (provider.meta?.usage_script) return provider;
|
|
|
|
const baseUrl = provider.settingsConfig?.env?.ANTHROPIC_BASE_URL;
|
|
const codingPlanProvider = detectCodingPlanProvider(
|
|
typeof baseUrl === "string" ? baseUrl : null,
|
|
);
|
|
if (!codingPlanProvider) return provider;
|
|
|
|
return {
|
|
...provider,
|
|
meta: {
|
|
...(provider.meta ?? {}),
|
|
usage_script: createUsageScript({
|
|
enabled: true,
|
|
templateType: TEMPLATE_TYPES.TOKEN_PLAN,
|
|
codingPlanProvider,
|
|
}),
|
|
},
|
|
};
|
|
}
|