配置方案是 a4api 的核心管理单元:一张卡片对应一套完整的「服务商 + API Key + 模型 + 应用目标」组合,点击卡片即可把这套组合写入 Claude Code、Codex 与 dsh(DeepSeek Harness)的目标配置文件,几秒完成换服务商、换模型。本文章介绍配置方案的字段构成、卡片化管理、应用目标的组合规则、一键切换的完整流程,以及切换前的自动备份与切换后的生效方式。

1. 配置方案是什么

每个配置方案由以下字段组成,全部保存在本地 SQLite 数据库中:

字段 说明
名称 卡片显示名,自定义,如「DeepSeek 主力」「智谱备用」
服务商 关联一条服务商记录(含 API 地址与协议类型),见服务商管理与预置模板
API Key 使用 Windows DPAPI 加密后存入数据库,任何接口都不回显明文
模型 切换时写入目标配置文件的模型名,如 deepseek-v4-flash
应用目标 claude / codex / dsh 三选N,逗号组合,决定这次切换写哪些工具的配置
max_tokens dsh 单次输出上限(可选)。留空时自动兜底为 131072,避免 dsh 默认值超出上游上限被打回
生效状态 同一时刻至多一个方案处于「使用中」,界面上绿色高亮标识

API Key 的加密存储与密钥不回显机制详见安全设计;数据落盘位置见数据目录与日志说明

2. 配置方案的卡片化管理

2.1 界面布局

主界面顶部有两个页签:「配置方案」与「供应商管理」。配置方案以自适应卡片网格展示,当前生效的方案以主题色描边加柔和光晕突出显示,右上角带「使用中」徽章,一眼即可确认当前用的是哪套配置。

2.2 增改删与一键切换

操作 入口 说明
新增方案 配置方案页「新增配置」 选择服务商(支持按名称关键字实时搜索)、填入 API Key 与模型名、勾选应用目标
编辑方案 卡片上的「编辑」按钮 修改名称、Key、模型、目标组合或 max_tokens
删除方案 卡片上的「删除」按钮 仅删除这张卡片,不影响服务商与其他方案
一键切换 卡片上的「切换」按钮 把该方案写入所选目标的配置文件,详见第 4 节

2.3 关联服务商被删除的保护

若某个方案关联的服务商已被删除,切换该方案时会得到明确报错「该配置关联的服务商已被删除,请先编辑或删除此配置方案」,不会产生任何半写入状态。此时编辑该方案换一个服务商,或直接删除该方案即可。

3. 应用目标多选

每个配置方案可以同时勾选多个应用目标,切换时按目标逐一写入:

应用目标 写入的配置文件 生效方式
Claude Code ~/.claude/settings.json 重启 Claude Code 后生效,界面可一键重启
Codex ~/.codex/config.toml(另维护 models.json 模型目录) 重启 Codex 后生效
dsh ~/.dsh/settings.yaml + ~/.dsh/.credentials.yaml watcher 热加载,新会话即生效

组合规则上有一条硬约束:Codex 与 dsh 目标必须搭配 OpenAI 兼容类型的服务商。Codex 使用 OpenAI Responses 接口、dsh 使用 OpenAI Chat Completions 接口,两者都无法消费 Anthropic 协议端点。若选择了 Anthropic 类型服务商又勾选了这两个目标,切换会在写任何文件之前直接失败并提示,例如:

Codex 需要 OpenAI 兼容接口,请为「智谱主力」选择 OpenAI 兼容的服务商
graph LR A[点击切换] --> B{读取目标
targets} B -->|仅 claude| C[Anthropic 或
OpenAI 兼容均可] B -->|含 codex 或 dsh| D{服务商是否
OpenAI 兼容} D -->|是| E[继续切换流程] D -->|否| F[直接报错
不写任何文件] C --> E style A fill:#e8f4f8,stroke:#1a6b8a,stroke-width:2px style B fill:#ebdef0,stroke:#8e44ad,stroke-width:2px style C fill:#d6eaf8,stroke:#1a6b8a,stroke-width:2px style D fill:#ebdef0,stroke:#8e44ad,stroke-width:2px style E fill:#d5f5e3,stroke:#27ae60,stroke-width:2px style F fill:#fadbd8,stroke:#c0392b,stroke-width:2px

这一校验发生在解密 Key 之后、标记生效之前,属于「干净失败」:不会出现 Claude 配置已写入但整体报错的半生效状态。

4. 一键切换流程

4.1 完整流程

graph LR A[点击切换] --> B[DPAPI 解密
API Key] B --> C{目标与协议
兼容校验} C -->|不通过| D[报错返回
零写入] C -->|通过| E[数据库标记
该方案生效] E --> F[逐端处理:
先备份再合并生成再原子写] F --> G[写入切换日志
switch_logs] G --> H{目标含
claude?} H -->|勾选重启| I[CIM 探测并
重启 Claude Code] H -->|未勾选| J[完成
按端提示生效方式] I --> J style A fill:#e8f4f8,stroke:#1a6b8a,stroke-width:2px style B fill:#ffecd6,stroke:#e67e22,stroke-width:2px style C fill:#ebdef0,stroke:#8e44ad,stroke-width:2px style D fill:#fadbd8,stroke:#c0392b,stroke-width:2px style E fill:#d6eaf8,stroke:#1a6b8a,stroke-width:2px style F fill:#fdebd0,stroke:#b7950b,stroke-width:2px style G fill:#d6eaf8,stroke:#1a6b8a,stroke-width:2px style H fill:#ebdef0,stroke:#8e44ad,stroke-width:2px style I fill:#d5f5e3,stroke:#27ae60,stroke-width:2px style J fill:#d5f5e3,stroke:#27ae60,stroke-width:2px

