a4api 是一款 Windows 桌面端的 Agent LLM 服务商切换工具,通过可视化界面读写 Claude Code、Codex 与 dsh(DeepSeek Harness)的配置文件,让你无需记忆命令、无需手动编辑配置文件,即可在 DeepSeek、智谱 GLM、OpenRouter 等服务商与多套模型方案之间一键切换,并安全地加密保管 API 密钥。本教程将带你完成原理剖析与快速体验,并介绍如何从源码运行、打包为可分发的安装包。

前置教程

如想快速上手本项目,你可能需要先完成以下前置教程:

资源下载

1. 项目简介与核心原理

1.1 a4api 是什么

a4api 是一个基于 FastAPI + LayUI + pywebview 构建的桌面应用。pywebview 负责启动内嵌浏览器窗口,FastAPI 后端同时托管前端页面并提供 REST API,前端通过调用接口完成配置方案的增删改查与一键切换。

工具管理的目标有三个:Claude Code、Codex 与 dsh(DeepSeek Harness)。Claude Code 官方原生只支持 Anthropic 协议,Codex 使用 OpenAI Responses 协议,dsh(DeepSeek Harness)则原生走 OpenAI Chat Completions 接口,三者对国内常用的 OpenAI 兼容服务商(DeepSeek、智谱、火山方舟等)支持有限。a4api 通过内置的本地翻译代理解决这一问题:把 Claude Code 的 Anthropic 请求实时翻译成 OpenAI Chat Completions 格式转发给上游,让 Claude Code 也能使用任意 OpenAI 兼容 API;对原生支持 Responses 的服务商(如 DeepSeek 官方,仅 deepseek-v4-flash 模型),Codex 直连上游,对仅提供 Chat Completions 的服务商(如智谱),则由代理把 Responses 请求翻译转发。dsh 原生走 OpenAI Chat Completions,OpenAI 兼容服务商可直连写入 ~/.dsh/settings.yaml,无需本地翻译代理。一套配置即可同时覆盖 Claude Code、Codex 与 dsh。

工具开箱即用的核心功能如下:

功能 说明
预置服务商模板 内置 6 个常用服务商模板(DeepSeek、智谱、OpenRouter、本地 LLM Studio 等),安装即可用
配置方案卡片管理 新增、编辑、删除、一键切换,当前生效方案醒目高亮
应用目标选择 每个配置方案可选应用目标:Claude Code、Codex、dsh 或任意组合
dsh 支持 写入 ~/.dsh/settings.yaml~/.dsh/.credentials.yaml,OpenAI 兼容服务商直连上游、配置热加载新会话即生效
供应商管理 可视化新增、编辑、删除自定义服务商,无需改动代码
原生 Responses OpenAI 类型可标记「原生 Responses」,Codex 直连上游(DeepSeek 官方支持),否则经本地代理转发
本地翻译代理 把 Anthropic / Responses 请求翻译为 OpenAI 格式转发,仅监听本机并以随机 token 鉴权
自动备份 每次切换前备份原配置,滚动保留最近 5 份
原子写入 先写临时文件再整体替换,避免配置文件损坏
合并式写入 只覆盖工具托管字段,保留 hooks、permissions、mcpServers 等已有配置
API Key 加密 使用 Windows DPAPI 加密存储,仅当前用户可解密
一键重启 切换后可选自动重启运行中的 Claude Code;Codex 配置写入后需手动重启 Codex 才生效
单实例运行 防止重复打开多个工具实例

1.2 与手动配置方式的对比

对比项 手动编辑配置文件 a4api 桌面工具
操作方式 记事本改 JSON / TOML,需记忆密钥与地址 图形界面点选,所见即所得
API Key 保管 明文存放在配置或脚本中 DPAPI 加密后存入数据库
切换速度 手动替换字段,易出错 一键切换,自动完成备份写入
出错恢复 无备份,写坏需手动修复 自动备份最近 5 份,可恢复
扩展服务商 手写 JSON / TOML 条目,需改动文件 供应商管理页直接新增
多协议支持 Anthropic 与 OpenAI 兼容需自行搭建转发 内置本地翻译代理,自动处理

