Releases: shiftu/aivet
Release list
v0.2.2
v0.2.1
v0.2.0:cc-switch 备用 provider 与协议验证
新增
aivet provider add <名称>:为 Claude Code、Codex 向 cc-switch 保存多组备用 provider,默认不激活、不加入自动故障转移队列,不修改原生配置。aivet provider list和aivet provider verify [名称]:列出配置并按 Messages / Responses 协议验证推理响应;添加时可使用--verify。- 支持
--apps、--dry-run、--json、非交互输入和 Tab 补全。凭证支持AIVET_KEY,交互输入不回显。 - 整批事务写入、完整状态复核、冲突拒绝、重复添加幂等。无法安全入库时导出受保护的配置文件并返回非零退出码。
使用
aivet update
aivet provider add backup-a
aivet provider verify backup-a当前入库适配 SaladDay/cc-switch-cli 5.10.3、schema 17,需要 sqlite3。先启动 cc-switch 初始化数据库,再关闭窗口和后台进程。数据目录遵循 CC_SWITCH_CONFIG_DIR。
本版提供 HTTP 协议层验证;自动启动其他软件验证及全局切换后恢复配置尚未实现。HTTP 验证会发送实际模型请求。
验证
go vet ./...、go test ./...、go test -race ./...通过。- 真实 cc-switch-cli 5.10.3 在 macOS arm64 隔离目录中完成添加、重复添加、列出、切换 Claude/Codex、无当前 provider 添加验收;既有配置和记录保持不变。
- 提供 macOS、Linux、Windows 的 amd64/arm64 二进制及 SHA256SUMS;Linux/Windows 已交叉编译,未进行对应系统运行验收。
识别并自动修复 Cloudflare bot 拦截(hermes/pi default_headers)
新能力
- hermes / pi 被 Cloudflare 当 bot 拦(403)时:aivet 现在能识别(拦截页/挑战页、cf-mitigated、边缘信号+非 JSON 正文)并自动修复
aivet fix hermes.default_headers→ 往 providers..default_headers 写浏览器 User-Agent,写完立刻重验
aivet fix pi.default_headers→ pi 0.84.3 确认有 headers 配置位,同方案支持- 公网 HTTPS 网关才报 headers 状态;本地网关不唠叨
- aivet 自身探测不带这些头(探测路径 ≠ 工具路径);配了头却不带头被拦时自动按配置重探
已测试
- go build / vet / test 全绿(新增 4 个测试文件 20+ 用例)
- 假 Cloudflare 服务复现 403:识别 + 分流四种路径 + JSON 403 不误判 + dry-run 不留备份
- 真实环境 check hermes / check pi 全绿
v0.1.8 — aivet update:自己换掉自己
以前升级只有一条路:再跑一遍 install.sh。那是「装」不是「升」,用户得记住那行 curl。
现在 aivet update 就够了 —— 从 GitHub release 下当前平台的二进制,用它换掉正在跑的这个,下载时有进度条。
… aivet_darwin_arm64 ▕████████████░░░░░░░░░░░░▏ 47% 3.5 MB/7.4 MB 627.8 KB/s
✔ 校验和对上了 c5bf1d2c0c2bc1be…
✔ 已更新 v0.1.7 → v0.1.8 · ~/.local/bin/aivet
管道 / CI / 重定向到文件时一个 \r 都不出(那几百行刷屏是垃圾不是动效),只留一行结果;服务器不给 Content-Length 就退化成转圈 + 已下字节;ASCII 终端换成 [####....]。
这是在往你机器上放一个会被直接执行的文件,所以:
- 发布时一起传的
SHA256SUMS是必对的一环。没有它、或者对不上,一律删掉不装。跳过校验的自更新等于给自己开了一条后门。 - 顺序是先判断、再下载、下完先校验、最后才碰目标文件 —— 任何一步失败,你手里那个 aivet 都还是完好的。
- 换的动作是同目录
rename,原子的,不会留下半个文件。Windows 覆盖不了正在跑的 exe,先把旧的挪成.old,放不进去再挪回来。 - aivet 要是个软链(brew、
~/bin里手工链的),换的是它指向的那个,不会把链接本身变成真文件。 - 装在需要 root 的目录里时提示你用
sudo重跑,aivet 不自己提权。
用法
aivet update 有新版就装上
aivet update --check 只看,什么都不动
aivet update --version v0.1.6 退回某个版本
aivet update --force 版本一样也重装
用 brew 之类装的,更新交给它,别用这个。
装:
curl -fsSL https://raw.githubusercontent.com/shiftu/aivet/main/install.sh | bash
v0.1.7 — 装完顺手把 Tab 补全也装好
补全一直是「给你一行命令,你自己照抄」。多一步就少一批人装。
aivet completion --install:认出你在用哪个 shell,把脚本写到该在的地方,再往 rc 文件里补上加载它的那几行。install.sh / install.ps1 装完二进制会顺手跑一次,所以一般你不用自己敲。
重复跑是安全的 —— rc 里那几行用 # >>> aivet completion >>> 框着,升级时整段换掉,不会越叠越多。不想让它碰 rc 文件就照旧:aivet completion zsh > 你说了算的路径。
几个坑已经处理掉了:
- zsh 加载顺序:那几行加在
.zshrc末尾,也就是 oh-my-zsh 跑完compinit之后。写成「compdef有了就直接 source、没有就自己开一次compinit」,两种顺序都活。 - PowerShell 的
$PROFILE:OneDrive 会把「文档」整个重定向走,所以不自己拼Documents\PowerShell\...,改成跑pwsh -Command $PROFILE问它本人要。 - macOS 的 bash:登录 shell 只读
~/.bash_profile。改的是对的文件但不会被念到 —— 这种只提醒,不替你改.bash_profile。
补全没装上不算安装失败:认不出 shell、rc 只读、找不到家目录一律当成跳过并返回 0。
装:
curl -fsSL https://raw.githubusercontent.com/shiftu/aivet/main/install.sh | bash
v0.1.6 — Tab 补全
按 Tab 就有
aivet completion # 认出你在用哪个 shell,把安装命令直接给你,照抄一行
aivet completion zsh # 或者自己决定脚本放哪
支持 bash / zsh / fish / PowerShell。装完之后每一级都能补:
| 敲的 | 补出来 |
|---|---|
aivet <Tab> |
全部命令 + 一行说明 |
aivet check <Tab> |
claude codex hermes pi dsh ccswitch(敲过的不再提示) |
aivet check --<Tab> |
--json --live --offline --help |
aivet fix <Tab> |
这台机器上此刻真能修的那几项 |
aivet skill <Tab> |
install / show |
aivet ask --with <Tab> |
只列真能接手的 agent |
aivet setup --tools claude,<Tab> |
逗号续写,已选的不再出现 |
aivet help <Tab> |
全部命令名 |
zsh 和 fish 还会把说明显示在候选旁边。
装一次就够
补全脚本只有十行胶水 —— 每按一次 Tab 回头问 aivet 要候选,候选从帮助那份说明书现算。
所以帮助里有什么就能补什么,两边不可能对不上;以后 aivet 升级、加命令、加修复项,
补全跟着变,不用重装。
顺带
aivet help --json多了positional和values:agent 不用再从args那句自由文本里猜某个位置能填哪几个- 参数解析里那份重复的「哪些选项要取值」清单删掉了,和补全共用同一处判断
- 命令总览的名字列宽度跟着最长命令走,不再写死
已知
fish 和 PowerShell 的脚本在打包这台机器上没有对应 shell,只做了静态审查,没有实按 Tab 跑过。
两者共同的坑(空的当前词被吞掉)已经在协议层解决 —— 正在敲的词走 --cur=,永远是个非空参数。
v0.1.5 — 收录 OminiGate
把 OminiGate 加进内置知识(19 个提供方)。现在你的配置里直接写 ominigate 就行,不用再自己声明地址和 key 名。
两条记录,因为它一个域名两套协议
| 名字 | 协议 | 地址 |
|---|---|---|
ominigate |
chat | https://api.ominigate.ai/v1 |
ominigate-anthropic |
anthropic | https://api.ominigate.ai |
/v1 的有无是故意相反的。 Claude Code 会自己补 /v1/messages,给它一个带 /v1 的地址反而 404 —— aivet 本来就有一条检查专门骂这件事。写反了不报错,只会让所有 OminiGate 用户探测失败,所以加了测试把这条钉死。
key 优先读 OMINIGATE_API_KEY,其次退回该协议的通用名(OpenAI 侧 OPENAI_API_KEY、Anthropic 侧 ANTHROPIC_AUTH_TOKEN)。
一件要紧的事:新版 Codex 用不了 OminiGate
发版前把四个端点实测了一遍(不带 key):
GET /v1/models 401 ← 在,要 key
POST /v1/chat/completions 401 ← 在
POST /v1/messages 401 ← 在
POST /v1/responses 404 ← 没有
最后一条是问题:Codex 0.137+ 已经删掉 wire_api = "chat",只发 Responses API,而 OminiGate 没有 /v1/responses。 所以 OminiGate 那篇 Codex 集成文档只对 0.137 以前的 Codex 成立。
这不是 aivet 的 bug,也不需要新代码:v0.1.3 起就有 codex.wire_api_chat_removed = 0.137.0 这条版本断言,aivet 会拿你实际装的 Codex 版本去比 —— 旧版报提醒,新版报故障。Claude Code 和 Hermes 走 chat / anthropic,不受影响。
顺带一提:knowledge 就是干这个的
aivet knowledge 里那些「会过时的外部事实」(提供方地址、配置文件位置、模型别名、版本断言)都可以就地改,不必等 aivet 发新版:
aivet knowledge --init # 生成 ~/.aivet/knowledge.json
只写你要改的那几条,其余继续用内置的。这一版加的 OminiGate 你本来也能自己补一条 —— 现在省了。
安装
curl -fsSL https://raw.githubusercontent.com/shiftu/aivet/main/install.sh | bash
或从下面直接下对应平台的二进制(SHA256SUMS 可校验)。
v0.1.4 — 谁在管,以及模型不止一个
两件事,都是「报告说没问题,其实没查」的同一类毛病。
cc-switch 那一节改答「谁在管」
之前只回答「cc-switch 选的和原生文件一致吗」,漂移时两头押宝「以谁为准」。现在有明确立场:原生配置优先,官方登录为正,cc-switch 是 fallback。
- 原生官方登录 → ✔「cc-switch 没接管;另存 N 个备用未启用」。官方能用时 cc-switch 空着、或存一份备用不启用,都是正常状态,不催你迁。
- 原生是官方、cc-switch 却记着旧网关 → ▲「记录过时了」。现在不影响使用,但提醒你别在 cc-switch 里随手再切一次,那会把官方登录盖掉。
- 原生网关能跑 → 说清是「原生自管」还是「cc-switch 接管」;漂移时明说原生优先,不用动。
- 原生探不通 / 没配置 → 这才轮到 cc-switch。而且推荐之前先探:把它库里存的候选逐个拉一次模型清单,通了才给
cc-switch use <id> --app <工具>;都不通就说「先看网关」,不让你从一个坏的换到另一个坏的。
「原生能不能跑」来自那件工具自己的体检结论(新增 harness.Posture),不再由 cc-switch 那节重读一遍原生文件去猜。单独跑 aivet check ccswitch 时会补一份只读配置的姿态,并明说「没探」。
一件工具不止一个模型槽
只验主模型就说「全部通过」,用户在工具里切一下就 404 —— 报告当时是绿的,而且没人会回来问。现在把配置里写着的其他模型也对着网关清单核对:
| 工具 | 之前没查的 |
|---|---|
| Codex | review_model(/review 真正发出去的那个) |
| Claude Code | sonnet / opus / haiku 三个别名 env 各自指到的模型 |
| Hermes、dsh | providers 里声明的那份模型菜单 |
| pi | enabledModels(Ctrl+P 能切到的那几个) |
出一条聚合的「其他模型」:
- 都在清单里 → ✔
- 有对不上的 → ▲ 列出是哪个、从哪个字段来的。是提醒不是故障:你未必用得上它,不该把整台机器判成有病,退出码仍是 0。
- 离线 / 没 key / 网关没有清单接口 → 报「没核对」,不替查不到的东西打包票。
只做清单核对不发真请求 —— 清单这时已经缓存,等于免费;逐个发请求会让一次体检从两秒变成一分钟。
上下文长度不再猜
aivet setup 以前给所有模型写死 128000 / 16384。现在照抄网关模型清单里的 context_length / max_completion_tokens,写完会告诉你这个数是哪来的。实测 charaboard/deepseek-v4-flash:128000/16384 → 1048576/65536,差了 8 倍。网关给不出才退回默认值,并且明说是退回来的。
安装
curl -fsSL https://raw.githubusercontent.com/shiftu/aivet/main/install.sh | bash
或从下面直接下对应平台的二进制(SHA256SUMS 可校验)。
v0.1.3 — 让 aivet 知道自己什么时候过时了
aivet 对六件工具的了解会随它们升级而失效。麻烦的不是失效本身,是失效的表现形式:
解析器读到一个改了名的字段不会报错,它只会留一个零值。于是后面每条检查都在核对空值,
然后一路绿灯 —— 查了等于没查,而报告上写着「一切正常」。这比报错危险得多,因为没人会来问。
这个版本让 aivet 能说出「我读不懂这个」。
读不懂就明说,并且闭嘴
配置文件有内容、却没有一个 aivet 认得的顶层键时,报一条 <工具>.schema「配置结构」,
并就此打住,不再输出没有依据的绿灯。汇总行也跟着改口:
1 通过 · 1 提醒
有配置 aivet 读不懂(见上面的「配置结构」),那几件工具的结论不作数。
实测一下:aivet check <工具> --live
用在哪儿是有取舍的,不是一刀切:
- hermes / pi(models.json) / dsh —— 这些文件存在的意义就是声明提供方,读不懂就得停。
- codex config.toml —— 多用途文件(审批策略、沙箱设置也在里面),「没有模型配置」有两种读法:
用户本来就走 OpenAI 官方,或者 codex 改了字段名。分不清就别装作分得清:陈述事实,不打断。 - claude settings.json —— 里面可能全是主题、权限之类和 aivet 无关的设置,误报风险太高,不用这条。
改的是另一处:文件不存在时不再报 OK;三样配置来源都空时提示可能换了配置文件位置。
知识可以就地补,不用等发版
新增 aivet knowledge。提供方地址、Claude 模型别名、配置文件路径、版本断言
四类会过时的事实从代码里搬到了 ~/.aivet/knowledge.json:
aivet knowledge # 看 aivet 现在以为配置文件在哪、认识哪些提供方、哪些被你改过
aivet knowledge --init # 生成模板(已存在则不覆盖 —— 那是你手写的东西)
aivet knowledge --json # 给 agent工具搬了配置文件的家,往 paths 对应键的最前面加一条新路径即可 —— 内置的仍留作兜底,
不必把原来的抄一遍。加提供方、改版本断言同理。只写你要改的那几条,其余继续用内置的。
用户文件读不了会挂到报告的 notes 上并打在屏幕上:静默退回内置知识,
是这个功能最坏的失败方式 —— 你以为补的东西生效了,其实没有。
版本断言带版本号比
wire_api = "chat" 不再无条件报故障:
| 你装的 codex | 结论 |
|---|---|
| ≥ 0.137 | 故障(启动即报错) |
| < 0.137 | 提醒(你这儿还能跑,但升级会坏) |
| 读不出版本 | 提醒 + 明说读不出版本,不瞎断言 |
三种情况都留可自动修的出路。老实现见到 chat 就报故障,两头都会错:旧版用户被一条
在他那儿根本不成立的「故障」挡住,而 codex 万一把 chat 加回来,这条就成了纯误报。
顺带修一个真 bug:wire_api = "chat" 时探测仍用 Responses 协议,对旧版用户必然 404 ——
那是 aivet 的错,不是用户配置的错。现在探它实际会发的那个协议。
给 agent
aivet help --json 的工作流多了一步;SKILL.md 明确写了:见到 .schema 项就别再拿那部分结果当事实,
改走 --live(工具自己跑一次,完全不经过 aivet 对配置的理解)或 aivet knowledge。
验证
- 实机
aivet check:35 通过 / 3 提醒 / exit 0,与上一版一致,真实配置上零误报 go vet+ 9 个包测试全绿,新增 3 个测试文件- 测试钉的是行为不是措辞:漂移必须报出来 → 报出来之后不许再吐绿灯 → 正常配置不许误报 →
补一条路径能从「文件搬家」里恢复 aivet knowledge --init生成的模板自己读得回来
一处诚实的取舍:内置 paths 表里每个键只有一条候选路径。没有凭空加 XDG 之类的备选 ——
那是猜,而猜正是这个版本要消除的东西。多候选的能力留给用户和 agent 用真实观察去填。
安装
curl -fsSL https://raw.githubusercontent.com/shiftu/aivet/main/install.sh | bash