Repository navigation
Releases: jiandanc/CLIProxyAPI-freetier2api-plugin
Release list
v0.1.16
通过 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。
本版要点
- AutoClaw 国际版登录接通:控制台页面内完成阿里云人机验证后,直接拿到真实的 Zai / Google 授权链接;登录后粘贴 localhost 回调即可换码入库,不再是一张
data:text/html指引页。 - OAuth 405 修复:两跳改用官方桌面端指纹与 UA(
AutoClaw/1.18.5、X-Client-Type: pc等),绕开阿里云 WAF 对 Go 默认 UA 的拦截——这是 Zai 取链接失败、Google 正常的根因。 - 模型列表恢复:修正
autoclaw-model-config的响应解析(上游返回顶层models数组),模型页与/v1/models都能看到上游模型,并带图片输入能力标记。 - 额度显示修正:上游只提供积分余额、没有总额/已用概念,账号表改为「余额 / —」,不再出现
10000 / 0与红色空槽。 - CI 稳定:qoder 签到用例钉住时钟,消除每天 8 小时的必挂窗口。
What's Changed
- fix(zcode): Start Plan 通道按凭据串行化出站,遵守上游并发上限 by @ArmedHelicopter in #27
- refactor(zcode): Start Plan 闸门改为实例级,按账号隔离并只作用于 Plan 通道 by @jiandanc in #28
Full Changelog: v0.1.15...v0.1.16
v0.1.15
通过 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。
本版要点
Merge commit '0286665'
What's Changed
- fix(workbuddy): 对齐正版 5.8.3 客户端协议(端点/UA/归属头/会话 ID/trace 族) by @ArmedHelicopter in #23
- feat(vendors): 新增 AutoClaw 国内/国际版与小浣熊骨架实现 by @jiandanc in #25
Full Changelog: v0.1.14...v0.1.15
v0.1.14
通过 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。
本版要点
feat: 修复 ZCode 对话调用、新增单供应商 10 账号限制、精简中英文 README 并切换 MIT 许可(v0.1.14)
What's Changed
- fix(workbuddy): 企业账号额度走企业用量接口,签到按账号判定 by @jiandanc in #22
- fix(admin): 额度缓存按供应商与账号隔离,修复 OpenCode ZEN 显示 WorkBuddy 额度 by @jiandanc in #21
Full Changelog: v0.1.13...v0.1.14
v0.1.13
通过 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。
本版要点
refactor: 提示词过滤回归全局单份配置
提示词过滤不再按供应商配置:模式(passthrough/custom/append)与提示词文件
是插件级设置,控制台恢复成原来的单个下拉框,实现方(当前 WorkBuddy)读同一
组全局键。
- 配置:新增全局
prompt_mode/prompt_file,模式在解析与校验阶段就把关;
旧键workbuddy_prompt_mode/workbuddy_prompt_file归一化到新键,老配置
不会静默失效。 - 状态:state.json 的
vendor_settings换成单值prompt_mode(页面覆盖 > YAML)。 - 管理端:/settings 收
prompt_mode,/status 的 settings 回生效值;删除上一版
按供应商声明字段的汇总/渲染/校验代码与 core.RuntimeFieldsProvider。 - 控制台:恢复「提示词防御模式」下拉与摘要行,保存即写全局模式。
- 测试:模式取值集合、生效值回显、旧键兼容、App 间状态隔离。
What's Changed
- ✨ feat(admin): 美化控制台界面并完善明暗主题 by @Syngnat in #17
- 合并 PR #16 并修复活动探测审查问题 by @jiandanc in #18
- feat: add read-only ZCode activity probe by @ArmedHelicopter in #16
New Contributors
Full Changelog: v0.1.12...v0.1.13
v0.1.12
通过 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: ZCode 套餐领取补上活跃上报,持有判读改用 billing/balance,提升至 0.1.12
问题:官方 ZCode 客户端显示账号有可领套餐且能领,插件控制台却把按钮永久
置灰成「已领取」,实际上一个套餐都没领到。控制台的按钮状态只由
ClaimStatus.Claimable(= offered − held)决定,因此问题出在对上游的两处读数
上,而非领取链路本身。
根因一:preview 之前缺少年度活跃上报(主因)
- 活动套餐的投放以「当日活跃」为资格信号,而不是纯粹的账号权益快照。
官方桌面端每次启动发 app_launch、每个自然日发一次 app_daily_active
(packages/services/src/telemetry/telemetryCore.ts),缺这两条事件的账号
billing/preview 恒空。 - 插件从不发送,于是 offered 为空 → claimable=0 → 页面显示「已领取」。
这解释了为什么表现为「客户端有、插件没有」且不报错。
根因二:持有集合读了已废弃接口
- billing/current 已被官方标注废弃(codingPlanProviderAvailability.ts、
bigmodelUsageQuotaProvider.ts),持有套餐的权威来源是 billing/balance 的
data.plans。旧接口返回空时 held 恒空,会朝相反方向出错(全部误列为可领)。 - 同时补齐官方对 plans[] 的过期归一:status=active 但 ends_at 早于服务端时间
应视为 expired,否则活动结束后按钮会一直灰在「已领取」。
改动:
- 新增 internal/vendors/zcode/activation.go:按官方 sendReport 的 16 字段上报
app_launch / app_daily_active,每账号每自然日一次(进程内去重,与 claimGate
同一套「状态属于实例」约定,不引入 state 依赖)。仅凭 JWT 解出的 user_id
归属,不带 Authorization(官方该端点同样匿名)。上报失败不阻断 preview,
但会记录原因。 - 重写 fetchPlanSnapshot:先上报活跃 → billing/balance(一次拿齐 plans +
balances + server_time)→ billing/preview。删除废弃的 PathBillingCurrent,
额度查询由 3 次请求降为 2 次,balance 不再重复取数。 - heldPlanIDs 改从 balance 的 data.plans 判定,并接受服务端时间做过期归一。
- claimStatusOf:preview 成功且确实无投放才是「已领取」;活跃上报失败导致的
空列表改为携带 Error,页面保持按钮可点并显示原因,不再谎报。 - FetchQuota/PreviewPlans 收敛为 adapter 方法(上报去重需要实例状态)。
其他:
- 控制台模型表状态列文案「已禁用」→「禁用」(账号表不变)。
测试:新增 activation_test.go(事件体 16 字段逐项校验、每日去重与失败撤销、
账号时区下的自然日)与 heldPlanIDs 过期归一等用例,全部不触网。
Co-Authored-By: Claude Code noreply@anthropic.com
Full Changelog: v0.1.11...v0.1.12
v0.1.11
通过 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: 整修合并 #14/#15 后的删除、额度与管理接口,修复 Qoder 余额显示 0/0
两个社区 PR(#14 相对路径删除、#15 管理接口与上游响应加固)已合入,但对
合并结果做完整审查后,发现若干处在既有结构上叠补丁而不是修到根因,本次
统一收敛。另修复 #14 引入的 Qoder 剩余/总额恒为 0/0 的回归。
额度折算(用户可见回归)
- #14 的 presence 标志把「第一个出现的额度族」永久锁定。Qoder 同时输出
user_quota_(套餐)与 addon_quota_(拓展包),Free 计划的套餐是合法的
{used:0,total:0,remaining:0},于是拓展包额度永远覆盖不上,页面恒为 0/0。
改为按族分组、选「真有容量」的族;所有族都无容量时才回落到第一族
(此时 0/0 是真实语义)。「只报 used」的反推保留,显式 total=0 不反推。 - 三份必须手工同步的键白名单(remaining/total/used 各一个 switch)合并成
一张 quotaKeyRoles 表:族与角色收敛成一处知识,避免同类静默 0/0。 - 新增回归用例:Qoder Free+拓展包让位、全 0/0 保留第一族、显式 total=0
不反推。
凭证路径与删除(#14 的根因修复)
- 相对路径归一化上移到宿主边界 hostbridge.ResolveAuthPath,在
ListAuths / AuthJSONAndPath 出口统一处理;删除、stat 取修改时间、读文件
兜底、续期写回四条路径共用同一份绝对路径。删除入口不再各自换算。 - 删除校验收敛为 safeAuthFileForDelete:归属校验 → 运行时凭证 → 必须绝对
路径 → 必须存在 → .json / 符号链接 / 目录 → 目标文件身份比对。 - 修掉 #14 的两个行为问题:
- 文件不存在时原先 Lstat 返回 nil、Remove 命中 IsNotExist 也返回 nil,
页面会显示「已删除」而账号其实还在;现在如实报错。 - 路径基准不一致时同名文件可能属于另一个账号;删除前比对目标文件的
vendor 与 UID(只比身份字段,不涉及 token)。
- 文件不存在时原先 Lstat 返回 nil、Remove 命中 IsNotExist 也返回 nil,
- deleteAuthFile 精简为「取凭证 → 校验 → 删除」。
管理接口请求体
- 泛型 decodeRequest[T] / decodeRequestInto 取代逐 handler 的解码样板,
覆盖 11 个管理入口;models 两处重复的错误文案统一。 - /tasks/run 原先在 tasks 包内用
_ = json.Unmarshal吞掉畸形 JSON,
#15 声称覆盖任务入口但实际漏掉;解析上移到 admin,tasks 只接收
QueueRequest,缺省值由 DefaultQueueRequest 提供。 - login/callback 保留 {ok,status,message} 契约:页面按 AuthLoginStatus
读字段,#15 改成 {ok,error} 会丢掉「请刷新页面后重试」这句提示。
供应商
- WorkBuddy 领奖:#15 修好了解析但调用方仍吞错并返回 (0,0),用户看到的
仍是「任务已达标」。claimGrowthReward 改为返回 error 并上抛到
AutoTaskResult;parseClaimResult 改用指针字段一次解码(原实现解两遍)。 - Qoder 短响应上限:三个重复的 1<<20 合并为 shortResponseMaxBytes,并把
仍在无界读的 FetchUserInfoWithToken 纳入;签到读失败不再静默当成空正文。
宿主流读取
- 空分片退避去掉 time.NewTimer 与
if !timer.Stop() { <-timer.C }排空写法
(Go 1.23+ 的 unbuffered timer 下会阻塞),改用仓库既有的 time.After;
保留 32 次上限与指数退避。
测试与守卫
- 删除集成用例改用 t.TempDir 构造 core/oauth 平级布局,真正传
../oauth/<name>.json形态;新增绝对路径(标准 CPI 部署)与文件不存在
两条用例。 - 合并重复的 managementCall / managementCallWithBody helper。
- 架构守卫补反向检查:layerRules 里的非 vendor 包必须同时出现在
internalPackages。
验证(容器 golang:1.24,与 CI 一致)
gofmt / go vet ./... 通过
go test ./... -count=1 全部包通过
go test -race <core,state,auth,tasks,admin> 通过
go test -tags live ./tests/live -run '^$' 通过
go build -buildmode=c-shared(linux/amd64) 通过
版本保持 0.1.11:本次修复与 Qoder 设备身份改动一起发布。
Co-Authored-By: Claude Code noreply@anthropic.com
What's Changed
- fix: 宿主返回相对凭证路径时账号删除失效(EasyCLIProxyAPI 默认 ../oauth) by @ArmedHelicopter in #14
- fix: 加固管理请求与上游响应处理(stacked on #14) by @ArmedHelicopter in #15
New Contributors
- @ArmedHelicopter made their first contribution in #14
Full Changelog: v0.1.10...v0.1.11
v0.1.10
通过 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。
本版要点
feat: 模型费用倍率展示与控制台列偏好,Qoder 国际版补齐客户端设备身份,提升至 0.1.10
模型费用/额度倍率展示 (Closes #12)
- 控制台模型列表新增「费用倍率」列,紧挨模型名显示,方便按成本选型。
- 费用倍率统一归一化为始终保留两位小数的格式(如 0.50X、0.05X),支持
非数值文案(如 Cline 的「免费」/「订阅」);上游未提供时显示「—」,
不臆测为免费。 - 新增 core.CreditsProvider 接口;倍率随模型清单缓存一同落盘到 state.json,
插件重载或重启后立即呈现,无需等待重新打上游探测。 - 控制台表格支持「列展示」偏好配置:可按需显示/隐藏输出上限、推理档位、
能力标签等,选项保存在浏览器本地存储。 - 优化模型别名编辑交互体验:支持点击模型名或 ✎ 图标直接行内编辑,
按回车或点选外部保存,按 Esc 取消,未设置别名时直接显示官方 ID。
Qoder 国际版签到客户端设备身份 (Closes #13)
- 国际版活动列表要求请求头必须成对携带 cosy-machinetoken 与 cosy-machinetype,
缺失任一值时上游接口虽返回 200,但会静默过滤「每日领取 100 Credits」等
CLAIM_BENEFIT 活动,导致误判为无活动或无资格。 - 新增 internal/vendors/qoder/identity.go,基于账号凭证种子确定性派生稳定
设备身份(88 字符 token、18 字符 type、machineos、hostname、version),
与 cosy 会话保持同源同口径,无需读取用户文件或依赖外部官方客户端。 - 签到流程中的活动查询、活动领取(claim)、奖励发放回查(reward)三条链路
统一携带原生设备身份头。 - 增加 qoder_desktop_version 配置项支持自定义桌面端版本覆盖。
版本
- 默认版本号提升至 0.1.10。
Co-Authored-By: Claude Fable 5 noreply@anthropic.com
Full Changelog: v0.1.9...v0.1.10
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
v0.1.8
通过 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。
本版要点
feat: Qoder 模型 ID 规范化为 display_name slug,提升至 0.1.8
模型 ID 与别名
- Qoder 国内版/国际版的对外模型 ID 改为上游 display_name 的规范化形式
(小写、空白折叠为 "-"):DeepSeek-V4-Pro -> deepseek-v4-pro、
GLM-5.3 -> glm-5.3、Qwen3.8-Max -> qwen3.8-max。 - slug -> 上游 key 的对应关系不写死在代码里:每次拿到上游 model/list
就在 adapter 实例内重建索引(国内版/国际版各自独立),出站时精确还原
为 model_config.key / x-model-key。旧上游 key 仍可直接请求。 - 移除 Qoder 内置兜底模型清单:写死的目录会随上游过时,探测失败改为
返回错误,由宿主跳过该凭证。
陈旧键不再误伤新模型
- 供应商换掉对外 ID 后,state.json 里按旧 ID 保存的别名与禁用项会失效。
此前它们会让请求被翻回旧 ID 再撞上禁用,报
「model is disabled by plugin configuration」——而列表里该模型是启用的。 - 现在别名与禁用判定都先对照当前清单:只对真实存在的模型 ID 生效。
刻意不删除状态里的旧键——清单可能因探测失败暂时拿不到,删除会让用户
配置永久丢失;清单恢复后旧键自动重新生效。
管理面韧性
- 额度批量查询改到后台作用域并做单轮 singleflight:页面刷新取消管理 RPC
时不再中断整轮查询,账号不会卡在「查询中…」。 - 模型清单在缓存为空时按供应商补探测(singleflight + 冷却),
控制台不再出现「整家供应商缺模型」,前端最多轮询两轮等待补齐。
文档
- README 重排:安装提前到供应商表之后,添加账号合并为一张凭证字段总表,
删除重复章节,已知限制每条压缩为一句话。
Co-Authored-By: Claude Code noreply@anthropic.com
Full Changelog: v0.1.7...v0.1.8
v0.1.7
通过 CPA 插件商店安装(推荐)
在 CPA 的 config.yaml 里把本仓库的 registry.json 加为三方源:
plugins:
enabled: true
store-sources:
- "https://raw.githubusercontent.com/jiandanc/CLIProxyAPI-freetier2api-plugin/main/registry.json"重启 CPA 后,在管理面板的插件商店里搜 FreeTier 2API 一键安装。
手动安装
下载对应平台的文件,重命名成宿主认识的插件名后放进 CPA 的 plugins/ 目录:
| 平台 | 下载文件 | 放进去时改名为 |
|---|---|---|
| Linux x86_64 | freetier2api-linux-amd64.so |
freetier2api.so |
| Linux arm64 | freetier2api-linux-arm64.so |
freetier2api.so |
| macOS Apple Silicon | freetier2api-darwin-arm64.dylib |
freetier2api.dylib |
| macOS Intel | freetier2api-darwin-amd64.dylib |
freetier2api.dylib |
| Windows x64 | freetier2api-windows-amd64.dll |
freetier2api.dll |
SHA256SUMS.txt 可用于校验完整性;配置与账号导入见仓库 README。
本版要点
fix: 响应归一化去掉逐分片整包解码;Trae 目录按功能命名空间;额度状态不再反推
本版集中修复三个上报问题:响应钩子的 CPU 放大(#9)、扫不到 Trae 的
deepseek-v4.1-flash(#10)、以及额度列「永远查询中 / 0 0」的错误状态
(与 #11 的签到假性成功闭环配套)。
响应归一化(#9)
- v0.1.6 注册的全局 response.normalize_before 被宿主对每一条 SSE 行调用
一次,RPC 参数里带着完整客户端请求与完整上游请求(长上下文下各可达数 MB,
且都以 base64 出现在 JSON 中)。插件此前整包 json.Unmarshal 成
ResponseTransformRequest,把这两份大字段全部 base64 解码——实测 12 秒
735 次调用、累计 5.24 GB 入参,占 CPA 用户态 CPU 采样的 73%。 - 新增 internal/app/responsegate.go:单次线性扫描只取
Stream / FromFormat / ToFormat / Body,两个大字段用 bytes.IndexByte
做字符串跳过,既不 base64 解码也不分配。三个标量一旦凑齐且判定「不需要
补 data: 信封」,立即返回,不再扫后面的大字段。 - 扫描器只依赖 JSON 语法、不假设字段顺序;遇到转义或结构异常时退回
encoding/json 的窄结构体解码(不声明两个大字段,同样不会解码它们),
宁可慢一次也不误判成「无需处理」。 - 跨协议流式转换行为不变:Claude / Gemini / openai-responses 目标格式仍补
一层 data: 前缀,#5 / #8 的修复保留。未命中时返回空 PayloadResponse,
宿主按 no-op 保留原 body。 - 宿主侧逐分片的请求体 clone 与 base64 序列化开销仍在,需上游侧优化,
本改动只消除插件内的重复解码。
Trae 模型目录(#10)
- 目录请求的 function 改为跟随 cfg.Function。上游按 function 维护两套
wire id 命名空间(chat_v3: DeepSeek-V4-Pro__dev;solo_work_lite:
deepseek_v4_pro__dev),此前目录固定用 solo_work_lite、对话用 chat_v3,
取到的 wire id 会被判 4023 model is unknown;同时请求体与
X-App-Function / X-Ide-Function 三处保持一致。 - 国内版构建号抬到 3.3.104 / 20260922:上游按 X-Ide-Version-Code 下发
模型目录,构建号低于 20260806 拿不到 deepseek-v4.1-flash。 - 新增按实例区分的配置覆盖 <实例ID>_ide_version / _ide_version_code
(traecn / traeglobal / traesolo 三条产品线版本体系不同,不共用族级键),
版本在运行期可改,所有读取点统一走 profile() 快照。 - 模型目录缓存键加入 function 与构建号,避免版本被配置改写后仍命中旧清单。
- 目录拉取失败时记录状态码/响应摘要/过滤后为空的条目摘要,便于区分
「结构变更」与「版本号被降级」。
额度与签到状态(#11 配套)
- 账号概览新增静态能力 supports_quota(接口断言)。此前页面用「额度结果
里有没有这条」反推状态,导致不提供额度接口的供应商(OpenCode ZEN 等)
永久停在「查询中…」,与「还没查」无法区分。 - 额度缓存改为成功与失败都写入:失败结论(如上游无额度接口)同样确定,
不该每次刷新都丢回「没有结果」。 - 认证层 Totals 改为返回 QuotaTotals 并识别 unit=unlimited / 负值,展示层
显示「无限」;Trae 额度键统一到 credit_remain / credit_total / credit_used
词表(原 remaining_credit 等不在白名单,会静默显示 0 / 0)。 - 控制台额度列只读后端 /status 的 account.quota 一个数据源,删掉页面自己
再存一份的 quotaByAuth 与多键猜测逻辑。
另:Qoder 的任务中心能力仍需上游提供可自动推进的任务接口,本版未接入
TaskRunner;签到侧的假性成功已由前一次提交修复。
Closes #9
Closes #10
Closes #11
Co-Authored-By: Claude Code noreply@anthropic.com
Full Changelog: v0.1.6...v0.1.7