结论:对于经常在多个模型服务商之间切换的开发者,图形化的 a4api 工具比手动编辑配置文件更安全、更高效、更不易出错。

1.3 切换原理

a4api 通过读写三个配置文件完成切换:Claude Code 的 ~/.claude/settings.json、Codex 的 ~/.codex/config.toml 与 dsh 的 ~/.dsh/settings.yaml(含凭证文档 ~/.dsh/.credentials.yaml)。

Claude Code 配置

Claude Code 通过两个环境变量确定连接哪个模型服务:

环境变量 作用
ANTHROPIC_AUTH_TOKEN API 密钥,作为 Bearer Token 发送给服务端
ANTHROPIC_BASE_URL API 基础地址,决定请求发往哪个服务商

按服务商协议类型,backend/app/config_manager.py 中的 build_settings() 生成两类配置:

  • Anthropic 协议服务商(如 DeepSeek-anthropic、智谱-anthropic):直接写入 API Key 与上游地址。
{
  "env": {
    "ANTHROPIC_AUTH_TOKEN": "sk-xxxxxxxx",
    "ANTHROPIC_BASE_URL": "https://api.deepseek.com/anthropic"
  },
  "model": "deepseek-chat",
  "alwaysThinkingEnabled": false
}
  • OpenAI 兼容服务商(如 DeepSeek-openai、OpenRouter-openai):官方 Claude Code 不识别 OPENAI 相关配置,需经由本地翻译代理。此时 ANTHROPIC_BASE_URL 指向本地代理 http://127.0.0.1:17890(不带 /v1 后缀,Claude Code 会自动追加),ANTHROPIC_AUTH_TOKEN 写入代理的随机鉴权 token。
{
  "env": {
    "ANTHROPIC_AUTH_TOKEN": "本地代理鉴权 token",
    "ANTHROPIC_BASE_URL": "http://127.0.0.1:17890"
  },
  "model": "deepseek-chat",
  "alwaysThinkingEnabled": false
}

工具采用合并式写入:只覆盖上述托管字段(env 中的 ANTHROPIC_AUTH_TOKEN / ANTHROPIC_BASE_URLmodelalwaysThinkingEnabled),hookspermissionsmcpServers 及其他 env 变量原样保留,避免切换时抹掉用户已有的 hook、授权与服务器配置。

对应代码:

def build_settings(
    existing: dict | None,
    provider,
    api_key: str,
    model: str,
    proxy: dict | None = None,
) -> dict:
    """按服务商协议类型生成 settings.json 内容(合并式,保护已有配置)。"""
    if provider.api_type == "openai":
        # OpenAI 类型:把 ANTHROPIC_BASE_URL 指向本地翻译代理,token 换成代理鉴权 token
        env = {
            "ANTHROPIC_AUTH_TOKEN": proxy["token"],
            "ANTHROPIC_BASE_URL": proxy["base_url"],
        }
    else:
        env = {
            "ANTHROPIC_AUTH_TOKEN": api_key,
            "ANTHROPIC_BASE_URL": provider.api_base,
        }

    data = dict(existing or {})
    current_env = data.get("env")
    if not isinstance(current_env, dict):
        current_env = {}
    data["env"] = {**current_env, **env}
    data["model"] = model
    data["alwaysThinkingEnabled"] = False
    return data

完整代码请查看 a4api/backend/app/config_manager.py

Codex 配置

配置方案包含 Codex 目标时,a4api 还会写 ~/.codex/config.toml。Codex CLI 使用 OpenAI Responses 协议,wire_api 固定为 responses。工具基于现有配置生成新的 TOML,用 a4api 托管的服务商条目([model_providers.a4api_p*])替换旧的 a4api 条目,更新顶层 model / model_provider,其余配置原样保留:

[model_providers.a4api_p1]
name = "DeepSeek-openai"
base_url = "https://api.deepseek.com/"
wire_api = "responses"
experimental_bearer_token = "sk-xxxxxxxx"

