WorkBuddy2API
August 28, 2026 · View on GitHub
WorkBuddy CN(CodeBuddy / copilot.tencent.com)的 OpenAI 兼容反向代理,支持 OAuth 登录、多账号轮转、工具调用与流式响应。
功能特性
- 🔐 OAuth 登录 — 通过
/v2/plugin/auth/state设备授权流程获取凭证,支持 token 自动刷新 - 🔄 多账号轮转 — 加权随机选号(credits 权重),防热点 + 防惊群(100ms 窗口)
- 🛠 工具调用 — 完整支持 OpenAI tools/tool_choice,流式
tool_calls按 index 合并 - 📡 流式 + 非流式 — 上游 SSE 透传;非流式本地聚合(上游拒绝非流式请求)
- ⏰ 定时签到 — 每日 09:00 / 21:00 自动签到 + 积分查询,积分耗尽账号次日 04:00 自动恢复
- 📊 积分监控 —
credit.sh一键查询全部账号剩余/总量/百分比 - 🔑 登录工具 —
login.sh交互式登录,落盘即生效 - 🏗 Docker 部署 — 一键
docker compose up,healthcheck 常驻 - 📈 请求级日志 — 每个
/v1/chat/completions请求打表格日志(seq/TTFB/uid/tokens/latency) - 🏥 健康检查 —
/healthz无健康账号时返回 503,可接负载均衡器 - 📉 状态汇总 —
/status返回 total/healthy/cooling/disabled 计数 + 每账号完整画像
快速开始
1. 克隆 & 配置
git clone https://github.com/Sliverkiss/workbuddy2api.git
cd workbuddy2api
cp config.example.json config.json
# 编辑 config.json,设置 api_key
2. 添加账号
./login.sh
# 打开浏览器登录 → 按 y → 自动落盘 auths/ → 重启容器
3. 启动服务
docker compose up -d --build
4. 验证
# 模型列表
curl -s http://localhost:7863/v1/models -H "Authorization: Bearer your-api-key"
# 账号状态(汇总 + 每账号详情)
curl -s http://localhost:7863/status -H "Authorization: Bearer your-api-key"
# 健康检查(无健康账号时 503)
curl -s http://localhost:7863/healthz
# 聊天补全(流式)
curl -sN http://localhost:7863/v1/chat/completions \
-H "Authorization: Bearer your-api-key" \
-H "Content-Type: application/json" \
-d '{"model":"deepseek-v4-flash","messages":[{"role":"user","content":"hi"}],"stream":true}'
# 聊天补全(非流式,本地聚合)
curl -s http://localhost:7863/v1/chat/completions \
-H "Authorization: Bearer your-api-key" \
-H "Content-Type: application/json" \
-d '{"model":"deepseek-v4-flash","messages":[{"role":"user","content":"hi"}],"stream":false}'
配置说明
{
"listen": ":7863",
"api_key": "your-api-key",
"auth_dir": "./auths",
"state_file": "./data/state.json",
"region": "cn",
"cooldown": {
"hard_credit": "12h",
"soft_rate": "60s",
"err_threshold": 5,
"err_cooldown": "10m"
},
"schedule": {
"checkin_hours": [9, 21],
"keepalive_hours": [22]
},
"upstream": {
"timeout_seconds": 120
}
}
注意:hard_credit 字段为历史兼容保留。实际行为由 CooldownUntilTomorrow4AM 接管——402 + 余额关键词时,账号冷却到次日 04:00(本地时区),等签到任务恢复。
账号轮换与冷却策略
状态机
Healthy → Cooling → (签到恢复) → Healthy
↓ ↑
Disabled ←────┘ (session 死亡,永久)
错误分类
| 错误类型 | 冷却策略 | 恢复方式 |
|---|---|---|
| 402 + 余额关键词 | 冷却到次日 04:00 | 签到任务(09:00/21:00)自动恢复 |
| 429 限流 | 60s 短冷却 | 到期自动恢复 |
| 401 + session 死亡 | 永久禁用 | 人工重新登录 |
| 404 上游偶发 | 60s 短冷却(不累计错误计数) | 到期自动恢复 |
| 5xx 上游故障 | 10m 冷却(累计错误计数,阈值 5) | 到期自动恢复 |
| 网络抖动 | 不冷却,立即换号重试 | 即时 |
挑选策略
- 状态过滤:Disabled / Cooling 不选
- Top-5 候选:按 credits 降序取前 5
- 加权随机:按 credits 为权重抽签(credits 全 0 时均匀随机)
- 防惊群:跳过 100ms 内刚被选中的账号(除非只剩 1 个)
请求级日志
每个 /v1/chat/completions 请求结束后打一行表格日志到 stdout:
| #001 | 18:31:31 | deepseek-v4 | stream | 200 | uid=0851ce35 | TTFB=801ms | tok=60 | 23.5tok/s | total=2.6s |
字段说明:
#001:请求序号(进程级 atomic counter)TTFB:首 token 到达时间(stream 模式)tok:输出 token 数(从上游 usage.completion_tokens 精确读取,非估算)uid:账号 UID 前 8 位
工具脚本
| 脚本 | 用途 |
|---|---|
./login.sh | OAuth 登录,落盘 auth 文件 |
./credit.sh | 积分日报(美化输出) |
./credit.sh -json | 积分原始 JSON |
./signin.sh | 批量签到(遍历 auths/ 下所有账号) |
API 端点
| 端点 | 鉴权 | 说明 |
|---|---|---|
POST /v1/chat/completions | Bearer | OpenAI 兼容聊天补全(流式/非流式) |
GET /v1/models | Bearer | 模型列表(动态拉取 + 静态兜底) |
GET /status | Bearer | 账号状态汇总(total/healthy/cooling/disabled + 每账号详情) |
GET /healthz | 无 | 健康检查(无健康账号时 503) |
稳定性设计
- 防雪崩:上游 4xx/5xx 轮转重试(不直接返回),404 短冷却 60s 不累计 errCount
- 错误分流:网络层错误不累计 errCount(避免抖动连坐);HTTP 5xx 累计 errCount 阈值 5 触发冷却
- 请求日志:表格日志(seq/TTFB/uid/tokens/latency)便于排查慢请求
- 连接池:
MaxIdleConnsPerHost=20减少 TLS 握手 - 凭证续期:token 临近过期自动 refresh,失败禁用账号
- 状态持久化:
data/state.jsondirty flag + 5s 周期异步落盘,进程退出前强制 flush - 防惊群:100ms 窗口内不重复选中同一账号(高并发时打散热点)
开发
测试
go build ./...
go test ./... -count=20 # 20 次全绿(无 flake)
go vet ./...
gofmt -l . # 应为空
代码结构
cmd/
server/ # 主服务入口
login/ # OAuth 登录工具
credit/ # 积分查询工具
signin/ # 批量签到工具
internal/
auth/ # auth 文件解析 + token 刷新
pool/ # 账号池(状态机 + 冷却 + 持久化)
scheduler/ # 定时签到 + 积分查询
server/ # HTTP handler + 请求日志
upstream/ # 上游 API 封装(chat/billing/auth)
免责声明
本项目仅供学习和研究使用。使用者需遵守 WorkBuddy / CodeBuddy 的服务条款,自行承担使用风险。作者不对任何因使用本项目产生的直接或间接损失负责。
License
MIT