Back to Cc Switch

CC Switch v3.19.0

docs/release-notes/v3.19.0-zh.md

3.19.040.7 KB
Original Source

CC Switch v3.19.0

这一版的主线是让你更放心:一波集中式安全加固——Skill 安装、ccswitch:// 导入确认、SQL 备份导入、通用配置合并、终端启动全部收紧,其中两条需要你花一分钟确认——Gemini 通用配置的密钥泄漏已修复并在升级后自动清洗(需要你轮换密钥),ccswitch:// 的 MCP 导入确认框此前可能显示不出即将写入的命令(若你曾打开过来源不明的导入链接,建议核对一次),两条都见「升级提醒」;一个代理正确性大修——通过代理读图不再撑爆上下文(一张截图曾经吃掉 10 万+ token,两三张就能把 Codex 会话卡死在 400 上)。省心的部分同样实在:模型定价可以交给 models.dev 自动维护、Grok CLI 官方登录模式的用量与 SuperGrok 订阅余量终于进看板、应用内更新改走 dl.ccswitch.io 镜像——GitHub 访问不畅也能顺利升级。

English → | 日本語版 →


重点内容:你现在可以

  • 在代理下正常读图,不再撑爆上下文:Codex 的 view_image、返回图片的 MCP 工具,图片此前被序列化成工具文本、按纯文本计 token(约 9,000 倍膨胀);现在所有转换桥都把图片还原为原生格式再上送(文件与音频在两条 Chat 桥上一并支持)。真实测试里同一回放轮从 85k+ token 降到约 12k、缓存命中 99%。
  • 把模型定价交给 models.dev 自动维护:用量面板新增「models.dev 自动定价同步」(默认关闭)。开启后启动时自动刷新所选模型的价格(每 6 小时至多一次),可在完整目录里挑选要跟踪的模型,或让它自动包含各家最新的常用模型。手工改价与删价从本版起会记入 ~/.cc-switch/model-pricing.json,数据库重建也不丢。
  • 看到 Grok 官方模式的用量与订阅余量:Grok CLI 用官方 OAuth 登录时无法走本地代理,此前这部分消耗完全不可见;现在会从会话日志导入逐轮用量,看板里以「Grok Build (Session)」呈现。官方类 Grok Build 供应商卡片还会直接显示 SuperGrok 订阅的额度用量与重置时间。
  • 更放心地点开 ccswitch:// 导入链接:确认框现在完整展示命令、每个参数、URL 与环境变量(凭据类值脱敏显示),高亮标记值得多看一眼的值——shell 内联执行、改变加载行为的环境变量、内网 / 元数据地址;用量查询脚本会显示完整代码,且默认以禁用状态导入
  • 确认 Gemini 供应商里不再夹带别人的密钥:通用配置共享片段此前会把 GOOGLE_API_KEY 等凭据复制进每个使用它的 Gemini 供应商;本版关闭该路径,升级后首次启动自动执行一次性清洗。凡是进过共享 Gemini 片段的密钥都应视为已暴露,请先轮换再重填(见「升级提醒」)。
  • 在 GitHub 访问不畅时照常更新应用:应用内更新器优先查询 https://dl.ccswitch.io/latest.json(Cloudflare R2 镜像),GitHub 作为回落;minisign 签名校验不变,镜像本身不被信任。
  • 新建供应商时直接用上最新模型:预设默认模型升级为 Claude Opus 5、GPT-5.6 Sol 与 Gemini 3.6 Flash,配套定价同步入库;已创建的供应商保持原样。
  • 更快导入 fork 密集的 Codex 用量历史:父 rollout 文件只解析一次、跨全部 fork 点共享,fork 密集的历史重建明显提速,导入结果逐字节不变。

使用攻略