model = "deepseek-chat"
model_provider = "a4api_p1"

上游原生支持 Responses 协议时(如 DeepSeek 官方,仅 deepseek-v4-flash 模型),Codex 直连上游;仅提供 Chat Completions 的上游(如智谱)则由本地翻译代理把 Responses 请求翻译转发。此外,工具还会维护 Codex 的模型目录 ~/.codex/models.json,确保自定义模型的能力元数据可被 Codex 正确解析。

dsh 配置

配置方案包含 dsh 目标时,a4api 还会写 ~/.dsh/settings.yaml~/.dsh/.credentials.yaml。dsh(DeepSeek Harness)原生走 OpenAI Chat Completions 接口,只注册 deepseek-official 一个 provider 路由,OpenAI 兼容服务商可直连上游、无需本地翻译代理。工具按 namespace 分段合并式写入llm-deepseek 段写 baseURL / apiKeyEnv / maxTokens,agent-default-model 段写默认模型与 provider,其余段(如 ui-onboarding)原样保留:

llm-deepseek:
  baseURL: https://api.deepseek.com
  apiKeyEnv: DEEPSEEK_API_KEY
  maxTokens: 131072
agent-default-model:
  provider: deepseek-official
  model: deepseek-v4-flash

API Key 本体不写进 settings.yaml,而是落到独立的凭证文档 ~/.dsh/.credentials.yaml,与设置分离存放:

DEEPSEEK_API_KEY: sk-xxxxxxxx
  • maxTokens 输出上限:dsh 适配器默认 max_tokens 为 256000,远超多数上游(如智谱)131072 的输出上限,会把请求直接打回 INVALID_REQUEST。a4api 新增「输出上限」字段,可在配置方案里显式填写单次输出上限(写入 maxTokens);留空时保留用户已手动设置的值,都没有则用安全兜底 131072。
  • 热加载免重启:settings.yaml 被 dsh 的 watcher 热加载,切换后新会话即生效,无需重启。
  • 切换前自动备份原 settings.yaml / .credentials.yaml(滚动保留最近 5 份),原子写入防损坏;含 dsh 目标的方案同样要求服务商为 OpenAI 兼容类型(保存与切换两处均校验)。

一次完整切换的流程如下:

graph LR A[点击切换按钮] --> B[解密 API Key
DPAPI 加密] B --> C[备份原配置
保留最近 5 份] C --> D[启动本地翻译代理
非原生直连的 OpenAI 类型需要] D --> E[生成新配置
build_settings / build_codex_settings] E --> F[原子写入
settings.json / config.toml / settings.yaml] F --> G{是否重启 Claude Code?} G -->|是| H[关闭旧进程
并重新启动] G -->|否| I[下次启动生效] style A fill:#f8fff8,stroke:#27ae60,stroke-width:2px style B fill:#e8f4f8,stroke:#1a6b8a,stroke-width:2px style C fill:#fff4e8,stroke:#f39c12,stroke-width:2px style D fill:#e8f8f5,stroke:#16baaa,stroke-width:2px style E fill:#fef9e7,stroke:#f1c40f,stroke-width:2px style F fill:#e8f4f8,stroke:#1a6b8a,stroke-width:2px style G fill:#f5f5f5,stroke:#7f8c8d,stroke-width:2px,stroke-dasharray: 5 5 style H fill:#d4efdf,stroke:#27ae60,stroke-width:2px style I fill:#d4efdf,stroke:#27ae60,stroke-width:2px

1.4 系统架构

