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 计数 + 每账号完整画像
git clone https://github.com/Sliverkiss/workbuddy2api.git
cd workbuddy2api
cp config.example.json config.json
# 编辑 config.json,设置 api_key./login.sh
# 打开浏览器登录 → 按 y → 自动落盘 auths/ → 重启容器docker compose up -d --build# 模型列表
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}'权威字段定义见
config.example.json:它是当前 schema 的唯一权威,下方样例与之保持一致。cp config.example.json config.json即可得到完整默认配置。
{
"listen": ":7863",
"api_key": "your-api-key-here",
"auth_dir": "./auths",
"state_file": "./data/state.json",
"region": "cn",
"cooldown": {
"soft_rate": "60s"
},
"schedule": {
"checkin_hours": [9, 21],
"keepalive_hours": [22]
},
"upstream": {
"timeout_seconds": 120
},
"features": {
"sanitize_blacklist_fingerprints": true
},
"upstash": {
"url": "",
"token": ""
},
"pool": {
"max_in_flight": 3,
"breaker_threshold": 3,
"breaker_cooldown": "30m",
"breaker_cooldown_max": "6h",
"idle_weight_per_hour": 0.5,
"idle_weight_max": 5.0
},
"session_sticky": {
"enabled": true,
"ttl": "30m",
"gc_interval": "5m"
}
}注意:cooldown.hard_credit / cooldown.err_threshold / cooldown.err_cooldown 三个历史键已退役。硬冷却固定为次日 04:00(本地时区,CooldownUntilTomorrow4AM),连续错误语义并入熔断器(pool.breaker_threshold 触发指数退避)。旧配置中的这些键因 JSON 未知字段被自然忽略,不报错。
Healthy → Cooling → (签到恢复) → Healthy
↓ ↑
Disabled ←────┘ (session 死亡,永久)
| 错误类型 | 冷却策略 | 恢复方式 |
|---|---|---|
| 402 + 余额关键词 | 冷却到次日 04:00 | 签到任务(09:00/21:00)自动恢复 |
| 429 限流 | 60s 短冷却 | 到期自动恢复 |
| 401 + session 死亡 | 永久禁用 | 人工重新登录 |
| 404 上游偶发 | 60s 短冷却(不累计错误计数) | 到期自动恢复 |
| 5xx 上游故障 | 喂熔断计数(pool.breaker_threshold 触发指数退避熔断) |
熔断到期自动恢复 / 成功清零 |
| 网络抖动 | 不计失败,立即换号重试 | 即时 |
- 状态过滤:Disabled / Cooling / 熔断 / 在途占满 不选
- Top-5 候选:按三因子权重降序取前 5(credits 只是权重的一个因子,闲置补偿与成功率同样决定谁进短名单)
- 三因子加权随机:权重 = credits 比例 ×10 + 闲置补偿 + 成功率 ×3(credits 全 0 仍按闲置+成功率加权)
- 防惊群:跳过 100ms 内刚被选中的账号(除非 top5 全部刚被用过,退回 LRU)
在 v2 基础上吸收外部项目成熟设计,引入四块能力:
- 熔断器(指数退避):连续
pool.breaker_threshold次失败熔断,退避breaker_cooldown × 2^retryCount封顶breaker_cooldown_max;成功清零。单一连续失败计数器fails,签到解冻只清冷却(余额恢复)不动熔断——熔断作为"连续 5xx"信号要到退避到期或下次 chat 成功才恢复。 - 三因子加权选取:
credits 比例 ×10 + idleWeight + successRate ×3。闲置补偿每小时+idle_weight_per_hour(封顶idle_weight_max),成功率无记录给中性 1.5。 - 在途租约:单账号并发上限
pool.max_in_flight(0 = 不限),Pick跳过占满账号。 - 会话粘性路由:同一
metadata.conversation_id/conversation_id/metadata.user_id尽量绑定同一账号,TTL 滚动续期;请求失败自动解绑回落轮换,请求成功后会话绑定跟随最终成功号。 - 全冷却兜底:无 healthy 账号时从冷却账号选最早到期者顶班(禁用与余额耗尽号永不参与)。
- 配置
upstash.url/token(空 = 纯内存模式,一切功能照常,只打一条启动警告)。 - Redis 仅做异步镜像(粘性会话映射防重启丢失 + 池状态快照恢复备份),不在请求热路径同步调用。
- 池状态快照:每次本地
state.json落盘同步镜像一份到 Redis(带saved_at);启动时择新恢复——Redis 快照比本地新才采用,否则本地优先。 /status透出redis_mode(upstash/noop)与池级sticky_sessions。
每个 /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/ 下所有账号) |
| 端点 | 鉴权 | 说明 |
|---|---|---|
POST /v1/chat/completions |
Bearer | OpenAI 兼容聊天补全(流式/非流式) |
GET /v1/models |
Bearer | 模型列表(动态拉取 + 静态兜底) |
GET /status |
Bearer | 账号状态汇总(total/healthy/cooling/disabled + 每账号详情) |
GET /healthz |
无 | 健康检查(无健康账号时 503) |
- 防雪崩:上游 4xx/5xx 轮转重试(不直接返回),404 短冷却 60s 不累计失败
- 错误分流:网络层错误不计失败(避免抖动连坐);HTTP 5xx 喂单一连续失败计数器,达
breaker_threshold(默认 3)触发指数退避熔断 - 请求日志:表格日志(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 的服务条款,自行承担使用风险。作者不对任何因使用本项目产生的直接或间接损失负责。
MIT