cc-switch 供应商编辑深度指南:live 配置回填、图标自定义与 JSON 编辑实践
【免费下载链接】cc-switchA cross-platform desktop All-in-One assistant for Claude Code, Codex, OpenCode, OpenClaw, Grok Build & Hermes Agent. Only official website: ccswitch.io项目地址: https://gitcode.com/GitHub_Trending/cc/cc-switch
cc-switch 的「编辑供应商」是日常使用频率最高的功能之一:修改 API Key、切换端点地址、调整模型列表、更换图标都发生在这块全屏编辑面板里。本文基于官方用户手册的编辑章节,结合 EditProviderDialog、IconPicker、JsonEditor 等前端源码,完整拆解可编辑字段、「live 回填」同步机制、多端点管理与 JSON 编辑器的工作方式,帮助你在改动配置时理解每一个保存动作背后实际发生了什么。
打开编辑面板
编辑入口位于供应商卡片上:
- 找到要编辑的供应商卡片;
- 鼠标悬停在卡片上,显示操作按钮;
- 点击「编辑」按钮。
点击后打开的是一个全屏面板。从源码看,编辑对话框由 EditProviderDialog 实现,它基于 FullScreenPanel 渲染,内部复用与添加供应商完全相同的 ProviderForm 表单组件——这也意味着编辑时能用的功能(模型下拉、通用配置快捷开关、端点管理)与添加时一致。面板底部放置「保存」按钮,其可用状态与表单的提交就绪状态(isFormReady)和提交中状态(isFormSubmitting)绑定,防止重复提交。
可编辑内容
基本信息
| 字段 | 说明 |
|---|---|
| 名称 | 供应商显示名称 |
| 备注 | 附加说明信息 |
| 网站链接 | 供应商官网或控制台地址 |
| 图标 | 自定义图标和颜色 |
提交时这些字段会经过轻量的规范化处理。查看 EditProviderDialog 的handleSubmit可以发现:name会trim(),而notes和websiteUrl在仅有空白字符时会被置为undefined,即"清空输入"与"留空"效果等价,不会把纯空格存进数据库。
图标自定义
CC Switch 提供丰富的图标自定义功能。
图标选择器
- 点击图标区域打开图标选择器;
- 使用搜索框按名称搜索图标;
- 点击选择想要的图标。
图标库包含常见的 AI 服务商和技术图标,支持:
- 按名称模糊搜索;
- 显示图标名称提示;
- 实时预览选中效果。
从源码看,选择器由 IconPicker 实现,核心机制包括:
- 搜索过滤:搜索框输入后调用
searchIcons(searchQuery)对图标列表做模糊匹配,图标元数据来自 icons/extracted 目录; - 名称提示:每个图标按钮的
title使用getIconMetadata(iconName)中的displayName,即悬停时能看到图标的可读名称,而不是内部标识符; - 选中态反馈:被选中的图标会应用
border-primary bg-primary/10高亮样式,且按钮下方的名称文字提供实时预览; - 无结果兜底:搜索无匹配时显示"未找到匹配的图标"提示,避免空白界面。
图标值最终保存为字符串(icon字段),配合可选的iconColor用于配色。
配置信息
JSON 格式的配置内容,包括:
- API Key;
- 端点地址;
- 其他环境变量。
编辑当前启用的供应商:live 回填机制
编辑当前启用的供应商时,有特殊的「回填」机制:
- 打开编辑面板时,会从 live 配置文件读取最新内容;
- 如果你在 CLI 工具中手动修改过配置,这些修改会被同步回来;
- 保存后,修改会写入 live 配置文件。
这确保了 CC Switch 和 CLI 工具的配置始终同步。
这一机制在 EditProviderDialog 中有完整实现,值得细看几个设计决策:
- 仅对"当前生效供应商"读取 live:打开面板时先通过
providersApi.getCurrent(appId)查询当前启用的供应商 ID,只有当编辑对象恰好是它时才调用vscodeApi.getLiveProviderSettings(appId)读取实时配置;编辑非启用供应商时直接以数据库(SSOT)中的settingsConfig为初始值。 - 只加载一次:
hasLoadedLive标记保证 live 配置只在首次打开时读取一次,避免后续渲染用旧数据覆盖用户已在表单中做的编辑。 - 读取失败静默回退:live 读取抛错时回退到数据库配置(SSOT),不打断编辑流程。
- 代理接管模式例外:当代理(proxy)接管了配置写入时,live 文件里是代理改写后的地址与占位符,此时
isProxyTakeover分支会跳过 live 读取、直接展示数据库配置,避免用户在编辑界面看到代理地址后误保存(源码注释见 EditProviderDialog)。 - OpenCode / Pi 例外:OpenCode 使用增量合并(additive)模式,Pi 的共享
models.json由目录协调器管理,二者都没有"每个供应商一份 live 快照"的概念,因此同样不读取 live 覆盖数据库聚合值。 - Codex modelCatalog 防丢失:Codex 的
modelCatalog是 cc-switch 的私有字段,SSOT 在数据库;而 live 的config.toml只在写入时投影出model_catalog_json指针。来回切换供应商或 Codex.app 改写配置都可能让 live 丢失该投影。因此源码强制以数据库的modelCatalog为准(EditProviderDialog),防止"编辑界面显示空映射表 → 保存后连同数据库映射一起被清空"的数据丢失问题。
自动获取模型
编辑供应商时,可以自动从供应商端点获取可用模型列表:
- 确保已填写 API Key 和端点地址;
- 点击模型输入框旁的获取模型按钮(下载图标);
- 从分组下拉菜单中选择模型。
详细说明请参阅 2.1 添加供应商 — 自动获取模型。由于编辑面板复用ProviderForm,模型获取、下拉选择与添加时的行为完全一致。
通用配置快捷开关(Claude)
编辑 Claude 供应商时,JSON 编辑器上方提供常用设置的快捷开关,包括工具搜索、禁用自动更新、Teammates、高效能模式等。详见 2.1 添加供应商 — Claude 通用配置快捷开关。
修改 API Key
编辑供应商时,可以直接在API Key输入框中修改:
- 点击供应商卡片的「编辑」按钮;
- 在「API Key」输入框中输入新的密钥;
- 点击「保存」。
提示:API Key 输入框支持显示/隐藏切换,点击右侧的眼睛图标可查看完整密钥。
修改端点地址
编辑供应商时,可以直接在端点地址输入框中修改:
- 点击供应商卡片的「编辑」按钮;
- 在「端点地址」输入框中输入新的 URL;
- 点击「保存」。
端点地址格式
| 应用 | 格式示例 |
|---|---|
| Claude | https://api.example.com |
| Codex | https://api.example.com/v1 |
| Gemini | https://api.example.com |
注意 Claude 与 Codex 的差异:Codex 的 base URL 需要带/v1路径后缀,Claude 则是裸域名。填错路径是最常见的连通性问题来源之一,保存前可借助表单的校验提示确认。
添加自定义端点
供应商可以配置多个端点,用于:
- 速度测试时测试多个地址;
- 故障转移时的备用端点。
自动收集
添加供应商时,CC Switch 会自动从配置中提取端点地址。
手动添加
编辑供应商时,在「端点管理」区域可以:
- 添加新端点;
- 删除现有端点;
- 设置默认端点。
从源码看,多端点能力集中在表单层:useSpeedTestEndpoints 管理端点集合与速度测试,EndpointSpeedTest 负责并发探测各端点延迟,CommonConfigEditor 提供端点编辑界面。这些组件在编辑面板中与添加面板共享,保证两处体验一致。
JSON 编辑器
配置使用 JSON 格式,编辑器提供:
- 语法高亮;
- 格式校验;
- 错误提示。
常见错误
缺少引号:
// ❌ 错误 { env: { KEY: "value" } } // ✅ 正确 { "env": { "KEY": "value" } }多余逗号:
// ❌ 错误 { "env": { "KEY": "value", } } // ✅ 正确 { "env": { "KEY": "value" } }未闭合括号:
// ❌ 错误 { "env": { "KEY": "value" } // ✅ 正确 { "env": { "KEY": "value" } }从实现看,JsonEditor 基于 CodeMirror 6 构建:使用@codemirror/lang-json提供 JSON 语言支持与语法高亮,@codemirror/lint的linter扩展实时解析文档内容并生成诊断(diagnostics)——包括 JSON 语法错误、以及顶层结构不是对象时的额外提示;showValidation属性可关闭校验(只读展示场景)。编辑体验上,它还实现了基于最长公共前后缀的最小差异更新与光标位置映射(mapPositionByContext),确保格式化重排时输入光标不跳位。
保存与生效
- 点击「保存」按钮;
- 如果表单检测到非阻塞问题,会出现「先存上再说」确认提示;确认后仍可保存;
- 如果是当前启用的供应商,配置立即写入 live 文件;
- 重启 CLI 工具生效。
第 2 步对应源码中的"软校验"(soft validation):表单在提交前检查必填项(例如非官方供应商未填 API Key、未填端点),发现问题时弹出标题为「配置存在以下问题」的确认框,提示"仍要保存吗?保存后切换此供应商时可能失败,可以之后再补全",按钮文案为「仍要保存」——文案定义见 zh.json,弹框触发点位于 ProviderForm。而 JSON 格式错误则属于硬校验:configJsonError("配置JSON格式错误,请检查语法")会直接阻断保存。
保存成功后,handleSubmit会关闭面板并通过onSubmit把新配置连同originalId(原供应商 ID)一起交给上层处理,上层负责持久化到数据库,必要时同步 live 文件。对于当前启用的供应商,配置会立即写入 live 文件;但注意 CLI 工具读取配置通常在进程启动时完成,因此需要重启 CLI 工具(如重启 Claude Code / Codex 会话)才能让新配置生效。
取消编辑
点击「取消」或按Esc键关闭编辑面板,所有修改都不会保存。
从源码看,取消路径经过closeDialog→onOpenChange(false)关闭全屏面板;由于所有编辑都只发生在表单的受控状态中,未经提交就不会写入数据库或 live 文件,因此取消是完全无损的。另外源码对面板关闭做了细分:若此时打开着托管账号(Auth)设置子面板,handlePanelClose会先关闭子面板而不是整个编辑对话框,避免误关导致编辑内容丢失。
小结
| 操作 | 行为要点 | 源码/文档依据 |
|---|---|---|
| 打开编辑 | 卡片悬停 →「编辑」,全屏面板 | EditProviderDialog |
| 编辑启用供应商 | live 回填,保持与 CLI 手动修改同步 | EditProviderDialog |
| 图标更换 | 搜索、名称提示、选中高亮 | IconPicker |
| 配置编辑 | CodeMirror + JSON 实时校验 | JsonEditor |
| 非阻塞问题 | 「仍要保存」软校验确认 | ProviderForm |
| 保存生效 | 启用供应商立即写 live,重启 CLI | docs/user-manual/zh/2-providers/2.3-edit.md |
理解"数据库 SSOT + live 文件双向同步"这条主线,是正确使用编辑功能的关键:数据库是配置的事实来源,live 文件是 CLI 工具实际读取的产物;编辑启用供应商时回填 live 是为了纳入你在 CLI 侧的手动修改,而代理接管、OpenCode、Pi 等特殊应用形态各有明确的例外处理,避免误读误写。
【免费下载链接】cc-switchA cross-platform desktop All-in-One assistant for Claude Code, Codex, OpenCode, OpenClaw, Grok Build & Hermes Agent. Only official website: ccswitch.io项目地址: https://gitcode.com/GitHub_Trending/cc/cc-switch
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考