graph LR A[pywebview 桌面壳
desktop.py] -->|加载页面| B[LayUI 前端
index.html + js/app.js] B -->|fetch /api/v1| C[FastAPI 后端
backend/app/main.py] C --> D[(SQLite 数据库
a4api.db)] C --> E[~/.claude/settings.json] C --> F[~/.codex/config.toml] C --> F2[~/.dsh/settings.yaml
+ .credentials.yaml] C -->|启动 / 停止| G[本地翻译代理
proxy_standalone] G -->|转发请求| H[OpenAI 兼容上游] E --> I[Claude Code 进程] F --> J[Codex CLI] F2 --> K[dsh CLI
热加载生效] style A fill:#f8fff8,stroke:#27ae60,stroke-width:2px style B fill:#e8f4f8,stroke:#1a6b8a,stroke-width:2px style C fill:#fff4e8,stroke:#f39c12,stroke-width:2px style D fill:#d5f5e3,stroke:#27ae60,stroke-width:2px style E fill:#e8f8f5,stroke:#16baaa,stroke-width:2px style F fill:#e8f8f5,stroke:#16baaa,stroke-width:2px style F2 fill:#e8f8f5,stroke:#16baaa,stroke-width:2px style G fill:#fef9e7,stroke:#f1c40f,stroke-width:2px style H fill:#f9e79f,stroke:#d4ac0d,stroke-width:2px style I fill:#f9e79f,stroke:#d4ac0d,stroke-width:2px style J fill:#f9e79f,stroke:#d4ac0d,stroke-width:2px style K fill:#f9e79f,stroke:#d4ac0d,stroke-width:2px
  • 前端:LayUI 卡片界面,包含「配置方案」与「供应商管理」两个页签,只调用后端 REST API,不直接读写文件。
  • 后端:FastAPI 提供 providers(服务商)、configs(配置方案)、switch(切换与状态)三类接口,并托管前端静态资源;CORS 白名单仅放行 localhost / 127.0.0.1 / [::1],防止任意网站读取或篡改本地配置。
  • 数据库:SQLite 持久化服务商与配置方案,API Key 以 DPAPI 加密后的密文存储。
  • 本地翻译代理:切换 OpenAI 类型服务商时以独立进程启动,应用退出后代理仍然存活,Claude Code 可继续使用;当生效配置不再需要代理时自动退出。
  • 配置:切换结果写入 ~/.claude/settings.json~/.codex/config.toml~/.dsh/settings.yaml(含凭证 ~/.dsh/.credentials.yaml),供 Claude Code 与 Codex 启动时读取、dsh 热加载即时生效。

2. 快速体验

本节面向只想快速体验工具的读者:从资源下载区块获取安装包,按向导安装后即可使用,无需安装 Python 环境。若你想从源码运行或自行构建,请跳到第 3 章。

2.1 下载安装包

a4api 的官方分发形式为 Inno Setup 制作的安装包 a4api-setup-<版本>.exe,采用每用户安装(免 UAC):双击运行后按向导安装到当前用户目录,全程无需管理员权限,安装完成后自动创建开始菜单与桌面快捷方式,并可在「设置 → 应用」中卸载。下载时可核对发行版页面提供的 SHA256 校验值。若安装或运行时弹出 Windows SmartScreen 提示,点击「更多信息 → 仍要运行」即可(应用未做商业代码签名,属正常现象,不影响功能)。

2.2 启动工具

安装完成后,从开始菜单或桌面快捷方式启动 a4api,稍候弹出「a4api」窗口。首次运行会自动创建数据目录 %APPDATA%\a4api\,用于存放数据库与配置备份;日志写入 ~/.a4api/logs/。若系统提示「a4api 已在运行中」,说明已有实例在运行,请切换到已打开的窗口使用。

启动工具示意图

2.3 新增配置方案

  1. 点击右上角「新增配置」按钮,弹出表单。
  2. 填写以下字段:
字段 说明 示例
方案名称 配置方案的名称,便于识别 日常开发
服务商 下拉选择,支持按名称关键字实时搜索,预置 6 个模板 DeepSeek-openai
API Key 在对应服务商平台获取 sk-xxx
模型 服务商支持的模型标识 deepseek-v4-flash
输出上限 可选,dsh 目标的单次输出上限,留空自动兜底(131072) 131072
应用目标 复选 Claude Code / Codex / dsh,可同时勾选 Codex
  1. 点击「保存」,新卡片出现在列表中。

新增配置方案示意图

