WorkBuddy2API Panel - Docker Image
3.2K
把腾讯 CodeBuddy 账号变成 OpenAI 兼容 API 的多账号网关 · 附 Web 管理面板
Web 面板 · OAuth 浏览器登录 · 账号池轮转 · 熔断与冷却 · 会话粘性 · 定时签到 / 活跃 / 旅行 / 保活 · 成长任务一键完成(17/18) · 流式 / 非流式
本项目是 Sliverkiss/workbuddy2api 的增强分支(fork)。 上游仓库现已删除;本项目已同步至上游删库前的最后一次更新(
ea8b1e5),此后由本分支独立维护演进。 在上游基础上重构了可视化运维层;差异概览见 与上游的差异,上游设计的精巧之处(账号池调度、错误分类、提示词体系)原样保留,详见下文。
⚠️ 本项目仅限自用账号(签到 / 保活 / 个人工具接入),不支持同时也是禁止批量小号分发额度、二次打包或收费售卖。 详见 使用声明(必读)。
本项目(含上游 Sliverkiss/workbuddy2api,下同)的开发初衷只有一个:方便个人管理自己的 CodeBuddy 账号——自动签到、保活、给自己的本地工具提供一个 OpenAI 兼容入口。它是免费、开源、按「原样」提供的个人自用工具。
近期我们发现有人将本项目用于以下行为:
我们对上述行为表达最强烈的反对,并声明如下:
auths/ 中保存的是明文 accessToken / refreshToken)。你付钱买到的不是本项目,而是把自己账号交给陌生人的机会。如果你的用途是管理自己的账号,欢迎正常使用、反馈问题与提交 PR。
WorkBuddy2API 是一个自托管的 OpenAI 兼容反向代理网关,将腾讯 CodeBuddy(copilot.tencent.com)账号包装为统一的 /v1/chat/completions 服务。
login.sh)获取账号凭证,在网关侧做 token 自动刷新、账号池调度与流量治理;⚠️ 合规须知:本项目是非官方网关,使用 CodeBuddy 账号作为上游,仅限本人授权账号、本机 / 私有环境测试。详细边界见安全与合规。
| 能力 | 说明 |
|---|---|
| 🔑 OAuth 一键登录 | login.sh 设备授权流程,自动落盘凭证并重启容器加载新账号 |
| 🔄 多账号池 | 快过期积分加权 + 成本分层 + 加权随机选号,Top-5 候选 + 防惊群 |
| 🛡️ 熔断与冷却 | 429 软冷却 600s 起指数退避(封顶 soft_rate_max)、404 固定 60s 短冷却、402 硬冷却至次日 04:00、连续失败熔断、在途租约限流 |
| 🧲 会话粘性 | 同一会话(conversation_id)尽量绑定同一账号,TTL 滚动续期,失败自动解绑,可镜像 Redis 防重启丢失 |
| ⏰ 定时任务 | 签到(09/21 点,末尾自动跑连登管家:兑换已解锁档位 + 抽完抽奖次数)+ 活跃上报(10 点,点亮连登 / 解锁领养 + streak 自检)+ 猫猫旅行(09/21 点,独立排程)+ token 保活(22 点),四类独立开关 |
| ⚡ 流式 + 非流式 | 出站强制 stream:true;SSE 帧按规范白名单重建;非流式由本地聚合为单响应 |
| 🧠 推理模型兼容 | DeepSeek 思维链注入(thinking.type=enabled + 默认档)、reasoning_content 多轮回填、effort 档位自动降级 |
| 💬 系统提示词体系 | 网关自有提示词替换客户端 system(默认 custom),从源头消灭 system 来源的内容误报;passthrough 遇拦截自动降级重试 |
| 🗑️ 指纹脱敏 | 出站请求体黑名单指纹字段清洗(可关闭),与提示词体系两层叠加 |
| 📊 可观测 | 每请求一行表格日志(TTFB / token 速率 / uid);/healthz 带 service 身份标识可接负载均衡 / 宿主探活 |
| 💾 状态持久化 | 池状态本地原子落盘 + Upstash Redis 异步镜像(可选),重启择新恢复 |
| 🖥️ Web 管理面板 | 内嵌单页面板(明暗主题,七个视图):账号运维 / 用量与积分分析 / 模型档位条件查询 / 在线改配置(热生效)/ 运行日志(含调用来源 IP·UA 与时间区间)/ 积分任务,见 Web 管理面板 |
官方「成长计划」的 18 个成长任务中,17 个可在面板上一键纯 API 完成——无需安装官方客户端、无需人工交互,点一下「一键完成」即自动推进进度、等待异步计分落定并自动领奖。剩余任务展示操作指引。
| 任务 | 奖励 | 一键完成方式 |
|---|---|---|
first_buddy | +300c +8e | 解锁上报 → 同意协议 → 领养第一只 Buddy |
create_canvas | +300c +5e | 设计画布创建事件组(Ardot 遥测) |
chat_5 | +100c | 对话活跃上报 ×5(自动补足差额) |
Model_chat_GLM5.2 | +100c +5e | glm-5.2 真实对话一次(发一条短消息) |
RichMeow_Chat | +100c +5e +UR Buddy | 桌面端对话事件链(6 事件,含成功回执) |
Buddy_App | +100c +5e | Buddy 应用「发现→进入→授权」事件链 |
Buddy_App_QQ | +50c +5e | 企鹅教师助手进入事件链(与上一条共用) |
automation_1 | +100c +5e | 定时任务创建成功事件 |
Library_read | +100c +5e | 资料库阅读点击(web 域上报) |
template_5 | +100c +5e | 模板使用事件组 ×5 |
playbook_prompt | +100c +5e | 灵感案例「做同款」发送事件 |
expert_5 | +100c +5e | 真实专家召唤+使用链 ×5(专家市场拉真实专家 → 真实对话 → 使用事件) |
Expert_team_use_3 | +100c +5e | 专家团召唤+使用链 ×3 |
Hp_Appearance | +100c +5e | 主题设置 + 皮肤生效事件 |
Expert_lighthouse | +100c +5e | 轻量云专家召唤+使用链(真实对话 requestId,可免费领一个月轻量服务器) |
skill_1 | +100c +5e | 真实对话 + 技能加载事件(skill_info) |
全新账号一键全做完 ≈ +1950 credits +78 能量,其中仅数个任务涉及真实对话(Model_chat_GLM5.2 一条、expert_5/Expert_team_use_3/skill_1 各数条 fast-model 短对话),其余全部为行为事件上报,零对话消耗。
| 任务 | 原因 |
|---|---|
Expert_Philanthropy | 需真实捐款(服务端领奖时校验捐赠回执,已实测无法绕过) |
任务计分走 /v2/report 行为上报,但不同任务认不同客户端指纹:CLI 指纹(www.codebuddy.cn)、桌面指纹(copilot.tencent.com + WorkBuddy/5.5.6 UA + workbuddy-desktop 事件族)、web 指纹(www.workbuddy.cn + x-client-platform: web)。网关为每类任务构造对应指纹的判据事件链(internal/upstream/desktop.go);专家类任务额外要求真实专家 id 与真实对话回执(internal/upstream/streak.go 之外的 expert 序列)。上报 200 ≠ 计分——面板在执行后轮询任务进度,达标即自动调用 Web 域领奖接口。
⚠️ 行为事件按天幂等:重复点「一键完成」不会重复扣资源,已达标的任务自动跳过。
「任务中心」视图把散落的任务能力收拢成一处:
官方「AI 好 Buddy,开学有好礼」小程序活动的 5 个任务全部纯 API 自动完成(挂签到排程末尾,幂等):
| 任务 | 奖励(每日) | 判据(已逆向) |
|---|---|---|
| 分享活动 | +100c +1抽奖 | share-complete 直调即点亮 |
| 桌面端体验(单次) | +100c +1抽奖 | viewed 激活 + 真实 chat + 桌面六事件链 |
| 和 AI 对话 3 次 | +50c +1抽奖 | viewed 后 3 条 chat_request_send 埋点(无需真实会话) |
| 召唤开学季专家 | +50c +1抽奖 | viewed 后 mp 事件链(召唤×3 + 对话) |
| 学生认证 | +100c | 需微信学生真实认证,不做 |
抽奖次数自动全部抽完。期间逆向成果(cf-connect 加密通道、mp 云对话全链路)记录在 data/desktop-task-protocol.md §8。
同一活动在成长任务中心还有两条小程序口径任务(X-Client-Platform: miniprogram 专属下发,默认列表不可见,各 +100c+5e):
| 任务 | 判据(已逆向) |
|---|---|
school_season 校园日 | mini chat_request_send + activityId=school_open_day_2026(无 activityId 不点亮;accept/claim 均要求 mp 头) |
Sequential_Tasks_1 小程序首对话 | mini chat_request_send(无 activityId,服务端按 source=mini_program 指纹关联) |
任务中心扫描自动合并 mp 口径待办;accept 带登记回读验证(上游存在 200+OK 但未落账的形态,未生效自动重试一次)。
成长中心连登档位(连续登录 7/14/28 天)兑换后发放积分 / 能量 / 补签卡 / 抽奖次数,抽奖次数只能从兑换获得。网关把它挂在每日签到排程末尾自动跑闭环(见定时任务):档位解锁当天自动兑换、有抽奖次数自动抽完,全程无需人工盯。
本分支相对 上游 master 的增量(均已在真实多账号环境验证):
| 能力 | 说明 |
|---|---|
| Web 管理面板 | internal/panel,前端 go:embed 单文件进二进制,零外部依赖。账号池可视化(健康色条 / 积分量条 / 冷却倒计时)、积分到期分布、单号运维、批量任务、日志查看、明暗主题 |
| 请求指标与脱敏日志 | 面板展示完成成功率 / HTTP 成功率 / 平均耗时 / 最近请求,响应带 X-Request-Id;JSONL 只归档请求元数据,不写提示词、响应正文或凭证 |
| 浏览器内 OAuth 添加账号 | 面板「添加账号」按钮完成设备授权 → 凭证落盘 → 热加载进池(免重启),替代命令行 login.sh 流程 |
| 在线配置编辑(热生效) | 面板直接改 config.json:API 密钥 / soft_rate / 脱敏开关 / 池参数 / 任务排程立即生效;装配期字段(listen 等)保存后提示需重启。写入采用深合并 + 原子替换,保留未知键 |
| 积分任务体系 | 任务列表 / 接受 / 领取接口 + 面板弹窗;「一键完成」覆盖 17 个任务(对话 / 领养 / 桌面行为链 / 模板 / 灵感案例 / 画布 / 专家召唤 / 技能尝鲜 / 主题 / 资料库 / 夜猫子等),推进进度、等待异步计分落定后自动领奖,纯 API 零客户端依赖 |
| 首启自动生成配置 | 目录下无 config.json 时自动生成推荐配置(含 crypto/rand 随机 api_key),双击即开 |
| 粘性会话内容回退 | 客户端不发 conversation_id 时,用 system + 首条 user 哈希派生会话键(d- 前缀),通用 OpenAI 客户端也能享受粘性 |
| 余额后台刷新 | schedule.balance_refresh_minutes(默认 5)周期查余额并更新池,冷却账号余额恢复自动解冻 |
| 模型能力透出 | /v1/models 附带 supported_efforts / default_effort / 积分倍率 / 输入输出上限等上游真实字段 |
| 安全加固 | 常量时间密钥比较(internal/httpauth)、CSP 与安全响应头、UID 白名单防路径穿越、前端属性转义修复 |
| 领养前置修复 | 上游 travelAdopt 缺 report 前置导致领养恒失败于 first_buddy task not completed yet;本分支修正后实测 +300 到账(3/3 账号) |
| 原生工具调用标记还原 | 上游(DeepSeek 系)的工具调用原生语法是带全角竖线的标记文本,仅在请求声明了 tools 时才被上游解析成结构化 tool_calls。实测 tools 声明在中转环节(Responses → chat/completions 等)丢失是常态,此时模型仍想调工具,标记就以纯文本落进 content——Codex 这类只执行结构化 function_call 的客户端会把它当普通正文写进会话历史,回合直接结束、工具一次都没跑。网关在出站响应里识别并还原成 tool_calls(流式与非流式都覆盖) |
第一轮(fork 基线 53ee3a1 → 9a87758,34 个提交):四类任务独立排程、pool 文件拆分、12153 连续计数才禁用、429 code=6004 模型级限流收窄、11101 不罚号、请求体 413、DeepSeek 思维链、reasoning_content 回填、Codex 指纹脱敏、系统提示词体系、出站 UA 可配等。
第二轮(9a87758 → ea8b1e5,2026-09-14,只吸收底层):
| 上游改动 | 吸收内容 |
|---|---|
| 净化增强 | tool_calls.arguments 盲区修复(content=null 的工具调用轮此前完全漏净化)、裸 11128 反探测改写、桌面版身份句(逗号形态)漏网修复、反馈句整句改写 |
| 出站头族 | UA 对齐官方三段式 WorkBuddy/<ver> WorkBuddy/<ver> CLI/<ver>(默认 5.5.4/2.137.1,可配);X-IDE-* 用量归属四头 + X-Agent-Purpose(client_name 配 WorkBuddy 即对齐官方桌面端);X-Device-Token 设备风控头(auth 每号 / config / 文件三源);X-IDE-Version 补齐 |
| 并发修复 | 客户端 IP 改按请求参数传递(消除共享字段竞态);billing 单段 UA 形态 |
| 签到幂等 | IsAlreadyCheckin 识别"今天已签到"(code=10001/14001),调度日志不再把重复签到当失败 |
| 粘性按模型判活 | 会话绑定的账号被 6004 模型级限额后,换模型请求自动解绑重分配(治"限额后换不动号");/healthz 探活计入模型豁免形态(治"全号被单模型限流探活误报 503") |
| report 增强 | ReportChatActivity 支持独立 requestID(同会话多轮上报各条可区分) |
未吸收(明确不做):脚本体系(task_runner/school 脚本—我们已有更完整的纯 API 实现)、governance/CI workflow、成本账本选号(依赖 usage.credit 观测,收益待验证)。
上游仓库此后已删除,上述第二轮(
ea8b1e5)即其删库前的最后一次更新,本分支已完整吸收。此后本仓库与上游不再有同步关系,演进以本仓库为准。
flowchart LR
Client["客户端 / SDK\nOpenAI 兼容请求"] --> H
subgraph GWI["WorkBuddy2API 网关 :7863"]
H["HTTP Handler\n鉴权 · 请求体上限 · 提示词改写 · 轮转"] --> P
H --> S
P["账号池\n快过期加权 · 成本分层 · 熔断 · 冷却 · 租约"] --> U
S["会话粘性路由"] -.绑定镜像.-> REDIS
T["定时调度\n签到 09/21 · 旅行 09/21 · 活跃 10 · 保活 22"] --> P
U["上游 Client\nChatHTTP 流式 · 短 RPC"]
end
P -. "读凭证 (0600)" .-> AUTH[("auths/*.json")]
P -. "状态镜像" .-> REDIS[("Upstash Redis\n可选")]
U -->|"chat/completions (SSE)"| CB["CodeBuddy\ncopilot.tencent.com"]
U -->|"billing / auth / growth"| CB
上游请求在出站前经历统一的改写管线(internal/upstream/payload.go):强制 stream:true、developer 角色归一、tool_choice 归一、image_url 字符串兼容为 OpenAI 对象形态、DeepSeek 思维链注入、reasoning_effort 档位降级、reasoning_content 回填、指纹脱敏。
CI 会自动构建多架构镜像(amd64 / arm64)并发布到 GHCR,git clone 之外的部署路径:
# 1. 准备配置与数据目录
mkdir -p auths data && cp config.example.json config.json
# 建议编辑 config.json 设置 api_key(或留空由程序自动生成随机密钥)
# 2. 拉取并运行
docker run -d --name workbuddy2api \
-p 7863:7863 -e TZ=Asia/Shanghai \
-v ./auths:/app/auths -v ./data:/app/data -v ./config.json:/app/config.json \
ghcr.io/linguo2625469/workbuddy2api-panel:latest
# 3. 健康检查(无可用账号时返回 503)
curl -s http://localhost:7863/healthz
首次发布后须将包设为公开:GitHub 仓库页 → Packages →
workbuddy2api-panel→ Package settings → Change visibility → Public,否则拉取需要docker login ghcr.io。镜像 tag 规则:
main分支推送latest/main/sha-xxxxxx;打v*tag 额外发布1.2.3/1.2/1语义化版本;PR 仅构建验证、不推送。
# 1. 克隆
git clone https://github.com/linguo2625469/workbuddy2api-panel.git
cd workbuddy2api-panel
# 2. 准备配置(compose 挂载此文件,缺失会导致容器启动失败)
cp config.example.json config.json
# 建议编辑 config.json 设置 api_key(或留空由程序自动生成随机密钥)
# 3. 启动(首次会构建镜像,约 1-2 分钟)
docker compose up -d --build
# 4. 健康检查(无可用账号时返回 503)
curl -s http://localhost:7863/healthz
# {"healthy":0,"total":0,"service":"workbuddy2api"}
启动后打开 http://localhost:7863/panel/,用面板「添加账号」完成登录(见下节)。
常用运维命令:
docker compose logs -f # 跟踪日志
docker compose restart # 重启
docker compose down # 停止并移除容器(数据在 ./auths 与 ./data,不受影响)
# 1) 下载 Release 中的 wb2api.exe,或从源码构建
go build -trimpath -ldflags="-s -w" -o wb2api.exe ./cmd/server
# 2) 直接运行:首次启动自动生成 config.json(含随机 api_key,日志打印一次)
.\wb2api.exe -config config.json
# 3) 浏览器打开面板添加账号
# http://127.0.0.1:7863/panel/
exe 为单文件自包含(前端资源已 embed 进二进制),拷到任意 Windows 机器即可运行,只需保证 auths/(凭证)与 data/(状态)目录可写。
go build ./...
go vet ./...
go test ./... # 完整测试套件
go run ./cmd/server -config config.json
构建全部二进制:
CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o wb2api ./cmd/server
CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o signin_bin ./cmd/signin
CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o login ./cmd/login
CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o credit ./cmd/credit
方式 A:Web 面板(推荐,各平台通用,免命令行)
打开 http://127.0.0.1:7863/panel/,点右上角「添加账号」:面板展示授权链接 → 浏览器完成登录 → 自动检测并落盘凭证 → 热加载进池(无需重启),顺带完成首次签到。
方式 B:命令行脚本(仅 Linux / macOS,依赖 bash + python3)
./login.sh
# 按提示在浏览器打开授权链接 → 回到终端确认 → 凭证落盘 auths/workbuddy-<uid>.json
login.sh 内置授权 URL 获取 + 浏览器登录 + token 轮询 + 首次签到 + 凭证落盘 + 容器重启,全程无 PKCE(state 由服务端签发)。账号池在容器启动时用 auths/ 目录自动对齐,新增凭证文件即自动发现。
Windows 用户请用方式 A(或 WSL);
login.sh需要 python3。
# 模型列表
curl -s http://localhost:7863/v1/models -H "Authorization: Bearer your-api-key"
# 账号状态(汇总 + 每账号详情,disabled 账号透出 disabled_reason)
curl -s http://localhost:7863/status -H "Authorization: Bearer your-api-key"
# 流式聊天
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 是配置项最完整的参考:每个字段、默认值与结构都能在其中找到,示例值一律是 test_key 之类占位符,不含任何真实密钥。下表为字段含义速查。
| 字段 | 默认 | 说明 |
|---|---|---|
listen | :7863 | HTTP 监听地址 |
api_key | 空 | 网关鉴权 |
Content type
Image
Digest
sha256:f8f357b2f…
Size
30.2 MB
Last updated
about 6 hours ago
docker pull oozzbb/workbuddy2api-panel