本版新能力主要落在用量面板与 ccswitch:// 深链导入上,建议结合以下文档了解:

  • 用量统计:用量看板的数据来源与统计口径。本版新增 models.dev 自动定价同步与 Grok 官方模式用量导入。
  • 深链导入(ccswitch://):导入确认框的字段说明与 usageEnabled 等参数的默认值(本版起用量脚本默认禁用导入,文档已同步修正)。
  • 安全策略(SECURITY.md):本版补齐了威胁模型与报告范围——哪些输入被视为不可信、哪些问题欢迎报告,一目了然。

[!WARNING]

唯一官方渠道声明(请务必阅读)

CC Switch 是完全免费、开源的桌面应用,不会向用户收取任何费用。请仅通过下列官方渠道获取本软件:

类别唯一官方
官网ccswitch.io
源码github.com/farion1231/cc-switch
下载GitHub Releases
作者@farion1231
举报山寨GitHub Issues

任何向你收费、要求充值、或索取登录凭据的"CC Switch"网站或客户端均为假冒。如果你被诱导支付了费用,请立即停止操作并通过 GitHub Issues 反馈。


概览

CC Switch v3.19.0 由一波安全加固与一个代理正确性大修领衔。安全侧(#5811 及后续独立修复):从 GitHub 仓库安装 Skill 加固了 zip-slip 与路径穿越并设归档上限;Gemini 通用配置的密钥泄漏被关闭,升级后首次启动自动执行一次性清洗,把已经泄漏进其它供应商配置的密钥清理干净;导入 SQL 备份改在 SQLite authorizer 下执行,ATTACH 等能触及导入库之外的语句一律拒绝;通用配置片段合并不再跟随 __proto__ 污染全局原型;外部终端启动改用 POSIX 单引号转义,目录名再也注入不了命令;ccswitch:// 导入确认框完整展示载荷(凭据类值脱敏显示)并标记风险值,用量脚本默认禁用导入。代理侧,工具结果里的图片不再被序列化成工具文本,而是在各转换桥还原为原生媒体上送(文件与音频在两条 Chat 桥上一并支持)——终结了「一张 113 KB 截图吃掉 10 万+ token、两三张图把 Codex 会话卡死在 400 上」的问题(#4465#5663)。

用量统计获得两块新能力:models.dev 自动定价同步(可选开启,#5734),配套把手工改价 / 删价持久化到人类可编辑的 ~/.cc-switch/model-pricing.json;以及 Grok CLI 官方 OAuth 模式的用量导入——这条流量无法走本地代理,此前完全不可见——外加供应商卡片上的 SuperGrok 订阅配额展示。围绕分发与体验:应用内更新优先走 dl.ccswitch.io 的 Cloudflare R2 镜像(GitHub 回落,签名校验不变);Codex 用量导入对 fork 会话重用已解析的父 rollout 时间线(#5626);预设默认模型升级为 Claude Opus 5、GPT-5.6 Sol 与 Gemini 3.6 Flash;OpenClaw 的 Kimi For Coding 预设修正了 base URL;工具栏应用切换器改为纯图标。本版没有数据库 schema 迁移,升级轻量。

发布日期:2026-07-30

更新规模:38 commits | 132 files changed | +14,926 / -1,415 lines


新功能

models.dev 自动定价同步

用量面板的定价区新增「models.dev 自动定价同步」卡片,默认关闭、需手动开启:开启时会有确认说明——CC Switch 将在启动时(每 6 小时至多一次)从 models.dev 刷新所选模型的价格,同名模型的内置价与手工价都会被覆盖。「选择模型」对话框提供完整的 models.dev 目录(可搜索筛选),另有「自动包含常用模型」选项,覆盖 Claude、GPT、Gemini、Grok、DeepSeek、Qwen、MiMo、LongCat、Kimi、MiniMax、GLM 各家最近发布的模型(每族至多 6 个,可单独排除)。卡片显示上次同步时间与错误,提供「立即同步」,还能打开或重载本地定价文件。

从本版起,手工改价与删价会同时记入数据库旁边的人类可编辑文件 ~/.cc-switch/model-pricing.json,每次启动重放——数据库重建后手工定价不再丢失,删掉的内置价也终于能删得掉(以墓碑记录,不再被重新播种)。注意该文件创建时为空、刻意不从既有定价表回填(否则内置价会被一并写成覆盖项、挡掉将来的内置价修正),升级前的改价仍只存在数据库里,重存一次即可入文件。同步真的改了价格时,会把从未算出成本(零或缺失)的历史用量行按新价补算——已有成本的行保持原值;拉取失败或离线绝不阻塞启动。models.dev 列表还过滤掉了非文本与已弃用的模型(音频 / 图像 / 视频 / embedding 等),手动选价对话框一并清爽了。(#5734

Grok 官方模式的用量,终于进看板

Grok CLI 用官方 OAuth 登录时无法经本地代理路由——Grok 以空配置作为模式开关,没有地方能把它指向 CC Switch——这部分消耗此前在用量看板里完全不可见。现在 CC Switch 会随常规会话日志同步,从 ~/.grok/sessions(含归档会话)的 updates.jsonl 里按 turn_completed 事件导入逐轮用量:成本优先采用 CLI 自己上报的精确数字,缺失时回落本地定价(内置定价表新增 grok-4.5-build,$2 输入 / $6 输出 / $0.30 缓存读,每百万 token)。导入行以上游逐轮 ID 为键,回卷会话不会造成重复计数;沉淀窗口加近期代理活动检查,确保同一流量在「路由 + 官方」混用时也不会算两次。看板里新行以「Grok Build (Session)」供应商名呈现,应用筛选器新增 Grok Build 选项,数据来源分栏新增「Grok Build Session」条目与专属图标,四语齐全。

供应商卡片上的 SuperGrok 订阅配额

类别为「官方」的 Grok Build 供应商,卡片上现在直接显示 SuperGrok 订阅用量——与 Claude Code / Codex / Gemini 的官方订阅页脚并列:CC Switch 读取 Grok CLI 自己的 OAuth 凭据(~/.grok/auth.json),查询 grok.com 计费端点获取额度窗口的已用百分比与重置时间;重置间隔可识别时标注为「周」或「月」,否则归入新的「Credits」档(托盘用量摘要中以 c 组呈现)。网络瞬断时保留上一次读数并重试,不清空页脚;令牌过期会提示重新 grok login。Claude Code、Claude Desktop 与 Codex 里的受管 xAI OAuth(SuperGrok)供应商也自动获得同款配额展示——数据来自绑定到该供应商的账号,用量脚本入口随之隐藏。注意 Grok Build 供应商的「官方」判定现在只看 category 字段,不再探测配置内容。

Claude Opus 5 内置定价

claude-opus-5 加入内置定价表:$5 输入 / $25 输出、$0.50 缓存读 / $6.25 缓存写(每百万 token),用量不再显示 $0。按「不存在才插入」播种,改过的价格不受影响(Opus 5 fast 模式走独立计费,刻意未入表)。

预设目录更新

A6API(同模型多上游自动择优的聚合平台)加入八个应用的赞助商预设;PackyCode 预设在支持备用端点的五类预设(Claude Code / Claude Desktop / Codex / Gemini CLI / Grok Build)上新增三个备用地址,可在地址管理器与测速里选择;AICoding 合作伙伴预设回归七个应用;赞助商排序与 README 重新对齐。


变更

预设默认模型升级:Claude Opus 5、GPT-5.6 Sol、Gemini 3.6 Flash

内置预设的默认模型全面来到当前一代:claude-opus-5 替换 claude-opus-4-8(三种命名形态全覆盖),gpt-5.6-sol 替换 gpt-5.5 与裸 gpt-5.6gemini-3.6-flash 替换 gemini-3.5-flash。同步更新了所有镜像位置——通用 / NewAPI 默认值、Codex 自定义 config.toml 模板、推荐列表、表单占位符与四语文案;gemini-3.6-flash 定价同步入库($1.50 / $7.50、缓存读 $0.15,每百万 token)。仍钉在 gemini-3.1-pro-preview 的 Code0 与七牛 Gemini 预设一并对齐到 3.6 Flash——这是有意的档位调整:3.6 没有 Pro 版,3.5 Pro 仍限合作测试。默认值只影响新建供应商,已保存的供应商维持创建时的模型;Claude Desktop 的 opus 路由现值前进到 claude-opus-5claude-opus-4-8 转入兼容别名槽,存量配置照常解析。

应用内更新改走 ccswitch.io 镜像

更新器现在优先查询 https://dl.ccswitch.io/latest.json——发布清单的 Cloudflare R2 镜像——GitHub Releases 作为回落,检查与下载更新不再依赖 GitHub 可达。镜像清单把各平台下载指向同一存储桶,而 minisign 签名保持不动:签名覆盖的是文件内容而非 URL,每个下载产物仍会对着内置公钥校验,镜像本身始终不被信任。发布由 release 门控的同步工作流负责,只有当 tag 确为 GitHub 的 releases/latest 时才改写根清单,镜像永远不会把用户往回推到旧版本。

Codex 用量导入:fork 会话提速

导入与重建 Codex 用量统计不再对同一个父 rollout 文件按 fork 点逐次重读:每个父 ~/.codex/sessions/*.jsonl 只解析一次,生成内存中的 token 时间线,由所有从它 fork 出的子会话共享,各子会话的截断点改为内存过滤。缓存以文件身份戳校验(修改时间、大小,加 Unix 的 device/inode 或 Windows 的卷序列号 + 文件 ID),被追加、轮转或替换的父文件会重读而不是拿到陈旧数据。提速幅度取决于 fork 密度:fork 密集的历史冗余解析大幅减少,fork 稀少的历史基本不变——两种情况下导入结果都逐字节一致。(#5626

工具栏应用切换器改为纯图标

切换器按钮不再在图标旁渲染文字标签——受管应用增至八个后,标签本来就几乎总是被溢出检测收起,于是移除了基于 ResizeObserver 的自动紧凑机制,始终只显示图标。应用名保留在悬停提示里,读屏器经 aria-label 照常可及。

赞助商域名与推荐链接刷新

多家赞助商迁移了域名,预设地址、备用端点、推荐链接与 README 行已同步(PackyCode → www.packyapi.ai、RightCode → www.rightapi.ai、ClaudeAPI → www.apito.ai、APINebula → apinebula.ai、AICodeMirror → .ai、AICoding → .inc、AIGoCode → .app),顺带移除了两个已失效的备用端点。已创建的供应商保留数据库里存的旧地址——想迁到新域名,手动改地址或从刷新后的预设重建即可。


修复

通过代理读图不再撑爆上下文

客户端经工具调用读取图片时——Codex 的 view_image,或任何返回图片的 MCP 工具——代理的协议转换会把整个图片块序列化进工具消息的文本里,上游按纯文本给 base64 计 token:约 9,000 倍的膨胀,一张 113 KB 的 PNG 折算 10 万+ prompt token;Codex 每轮重放全部历史,两三张截图就足以把会话顶出上下文窗口、卡死在反复的 400 上(#4465#5663)。

代理现在把媒体载荷从工具结果里提出来、按各桥的原生格式重新上送——图片全桥覆盖,文件与音频在目标协议支持处生效:两条 Chat 桥(Claude→Chat、Codex Responses→Chat)承载图片 / 文件 / 音频,工具消息里留下简短标记、媒体作为合成用户消息紧随工具批次之后;Claude→Responses 还原原生 input_image,Codex / GrokBuild→Anthropic 重建标准 Anthropic 图片块,Claude→Gemini 在 Gemini 3 上用多模态 functionResponse.parts(旧型号用 inlineData),只接受内联 base64 图片。检测覆盖有类型的 Responses 块、Anthropic source 块、MCP data+mimeType 结果与整串图片 data URL,可穿透数组与嵌套 content 包装(含 JSON 编码的工具输出);一旦判定输出含媒体,其中残留的 data URL 与裸 base64 会被折叠成占位——裸 base64 本身从不触发媒体判定,普通工具输出原样不动。不含媒体的工具结果在所有桥上保持与之前逐字节一致,prompt 缓存前缀不受影响;上送的媒体块刻意不带 cache_control 标记,GLM、Qwen 这类严格上游不会拒收。对 Kimi K3 的端到端实测:同一回放轮稳定在约 12k 输入 token、缓存命中 99%,此前每次重放要背 85k+ 的 base64 文本。

「不支持图片回退」现在能看到工具结果里的图

「不支持图片回退」设置会在供应商仅文本或上游拒图时用占位标记替换图片块,但它此前只能看到仍是结构化块的图片——已被打平成 base64 文本的工具结果图片对它不可见,仅文本上游直接失败、无从恢复。媒体清洗器现在在每条路径上对称地检测并剥离工具输出内的媒体,发送前剥离与被拒后重试两条路都能救回这类轮次;由于该检测现在也深入工具结果,一条回归测试钉住了反应式重试仍只对真正的模态拒绝触发——上下文超限的 400 不会被误当拒图去重试。

Grok Build 成本回填不再高估

补算缺失成本的例程此前只把 Codex 与 Gemini 视为「上报输入 token 已含缓存读」的供应商,而 Grok Build 同属该口径——被回填的 Grok Build 行按全量输入计价、缓存读又计一次,成本虚高。缓存含入式供应商集合现在只定义一处,由路由记录器、成本计算器与回填例程共享,三者不再可能各说各话。注意此前已被旧回填修过的行保持原值——回填只处理零成本行,从不改写已有正成本。

手工编辑的配置文件不再让应用崩溃或吞掉编辑

~/.codex/config.tomlmcp_servers 存在但不是表(比如 mcp_servers = "x")时,MCP 同步会在切换中途 panic——且发生在数据库与 live 配置都已写入之后,留下半套用的切换;非表值现在先告警再归一为空表,Codex 与 GrokBuild 写入器同步修复。内联表形态(合法 TOML)有镜像问题:MCP 删除静默无效而界面报成功、base_url 编辑写到 Codex 根本不读的层级——均已处理。根节点、providermcp 段是数组 / 标量的 opencode.json 不再 panic,这类文件会被报错拒绝而不是重建,你自己的 modeltheme 设置不会被抹掉。(#5811

代理转换扛得住畸形上游响应

上游网关的畸形数据此前可能直接干掉本地代理而不是产生错误:Anthropic SSE 流里非对象的 messagecontent_block、缓冲响应体是顶层 JSON 数组或标量(无视 stream: true 的网关就返回这种)都会命中 panic 的索引赋值;流现在以正常的失败事件收尾。畸形的 content_block 头还会被恢复为文本块——只把它净化成空对象虽止住 panic,却让后续内容全部被静默丢弃、模型看起来什么都没说——由于坏头之后的增量通常是完好的,常见情况现在能通传,替换发生时记一条警告。(#5811

OpenClaw 的 Kimi For Coding 地址修正

OpenClaw 预设此前指向通用平台端点 https://api.kimi.com/v1,而 Kimi For Coding 订阅走的不是它,coding 套餐的 key 用不了。地址修正为 https://api.kimi.com/coding/v1,表单占位符与默认值同步更新。从旧预设创建的供应商需手动改到新地址。


安全加固

本节九条里,有两件事需要你动手:轮换进过 Gemini 通用配置的密钥,以及核对曾经通过 ccswitch:// 导入的 MCP 条目——「升级提醒」里写明了怎么做。其余的升级即生效,不需要你操作。

如果你从不点开别人发来的 ccswitch:// 链接,也没用过共享的 Gemini 通用配置,那这九条对你的意义主要是「以后更不容易出事」;如果两条里有一条对得上,这一版值得优先升级

Gemini 通用配置不再泄漏密钥,升级后自动清洗

Gemini 通用配置提取器此前只从共享片段里剥掉 GEMINI_API_KEYGOOGLE_GEMINI_BASE_URL,其余 env 条目原样复制——而 GOOGLE_API_KEY 正是 Gemini 的一等凭据,某个账号的 key(连同其它长得像凭据的条目)会被深合并进每一个使用通用配置的 Gemini 供应商,并发往对方的 base URL——那可能是第三方中转。提取器现在跳过一切命中凭据模式的键(与 Claude 提取器同一套匹配器),前端片段校验器同步对齐,手工编辑也塞不回去。由于 Gemini 片段一旦存在就不再重提取,升级后首次启动还会执行一次性清洗:把已经泄漏的凭据从片段、从每个被合并到的供应商、从 ~/.gemini/.env 里清掉——按键名加值全等匹配,供应商自己的同名不同值 key 不受牵连——并保留 env 文件的排版与注释。清洗细节与注意事项见「升级提醒」。(#5811

Skill 仓库安装加固:路径穿越与归档上限

从 GitHub 仓库安装或浏览 Skill 此前可能写到目标目录之外:归档条目未经归一就拼上目标路径,带 .. 的 ZIP 能逃出解压目录(zip-slip);仓库坐标从未校验,../../../releases/download/v1/evil 这样的分支名能把下载重定向到任意 release 资产——而 Skill 仓库可经不可信的 ccswitch:// 深链添加且默认启用,打开 Skills 面板就足以触发下载。来自备份恢复、同步快照与「从应用导入」的 Skill directory 值同样未经校验就拼路径,卸载可能 remove_dir_all 到受管目录之外。所有落点现在都校验目录名,仓库 owner / 名称 / 分支在唯一下载汇聚点白名单化,解压设硬上限(10,000 条目、写入 512 MB、下载 128 MB、符号链接目标 4 KB,自指链接拒绝),新错误信息四语齐全。(#5811

深链导入确认框:看全内容,标记风险

ccswitch:// 的 MCP 导入确认框此前只渲染一行会被截断的 Command:argsurlenv 一概不显示——链接带上 command: "sh"args: ["-c", "curl …|sh"] 和一个 LD_PRELOAD 环境变量,显示出来只是一个人畜无害的 sh,确认后却被写进各应用的 live MCP 文件。确认框现在把命令、每个参数、URL 与环境变量逐行渲染,换行而非截断,不会有内容被裁掉看不见(键名含 TOKEN / KEY / SECRET / PASSWORD 的 env 值以前缀加星号脱敏显示);值得多看一眼的值会被高亮并汇总进警告块:带内联执行标志的 shell 解释器(含 bash -lccmd /C、PowerShell -Command 缩写等组合形态)、改变进程加载行为的环境变量(LD_*DYLD_*NODE_OPTIONSPYTHONPATHPATH、代理变量等)、指向回环 / 内网 / 云元数据地址的端点。标记纯属提示、从不拦截导入——本地 Ollama 端点是再正常不过的用法。供应商确认框获得同款处理;「将立即写入所有指定应用」的警告改为无条件显示,不再受链接可控字段的门控。

深链用量脚本:默认禁用导入,代码先看后用

经深链导入的用量查询脚本是每次查用量都会执行的 JavaScript,此前可能全程没见过代码就被启用:后端把「带了代码」当作「同意执行」,确认框只显示启用 / 禁用徽标、从不显示脚本体。脚本现在默认禁用——链接必须显式携带 usageEnabled=true 才请求启用——确认框以可滚动、完整换行的代码块显示解码后的全部脚本,并警告启用后将会执行。解码失败时回落显示原始载荷,畸形脚本不可能伪装成「没有脚本」。脚本代码照常存到供应商上,审阅后可在应用内手动开启。

URL-safe Base64 曾让确认框整块变空

上面两条修的是「确认框显示得不够」,这一条修的是「确认框可以什么都不显示」。后端接受四种 Base64 变体(含 RFC 4648 §5 的 URL-safe 字母表),而前端的 atob 只认标准字母表、解不开时原样返回输入而不报错——于是同一段载荷,后端解码成功并导入,前端拿到的是一坨解不开的字符。用量脚本与系统提示词因此显示成不透明的 Base64;MCP 配置最糟:JSON.parse 失败被组件吞掉,确认框渲染成「0 个服务器」加一张空列表,而后端照常把真实条目写进 live MCP 文件。把载荷里一个 / 换成 _ 就够了——确认框变空,导入功能完好,上面两条刚补上的完整展示随之一并失效。

前端解码器现在先归一 URL-safe 字母表再解码,确认框显示的永远与将要导入的一致;共享解码器首次有了单元测试,用例内含前置自检,确保样本真的落在 URL-safe 分支上而不是碰巧两种编码相同。

这条缺陷影响 v3.8.0 起的所有版本。若你曾通过 ccswitch:// 链接导入过 MCP 服务器,建议检查一次——见「升级提醒」。

SQL 导入拒绝触及导入库之外的语句

导入数据库备份此前只校验文件头注释,之后整段文本直接交给 execute_batch——精心构造的备份可以 ATTACH DATABASE 在用户可写的任意位置创建 SQLite 文件,且该副作用发生在导入自身的状态校验之前,导入整体失败文件也已落地;WebDAV / S3 同步快照走的是同一条代码路径。现在外部批次执行期间安装 SQLite authorizer(结束立即卸下,应用自身的 schema 维护不受影响):ATTACH / DETACHVACUUM、虚表创建(csvfile 这类文件后端模块能读写任意路径)以及一切 SQLite 报告为未知的动作一律拒绝——未来的新语句默认失败;PRAGMA 只放行导出器实际会写的 foreign_keysuser_version 两个。

通用配置片段的原型污染

应用、移除、比对通用配置片段的三个遍历器此前都会跟着 __proto__ 走进全局 Object.prototypeJSON.parse('{"__proto__":{…}}') 产出的是自有可枚举属性,合并会把攻击者指定的值写上全局原型——而 settings 表在同步时会被远端整表覆盖,恶意 WebDAV / S3 快照落地后,打开一次供应商表单就触发合并。三个遍历器现在一律跳过 __proto__constructorprototype;「已应用通用配置」的比对同时要求自有属性,顺带修掉一个可见怪象——{"__proto__":{}} 此前被判定为任何配置的子集。

终端启动的目录名命令注入

在外部终端恢复会话时,cd 行此前用双引号包裹工作目录、只转义反斜杠和双引号——双引号里 shell 照样展开 $(…)、反引号与 $VAR,而这个值是 CLI 会话历史里记录的真实项目路径,macOS 上目录名合法地可以包含这些字符。文件夹起了那样的名字,点「恢复」就会在你的终端里执行内嵌命令,全程无需任何被攻破的组件。三个拼 shell 行的启动器——Terminal.app、iTerm、kitty——改用 POSIX 单引号转义,任何内容都不展开(穿过 Terminal / iTerm 所需的 AppleScript 引号层同样安全);Ghostty、WezTerm / Kaku、Alacritty 本就把目录作为独立参数传递,原本安全。

GrokBuild 凭据解析不再替换或内联环境密钥

GrokBuild 凭据提取此前在配置指定的 env_key 变量未设置时回落到进程级 XAI_API_KEY——静默替换成另一个账号的 key、发往配置指向的任意 base URL;凭据现在只来自显式的内联 api_keyenv_key 精确命名的环境变量。深链导入不再把环境变量解析成明文 api_key;只带 env_key 名字的链接会被拒绝并提示手动添加——照单全收意味着请求时仍会解析受害者的环境密钥、送往链接声明的地址。顺带修复:base URL 解析与凭据解析解耦,此前凭据缺失连 base URL 一起清空,macOS(GUI 进程不继承 shell 环境)上界面显示的地址与实际使用的不一致、用量脚本的 {{baseUrl}} 展开为空。(#5811


文档

「在 Claude Code 中使用 GPT 模型」攻略补齐英日双语

此前仅有中文的本地路由攻略现已完整移植为英文与日文,端到端覆盖两条接入路径:第三方 OpenAI Responses 网关(API Key),以及 ChatGPT Plus/Pro 订阅经 Codex 设备码 OAuth 登录。两篇路由攻略同时改题为「用什么模型」而非「什么客户端对」——《在 Claude Code 中使用 GPT 模型》《在 Codex 中使用 Claude 模型》——所有交叉链接(含三语 v3.18.0 release notes)改为指向读者语言的版本。

用户手册:深链 usageEnabled 默认值修正

三语用户手册的深链参考此前声称 usageEnabled 默认为 true,实际默认 false、与导入器一致。手册现在写明正确默认值,并补充两个推论:导入前确认框会完整显示脚本代码;未显式 usageEnabled=true 时脚本以禁用状态导入,可稍后在应用内开启。

SECURITY.md:威胁模型与报告范围

SECURITY.md 补齐双语威胁模型与明确的范围内 / 范围外清单,报告按「谁控制这个输入」而非「值最终到了哪个 API」分诊:内置 WebView 渲染器声明为受信组件(附四条可独立验证的事实与失效触发条件);深链载荷、WebDAV / S3 恢复数据、导入文件、上游 API 响应、本地代理的入站请求全部列为不可信输入、欢迎报告。


升级提醒

本版没有数据库迁移

v3.19.0 不含 schema 迁移(版本号保持 v16),升级即用,无需等待数据重建。

Gemini 密钥一次性清洗(请读)

升级后首次启动会在常规配置提取前执行一次性的 Gemini 通用配置清洗。部分 Gemini 供应商随后可能提示缺少 API Key:条目按凭据型键名加值全等匹配删除,通常删掉的是经共享片段泄漏进来的其它供应商凭据(该供应商自己的原值在泄漏发生时已被覆盖、无法找回)——但你有意在多个 Gemini 供应商间复用的同值 key 也会被一并移除。无论哪种情况,请先轮换再重填:凡是进过共享 Gemini 片段的密钥都应视为已暴露。删除的键名与受影响的供应商 id(绝不含值)记录在 settings 表的 gemini_common_config_scrub_audit_v1 下,可据此逐一定位需要重新填写密钥的供应商。

曾用深链导入过 MCP?建议检查一次(请读)

本版之前,ccswitch:// 的 MCP 导入确认框可能显示不出即将写入的内容:参数与环境变量一概不渲染(command: "sh"args: ["-c", …] 显示成一个无害的 sh),若载荷用 URL-safe Base64 编码,则整个列表显示成「0 个服务器」——而后端两种情况都照常把条目写进各应用的 live MCP 文件。这两条缺陷影响 v3.8.0 起的所有版本,本版一并修复。

利用需要你亲自打开攻击者提供的链接并点「导入」,因此绝大多数用户不受影响。如果你确实从不完全信任的来源打开过 ccswitch:// MCP 导入链接,建议在 MCP 面板逐条核对,或直接检查 ~/.claude.jsonmcpServers(Codex 见 ~/.codex/config.tomlmcp_servers),确认没有你不认识的条目——MCP 服务器会在 CLI 下次启动时作为子进程执行。

深链用量脚本默认禁用

携带用量查询脚本的深链现在默认以禁用状态导入,除非链接显式携带 usageEnabled=true。依赖自动启用的链接(例如部分合作伙伴的一键配置链接)会导入脚本但不开启用量查询——审阅代码后在供应商编辑器里手动开启即可。应用内手工配置的用量脚本不受影响。

新默认模型只影响新建供应商

已保存的供应商维持创建时的模型 ID,想用新模型需手动编辑。Claude Desktop 的 opus 路由现值前进到 claude-opus-5claude-opus-4-8 移入兼容别名槽,存量配置照常解析。

定价播种与本地定价文件

新定价行(claude-opus-5gemini-3.6-flashgrok-4.5-build)在下次启动按「不存在才插入」追加——播种绝不覆盖你改过的价格~/.cc-switch/model-pricing.json 创建时为空,只记录本版之后的手工改价与删价——更早的改价不会迁入,想让它们扛住数据库重建,重存一次即可。models.dev 自动同步保持关闭直到你手动开启;一旦开启,它是唯一会覆盖同名价格(内置与手工皆然)的路径。

GrokBuild 隐式环境变量回落已移除

依赖隐式 XAI_API_KEY 环境回落的 GrokBuild 供应商,现在需要显式的 api_key 或正确命名的 env_key

Grok 官方模式用量有意延迟

官方模式的 Grok 用量会延迟约十分钟加一个同步周期出现——事件先沉淀、再与代理记录的行核对防止双计;若路由流量与官方流量在窗口内交替,部分官方轮会被跳过而不是冒险重复计数。被旧成本回填高估过的 Grok Build 行保持原值——回填只处理零成本行,从不修订已有正成本。

更新镜像自下个版本起生效

更新器端点列表内置在应用二进制里,现有安装在升级到含本改动的版本之前仍然只查 GitHub;此后优先 dl.ccswitch.io 镜像、GitHub 回落。

赞助商域名迁移不改存量供应商

已创建的供应商保留数据库中存储的旧地址,仍指向旧域名。想迁到新域名,手动修改供应商地址,或从刷新后的预设重新创建。


风险提示

SuperGrok 配额查询(本版新增)

供应商卡片的 SuperGrok 配额展示会读取 Grok CLI 自己的 OAuth 凭据(~/.grok/auth.json)并查询 grok.com 的计费端点——该端点并非公开文档化接口,其响应解析基于对现有格式的观察,xAI 调整接口后此功能可能失效(届时卡片降级为不显示配额,其余功能不受影响)。CC Switch 不会存储或修改这些凭据。

沿用的提示

xAI Grok OAuth 登录:复用官方 Grok CLI 的公开 OAuth 客户端身份,使用可能导致账号被限制或封禁——详见 v3.18.0 release notes

Codex OAuth 反向代理:使用 ChatGPT 订阅的 Codex OAuth 反代可能违反 OpenAI 服务条款,详情见 v3.13.0 release notes

第三方供应商路由:通过 CC Switch 本地代理把 Codex、Claude Desktop 或 Grok Build 的请求转换并转发到第三方供应商时,各供应商对计费、合规与数据留存的约束不同,请在使用前阅读目标供应商的服务条款。

用户启用上述功能即表示自行承担相关风险。CC Switch 不对因使用这些功能而导致的任何账号限制、警告或服务暂停承担责任。


致谢

这一版的安全加固几乎全部来自外部——一个 PR,加上收到的安全报告。

代码贡献

  • #5811:Skill 安装的 zip-slip 与仓库坐标穿越、Gemini 通用配置密钥泄漏与一次性清洗、GrokBuild 凭据解析、多处 panic 路径修复,感谢 @zayokami。这是本版单个来源里覆盖面最广的一份工作。
  • #5734:models.dev 自动定价同步,感谢 @YUZHEthefool。
  • #5626:Codex fork 会话用量导入提速,感谢 @ayanamislover(与 @SaladDay 共同署名)。

安全报告

本版「安全加固」里的四条修复来自私下发来的安全报告。感谢 23pds(SlowMist 慢雾)与 zues devil——逐条归属如下:

  • 深链导入确认框只显示一行会被截断的 Command:——argsurlenv 一概不渲染,sh -cLD_PRELOAD 的载荷在界面上看起来只是一个 sh。这是本版影响面最大的一条。(23pds,SlowMist)
  • 导入 SQL 备份未受约束——ATTACH DATABASE 能在用户可写的任意位置创建文件,且副作用发生在导入自身的校验之前。(zues devil)
  • 外部终端启动的目录名命令注入——cd 行用双引号包裹,$(…) 照常展开,而这个值是会话历史里记录的真实项目路径。(zues devil 与 23pds 各自独立报告,分别指向内置启动器与自定义模板两条路径)
  • 通用配置片段合并的原型污染——三个遍历器都会跟着 __proto__ 走进全局 Object.prototype。(23pds,SlowMist)

报告同时促使我们补齐了 SECURITY.md 的威胁模型与报告范围——在此之前,这个项目只写了怎么报告,没写什么算漏洞。

其余两条深链修复(用量脚本默认禁用、URL-safe Base64 绕过)是在审查上述修复本身时发现的,不在原始报告内。

问题反馈

感谢在 #4465#5663 中反馈代理读图撑爆上下文的用户——本版最重要的代理修复来自这些真实场景的复现线索。


下载与安装

访问 Releases 下载对应版本,或从官网 ccswitch.io 获取(本版起下载经 Cloudflare 边缘节点分发,不再依赖 GitHub 可达)。

系统要求

系统最低版本架构
WindowsWindows 10 及以上x64 / ARM64
macOSmacOS 12 (Monterey) 及以上Intel (x64) / Apple Silicon (arm64)
Linux见下表x64 / ARM64

Windows

文件说明
CC-Switch-v3.19.0-Windows.msi推荐 - MSI 安装包,支持自动更新
CC-Switch-v3.19.0-Windows-Portable.zip便携版,解压即用,不写入注册表

Windows ARM64 设备请选择文件名中带 arm64 标识的对应制品。

macOS

文件说明
CC-Switch-v3.19.0-macOS.dmg推荐 - DMG 安装包,拖入 Applications 即可
CC-Switch-v3.19.0-macOS.zip解压后拖入 Applications,Universal Binary
CC-Switch-v3.19.0-macOS.tar.gz用于 Homebrew 安装和自动更新

Homebrew 安装:

bash
brew install --cask cc-switch

更新:

bash
brew upgrade --cask cc-switch

Linux

Linux 资产同时提供 x86_64ARM64aarch64)两种架构。资产文件名中包含架构标识,请按你机器的 uname -m 输出选择对应版本:

  • CC-Switch-v3.19.0-Linux-x86_64.AppImage / .deb / .rpm
  • CC-Switch-v3.19.0-Linux-arm64.AppImage / .deb / .rpm
发行版推荐格式安装方式
Ubuntu / Debian / Linux Mint / Pop!_OS.debsudo dpkg -i CC-Switch-*.debsudo apt install ./CC-Switch-*.deb
Fedora / RHEL / CentOS / Rocky Linux.rpmsudo rpm -i CC-Switch-*.rpmsudo dnf install ./CC-Switch-*.rpm
openSUSE.rpmsudo zypper install ./CC-Switch-*.rpm
Arch Linux / Manjaro.AppImage添加执行权限后直接运行,或使用 AUR
其他发行版 / 不确定.AppImagechmod +x CC-Switch-*.AppImage && ./CC-Switch-*.AppImage