Releases: Practice019/multi2api
Release list
v1.7.0 — 上游 4 个 → 10 个 + 登录/签到/额度/续期四条链路补齐
v1.7.0 — 上游扩到 10 个 + 登录/签到/额度/续期四条链路系统性补齐
📦 打包形式(同 v1.6.1 / v1.6.2)
每个平台 zip 内含:可执行文件 + config.example.json(10 个上游全部配好)+ 使用说明.txt(Windows 另外带 start.bat),解压即用。
⚠ 本版只增不删:没有删除任何 v1.6.2 里已发布过的上游。
mimo/buddy两个上游确实被删了,但它们从未进过任何 Release
(是 v1.6.2 之后加的),所以升级的用户本来就没见过它们。
配置里若残留mimo段会被静默忽略,建议删掉。
旧 config.json 可直接用 —— 没有任何配置字段被改名或删除。
🆕 上游:4 个 → 10 个
v1.6.2 只有 4 个(workbuddy / codearts / loomy / trae)。本版新增 6 个:
| 上游 | 登录方式 | 能力 |
|---|---|---|
| WorkBuddy 海外版 | 页内 OAuth(www.workbuddy.ai) | 对话 / 额度(海外版无玩法) |
| Cline | WorkOS 设备码轮询(不起本地端口,服务器部署天然可用) | 对话 / 余额 / 自动续期 |
| Raccoon(商汤小浣熊) | 微信扫码(页面直接出二维码) | 对话 / 积分余额 / 登录奖励 |
| LobsterAI(有道龙虾) | 页内登录 | 评论 / 三步式签到领积分 |
| Qoder(阿里系) | PKCE 设备码 | 对话(WASM 加密推理)/ 积分 / 每日签到 |
| Qoder 中国版 | 同上 | 同上(与 qoder 共用凭证目录,靠 product_id 区分) |
✨ 新增能力
两层「全部签到」
账户池顶部一个「全部签到」→ 触发所有上游的全量签到(后台任务 + 进度回执)。
各上游卡片头上另有一个「全部签到」→ 只签本上游。
额度三层作用域 + 原始值
- 账号行内「额度」:只刷该账号
- 卡片头「刷新本上游额度」:只刷该上游
- 顶部「刷新全部额度」:刷所有账号
额度列显示上游自己的记账单位(不做单位换算假设)。
批量导入统一到所有上游
卡片头「批量导入」:把你已有的凭证 JSON 直接粘进来(单个对象或 [ ] 数组),导入后自动重载账号池。
10 个上游都支持 —— 此前只有 2 个。
Token 列 / 自动续期
- 各上游按自己的凭证寿命比例提前续期(不再是固定 10 分钟),判据取自 token 自己的
iat/exp。 - 「Token 到期」列现在如实显示剩余时间。
登录
- 「添加账号」默认用无痕窗口打开授权页(网关自己启动浏览器 + 独立 profile,避免 OAuth 拿浏览器里已登录的账号完成授权)。
- 扫码类上游(raccoon)现在直接渲染二维码 —— 此前给的是一个扫不了的链接。
🔧 修掉的问题(都是用户实测报的)
「添加账号有问题」
- qoder:此前完全没有 PKCE —— 授权页能打开、点了授权却永远拿不到 token(一直转圈到 5 分钟超时)。按参照实现补齐 PKCE 五件套,轮询改用 GET。
- raccoon:给出扫不了的链接 —— 它的链接是给手机扫的内容,而界面只给「打开链接」。
- 弹窗同时说两句矛盾的话 —— 顶部引导语写死"去浏览器登录",扫码流程还会再显示"用手机微信扫码"。现按登录形态分叉。
「签到失败」
- lobsterai:上游返回的
actions是字符串数组,我们按对象数组解析 → 每次签到必失败。 - qoder:缺少机器身份头(服务端就不下发可领活动)。根因是那个头的来源文件在本机根本不存在(纯登录流程不产生它),而旧实现只读文件、读不到就静默降级 → 实际是永久不发头。现在实时调用官方
runtime-info.exe生成。 - 瞬时 503 被当成永久失败:实测上游约 25% 的请求回
DEPENDENCY_UNAVAILABLE(与请求头无关,/usage同时刻恒 200)。旧实现不重试,而签到每 30 分钟扫一次、撞上就记一次失败。现加退避重试。
「额度是 0」
真相是**"我们还没问过上游"** —— 额度探测只在手动点按钮时才被调用,没有定时任务扫它。现在由续期任务每轮顺带写回。
「Token 不会自动刷新」
- cline:它的续期能力实现了,但没有注册后台任务 —— 核心的两条续期路径(出站请求 / 后台定时)一条都不占,没人用它时 token 就静静过期。
- qoder 续期响应字段名全错:上游返回
device_token+expires_at(ISO 字符串),我们读的是access_token+expires_in(两个都不存在)→ 续期永远失败、过期时刻从未落盘。 - qoder 两个实例注册了同名后台任务 → 日志
任务名 qoder-refresh 重复…已跳过后者→ 中国版永不续期。
其它
- 「刷新本上游额度」点下去报
refreshAccounts is not defined(调用了一个从未定义的函数)。 - 额度回执显示
[object Object]。 workbuddy批量导入会丢deviceToken—— 它是每账号一个的风控头,丢了表现为"导入后这个号开始被风控",且看不出与导入有关。
🎨 界面
- 卡片头按钮顺序统一为:
全部签到 → 添加账号 → 批量导入 → 刷新本上游额度 → 重载 auths
「添加账号」去掉了+前缀。
🧪 工程
- 新增真浏览器 e2e(点按钮 → 抓真实请求),验的是行为而不是"有没有某个元素"。
变异验证:把事件委托的"只绑一次"守卫去掉 → 刷新 5 次后点一次发 7 个请求,而所有只看 DOM 的静态断言全绿。 - 新增二维码编码器(零依赖自实现),正确性由交叉验证守住:真的调用 Python
qrcode库逐位比矩阵 —— 结构断言全绿不等于码能扫。
🚀 快速开始
- 解压对应平台的 zip
copy config.example.json config.json,编辑api_key- 放凭证到
auths/<上游>/,或直接用管理台的「添加账号」/「批量导入」 - Windows 双击
start.bat;Linux/macOS 执行./wb2api-server -config config.json - 打开 http://127.0.0.1:7863/ui
📥 下载
推荐(带版本号、含 使用说明.txt + 完整 config.example.json):
wb2api-server-v1.7.0-windows-amd64.zip— Windows x64wb2api-server-v1.7.0-linux-amd64.zip/-linux-arm64— Linuxwb2api-server-v1.7.0-darwin-amd64.zip/-darwin-arm64— macOS
CI 自动构建(由 GitHub Actions 从 tag 构建,不含 使用说明.txt):
wb2api-server-windows-amd64.zipwb2api-server-linux-amd64.tar.gz
SHA256SUMS.txt — 上面全部 7 个压缩包的校验和。
校验方法:
sha256sum -c SHA256SUMS.txt(Windows 可用certutil -hashfile <文件> SHA256逐个核对)。⚠ 本仓库此前几个版本的
SHA256SUMS.txt只覆盖了 CI 那两个,占多数的
带版本号 zip 没有校验和 —— 本版已修正为覆盖全部资产。
完整变更见仓库
CHANGELOG.md与 git log(v1.6.2..v1.7.0)。
v1.6.2
v1.6.2 — 30 分钟主动全量续期 + 手机号昵称 + 稳定性
📦 打包形式(同 v1.6.1)
每个平台 zip 内含:可执行文件 + config.example.json(默认启用四上游)+ start.bat + 使用说明.txt,解压即用。
✨ 相比 v1.6.1 的更新
token 续期:统一「30 分钟主动全量续」
- 之前"被动只刷临近过期":codearts 60s 扫描只刷剩 <3min 的,用户看到 token 倒计时却不续(观感差)
- 现在:所有上游(workbuddy/trae/codearts)每 30 分钟无条件全量刷新全部账号 token——token 永远是"30 分钟内续过"的,不会走到"请求时发现过期"
- codearts 续期间隔默认 60s → 30min(可配置)
- 死 token 号保留退避(不刷屏)+ 账号池可见「需重新登录」
- ⚠ 注意:codearts refreshToken 消费型,同一凭证目录只应被一个实例使用
账号昵称统一手机号
- loomy:昵称优先级改为手机号优先(批量导入也显示手机号,之前显示 NKxxx)
- workbuddy:本就手机号
- codearts/trae:凭证体系无手机号,显示官方账号标识(也是登录凭据)
修复
- 导入/重载账号后数据自动更新(重载路径补额度刷新 + 无感轮询检测新账号行)
- 重复导入/重载不再清掉已有凭证(投影同步保留 token)
- 移除「每 5s 刷新」开关(数值实时性由 30s 无感轮询覆盖)
- 管理密钥一键轮换(写 config 立即生效无需重启)
- 趋势图 hover tooltip + 布局修复;网关卡 2→7 张
🚀 快速开始
- 解压 zip
- copy config.example.json config.json,编辑 api_key 与凭证目录
- 放凭证到 auths/(或用管理台「+添加账号」页内登录)
- 双击 start.bat(或 ./wb2api-server -config config.json)
- 打开 http://127.0.0.1:7863/ui
📥 下载
wb2api-server-v1.6.2-windows-amd64.zip— Windows x64wb2api-server-v1.6.2-linux-amd64.zip/linux-arm64— Linuxwb2api-server-v1.6.2-darwin-amd64.zip/darwin-arm64— macOSSHA256SUMS.txt— 校验和
完整变更见仓库 git log(v1.6.1..v1.6.2)。
v1.6.1
v1.6.1 — API 管理 + 仪表盘增强 + 稳定性修复
📦 本次打包形式:压缩包(解压即用)
每个平台的 zip 内含:可执行文件 + config.example.json(配置模板,默认启用全部四个上游)+ start.bat(Windows 启动脚本)+ 使用说明.txt。不再需要分别下载配置文件。
✨ 相比 v1.6.0 的新功能
API 管理(对标 new-api 令牌管理)
- 多把 API Key(存 data/apikeys.json,持久化,重启不丢)
- 每把 Key:额度上限(token,0=不限)、每分钟请求上限(0=不限)、启用/禁用、独立用量统计(请求数/消耗 token/失败数)
- 管理密钥一键轮换:生成新钥匙 → 写入 config.json → 立即生效无需重启(旧钥匙作废)
- 鉴权语义:config 的 api_key 是管理钥匙(不限额);普通 Key 额度用尽 → 402、超速 → 429、禁用/未知 → 401
- 兼容性:未配置多 Key 时行为与旧版完全一致
仪表盘增强
- 24h 趋势图:请求量 + 成功率双折线(内联 SVG,零图表库),hover 显示各小时请求/成功/失败/token
- 网关状态卡 2 → 7 张:账号总数/健康/冷却中/已禁用/在途请求/累计请求/成功率
- 移除「每 5s 刷新」开关:数值实时性统一由 30s 无感轮询覆盖(只更新数值不整页重绘)
- API 管理面板移到仪表盘下方,管理钥匙与普通 Key 同屏显示
稳定性
- 后台续期失败统一接入账号池可见禁用(连续 3 次 → 「已禁用:凭证失效,需重新登录」)
- codearts 死 token 不再每 60s 重试打上游(指数退避 + 抖动,借鉴 LiteLLM)
- 全部上游签到/保活/福利领取统一 30 分钟被动扫描(幂等)
🚀 快速开始
- 解压对应平台的 zip
copy config.example.json config.json,编辑 api_key 与凭证目录- 放入凭证到 auths/(或用管理台「+添加账号」页内登录)
- Windows 双击 start.bat;Linux/macOS 执行
./wb2api-server -config config.json - 打开 http://127.0.0.1:7863/ui
📥 下载
wb2api-server-v1.6.1-windows-amd64.zip— Windows x64wb2api-server-v1.6.1-linux-amd64.zip/linux-arm64— Linuxwb2api-server-v1.6.1-darwin-amd64.zip/darwin-arm64— macOSSHA256SUMS.txt— 全部压缩包校验和
完整变更见仓库 git log(v1.6.0..v1.6.1)。
v1.6.0
v1.6.0 — 解压即用的预编译 Release
📦 下载后怎么用(3 步)
- 按系统下载对应压缩包,解压得到:
wb2api-server(主程序)+config.example.json(配置模板,四个上游默认全开)+start.bat(Windows 双击启动) - 把
config.example.json改名config.json,填入你的 API Key(api_key 字段)与凭证:- 方式 A:把已有的凭证目录
auths/(workbuddy/codearts/loomy/trae 的 json)放进解压目录 - 方式 B:启动后在管理台「+ 添加账号」页内登录(workbuddy/codearts/trae/loomy 都支持)
- 方式 A:把已有的凭证目录
- 启动:
- Windows:双击
start.bat(自动用同目录 config.json) - Linux/macOS:
./wb2api-server -config config.json - 管理台:http://127.0.0.1:7863/ui
- Windows:双击
没有 config.json 时程序会提示复制 config.example.json,并以默认值启动(不会硬退)。
端口改 config.json 的listen字段(默认 7863;避开被占用的端口,如 Clash 的 7899)。
新增上游
- TRAE SOLO:第四个上游 —— 多账号对话、页内添加账号(浏览器 OAuth 零手动)、自动签到、自动续期、权益额度
- loomy 邀请码体系:绑定/导入/额度全链路,错误翻译成人话
稳定性(移植 AIClient2API 机制)
- 主动健康检查:定时探测冷却/熔断中的账号并提前恢复
- 熔断失败窗口衰减、刷新失败连续 3 次自动禁用
- 全部上游统一 30 分钟被动扫描(签到/保活/福利领取同一粒度、幂等)
控制台 UI 大改
- 设置页重设计:6 组按主题切分 + 生效时机徽章;删减不必要的设置、必要项只读
- 账号池额度/状态/统计卡无感轮询:只更新数值不整页重绘
- 成长计划精简:12 列/8 卡 → 6 列/6 卡;「一键完成」支持全部账号
- 修复:boot 崩溃、邀请码绑定路由、codearts 福利"已领取"显示、缺配置硬退
校验
下载后可用 SHA256SUMS.txt 校验(sha256sum -c SHA256SUMS.txt)
multi2api v1.5.1
服务标识从 workbuddy2api 统一为 multi2api(顶栏标题 / /healthz service / X-Service 头 / 启动日志)。
multi2api v1.5.0
multi2api —— 多上游聚合反代网关(WorkBuddy / CodeArts / Loomy → OpenAI 兼容 API)。本版为自 v1.2.0 以来的累积发布。
✨ 新增
- Loomy 手机号验证码登录:对接讯飞账号网关(HMAC-SHA1 签名),「+ 添加账号」可输手机号+验证码直接登录。
- Loomy 新手任务:新标签页「新手任务 · Loomy」—— 8 个 onboarding 任务(10000 分),一键完成单账号 / 全部账号。
- Loomy 邀请码:新标签页「邀请码 · Loomy」—— 激活状态 / 我生成的码(active/exhausted)/ 绑定别人的码;首登初始化自动补。
- 批量粘贴导入:账号池「批量导入」按钮,粘贴 JSON(单条/数组)逐条落盘 + 自动重载账号池。
- 额度改走积分网关:按 session 逐账号查可用总额度(availableBalance = 总余额 + 当日剩余),不再依赖本机缓存。
🎨 控制台重构
- 仪表盘精简:网关状态只留「账号总数/健康」;调用统计 8 张核心卡,累计消耗改 token 口径(跨上游统一单位)。
- 删除「任务历史」标签页;账号池删「熔断/在途」列、昵称自动打码、去掉顶部「全部签到」。
- codearts 按钮文案「领取福利」→「签到」;workbuddy「签到」与「额度」互换位置(额度排最前)。
- 仓库更名 multi2api(多上游聚合反代),README 全面重写并附界面截图。
🛠 修复
/admin/login/poll不再下发ExpiresAt零值(之前让添加账号弹窗显示「已过期」)。- 页面轮询不再拆建面板 / 重复拉取已加载面板;输入框重绘后保留已输内容。
- 邀请码绑定前置校验"不能用自己的码",失败提示翻译成人话。
📦 产物
wb2api-server-windows-amd64.zip(exe + config.example.json + start.bat)wb2api-server-linux-amd64.tar.gzSHA256SUMS.txt
配置参考
config.example.json;Loomy 短信登录签名 key 随官方安装包分发(混淆而非加密),可用loomy.sms_*覆盖。
WorkBuddy2API v1.2.0 — 伪造客户端行为遥测层 + 内容误报治理
WorkBuddy2API v1.2.0
本版主题:移植并接通「客户端行为遥测伪造层」 —— 让网关能把一批上游成长任务直接做完;
同时补上内容误报治理(提示词体系 + 降级重试)与出站身份的一致性。
亮点
1. 任务中心「一键完成」
控制台的任务明细现在长出了三个入口:
| 入口 | 位置 | 端点 | 形态 |
|---|---|---|---|
| 一键完成 | 每行「操作」列 | POST /admin/growth/auto |
同步,实测 ~10s |
| 一键完成待办 | 任务明细工具条(作用于选中的账号) | POST /admin/growth/auto-all |
202 + 后台,实测 ~186s |
| 开学季一键完成 | 同上 | POST /admin/school/run |
202 + 后台 |
按钮按后端能力表(GET /admin/growth/auto/actions,17 条)动态出现,不在前端写死;
不在表里的任务(如需微信真实认证的 Expert_Philanthropy)仍显示「去客户端做」。
在此之前,这 7 条遥测端点一条都没被前端引用 —— 能力只存在于 curl 里。
而且任务行对accepted/in_progress一律显示「去客户端做」,注释还写着
"这两类任务本网页无法代做":能力接进来之后那句话变成了假话。
2. 两类任务的代价不同(重要)
| 类别 | 任务 | 做的事 |
|---|---|---|
| 纯伪造 | chat_5、Buddy_App、automation_1、Library_read、template_5、playbook_prompt、create_canvas、Hp_Appearance 等 |
只发构造好的事件链,没有任何真实动作,不消耗账号配额 |
| 需真实对话 | expert_5、Expert_team_use_3、Expert_lighthouse、skill_1、Model_chat_GLM5.2、RichMeow_Chat |
必须真发一次 chat 才能拿到上游签发的 requestId —— 实测上游会校验专家 id 与 requestId,自造的不计数 |
black_cat(夜猫子)只在 23:00–08:00 本地时间计分;窗口外不会假装成功,
而是如实回报「不在窗口、行为不计分」,并交由每日 23 点的排程补足。
3. 内容误报治理:提示词体系
上游内容审核不是语义审核,而是对客户端注入的固定模板句做逐字精确匹配,
命中就整单拦截(HTTP 400 + 审核文案)—— 一批完全合法的流量因此被误杀。
三层防护,互不替代:
- 提示词体系:出站前用网关自有提示词整体替换客户端 system/developer 消息
(prompt.mode=custom,内置 2086 字节,可用prompt.file覆盖); - 指纹脱敏兜底:user/assistant/tool 消息里的已知指纹串逐串擦;
- 内容拦截成为一等错误类(
ErrKindContentBlocked):与账号故障分开,
不再被误报成「所有账号不可用」。
被拦截时不罚账号、不换号(内容策略与账号无关),同请求内换极简中性提示词
重试一次并记忆到次日 00:00 CST。
4. 其余新增
- 软限流按模型冷却:解析上游
code 6004的重置时刻 + 指数退避,上限cooldown.soft_rate_max。 - 会话死亡计数:连续 3 次才禁用,替代"一票否决"。
- 出站身份一致性:三段式 UA + 设备令牌(5 分钟缓存)+ 客户端 IP 透传 + attribution/billing UA。
- 请求体硬上限
server.max_body_mb(默认 8 MiB)。 - DeepSeek thinking 注入 +
reasoning_content回填。 - 对话活跃上报(
schedule.activity_hours,空 = 关闭)。 - 管理台 7 条新端点(仅本机 loopback)。
修复(均为"不报错但用户会以为坏了"那类)
- 请求体 > 8 MiB 被静默截断后仍转发成功(HTTP 200) → 改为 413。
thinking未列入supportedFields→ 注入被整体剥离,配置形同无效。- 设备令牌缓存重置时误用 mutex →
fatal error: sync: unlock of unlocked mutex。 6004正则会把"code":60040误判成软限流。upstreamToGateway漏映射内容拦截 → 单上游部署返回 503 掩盖真实原因。- 单账号部署的内容拦截降级重试无法重新选号。
- 任务中心 4 个缺陷:已领取的任务也长按钮;
/admin/task完成摘要恒报「成功 0」
(实测开学季真跑完 3 次抽奖 +78c,摘要却是ok=0);一键完成后缓存快照不刷新
(跑完 186 秒、14 项领奖成功,界面仍显示原样待办);toast 把奖励播报两遍。 - 顺带修复领养前置:派猫前先补
ensureAdoptPrereq,此前恒失败。 - 冷却到"绝对时刻"时会改写调用方给的时刻(纳秒级偏差):上游给出的配额
重置时刻没有原样生效。根因是两次读钟之差被加进了目标时刻,
而且它只在 Linux 上暴露(Windows 时钟粒度约 15ms,两次读钟通常同值 → 偏差恒为 0,
本机一直全绿)。现已让"绝对时刻"不经过时长往返。
实测证据(本版关键路径都做过真机验证)
- 单任务伪造遥测:
Library_read上游计分并被接受 ——progress_before 0/1 → 1/1、claimed=true、+100 分 +5 能。 - 全量一轮:账号待办 15 → 1(仅剩窗口外的
black_cat);12 项执行成功并领奖。 - 提示词层行为级 A/B:同一句指令放
role=user时模型服从(BANANA-7),
放role=system时不服从 —— 证明 system 消息确实在出站前被替换(而非"配了没生效")。 - 缓存刷新:写入后
GET /admin/growth(不带refresh=1)从 5 条待办变为 4 条。 - 全部 6 个提交都过了 CI 的完整门禁(先在本机用 CI 同版本 go1.22.5 在
git archive导出的 LF 树上预演,再以 CI 的 Linux 结果为准):
gofmt -l无输出、go mod tidy无差异、build/vet/test全绿。 - 顺带说明:本版先修好了 master 上长期变红的
Check formatting,
才让 CI 第一次真正执行到go test—— 上面那条纳秒偏差正是这样被暴露出来的。
升级说明
- 本版零新增第三方依赖(
go.mod仍只有go-redis一个直接依赖,单文件静态二进制)。 config.json新增可选段(均可省略,省略即用默认值):
server.max_body_mb、cooldown.soft_rate_max、schedule.activity_hours/
activity_enabled、prompt.mode/prompt.file、upstream.user_agent/
client_version/cli_version/client_name/device_token/
device_token_file/passthrough_ip。详见config.example.json与 README。- ⚠
schedule.activity_hours是唯一「留空 = 关闭」的排程项
(签到 / 保活留空是回落到默认时点)—— 刻意如此,避免存量部署升级后凭空产生上游请求。 - 附带修复了 master 上 CI «Check formatting» 长期变红的 9 个存量文件(纯注释格式,零行为变化)。
产物
wb2api-server-windows-amd64.zip—— 含wb2api-server.exe+config.example.json+start.batwb2api-server-linux-amd64.tar.gz—— 含可执行文件 +config.example.jsonSHA256SUMS.txtwb2api-server.exe—— 另附一份未压缩的 Windows 可执行文件,方便不想解压的用法
由 CI 在干净环境用 go1.22.5 交叉编译(-trimpath -ldflags="-s -w",CGO_ENABLED=0),
以去掉本机路径并保证产物同构。
关于那份裸 exe
- 它逐字节取自
wb2api-server-windows-amd64.zip(同一份 CI 产物,不是另编一份),
工具链与构建参数因此完全一致。 - SHA256:
82941918d8948996a2061575ee86b270e1ec6004fa17ac74d5959cd5d67843cb - ⚠ 该哈希不在
SHA256SUMS.txt里 —— 那份文件由 CI 生成,只覆盖两个归档。
要校验裸 exe 请以上面这个哈希为准(或直接校验 zip 后解压)。 - 已用这份发布产物做过一次实机冒烟:独立端口 + 关闭全部排程启动 →
/healthz返回{"healthy":3,"service":"workbuddy2api","total":3},
且/ui下发的 HTML 含本版的三个「一键完成」按钮与相关判据 ——
即"发布的这个 exe 确实带着这些改动",而不是只看源码推断。
本项目仅供学习和研究使用。使用者需遵守上游服务条款,自行承担使用风险。
WorkBuddy2API v1.1.0
自动构建产物(Windows / Linux amd64)。详见仓库 README。
WorkBuddy2API v1.0.3
自动构建产物(Windows / Linux amd64)。详见仓库 README。
WorkBuddy2API v1.0.2
自动构建产物(Windows / Linux amd64)。详见仓库 README。