Repository navigation
Releases
wb2api 1.7.2
wb2api Android 1.7.2
跟随上游 workbuddy2api-panel v2026.11.8.1203(11-01 → 11-08,128 个提交,筛出可移植项)。
悬浮窗:单击 → 双击
- 双击浮窗回到应用;单击不动作(常驻在其它应用之上,单击最容易误触,把人从当前应用拽走)
- 判定:第一次抬起只登记候选;第二次按下时看「间隔 ≤ 系统双击超时(约 300ms)且落点 ≤ 48dp」,抬起后打开
- 拖动会清除候选(不会把「单击 → 拖动 → 抬起」拼成双击);三连击不会连开两次
- 双击触感跟随设置页「触感反馈」开关;TalkBack 的「双击激活」也能回到应用
- 顺带修:淡出动画期间不再可触摸(此前 140ms 内还能被双击拉起)、「关→开」不再短暂叠两个窗口、半出屏位置不再被写回成 0、旋转屏幕不再按旧尺寸写回坐标
上游跟进
- 长回答保护:按最终思考档位抬
max_tokens下限(low 4096 / medium 6144 / high 8192 / xhigh 12288 / max 16384)。上游把思考与正文算在同一份额度里,高档位思考会把客户端拍的小额度吃光、正文写到一半就断(实测 effort=high + max_tokens=2048 → 正文只剩 2048 就 length);抬的是上限不是目标长度,模型写完自然停,不改变答案长度、不额外计费 - 6020 排队:带
data.retry_after时不再换号,直接透传 429 + Retry-After(上游 #125:队列全局共享,换号必撞同一堵墙);6021 仍保留轮转 - SSE 注释帧:
: heartbeat之类注释行改为独立成帧,不再与下一个data:粘连导致事件被整块丢弃(上游实测 GLM 工具调用首帧丢失即此因)
审计修复
- 面板「活动上报」不再发空事件数组(上游 200 但静默丢弃,面板却报全部成功),改发真实
chat_request_send;批量任务顶层ok不再恒 true - 账号余额/签到状态写入收进
Store.withStateLock:不再覆盖请求线程刚写入的冷却时刻 - 定时任务失败会记日志(此前静默);连登管家失败不再计成成功
- 面板日志读取改实时快照;请求归档
limit裁剪上限
安装
- 覆盖安装即可(签名证书与 1.7.1 一致,SHA-256
32a556af…6c5c17),无需卸载 - 升级后请留意:单击浮窗不再跳回应用,双击才回
wb2api 1.7.1
wb2api Android 1.7.1
跟随上游 workbuddy2api-panel v2026.11.1.905(并对照 10-31 起的 clientpick.go 口径)。
模型列表:只显示官方客户端菜单里的模型
- 移植上游
clientpick.go:按/v3/config的data.agents[默认].models裁剪,去掉auto/auto-chat与付费变体paidId,顶部补 fast / balanced / deep 三个速度预设 - CN 实测平台全量目录 58 条 → 菜单 17 项:
deepseek-r1/deepseek-v3/Claude-3.7-Sonnet/Kimi-K2/Hunyuan-Turbos等已下架或内部路由变体不再出现(选中必报 11102「该后端无此模型」) - CN 只认主路(官方桌面端 UA)+ 企业端点;global 三路 UA 各按自己下发的菜单裁剪后并集
/v1/models追加 models.dev 词表能力声明(modalities/limit/tool_call/reasoning_options/supported_reasoning_levels),只认该词表的客户端(magpie 等)能正确识别多模态与思考档位- 单域刷新失败时保留该域旧缓存,不再让另一域模型整段消失 10 分钟
成长任务:任务中心
- 设置页「成长任务」改为任务中心:逐条显示标题 / 进度 / 奖励 / 状态,可单条领取(可领取的任务直接点「领取」)
- 语义修正:
completed也算达标(原来永远领不到);已达标先领奖、再决定跑不跑动作(避免 template_5 连发 5 组事件);回读失败 / 未达标 / 领奖失败分别提示,不再一律显示「已完成」 - 动作表外已达标任务补领(对齐上游 issue #174);企业版账号不再发成长请求(上游一律 403)
- 扫描加单飞闸:设置页与定时任务不会并发跑同一批账号
- 移除已下架任务:
school_season/Buddy_App_QQ/create_canvas
审计修复(全量代码审计)
- responses 流式:首帧前失败不再换号重发(同一轮不重复计费);已发流失败补 chunked 终止块(不再串包/挂起)
- chat 流式首帧前断流:按服务器错误处置(空流坏号会被降权,不再反复选中)
/healthz分域可服务判据与顶层同源;余额刷新合并落盘;版本检查 OkHttp client 复用- 清理死代码:
GrowthQueue.kt(从未接入)、lastStatus/frames/toolsPresent、desktopDesignCanvasSequence
安装
- 覆盖安装即可(签名证书与 1.7.0 一致,SHA-256
32a556af…6c5c17),无需卸载 - 升级后模型列表会变短:这是恢复了官方客户端菜单口径,不是模型丢失;如仍看到旧列表,下拉刷新或重启网关即可(目录缓存 10 分钟)
wb2api 1.7.0
wb2api 1.7.0(versionCode 49)
新增版本公告检测,并把上游 10-27 → 10-31 的变更跟进到位(其中一条是推翻我自己 1.6.9 的做法)。
1. 新增:启动时检测新版本
版本号由远程文本驱动(你随时改页面即可公告,不必发版):
- 拉取远程公告页 → 正则
最新版\s*[vV]?\s*(\d+(?:\.\d+){1,3})取版本 → 按段数值比较
(字典序会把1.10.0判成比1.9.9旧); - 远程文本里版本号后面常直接跟 URL/中文(
最新版1.6.9https://…),所以正则不加\b;
页面被富文本插了标签时先剥标签再匹配; - 发现更高版本 → toast「发现新版本 x.y.z(当前 x.y.z)」;
- 网络异常 / 超时 / 非 200 → 明确回执(不会静默);页面可访问但没有「最新版x.x.x」→ 单独文案;
- 设置 → 关于 → 「检查更新」 可手动重试(给出「正在检查 / 已是最新 / 无标记 / 网络异常」完整回执);
- 独立 OkHttp(8s 超时、浏览器 UA),只在冷启动跑一次,不占网关连接池、不影响启动速度。
2. 上游跟进(10-27 → 10-31,45 个提交)
| 上游 | 内容 | 落地 |
|---|---|---|
| PR #108 | 6020/6021 恢复请求内轮转,终态改回 429 + Retry-After | ✅ 1.6.9 我按当时推荐方案做的是 fail-fast + 503,上游实测「同号连续 6021 后 33 秒就通」→ 换号有意义,且上游本身回 429(SDK 对 429 才按 Retry-After 排队重试)。等待时长取 body 的 data.retry_after(6020 实测 40s),缺省 5s,封顶 600s |
| issue #117 | 号都在途占满时等一个名额 | ✅ 50ms 轮询、上限 10s、只给一次、不占换号次数 —— 「只差一个并发槽」的请求不再直接 503 |
| 10-27 | 11102 负缓存 TTL 6h/24h → 2m/10m | ✅ 11102 也会由瞬时抖动/分类误判触发,锁 6 小时会让整池该模型不可用 |
| 10-27 | 全冷却兜底不得绕过模型级冷却 | ✅ 否则兜底会挑一个冷却中的号白撞上游 |
| 10-30 | 客户端版本 5.9.3 / 5.9.4;内置 CLI 2.165.0(与 npm latest 2.176.0 不同源) | ✅ 新增 BUILTIN_CLI_VERSION 区分;Web 层 Origin 改 www.workbuddy.cn |
| 10-31 | 下架夜猫子(删整个排程) | ✅ 删 Scheduler 分支与对应配置项(旧配置的键被忽略,无需迁移) |
未移植(记录在案):思考档位网关策略(PR #104/#105,新功能,工作量大)、Kimi 工具 $ref 展开、按模型隔离的软限流、窗口用量加权调度、/v1/embeddings。
3. 审计修复(逐文件核对注释与实现)
| 级别 | 问题 |
|---|---|
| P0 | responder(读流/解析)抛异常没有任何处置 —— bodyStreamOf 注释声称的「可分类异常」会冒到 HttpServer 变成匿名 500,该号不罚、不换号 |
| P0 | hardMarkers 含裸词 "insufficient":400/403 的 insufficient_scope / insufficient permissions 会被判成「余额耗尽」→ 冷却到次日 04:00(近 24 小时出池) |
| P1 | max_completion_tokens 翻译失败(字符串/0/负数)被静默丢弃 → 由「模型最大输出」顶替(想限 1000 实际拿到数万 token) |
| P1 | http_success 指标用 hop.ok || hop.sent,错误响应也是 sent → 该指标恒等于 completed |
| P1 | revive(解冻)不清 breaker_retry → 解冻后第一次熔断仍按历史次数退避(最长 6h) |
| P1 | mapError 的 status 参数从未使用(三处调用各传不同值,误导读者) |
覆盖安装:签名与 1.6.3–1.6.9 一致(SHA-256
32a556af…6c5c17),账号与配置保留。
wb2api 1.6.9
wb2api 1.6.9(versionCode 48)
悬浮窗这次是真的能拖出屏幕了,另外修掉一个「每天必然发生」的常驻能力缺陷。
1. 悬浮窗:修 1.6.8 的错
1.6.8 改了夹取逻辑但实测拖不出去 —— 限制不在我们的 clampX,而在系统窗口层:
WindowManager 会把 x/y 夹回显示区域,除非窗口带 FLAG_LAYOUT_NO_LIMITS
(官方文档原话 allow window to extend outside of the screen)。
- ✅ 补上
FLAG_LAYOUT_NO_LIMITS - ✅ 屏幕尺寸基准改为
currentWindowMetrics.bounds(整屏):加了 NO_LIMITS 后坐标系原点在
屏幕左上角、不受系统栏约束,继续用displayMetrics(应用可用区域)会少算一条导航栏 - ✅ 夹取结果写回持久化,换分辨率/横屏后不再每次重新夹
结果:可把浮窗拖出屏幕三分之二(左右),屏内始终留三分之一可见、够抓回来;垂直仍整颗在屏内。
2. 常驻服务不再被 6 小时上限杀死 ⚠️
官方「Foreground service timeouts」:targetSdk 35+ 时 dataSync 前台服务在 24 小时内
累计只能跑 6 小时,到点回调 onTimeout,几秒内不停就抛 RemoteServiceException。
本项目 targetSdk 37 且一直是 dataSync —— 意味着每天跑满 6 小时必被系统停掉。
本版改用 specialUse(API 34+,不受该配额约束):manifest 双类型声明 +
PROPERTY_SPECIAL_USE_FGS_SUBTYPE 用途说明 + FOREGROUND_SERVICE_SPECIAL_USE 权限,
运行时按版本分支(API 32/33 仍用 dataSync,那两个版本本身没有 6h 限制)。
3. 底层优化:已核实「本来就在享受」与「评估后不做」
| 已默认生效(AGP 9.4.1) | 结论 |
|---|---|
| 优化型资源缩减 / R8 类重打包 / Kotlin 空检查优化 / R8 full mode | 无需配置 |
| 16KB 页对齐、依赖 baseline profile 合并 | 无 native 库 / 已随 AAR 合并 |
| Application.onCreate 极简、reportFullyDrawn、onTrimMemory、profileable | 早已落地 |
不做:Startup Profile(需真机 Macrobenchmark 才能生成有效规则,手写无法验证)、迁移到
AGP 9.3 新 optimization {} DSL(行为等效、keep 规则搬迁有剪错风险)、收紧 R8 keep
(序列化/Miuix 反射依赖字段名)。理由都写进 README,避免以后重复研究。
4. 审计修复
| 级别 | 问题 |
|---|---|
| P0 | 服务已跑时再点启动会把 boundPort 改成配置端口 → 公布没人监听的地址 |
| P0 | WAF 闸门按「次数」而非「不同账号」判定 → 单账号重试两次就把整个 realm 停 60s |
| P1 | 首帧即失败时未回填真实错误 → 轮转耗尽后把配额/渠道校验说成「号都挂了」 |
| P1 | clearModelBlock 裸读改写与并发 onError 抢同一台账 |
| P1 | loadAuths 先清空再回填,会吞掉并发写入的新 token(下一次白撞 401) |
| P1 | 定时任务幂等键清理判据 endsWith(日期) 恒 false → 触发时清空当天标记、任务重复跑 |
| P1 | bind 失败不关 ServerSocket(连点启动 = 漏 fd) |
| P1 | Responses 非流式截断判据漏 [DONE] → 半截 tool arguments 下发导致客户端解析卡死 |
| P2 | "500ms" 被解析成 0 秒(= 无冷却)、query 畸形转义掐断连接、crash.log 无界、 |
解禁残留 cool_kind、acquire 假判据、若干注释与 KDoc 错位 |
覆盖安装:签名与 1.6.3–1.6.8 一致(SHA-256
32a556af…6c5c17),账号与配置保留。
wb2api 1.6.8
wb2api 1.6.8(versionCode 47)
悬浮窗两项体验修正 + 跟进上游 10-27 发版 + 一轮全量审计修复。
悬浮窗
- 可拖出屏幕边缘:水平方向最多拖出 2/3,屏内始终留 1/3 可见(贴边时更好抓,
又不会把浮窗弄丢);垂直方向仍整颗在屏内。 - 主题实时跟随:切浅色/深色不再需要「关了再开」—— 应用内切换与系统深浅色两条
路径都会即时重算玻璃取值(根因是颜色写在构造里,浮窗是长生命周期对象)。
上游(10-24 → 10-27,37 个提交)
- CN 对话主域改回官方桌面端
www.workbuddy.cn(copilot.tencent.com 降为末位兜底) - 6020 / 6021 渠道级排队:不罚号、不换号,503 透传 + Retry-After: 3
(旧实现按 429 罚号,会把几秒排队放大成整段「全部账号冷却」) - 全池模型「用量配额」语义:清一色 6004/6000 时回 429 + 上游原文 + 数字业务码,
不发 Retry-After(客户端把该头当「睡多久」,报几十分钟出去就是静默挂起) GET /v1/models兼容 Anthropic 的x-api-key(此前同一份 key 能调
/v1/messages却列不出模型)- 官方 CLI 2.176.0;下线官方补偿端点(每轮少一次必然失败的请求)
审计修复
- 写侧停滞看门狗:客户端静默消失时
out.flush()会阻塞到内核重传耗尽,32 个
工作线程被钉满 → 「网关假死」。现在单次写阻塞 > 90s 只关掉那一条连接。 - usage 归档有界化:原先只追加不裁剪,常驻数月即 OOM/ANR(现 8MB 上限 + 流式裁剪)
- 主动续期纳入 uid 单飞:token 到期瞬间的并发刷新会让健康号被误判 DEAD 并禁用
- 配置端口 ≠ 实际监听:浮窗/通知/面板改读实际绑定端口,改端口时明确提示需重启
- 正常停止会丢池状态:
stopServer补flush()(原先只靠 Scheduler,而它先停)
覆盖安装:签名与 1.6.3–1.6.7 一致(SHA-256
32a556af…6c5c17),账号与配置保留。
wb2api 1.6.7
wb2api 1.6.7(versionCode 46)
本次更新带来「网关地址悬浮窗」,并跟进上游 2026-10-24 的修复、加了一轮针对本轮新代码的审计加固。
新增:网关地址悬浮窗
启动网关后在其它应用上层显示一颗液态玻璃胶囊,内容是 127.0.0.1:<端口>(端口取实际监听值)。
- 圆角取高度一半(胶囊),浅 / 深主题各自一套玻璃取值(渐变底 + 发丝描边 + 顶部内缘高光)
- 点击回到应用;拖动可换位置(超过 6dp 才算拖动,位置记忆)
- 无权限时点「启动网关」会 Toast 提示并跳系统授权页 —— 不阻断网关启动,授权返回后自动补显示
- 设置 → 界面可开关;关闭立即摘窗
修复
- 401 先求证再判死(上游 issue #66):网关边缘拦截与 token 真失效的响应体可能一样,现在先用 refresh 端点求证 —— 成功=瞬时拦截、被明确拒绝=真失效、无判词=软冷却绝不禁用;并发 401 按账号单飞,避免用旧 refresh_token 互相判死
- 429 code 6000 带「切换其他模型」文案时按模型级限流
- 模型级冷却不再被
soft_rate_max截断(账号级仍封顶) - 尊重客户端关闭思考:
reasoning_effort=off/none真正落成thinking.type=disabled - token 主动续期:到期前 120s 自动刷新并落盘,避免每小时白撞一次 401
- 加固:修复池状态临界区与落盘之间的锁序反转(可能造成网关假死)、浮窗撤销权限后不再显示、拖动越界、设置开关不生效
覆盖安装:签名与 1.6.3–1.6.6 一致(SHA-256
32a556af…6c5c17),账号与配置保留。
wb2api 1.6.6
wb2api 1.6.6(versionCode 45)
跟进上游 2026-10-22 三个发版(issue #51 / #46 / 空回复救援)后的修复版,重点解决「调用被渠道校验拦截」与「间歇性断流」。
1. 出站头族与标识对齐真机取证(上游 issue #51)
X-Conversation-ID/prompt_cache_key改为 UUID v4 形态(36 字符带横线)- 消息级 ID 补毫秒时间位;
X-Trace-ID与 B3SpanId改独立随机 - 补齐
X-B3-ParentSpanId/ 单头b3/ W3Ctraceparent/acp-connection-id/ 7 个x-stainless-* X-Product改SaaS;chat 域删掉官方从不发的Origin/Referer/Accept-Language/X-Machine-ID/X-Session-ID/X-No-*- body 侧补
conversationRequestId(头体一致)
2. 14003「模型繁忙」
- 模型级短冷却 10s 起、翻倍、封顶 60s(不再按 429 罚号 600s)
- 全池被挡且剩余 ≤10s 时先等一次;仍不可用返回
503 model_busy+Retry-After
3. 空回复预防
- 输出额度 16~399 且客户端未显式要求思考时不注入 thinking(该区间思考会吃光预算 → 空回复)
4. 审计修复
- Responses 流式错误帧漏
sent=true(会重复打上游) - 池状态读-改-写竞态(冷却可能被并发覆盖)
- HTTP 请求行/头条数无上限(OOM 风险)
- 归档读取改尾读、粘性开关生效、模型阻塞分 realm、错误路径落盘节流、chunked 边界保护
覆盖安装:签名与 1.6.3–1.6.5 一致(SHA-256
32a556af…6c5c17),可直接升级,账号与配置保留。
wb2api 1.6.3
基于上游 workbuddy2api-panel 重构的 Android 原生网关:在手机内直接运行 OpenAI 兼容的 HTTP 服务,把 WorkBuddy/CodeBuddy 账号转换为标准 API 供各类客户端接入。
主要能力
- 接口:
/v1/chat/completions(流式 / 非流式)、/v1/responses、/v1/models、/status、/healthz、/panel/api/* - 账号池:多账号加权轮转、会话粘性、在途并发控制、余额与状态可视化
- 容错:熔断、连败降权、模型级冷却、WAF 闸门,按错误类型区分「换号重试 / 冷却 / 禁用」
- 自动化:定时签到(定点或自动补签)、余额刷新、成长任务扫描与领奖
- 界面:Jetpack Compose + Miuix,明暗主题、液态玻璃浮层、分频道日志
安装与接入
- 安装 APK(仅 arm64-v8a,Android 12 / API 32 及以上)
- 打开应用,在「账号」页添加账号(扫码授权登录,或粘贴已有登录凭证)
- 在首页启动网关,服务默认监听
0.0.0.0:7863 - 客户端 Base URL:
- 本机(手机自身):
http://127.0.0.1:7863/v1 - 局域网(PC 或其它设备):
http://<手机局域网 IP>:7863/v1 - API Key:在「设置 → 服务」中设置;留空表示不做鉴权
- 本机(手机自身):
Android 17(API 37)起,跨应用回环通信与局域网访问分别需要 USE_LOOPBACK_INTERFACE 与 ACCESS_LOCAL_NETWORK 权限,应用已在清单中声明并在首次启动网关时按需申请。
产物信息
| 项 | 值 |
|---|---|
| 文件 | wb2api_1.6.3.apk |
| 大小 | 4,156,356 字节(约 3.96 MiB) |
| SHA-256 | 02a7ce203a8174d938fe492be6fb4ffc98d98e393100fae3b6a85faa8b552de0 |
| 版本 | 1.6.3(versionCode 42) |
| 系统要求 | minSdk 32 / targetSdk 37(Android 12 及以上) |
| ABI | 仅 arm64-v8a |
| 签名 | APK Signature Scheme v3(v1 / v2 / v4 未启用) |
| 打包 | R8 混淆 + 资源压缩,单 dex |
免责声明
本版本仅供个人学习与技术研究用途,限于本人拥有合法授权的账号与本机/私有环境中使用。使用者应自行确保其使用行为符合当地法律法规及服务提供方的相关条款,并自行承担由此产生的一切后果。本项目不对账号状态、服务可用性或数据完整性作任何保证,亦不承担因使用本项目而产生的任何直接或间接损失。请勿用于商业用途或二次分发。