4.2 分步说明

  1. 解密 Key:从数据库读出加密密文,经 Windows DPAPI 解密;解密失败立即中止并在日志中记录错误。
  2. 兼容性校验:检查目标组合与服务商协议是否匹配(见第 3 节),不通过则零写入返回。
  3. 先标记生效:在数据库中把该方案置为 active 后才执行写入。这一顺序是刻意的——独立运行的本地翻译代理进程需要从数据库读取「当前生效配置」来更新上游地址与密钥。
  4. 逐端写入:对每个目标依次执行「备份原配置、基于现有内容合并生成新配置、原子写覆盖」,三端各自的生成规则见本地翻译代理与三篇目标文档。
  5. 记日志:无论成功失败都写入 switch_logs 表,包含时间、状态与详情,便于追溯。
  6. 可选重启:目标含 Claude Code 且勾选重启时,自动探测并重启进程;Codex 由用户手动重启;dsh 无需任何操作。

4.3 合并式写入示例

写入采用合并式更新,只覆盖 a4api 托管的字段,用户手工维护的其他配置原样保留。以 Claude Code 为例,假设现有 ~/.claude/settings.json 为:

{
  "env": {
    "ANTHROPIC_AUTH_TOKEN": "旧 Key",
    "ANTHROPIC_BASE_URL": "https://old.example.com",
    "MY_CUSTOM_VAR": "keep-me"
  },
  "model": "old-model",
  "permissions": { "allow": ["Bash(git*)"] },
  "hooks": { "Stop": [] }
}

切换到新的 Anthropic 类型服务商后:

{
  "env": {
    "ANTHROPIC_AUTH_TOKEN": "新 Key",
    "ANTHROPIC_BASE_URL": "https://api.newprovider.com",
    "MY_CUSTOM_VAR": "keep-me"
  },
  "model": "new-model",
  "alwaysThinkingEnabled": false,
  "permissions": { "allow": ["Bash(git*)"] },
  "hooks": { "Stop": [] }
}

env.MY_CUSTOM_VARpermissionshooks 全部保留,只有托管字段被更新。Codex 与 dsh 的写入同理,详见ClaudeCode目标切换Codex目标切换dsh目标切换

5. 自动备份与回滚

每次修改目标配置文件之前,a4api 都会把原文件完整复制到数据目录的 backups/ 下,各类文件独立滚动保留最近 5 份:

备份文件名 对应原文件
settings.时间戳.json.bak ~/.claude/settings.json
codex.config.时间戳.toml.bak ~/.codex/config.toml
dsh.settings.时间戳.yaml.bak ~/.dsh/settings.yaml
dsh.credentials.时间戳.yaml.bak ~/.dsh/.credentials.yaml

即使配置文件在此期间被其他程序改动过,改动前的版本也会先入备份再写入,不丢失任何历史状态。需要手动回滚时,把对应的 .bak 文件复制回原路径即可。

备份目录的实际位置随运行方式不同:安装版在 %APPDATA%\a4api\backups\,开发模式在项目的 backend/database/backups/,详见数据目录与日志说明

所有写入均为原子操作:先写临时文件并强制刷盘,再用操作系统级替换覆盖目标文件,写入中途断电或崩溃也不会损坏原配置。

6. 切换后的生效方式

三个工具读取配置的时机不同,切换后的生效方式也不同:

应用目标 生效条件 a4api 提供的辅助
Claude Code 进程启动时读取一次 切换时可勾选「一键重启」:用 CIM 精确匹配命令行包含 claude 的进程,结束后在新终端重新拉起,最多等待 10 秒验证新进程出现
Codex 启动时读取 界面明确提示「重启 Codex 后生效」
dsh 文件 watcher 热加载 无需任何操作,切换后新会话即生效

一键重启只精确匹配命令行中包含 claude 的进程,不会误杀无关的 Node.js 进程;若本机未检测到运行中的 Claude Code,会如实提示而不会盲目拉起。

7. 常见问题

问:切换中途失败,会不会留下写了一半的配置文件?

答:不会,有两层保护。其一,兼容性校验放在所有写入之前,不通过就零写入返回;其二,每一端的写入都是「临时文件 + 原子替换」,不存在半截文件。失败详情会记录到切换日志与日志文件中,便于排查。

问:为什么切换时先把方案标记为生效,再写配置文件?

答:因为本地翻译代理是独立于主程序的常驻进程,它靠轮询数据库中的「当前生效配置」来获知上游地址与密钥。先标记生效,代理进程才能在配置写入的同时拿到最新上游信息,两端保持一致。

问:可以两个方案同时生效吗?

答:不能。配置激活操作使用进程内互斥锁串行化,「使用中」状态全局唯一;并发点击多张卡片的切换也只会按顺序生效,最终以最后一次为准,不会出现两套配置交叉写入。

问:max_tokens 留空会发生什么?

答:仅对 dsh 目标有意义。留空时写入安全兜底值 131072——dsh 适配器默认的 256000 超出多数上游(如智谱)131072 的输出上限,请求会被直接打回,因此没有显式值时绝不能放行默认值。显式填写的值优先级最高。