新增时方案名称、服务商、模型、API Key 均为必填项,且至少选择一个应用目标。API Key 仅加密存储,界面不会回显明文。

服务商下拉框支持关键字搜索,如输入 deepopenrouter 即可快速定位。找不到所需服务商时,可在表单中点击「没有你的供应商?点此添加」进入供应商管理页新增。

2.4 一键切换模型

  1. 在目标配置卡片上点击「切换」按钮。
  2. 弹出确认窗口:若方案面向 Claude Code,可勾选「切换后重启 Claude Code(若正在运行)」;若方案包含 Codex 目标,会提示「Codex 配置写入后需重启 Codex 才生效」;若方案包含 dsh 目标,会提示「dsh 配置热加载,新会话即生效」。
  3. 点击「确认切换」,系统自动完成备份原配置、生成并写入新的配置文件;若勾选了重启,则自动关闭旧进程并重新打开 Claude Code。

切换成功后,该卡片显示「使用中」徽标并高亮,顶部状态栏同步更新。

未勾选重启时,切换结果在下次启动 Claude Code 时生效;Codex 配置写入后需重启 Codex 才生效;dsh 配置被热加载,新会话即生效。 如果你更新了模型配置内容,需要点击切换按钮以应用更新。

一键切换模型示意图

2.5 供应商管理

窗口顶部「供应商管理」页签用于维护服务商模板,可查看、新增、编辑、删除服务商。列表展示名称、Base URL、协议类型与来源(预置 / 自定义);OpenAI 类型还会标注「原生 Responses」或「本地代理」。

  • 新增 / 编辑:填写名称、Base URL,选择协议类型。Anthropic 原生端点选择「Anthropic」,OpenAI 兼容端点选择「OpenAI 兼容」;OpenAI 类型可勾选「原生 Responses」开关(直连 / 代理),上游原生支持 OpenAI Responses 协议(如 DeepSeek 官方,仅 deepseek-v4-flash 模型)时,Codex 将直连上游,否则经本地翻译代理转发。
  • 删除:该服务商下存在配置方案时无法删除,需先删除其下配置方案,避免产生孤儿数据。

供应商管理示意图

预置的 6 个服务商模板遵循「服务商-协议」命名约定,同一服务商可能同时提供两套接口:

服务商模板 Base URL 协议 原生 Responses
DeepSeek-anthropic https://api.deepseek.com/anthropic Anthropic
智谱-anthropic https://open.bigmodel.cn/api/anthropic Anthropic
DeepSeek-openai https://api.deepseek.com/ OpenAI 直连
智谱-openai https://open.bigmodel.cn/api/paas/v4 OpenAI
OpenRouter-openai https://openrouter.ai/api/v1 OpenAI
本地llmstudio-openai http://127.0.0.1:1234/v1 OpenAI

OpenRouter 为 OpenAI 兼容聚合网关,配置方案中填入其 API Key 即可路由到 OpenRouter 上架的各家模型。 预置模板在工具升级时会按模板定义自动同步(api_base / 协议 / 原生 Responses),自定义服务商不受影响。

2.6 编辑与删除配置

  • 编辑:点击卡片「编辑」按钮,可修改方案名称、服务商、模型、应用目标;API Key 留空表示不修改。
  • 删除:点击卡片「删除」按钮,确认后移除该配置方案。删除配置方案不会影响已写入配置文件中的当前生效配置。

2.7 状态栏与代理服务开关

顶部状态栏实时显示「当前生效」配置,格式为「方案名称(服务商 · 模型)」。若 settings.json 中的实际模型与当前标记的方案不一致,状态栏会提示配置文件内实际使用的模型;方案包含 Codex 目标时,还会追加显示 Codex 当前模型或「Codex 待配置」;方案包含 dsh 目标时,会追加显示 dsh 当前模型或「dsh 待配置」。

右上角「代理服务」开关显示本地翻译代理的运行状态。代理运行中可手动关闭,关闭后 OpenAI 类型服务商将无法使用,需要重新切换配置才能恢复。

3. 从源码运行项目

如果你希望修改源码、调试功能或自行打包,可从源码运行项目。

