Skip to content

Releases: shiftu/aivet

v0.2.2

Choose a tag to compare

@shiftu shiftu released this 10 Sep 06:39

修复 proxy 子命令的 Clash 控制接口报错信息:连接失败时明确显示读取到的配置文件、external-controller 地址和底层连接错误,避免误解为工具写死控制端口。

v0.2.1

Choose a tag to compare

@shiftu shiftu released this 10 Sep 04:24

新增 Clash / Clash Verge 代理路径诊断与规则修复:通过 HTTP/HTTPS 请求、Clash 连接记录和失败拨号日志验证目标域名是否经代理出口;新增 aivet proxy check/fix,支持持久化前置 DOMAIN 规则、备份、重载、失败回滚和修复后复验。

v0.2.0:cc-switch 备用 provider 与协议验证

Choose a tag to compare

@shiftu shiftu released this 08 Sep 02:28

新增

  • 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)

Choose a tag to compare

@shiftu shiftu released this 02 Sep 03:28

新能力

  • 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:自己换掉自己

Choose a tag to compare

@shiftu shiftu released this 28 Aug 11:43

以前升级只有一条路:再跑一遍 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 补全也装好

Choose a tag to compare

@shiftu shiftu released this 28 Aug 11:25

补全一直是「给你一行命令,你自己照抄」。多一步就少一批人装。

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 补全

Choose a tag to compare

@shiftu shiftu released this 28 Aug 11:05

按 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

Choose a tag to compare

@shiftu shiftu released this 28 Aug 10:03

把 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 — 谁在管,以及模型不止一个

Choose a tag to compare

@shiftu shiftu released this 28 Aug 09:53

两件事,都是「报告说没问题,其实没查」的同一类毛病。

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 知道自己什么时候过时了

Choose a tag to compare

@shiftu shiftu released this 28 Aug 08:54

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