Skip to content

v0.1.9

Choose a tag to compare

@github-actions github-actions released this 22 Oct 02:33
· 83 commits to main since this release

通过 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