📈 GH Trending Explorer 🎲 Surprise me

← all repos

HanawaBanana / workbuddy2api

git clone https://github.com/HanawaBanana/workbuddy2api.git

WorkBuddy2API 延续仓库 —— 账号池转 OpenAI 兼容 API(原 Sliverkiss/workbuddy2api 已删库,MIT)

+1
stars, 24h · #9,417
+~7
stars, 7 days · #10,065
+116
stars, 30 days · #4,563
120
★ total · +6% this week
95
forks · 4 open issues

Star history (as recorded here)

2026-10-20 · 115 ★ 2026-10-22 · 120 ★
LanguageGo
LicenseMIT
Created2026-09-24 (28d ago)
Last push6d ago
Watchers0
OwnerUser

Links

README excerpt
> [!NOTE]
> **延续仓库**:原上游 Sliverkiss/workbuddy2api 已于 2026-09-24 从 GitHub 消失(删除或转私有)。本仓库是其完整历史的延续副本(含上游最后的公开提交 `9a26ae7`),按原项目的 **MIT License** 继续维护,原始版权声明见 LICENSE。
 WorkBuddy2API 
 把 CodeBuddy 账号变成 OpenAI 兼容 API 的多账号网关 
 OAuth 登录 · 账号池轮转 · 熔断与冷却 · 会话粘性 · 积分补充
---
## 项目简介
WorkBuddy2API 是一个自托管的 **OpenAI 兼容上游网关**,将 [code] 账号包装为统一的 `/v1/chat/completions` 服务。
### 交流群组
- @checkinHome
### 本项目做什么
- 通过 **OAuth 设备授权**(`login.sh`)获取账号凭证,在网关侧做 token 自动刷新、账号池调度与流量治理;
- 面向 **个人多账号** 场景:多账号共享、单号故障自动换号、冷却 / 熔断防止雪崩、会话粘性保证多轮上下文不跳号;
- 对客户端只暴露 OpenAI 兼容接口,现有 SDK / 前端 / 工具 **零改造接入**。
### 本项目不做什么
- **只做上游网关,不做下游协议转换** — 本项目仅负责对接上游 [code] 并暴露 OpenAI Chat 协议;Anthropic Messages、Gemini 等其他协议的适配应由下游网关负责;
- **不内嵌 Web 管理面板** — 网关核心保持精简,可视化面板作为独立项目维护,数据直取上游接口,不增加网关适配负担。
### 社区前端面板
需要 Web 管理面板的用户,可部署以下符合本理念的社区项目(独立维护,与网关解耦):
- workbuddy2api-gui — 账号池状态可视化面板
- workbuddy-manager — 账号管理工具
> ⚠️ 合规须知:本项目是**非官方**网关,使用 [code] 账号作为上游,**仅限本人授权账号、本机 / 私有环境测试**。详细边界见安全与合规。
📖 完整文档见 GitHub Wiki。
## 核心能力
### 账号池治理
- **OAuth 设备授权登录** — `login.sh` 一条命令完成:取授权 URL → 浏览器登录 → token 轮询 → 凭证落盘 → 重启加载,全程无 PKCE(state 由服务端签发),重复执行即可连续添加多账号
- **三因子加权随机选号** — `credits 比例 ×10 + 快过期积分占比 ×8 + 闲置补偿` 三项加权(`pool.expiring_soon` 窗口内的积分优先消耗,默认 7 天),按权重降序取 **Top-5 候选短名单**,再在短名单内加权抽签(等权重候选先随机打乱防惊群、LRU 兜底覆盖全部候选),兼顾积分多、快过期积分先用掉、闲置久的账号;失败账号由熔断 / 冷却 / 连败降权状态机处置(不进权重公式)
- **防惊群** — 跳过 100ms 内刚被选中的账号,多账号同时待命时不打爆同一台
- **在途租约** — 单账号最大在途请求数(`pool.max_in_flight`)限制并发占用,占满的号不参与选号,避免单号过载
- **账本择优** — 每次成功请求按 `usage.credit` 折算每千 token 单价记入 `(账号, 模型)` 账本,免费 / 便宜的账号优先;观测按 EMA 平滑、6 小时未更新即失效(陈旧价格不复活),成本随上游活动实时变化;账本随池状态落盘 `state.json`,重启不丢学费;`/status` 透出 `model_costs` 台账(模型 / 单价 / 末次观测 / 样本数)
- **成本分层条件探索** — costTier 硬过滤(免费 > 未知 > 收费)会把全池锁死在唯一的实测免费号上:其余账号永远轮不到、也就永远学不到「它其实也免费」(垄断 + 学习冻结,issue #136)。破解方式是**搭车改道**:tier 0 垄断层存在且 tier 1 有成员时,距上次探索 ≥ `pool.cost_explore_interval`(默认 30m,`"0"` 关停)就把本次选号改道给一个未知号——承接的是完整真实用户请求,**零新增上游请求**(IP 维度零增量,WAF 友好)。成功即毕业(首观测入账,免费回 tier 0 / 收费出局 tier 2,学费只付一次);失败走既有冷却 / 熔断策略,无探测风暴。探索频率硬性限幅 ≤ 48 次 / 天 / 模型(24h ÷ 30m),与池规模和 QPS 无关;tier 1 枯竭后自动停探。探索节奏按 `(域, 模型)` 独立;`/status` 透出 `cost_explore` 台账(累计事件数 + 各 (域, 模型) 最近探索时刻),与 `model_costs` 行对照即可读出「探索 → 毕业」全链路
### 流量治理
- **分级熔断与冷却** — 429 软冷却(600s 起指数退避、封顶 `soft_rate_max`)、404 固定浅冷却、402 / 余额耗尽硬冷却至次日 04:00、连续失败熔断(`breaker_threshold` 触发后指数退避封顶 6h)
- **模型级限流独立冷却** — 6004(该模型使用量超限)只冷却触发调用的模型,切其他模型立即可用;`/status` 透出 `rate_limited_models` 台账
- **当日积分预算闸**(`budget.daily_credit_limit`,缺省 `0` = 不限)— 给「跑飞的客户端 / 忘了关的脚本」装一道钱闸:当日累计扣费达到上限后,网关直接拒掉后续对话请求(`429` + `daily_budget_exceeded`,错误文案带上已用与上限),把积分损失截断在阈值附近。计数按 **CST 自然日**重置(与上游增长体系同口径),进程内不落盘、重启清零。只统计上游 `usage` 给出 `credit` 的请求(缺观测不计入,与成本账本同一纪律),所以当日用量是一个**下界**、真实日耗只会更多——阈值宜按保守值设;也可以先留 `0` 当观察模式跑几天,看 `/status` 里 `daily_budget.used` 的真实日耗再定值。闸在**读请求体之前**判定(被拒的请求不会被白读进内存),且**不改变选号**——它只决定「这一枪开不开」,不做「换便宜号」的降级。实时台账(当日已用 / 上限 / 当日被拒次数 / 归属日)在 `/status` 的 `daily_budget`
- **账号临时停用 / 恢复** — 运维可把某个号临时摘出选号池、观察后再放回,不必删凭证(issue #138/#118)。语义是「对话流量摘除」而非「账号冻结」:停用期间签到、token 保活、排程任务照常执行,账号仍在池里、状态照常透出。与系统自动禁用是**两个独立状态位**(`manual_disab