Documentation

文档
首页 / 文档 / 客户端配置

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 的按次套餐需要使用自定义脚本查询。

LINDE AI CC-Switch - 003-usage 配置步骤

配置步骤:

  1. 鼠标悬停在供应商卡片上,点击 用量查询 按钮(📊 图标)
  2. 打开 启用用量查询 开关
  3. 选择 自定义 模板
  4. Base URL 填写你的 LINDE AI 端点地址(留空则使用供应商本身的地址)
  5. 将以下脚本粘贴到编辑框中:
({
  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 + " · 不限额"
    };
  }
})
  1. 点击 测试脚本 确认能正常返回
  2. 保存配置

配置后,卡片底部会根据套餐类型显示对应信息:

  • 按次套餐 / GLM 编码套餐:显示剩余次数、已用次数、总次数与周期重置倒计时
  • Token 套餐(GLM Token / GPT Codex / GPT 全客户端):显示本周剩余 Token 价值额度、已用额度、周期限额(USD)与周期重置倒计时
  • 钱包余额:显示剩余余额(USD)
  • 不限额套餐:显示"不限额"
⚠️ 避免误用按次换算

PER_REQUEST = 0.007(GLM 单次价格)只适用于 GLM 编码套餐 的 USD 限额→次数等价换算。Token 套餐的 USD 是官方 Token 价值额度,不是按次金额池,不能除以 0.007 换算成次数,否则会出现"剩余 49997 次"这类无意义数值。