3.1 环境要求

要求
操作系统 Windows 10/11 64 位
Python 3.10 及以上
包管理器 uv(Python 包管理器)

3.2 安装 uv

uv 是本项目的依赖管理工具,安装命令:

pip install uv

验证安装是否成功:

uv --version

如果提示找不到 pip,请先参照前置教程完成 Python 环境的安装。

3.3 安装依赖并启动桌面应用

进入项目目录并同步依赖:

cd a4api
uv sync

启动桌面应用:

uv run python desktop.py

uv sync 会自动创建 .venv 虚拟环境并安装 pyproject.toml 中声明的全部依赖(FastAPI、uvicorn、SQLAlchemy、pywebview 等)。首次启动会弹出「a4api」窗口。

若你习惯使用 conda 管理 Python,可先用 conda create -n env python=3.10 创建并激活环境,再安装 uv、执行 uv sync,效果相同。

3.4 后端单独调试

桌面模式下后端自动运行在 127.0.0.1 的随机空闲端口。如需在浏览器中调试,可单独启动后端:

uv run uvicorn backend.app.main:app --port 8000

浏览器访问 http://127.0.0.1:8000 即可看到与桌面窗口相同的界面。

切换 OpenAI 类型服务商时,工具会启动独立翻译代理进程。开发模式下代理以 python -m backend.app.proxy_standalone 运行,打包后以 a4api.exe --proxy 运行,应用退出后代理仍然存活。

4. 打包与项目结构(进阶)

4.1 打包为安装包

资源下载区块中的安装包即由打包脚本构建。构建安装包需要先安装 Inno Setup 6:

winget install --id JRSoftware.InnoSetup -e --accept-source-agreements

在项目目录执行打包命令:

uv run python build.py                 # 生成 dist/a4api/(文件夹版 onedir)
uv run python build.py --installer     # 文件夹版 + 编译安装包 dist/a4api-setup-<版本>.exe
uv run python build.py --onefile       # 可选:生成单 exe(临时分发用)
  • 默认生成文件夹版(onedir,dist/a4api/a4api.exe);加 --installer 会同时编译 Inno Setup 安装包,生成 dist/a4api-setup-<版本>.exe,即资源下载区块中的安装包。
  • 版本号自动读取 pyproject.toml[project].version,也可用 --version 覆盖。
  • ISCC.exe 自动探测(--iscc 可指定路径);未安装 Inno Setup 时仅生成文件夹版并提示安装命令。
  • 打包脚本会自动读取 resources/logo.png 生成多尺寸 logo.ico,作为 exe 与安装包图标。
  • --onefile 生成单文件 exe(dist/a4api.exe),主要用于临时分发或快速验证。

4.2 项目结构解析

a4api/
├── backend/
│   ├── app/                         # FastAPI 后端
│   │   ├── main.py                  # 应用入口与路由注册、静态资源托管
│   │   ├── config_manager.py        # settings.json / config.toml / settings.yaml 读写、备份、原子写入
│   │   ├── openai_proxy.py          # 本地翻译代理:Anthropic / Responses 转 OpenAI 格式
│   │   ├── responses_translator.py  # Codex Responses 协议翻译层
│   │   ├── proxy_standalone.py      # 独立代理进程管理(启动、状态、停止)
│   │   ├── crypto.py                # API Key DPAPI 加解密
│   │   ├── process.py               # Claude Code 进程探测与重启
│   │   ├── crud.py                  # 数据库操作封装
│   │   ├── models.py                # 数据模型
│   │   ├── schemas.py               # Pydantic 请求 / 响应模型
│   │   ├── database.py              # SQLite 连接与数据目录管理
│   │   ├── seed.py                  # 预置服务商模板初始化
│   │   ├── singleton.py             # 单实例检测
│   │   ├── logging_config.py        # 统一日志配置
│   │   ├── tests/                   # 自动化测试(加解密、原子写入、协议翻译)
│   │   └── api/v1/                  # 服务商、配置、切换接口
│   └── database/                    # 开发模式数据目录
├── frontend/                        # LayUI 前端
│   ├── index.html
│   ├── js/app.js
│   ├── css/style.css
│   └── layui/                       # LayUI 静态资源
├── resources/                       # logo.png / logo.ico 图标资源
├── desktop.py                       # pywebview 桌面入口
├── build.py                         # PyInstaller + Inno Setup 打包脚本
├── installer.iss                    # Inno Setup 安装包脚本
├── pyproject.toml                   # 依赖声明与版本号
└── README.md

