Repository navigation
v0.1.9
通过 CPA 插件商店安装(推荐)
本插件已收录进 CPA 官方插件源,无需额外配置三方源。
在管理面板的插件商店里直接搜 FreeTier 2API 一键安装即可。
手动安装
下载对应平台的 freetier2api_<版本>_<goos>_<goarch>.zip,解压后把其中的
freetier2api 动态库放进 CPA 的 plugins/ 目录。
归档里已经用的是宿主要求的 freetier2api{ext} 文件名,解压后无需改名。
| 平台 | 下载归档 |
|---|---|
| Linux x86_64 | freetier2api_<版本>_linux_amd64.zip |
| Linux arm64 | freetier2api_<版本>_linux_arm64.zip |
| macOS Apple Silicon | freetier2api_<版本>_darwin_arm64.zip |
| macOS Intel | freetier2api_<版本>_darwin_amd64.zip |
| Windows x64 | freetier2api_<版本>_windows_amd64.zip |
checksums.txt 可用于核对归档完整性;配置与账号导入见仓库 README。
本版要点
fix: 凭证临时冷却不再被当作「没有凭证」;模型清单守卫与落盘,提升至 0.1.9
问题
- 供应商整家从控制台模型列表消失,账号概览的「剩余/总额」永远停在
「查询中…」。宿主日志证实:上游限流(WorkBuddy code:6004)或超时后,
宿主路由层把凭证标记为 unavailable,而插件把它和用户显式禁用的
disabled 混为一个判断,四处重复:
entry.Disabled || entry.Unavailable
于是该供应商被跳过模型探测、跳过额度查询——凭证文件本身完好无损。
修复
- core.HostAuth 新增 Usable():只看 Disabled。Unavailable 是宿主路由层的
临时状态(暂时别把对话流量打到这条凭证),不代表凭证不存在或不可读。
auth/pool.go、core/vendor.go、hostbridge/auth.go、workbuddy/adapter.go
四处调用点各收敛为一行 if !entry.Usable()。
模型清单
- 新增 CacheProbedModels:探测失败返回的空清单不覆盖既有缓存。供应商在
探测失败时按契约返回空结果(让宿主淘汰坏凭证),若照样写缓存,一次瞬时
401 就会让整家供应商从控制台抹掉。 - 清单写入后落盘到 state.json,插件重载由 LoadCachedState 回灌,控制台
不必再等一轮上游探测。落盘复用 Catalog 自己持有的 store,批量路径
(StaticModels / RefreshFromUpstream)整轮只写一次,内容未变不写盘——
不为去抖另造定时器或关闭期 flush 的生命周期。 - 补探测失败才记冷却,成功不再把接下来 30 秒的补探测全部挡掉。
控制台
- 「读取模型清单」按钮此前绑定 loadModels(只重读本地缓存),缓存为空时
点了永远没反应。改为真正 POST /models/refresh,失败时把上游错误显示出来。 - 文案对齐为「读取模型清单」,与服务端提示一致。
测试
- TestUnavailableCredentialStillServesConsole / ...StillQueried:临时冷却
仍要出现在模型列表、仍要查额度。 - TestCooldownWithFailingUpstreamKeepsConsole:冷却的真实形态——上游同时
在失败时,已缓存清单必须保留,失败额度必须缓存成 ok=false(页面显示
「-- / --」而非永远「查询中…」)。 - TestDisabledCredentialSkipsQuota:用户显式禁用仍必须排除。
- TestForAuthFailureDoesNotWipeModelCache、TestRefreshZeroDoesNotWipeCache、
TestCacheProbedModelsKeepsPreviousOnEmpty、TestModelCachePersistsToState:
空结果不覆盖缓存、清单落盘可回灌。 - 上述用例均已用「把 Usable() 改回旧语义」验证过确实失败,不是恒真断言。
Co-Authored-By: Claude Code noreply@anthropic.com
Full Changelog: v0.1.8...v0.1.9