把几台机器上多个 coding agent 的模型配置收敛到一个 YAML:改 vendors.yaml,跑一条命令,Codex / Pi / Claude Code / DSH / ZCode 的配置文件就同步成一致;换电脑时拷过去再跑一次即可。
它只管 provider、API key、默认模型和相关环境变量;主题、键位、项目信任列表、MCP、插件等个人设置一律不碰。
| 项 | 说明 |
|---|---|
| 语言 | Python 3.7+,单文件 bootstrap.py(约 840 行) |
| 依赖 | 只有 pyyaml(读 YAML);网络用标准库 urllib,不装 requests |
| 运行环境 | Windows(py)与 Linux/macOS(python3 / sync.sh);跨平台差异只在 codex_auth_command() 一处 |
| 被管理对象 | ~/.codex/config.toml、~/.codex/models.json、~/.pi/agent/*.json、~/.claude/settings.json、~/.dsh/*.yaml、~/.zcode/v2/config.json |
一条流水线:vendors.yaml 是唯一输入,各 agent 的配置文件是唯一输出,中间没有任何状态。
| 阶段 | 代码 | 做什么 |
|---|---|---|
| 读入 | load_vendors() |
vendors.yaml → 扁平 env 字典;解析 api_key_env、补默认值、校验类型(不合规就抛 ConfigError) |
| 探测 | fetch_models() |
拉 bai 的 /models,在线时刷新模型清单,离线时沿用本机已有列表 |
| 落地 | setup_claude / setup_codex / setup_pi / setup_zcode / setup_dsh |
每个 agent 一个函数,各自决定写哪些键 |
| 写入 | patch_json() / patch_toml() / write_text() |
逐键替换,保留未知字段与注释;先写临时文件再替换,保留权限 |
| 回读 | cmd_export() |
从当前机器的 agent 配置反向生成 vendors.yaml |
| 自检 | cmd_check() / cmd_verify() |
配置与网络;两条真实调用路径各发一次最小请求 |
四条设计约束:
- 只改认识的键。手写在 agent 配置里的东西不会被抹掉,所以
~/.codex/config.toml的notify、[projects.*]、MCP、插件等同步后原样保留。 - 没装的 agent 自动跳过。目标文件不存在就输出
skip (not installed),不会凭空创建目录。 - 清理已停用的上游。
RETIRED_PROVIDERS里的 provider 会从 agent 文件里被剪掉,避免留下还能选中的死人模型。 - 凭据不靠手抄。
export能把 key(含 codex 的[model_providers.<p>.auth])、URL、模型、推理强度全部读回vendors.yaml。
py -m pip install pyyaml
Copy-Item vendors.example.yaml vendors.yaml # 填 base_url + key(api_key 或 api_key_env)
py bootstrap.py --dry-run --only codex pi # 先看要动什么
py bootstrap.py --only codex pi # 再真动
py bootstrap.py verify # 真发一次请求,两条协议都验Linux / macOS 用 ./sync.sh 代替 py bootstrap.py。目标 agent 没安装时会跳过,不会凭空创建配置文件。
| 命令 | 用途 |
|---|---|
py bootstrap.py --dry-run |
只显示将要修改的内容,不写文件 |
py bootstrap.py --only claude codex pi zcode dsh |
只同步指定 agent |
py bootstrap.py --no-probe |
跳过在线模型列表探测 |
py bootstrap.py check |
校验 vendors.yaml 并探测 /models;不通或配置缺失时返回非零 |
py bootstrap.py verify |
向 openai / anthropic 两条真实调用路径各发一次最小请求,并核对默认模型在目录里 |
py bootstrap.py export --force |
从本机 agent 配置反向生成 vendors.yaml |
参数也能写在子命令后面,例如 python3 bootstrap.py check --config ./vendors.yaml --no-probe。
| 段 | 字段 | 说明 |
|---|---|---|
厂商段(bai、aizex) |
base_url、api_key 或 api_key_env |
key 二选一;api_key_env 指向已设置的环境变量 |
codex |
provider、model、reasoning_effort、models |
省略 reasoning_effort 则为 xhigh;wire_api 固定 responses;models 是额外要塞进 ~/.codex/models.json 的模型 ID(默认模型自动包含,条目按同名变种克隆) |
claude |
model、sonnet、opus |
默认模型与三个角色模型 |
pi |
provider、model、http_proxy |
http_proxy 会写进 ~/.pi/agent/settings.json |
dsh |
provider、model |
同 pi |
当前上游:b.ai(claude / pi / dsh / zcode)与 aizex(codex)。
| 路径 | 作用 |
|---|---|
bootstrap.py |
全部逻辑:load / setup / export / check / verify |
vendors.yaml |
唯一真相,含明文 key(已 gitignore,勿提交) |
vendors.example.yaml |
模板,带字段注释 |
sync.sh / sync.ps1 |
一行入口 |
skills/agent-bootstrap-sync/SKILL.md |
给 coding agent 的操作规范:改配置走 vendors.yaml,别手改生成物 |
- 一次同步多个 agent:provider、key、默认模型、推理强度、pi 代理。
- codex 的 key 写进
[model_providers.<p>.auth](Windows 用cmd /c echo,其它用echo),换机能复现 —— 那是 codex 拿到第三方 key 的唯一途径。 - pi 的模型清单在线刷新;探测失败时沿用本机列表,不会写空。缺
OPENCODE_MODEL_SPECS条目的新模型会退回 128k 窗口 / 16k 输出。 - qwen 系列自动补
compat块(thinkingFormat: qwen、不带reasoning_effort/store/developer),因为上游会拒这些字段。 pi models-store.json里的陈旧 provider 一并剪掉,避免缓存里还能选到已停用的模型。
- 改
bootstrap.py或skills/…/SKILL.md。vendors.yaml是本机私有、每台一份,不入库。 py bootstrap.py --dry-run --only <agents>预览 → 实际同步 →verify。master单分支,直接 push;其它机器git pull后再跑一次 sync。- 需要新字段时改脚本(
load_vendors+setup_*+cmd_export+cmd_verify四处对齐),别手改 agent 配置文件 —— 下次同步会覆盖手工修复。
- 只用标准库 + PyYAML,保持 3.7 兼容(无
match、无新式类型注解)。 - 写文件统一走
write_text/save_json:先写临时文件再替换,保留原权限;新建的含密钥文件在 posix 上自动0600。 - 任何密钥在输出与日志里一律
mask()(前 3 后 3)。 - 每个
setup_*都接受dry_run,把动作追加到out列表,由cmd_setup统一打印* / = / ~(改动 / 无变化 / 跳过)。
没有自动化测试;用三条命令自检:
check看配置与网络;verify看两条真实调用路径与默认模型;--dry-run看改动面。verify期望ALL OK,且bai openai、bai anthropic两行都 OK;/models里有某个 id 不代表能调用(余额),所以还要verify真发一次。- 已实测:3 台机器(Windows ×2、Ubuntu ×1)× 各 agent 段;反复 sync 后
--dry-run只剩patch_toml的已知无害标记(该函数恒返回 changed,内容实际未变)。 - 改
bootstrap.py后先--dry-run,在一台机器上verify通过,再推给其它机器。
旧机器:
py bootstrap.py export --force # 生成 vendors.yaml把整个目录(含 vendors.yaml)拷到新机器,然后:
py -m pip install pyyaml
py bootstrap.py # 一次落地vendors.yaml 里用 api_key_env 的机器要先设好环境变量,或直接改成内联 api_key。
vendors.yaml 含明文 API key,已在 .gitignore 里;_*.yaml / *.bak 一并忽略,避免临时副本被 git add -A 带走。不要把它提交到任何仓库或发给别人。Windows 上靠系统文件权限保护,posix 上由脚本 0600。
自己用为主,欢迎直接提 PR:单个改动、附 --dry-run 输出。新增 agent 时请同时补 setup_<agent>()、cmd_export 回读、cmd_verify 检查项,以及 README 的字段表。