4.3 数据存储位置

运行模式 数据目录
开发模式(源码运行) a4api/backend/database/
打包后(安装包运行) %APPDATA%\a4api\

数据目录中包含 SQLite 数据库 a4api.db、配置备份 backups/ 子目录与代理状态文件 proxy.json。切换前备份的旧配置以 settings.时间戳.json.bakcodex.config.时间戳.toml.bakdsh.settings.时间戳.yaml.bak 等命名,各自滚动保留最近 5 份。日志统一写入 ~/.a4api/logs/a4api.log。旧版(api-switch)的运行时数据会在首次启动时自动迁移到 %APPDATA%\a4api\,无需手动搬运。

4.4 本地翻译代理工作原理

本地翻译代理是 a4api 接入 OpenAI 兼容服务商的关键,代码位于 backend/app/openai_proxy.py

  • 监听与端口:仅绑定 127.0.0.1,端口限定在 17890-17899 的小范围,不对外网开放。
  • 鉴权:每次启动由 secrets.token_urlsafe(24) 生成随机 token,请求须携带 x-api-keyAuthorization: Bearer <token> 且与 token 一致,否则返回 401。
  • 端点/v1/messages 把 Anthropic 请求翻译为 OpenAI Chat Completions 并流式返回(Claude Code 使用);/responses 把 Codex 的 Responses 请求翻译转发(仅提供 Chat Completions 的上游使用);/v1/proxy/refresh 按数据库当前生效配置刷新上游;/v1/api/version 返回代理能力版本,供复用校验。
  • 独立存活:代理以独立进程运行,应用退出后仍然存活;代理轮询数据库,当前生效配置不再需要代理时自动退出;原生支持 Responses 且仅面向 Codex 的配置直接连上游,无需启动代理。
  • 能力校验:复用已运行代理前会校验其能力版本(/v1/api/version,要求版本不低于 2 且声明支持 openai_responses),避免误用旧构建的未鉴权进程。

代理默认不记录请求 / 响应内容。如需排查问题,可设置环境变量 A4API_PROXY_DEBUG 开启调试日志(含完整请求头、请求体与上游响应)。

5. 总结

5.1 核心内容回顾

  • a4api 通过图形界面读写 ~/.claude/settings.json~/.codex/config.toml~/.dsh/settings.yaml,实现 Claude Code、Codex 与 dsh 的多模型 API 快捷切换。
  • 内置 6 个预置服务商模板,支持 Anthropic 协议与 OpenAI 兼容 API,后者由本地翻译代理自动处理;原生支持 Responses 的上游(DeepSeek)Codex 直连;dsh 原生走 OpenAI Chat Completions,OpenAI 兼容服务商直连写入、免代理。
  • 选择服务商时支持按名称关键字实时搜索;OpenAI 类型可标记「原生 Responses」(直连 / 代理)。
  • 配置方案可选应用目标(Claude Code / Codex / dsh / 任意组合),卡片化管理任意数量的配置方案;含 Codex / dsh 的目标要求 OpenAI 兼容服务商。
  • 供应商管理页支持可视化新增、编辑、删除自定义服务商。
  • 切换前自动备份原配置(滚动保留最近 5 份),采用原子写入与合并式更新,保留 hooks、permissions、mcpServers、ui-onboarding 等已有配置。
  • API Key 使用 Windows DPAPI 加密存储,不落明文。
  • 切换 Claude Code 配置后可选择自动重启,Codex 配置写入后重启 Codex 生效,dsh 配置热加载、新会话即生效。
  • 官方分发为 Inno Setup 每用户安装包(免 UAC),也可通过 uv run python build.py 自行打包。

