CC-Switch
最后更新: 2026-06-30
CC-Switch 是一个桌面工具,可统一管理 Claude Code、Codex 与 Gemini CLI 的供应商配置、MCP 服务器和系统提示词,支持一键切换 API 配置。
💡 温馨提示
你可以在各客户端配置文档中,按照「通过 CC-Switch 配置」章节完成图形化配置。
#安装
前往 GitHub Releases 下载适合你系统的安装包:
- Windows:下载
.msi安装包,双击安装 - macOS:下载
.dmg安装包,拖入应用程序文件夹
ℹ️ Linux 用户
下载 .deb 包(请到 GitHub Releases 确认实际版本号):
wget https://github.com/farion1231/cc-switch/releases/latest/download/cc-switch_x.x.x_amd64.deb
安装:
sudo dpkg -i cc-switch_x.x.x_amd64.deb
安装后,你可以在各客户端配置文档中查看「通过 CC-Switch 配置」章节来使用图形界面完成配置。
#配置用量查询(可选)
CC-Switch 支持在卡片上显示剩余额度,方便监控套餐用量。LINDE AI 的按次套餐需要使用自定义脚本查询。

配置步骤:
- 鼠标悬停在供应商卡片上,点击 用量查询 按钮(📊 图标)
- 打开 启用用量查询 开关
- 选择 自定义 模板
- Base URL 填写你的 LINDE AI 端点地址(留空则使用供应商本身的地址)
- 将以下脚本粘贴到编辑框中:
({
request: {
url: "{{baseUrl}}/v1/usage",
method: "GET",
headers: {
"Authorization": "Bearer {{apiKey}}",
"User-Agent": "cc-switch/1.0"
}
},
extractor: function(response) {
if (!response.isValid) {
return {
isValid: false,
invalidMessage: response.message || "API Key 无效"
};
}
var sub = response.subscription || {};
var usage = response.usage || {};
var today = usage.today || {};
var plan = response.planName || "";
var isTokenPlan = /token/i.test(plan);
var PER_REQUEST = 0.007;
// 格式化周期重置时间(基于窗口起始时间 + 7 天,而非订阅本身的 expires_at)
function formatReset(windowStartStr) {
if (!windowStartStr) return "";
var windowStart = new Date(windowStartStr);
if (isNaN(windowStart.getTime())) return "";
var reset = new Date(windowStart.getTime() + 7 * 86400000);
var diff = reset - new Date();
if (diff <= 0) return "即将重置";
var days = Math.floor(diff / 86400000);
var hours = Math.floor((diff % 86400000) / 3600000);
return days > 0 ? days + "d " + hours + "h 后重置" : hours + "h 后重置";
}
// 格式化 Key 到期时间(仅用于非订阅、有 expires_at 的场景)
function formatExpiry(expiresAtStr) {
if (!expiresAtStr) return "";
var expires = new Date(expiresAtStr);
if (isNaN(expires.getTime()) || expires <= new Date()) return "";
var diff = expires - new Date();
var days = Math.floor(diff / 86400000);
var hours = Math.floor((diff % 86400000) / 3600000);
return days > 0 ? days + "d " + hours + "h 后到期" : hours + "h 后到期";
}
// === 按次套餐(quota_limited) ===
if (response.mode === "quota_limited" && response.quota) {
var q = response.quota;
var totalTimes = q.limit ? Math.floor(q.limit / PER_REQUEST) : 0;
var remainingTimes = q.remaining ? Math.floor(q.remaining / PER_REQUEST) : 0;
return {
isValid: true,
planName: plan,
remaining: remainingTimes,
used: totalTimes - remainingTimes,
total: totalTimes,
unit: "次",
extra: plan + (formatExpiry(response.expires_at) ? " · " + formatExpiry(response.expires_at) : "")
};
}
// === 订阅型套餐 ===
if (sub.weekly_limit_usd && sub.weekly_limit_usd > 0) {
// Token 套餐:展示官方 Token 价值额度(USD),不换算次数
if (isTokenPlan) {
var used = sub.weekly_usage_usd || 0;
var limit = sub.weekly_limit_usd;
var remainingUsd = Math.max(0, limit - used);
return {
isValid: true,
planName: plan,
remaining: parseFloat(remainingUsd.toFixed(2)),
used: parseFloat(used.toFixed(2)),
total: limit,
unit: "USD",
extra: plan + (formatReset(sub.weekly_window_start) ? " · " + formatReset(sub.weekly_window_start) : "")
};
}
// GLM 编码套餐:按次订阅,USD 限额等价换算为次数
var totalTimes = Math.floor(sub.weekly_limit_usd / PER_REQUEST);
var usedTimes = Math.floor((sub.weekly_usage_usd || 0) / PER_REQUEST);
var remainingTimes = Math.max(0, totalTimes - usedTimes);
return {
isValid: true,
planName: plan,
remaining: remainingTimes,
used: usedTimes,
total: totalTimes,
unit: "次",
extra: plan + (formatReset(sub.weekly_window_start) ? " · " + formatReset(sub.weekly_window_start) : "")
};
}
if (sub.daily_limit_usd && sub.daily_limit_usd > 0) {
// Token 套餐:展示官方 Token 价值额度(USD),不换算次数
if (isTokenPlan) {
var used = sub.daily_usage_usd || 0;
var limit = sub.daily_limit_usd;
var remainingUsd = Math.max(0, limit - used);
return {
isValid: true,
planName: plan,
remaining: parseFloat(remainingUsd.toFixed(2)),
used: parseFloat(used.toFixed(2)),
total: limit,
unit: "USD",
extra: plan
};
}
// GLM 编码套餐:按次订阅
var totalTimes = Math.floor(sub.daily_limit_usd / PER_REQUEST);
var usedTimes = Math.floor((sub.daily_usage_usd || 0) / PER_REQUEST);
var remainingTimes = Math.max(0, totalTimes - usedTimes);
return {
isValid: true,
planName: plan,
remaining: remainingTimes,
used: usedTimes,
total: totalTimes,
unit: "次",
extra: plan
};
}
if (sub.monthly_limit_usd && sub.monthly_limit_usd > 0) {
// Token 套餐:展示官方 Token 价值额度(USD),不换算次数
if (isTokenPlan) {
var used = sub.monthly_usage_usd || 0;
var limit = sub.monthly_limit_usd;
var remainingUsd = Math.max(0, limit - used);
return {
isValid: true,
planName: plan,
remaining: parseFloat(remainingUsd.toFixed(2)),
used: parseFloat(used.toFixed(2)),
total: limit,
unit: "USD",
extra: plan
};
}
// 编码套餐(月)
var totalTimes = Math.floor(sub.monthly_limit_usd / PER_REQUEST);
var usedTimes = Math.floor((sub.monthly_usage_usd || 0) / PER_REQUEST);
var remainingTimes = Math.max(0, totalTimes - usedTimes);
return {
isValid: true,
planName: plan,
remaining: remainingTimes,
used: usedTimes,
total: totalTimes,
unit: "次",
extra: plan
};
}
// === 余额制(无订阅,有钱包余额) ===
if (response.remaining && response.remaining > 0) {
return {
isValid: true,
planName: plan || "钱包余额",
remaining: parseFloat(response.remaining.toFixed(4)),
unit: response.unit || "USD",
extra: "钱包余额"
};
}
// === 不限额套餐 ===
return {
isValid: true,
planName: plan,
remaining: -1,
unit: "次",
extra: plan + " · 不限额"
};
}
})
- 点击 测试脚本 确认能正常返回
- 保存配置
配置后,卡片底部会根据套餐类型显示对应信息:
- 按次套餐 / GLM 编码套餐:显示剩余次数、已用次数、总次数与周期重置倒计时
- Token 套餐(GLM Token / GPT Codex / GPT 全客户端):显示本周剩余 Token 价值额度、已用额度、周期限额(USD)与周期重置倒计时
- 钱包余额:显示剩余余额(USD)
- 不限额套餐:显示"不限额"
⚠️ 避免误用按次换算
PER_REQUEST = 0.007(GLM 单次价格)只适用于 GLM 编码套餐 的 USD 限额→次数等价换算。Token 套餐的 USD 是官方 Token 价值额度,不是按次金额池,不能除以 0.007 换算成次数,否则会出现"剩余 49997 次"这类无意义数值。