5.2 常见问题与解答

问:没有安装 Python 也能使用吗?

答:可以。安装包为编译好的 Windows 程序,按向导安装后即可运行,无需 Python 环境。只有从源码运行或自行打包时才需要 Python 3.10 与 uv。

问:切换后 Claude Code 仍然使用旧模型?

答:切换写入的是 ~/.claude/settings.json,Claude Code 在启动时读取该文件。若切换时未勾选重启,请手动关闭所有 Claude Code 窗口后重新打开。

问:切换 Codex 配置后未生效?

答:a4api 会把配置写入 ~/.codex/config.toml,但不会自动重启 Codex。切换后需要手动重启 Codex,新配置才生效。

问:切换 dsh 配置后未生效?

答:a4api 会把服务商、模型与 API Key 写入 ~/.dsh/settings.yaml~/.dsh/.credentials.yaml。dsh 配置文件被 watcher 热加载,切换后新会话即生效、无需重启;若仍不生效,请确认方案已勾选 dsh 目标、服务商为 OpenAI 兼容类型,并检查 ~/.dsh/settings.yamlagent-default-model 段与 ~/.dsh/.credentials.yaml 中的 DEEPSEEK_API_KEY 是否已正确写入。

问:dsh 目标为什么要求 OpenAI 兼容服务商?

答:dsh 原生走 OpenAI Chat Completions 接口,只注册 deepseek-official 一个 provider 路由。因此含 dsh 目标的配置方案必须选择 OpenAI 兼容类型服务商(保存与切换两处均会校验),Anthropic 类型服务商只能用于 Claude Code 目标。

问:API Key 是否安全?会不会明文存盘?

答:API Key 经 Windows DPAPI(调用系统 crypt32.dll)加密后存入数据库,只有当前 Windows 用户才能解密。任何接口响应都不包含 API Key 明文或密文。非 Windows 环境仅作开发调试兜底,不具备安全性。

问:配置写坏了怎么办?

答:每次切换前都会自动备份原配置,备份文件位于数据目录的 backups/ 下(开发模式为 backend/database/backups/,打包后为 %APPDATA%\a4api\backups\),滚动保留最近 5 份,可手动恢复。

问:选择 OpenAI 兼容服务商后无法使用?

答:请检查界面右上角「代理服务」开关是否显示运行中。OpenAI 类型服务商依赖本地翻译代理转发请求,若代理未运行或已手动关闭,需重新切换一次配置以拉起代理。

问:双击程序提示「a4api 已在运行中」?

答:工具内置单实例检测(Windows 命名互斥体),防止多实例互相覆盖配置。请查看任务栏或系统托盘,找到已打开的窗口即可。

问:可以切换到官方 Claude 或本地模型吗?

答:可以。只要目标服务提供 Anthropic 兼容端点(如官方 https://api.anthropic.com)或 OpenAI 兼容端点(如本地 LLM Studio),在「供应商管理」页新增对应服务商即可。

问:杀毒软件提示病毒怎么办?

答:PyInstaller 打包的程序偶被安全软件误报,属正常现象。请在杀毒软件中将 a4api 添加为信任或排除项;也可将样本提交给对应安全厂商申诉误报。

问:如何升级或卸载?

答:直接运行新版 a4api-setup-<版本>.exe 覆盖安装即可升级,安装程序会自动停止后台翻译代理并清理旧文件;数据与配置保存在 %APPDATA%\a4api\,升级不受影响。卸载在「设置 → 应用」中操作,卸载后运行数据仍保留在 %APPDATA%\a4api\,如需彻底清除请手动删除该目录。

问:反馈问题时需要提供哪些信息?

答:在 github 仓库提交 Issue 时,请注明 a4api 版本号、目标应用(Claude Code / Codex / dsh)、服务商与模型,并附上 ~/.a4api/logs/a4api.log 的相关片段与复现步骤;切勿在 Issue 中粘贴 API Key 等敏感信息。