Skip to content

About

将 WorkBuddy 或 CodeBuddy 的 AI 服务转化为兼容 Openai 格式的 API

Topics

Resources

Stars

33 stars

Watchers

1 watching

Forks

Repository files navigation

Buddy 2API Go

License: MIT Go Version

用 Go 实现的 CodeBuddy / WorkBuddy 转 OpenAI 兼容代理网关:单一活动账号(可手动切换)、单二进制、内置 Web 管理面板。

项目地址:https://github.com/EchoPing07/Buddy-2API-Go

  • POST /v1/chat/completions —— OpenAI 兼容对话(流式透传 / 非流式聚合)
  • POST /v1/embeddings —— OpenAI 兼容嵌入(模型 bge-m3,1024 维;实验特性,默认关闭,管理后台「实验」页开启)
  • GET /v1/models —— 实时模型列表(从上游 /v3/config 动态拉取并缓存,cn / global 两套端点自动适配)
  • 内置 Web 管理后台 —— OAuth 登录、API Key 管理、官方余额、每日签到、成长任务、请求日志、仪表盘等
  • 默认中国端点(copilot.tencent.com),可切换国际端点(www.codebuddy.ai)

⚠️ 声明

  • 本项目仅用于学习与研究目的,请勿用于任何违法违规用途,不要干坏事。使用者需自行承担一切后果,作者不对任何滥用行为负责。
  • 本项目的代码参考了 wicm84266964/Buddy2api、Sliverkiss/CodeBuddy2api、cyl2361341082-alt/Buddy2api、ShouZhuo0413/codebuddy2api、Sliverkiss/workbuddy2api 等项目,Web 管理面板的 UI 设计参考了 grok2api(详见 致谢与参考)。
  • 本项目新增的官方成长任务相关功能来自 linguo2625469/workbuddy2api-panel。
  • 本项目不存储对话内容,数据库仅保存元信息(模型、token 数、耗时、状态码等)。
  • 成长任务(活跃地图上报 / 连登奖励 / 猫猫旅行等)默认关闭,属可选实验性功能:其实现为模拟官方客户端事件的活跃上报,可能不符合上游服务条款,存在触发风控、账号受限等风险,是否开启及其后果由使用者自行评估承担。

✨ 功能特性

模块 说明
单一活动账号 同一时刻只有一份活动凭证(data/token.json),OAuth 登录
多账号切换 登录 / 导入的凭证自动存档到 data/accounts/,账号页一键切换(手动,不轮询)
凭证导入导出 导出弹窗可选「当前 / 全部 / 选择」账号,统一输出凭证包;导入分「单个账号」(token.json / 手填 JWT)与「批量导入」(凭证包一次入档,不切换当前账号)
OpenAI 兼容端点 /v1/chat/completions(流式 / 非流式)、/v1/embeddings(实验,默认关)、/v1/models、/health
多 API Key 随机 / 自定义 Key,支持备注、启停、使用量统计
官方余额 实时拉取额度包明细,本地聚合可用额度(剔除周期外幻影/已过期包),官方 TotalDosage 对照展示,标注到期 / 临期,可一键隐藏已用完 / 已过期额度包
每日签到 独立开关,cron 定时 / 时间范围内随机二选一,失败重试 + 末班兜底,也可手动领取(在「任务」页)
成长任务 活跃地图连登上报、连登奖励兑换/抽奖、补签卡、猫猫领养与旅行(仅国内版账号);错过时点启动自动补跑,默认关闭
任务中心 官方「成长计划」任务列表 / 接受 / 一键完成 / 自动领奖(25 个任务可纯 API 点亮,含小程序口径);分钟级补领清扫把「已达标没领」的奖励领掉;活动补偿先查后领
仪表盘 请求量、Token、各模型请求数分布、近期错误等聚合统计
模型倍率 模型列表展示当前实际倍率(如 GLM-5.2 x0.50),自动套用官方分时段折扣(夜间折扣 / 限时免费等,支持跨零点时段窗与时区)
自动刷新 token 过期自动刷新,401 时刷新后重试一次;模型列表每小时 01 分自动刷新(失败保留旧表)
指纹头 出站请求复刻官方 CLI 指纹头;chat 请求绝不携带 refresh_token

🚀 快速开始

方式一:下载发行版二进制(推荐)

从 GitHub Releases 下载对应平台的压缩包(附 SHA256SUMS 校验和):

平台 架构 格式
Linux amd64 / arm64 / armv7 / riscv64 .tar.gz
Windows amd64 / arm64 .zip
macOS amd64 / arm64 .tar.gz

解压后直接运行(无需任何运行时依赖):

./buddy2api-linux-amd64      # 默认监听 127.0.0.1:10082,数据目录 ./data

Windows 双击 buddy2api-windows-amd64.exe 或在 cmd / PowerShell 中运行即可。

方式二:Docker(推荐)

docker compose up -d          # 浏览器访问 http://<服务器IP>:10082(局域网可访问)

或手动运行:

docker run -d \
  --name buddy2api \
  -p 0.0.0.0:10082:10082 \
  -v "$(pwd)/data:/app/data" \
  -e BUDDY2API_LISTEN=0.0.0.0:10082 \
  ghcr.io/echoping07/buddy-2api-go:latest

首次启动未设置管理密码时,默认密码为 password,登录后请尽快在管理后台修改;也可通过环境变量 BUDDY2API_ADMIN_PASSWORD 直接指定。

Docker 时区说明

镜像默认使用中国时区(Asia/Shanghai),并已内置 tzdata。需要其他时区时,通过 Docker 环境变量 TZ 覆盖即可,无需重新构建镜像:

# docker-compose.yml
services:
  buddy2api:
    image: ghcr.io/echoping07/buddy-2api-go:latest
    environment:
      TZ: Asia/Tokyo        # 例如东京时区;默认 Asia/Shanghai
# 或 docker run 时传入
docker run -e TZ=UTC -d --name buddy2api ...

Docker 数据路径

位置 路径 说明
容器内数据目录 /app/data 镜像已声明 VOLUME /app/data,工作目录为 /app,程序默认数据目录 ./data 即 /app/data
宿主机映射(compose 默认) ./data → /app/data 建议在部署目录下建 data/ 文件夹
二进制直跑 ./data(可用 -data 或 BUDDY2API_DATA_DIR 修改) 相对可执行文件所在目录

方式三:源码构建(进阶)

需要 Go 1.25+:

git clone https://github.com/EchoPing07/Buddy-2API-Go.git
cd Buddy-2API-Go
go build -o buddy2api .        # Windows 用 buddy2api.exe
./buddy2api                    # 默认监听 127.0.0.1:10082,数据目录 ./data

带版本号注入:

# Linux / macOS(注意用单引号,否则 $VERSION 会被 shell 展开)
go build -ldflags="-s -w -X buddy2api-go/internal/proxy.Version=v1.0.0" -o buddy2api .

# Windows PowerShell
go build -ldflags="-s -w -X buddy2api-go/internal/proxy.Version=$env:VERSION" -o buddy2api.exe .

跑测试(前端行为测试需要 node,缺失时该用例会自行跳过):

go vet ./... && go test ./...

发布流水线(.github/workflows/release.yml)在交叉编译前先跑 go test + go vet,不通过则不产出制品。

📖 使用

  1. 打开管理后台:本机部署访问 http://127.0.0.1:10082,Docker/局域网部署访问 http://<服务器IP>:10082,输入管理密码登录(默认 password)
  2. 「账号」页 → 登录(OAuth 设备流,浏览器完成授权)
  3. 「密钥」页 → 创建 API Key(随机或自定义,支持备注/启停)
  4. (可选)「任务」页 → 每日签到、成长任务中心(任务列表 / 一键完成 / 自动领奖 / 补领清扫 / 活动补偿)与成长任务(活跃地图连登 / 连登奖励兑换与抽奖 / 猫猫旅行,仅国内版账号);自动执行开关在「设置 → 任务」
  5. 在任意 OpenAI 兼容客户端填入:
Base URL: http://127.0.0.1:10082/v1
API Key:  sk-...
Model:    auto / glm-5.3 / kimi-k2.6 / ...(以 /v1/models 实际返回为准)
curl http://127.0.0.1:10082/v1/chat/completions \
  -H "Authorization: Bearer sk-..." \
  -H "Content-Type: application/json" \
  -d '{"model":"auto","stream":true,"messages":[{"role":"user","content":"你好"}]}'

嵌入(/v1/embeddings,实验特性:先在管理后台「实验」页开启,默认关闭;当前上游嵌入模型仅 bge-m3,1024 维):

curl http://127.0.0.1:10082/v1/embeddings \
  -H "Authorization: Bearer sk-..." \
  -H "Content-Type: application/json" \
  -d '{"model":"bge-m3","input":["你好,世界"]}'

🖥️ 命令行参数

参数 说明
-data <dir> 数据目录(默认 ./data,等价 env BUDDY2API_DATA_DIR)
-version 打印版本后退出

🔌 端点

OpenAI 兼容(业务端点,API Key 鉴权)

端点 说明
POST /v1/chat/completions OpenAI 兼容 chat(流式透传 / 非流式聚合)
POST /v1/embeddings OpenAI 兼容嵌入(实验特性,默认关闭,在管理后台「实验」页开启;关闭时返回 403 embeddings_disabled)。input 支持字符串 / 字符串数组;模型名透传上游,已知可用仅 bge-m3,未知模型返回 404 model_not_found
GET /v1/models 模型列表(craft 可用集 + 嵌入模型(仅实验开关开启时),从 /v3/config 动态拉取并缓存)
GET /health 健康检查(status / region / has_token / expired / version)

管理后台(/admin/*,Cookie 会话)

端点 说明
POST /admin/login POST /admin/logout GET /admin/session 密码登录 / 登出 / 会话状态
GET /admin/account POST /admin/account/oauth/start GET /admin/account/oauth/poll 账号摘要 / OAuth 发起 / OAuth 轮询(登录成功即写凭证并清旧账号缓存)
POST /admin/account/refresh POST /admin/account/test DELETE /admin/account 手动刷新 / 测试凭证 / 清空凭证(仅清空会一并清旧账号缓存并复位调度器日内状态)
POST /admin/account/import POST /admin/account/import/batch 导入凭证:单账号(JWT,"activate":true 为「导入并启用」,缺省仅导入)/ 批量导入凭证包(恒只入档,不切换当前账号)
GET /admin/account/export?scope=current|selected 导出凭证包(JSON,内含 access_token)。单账号与多账号同构:current=单个(当前活动账号)、selected=批量(配 uids=a,b)
GET /admin/accounts POST /admin/accounts/{uid}/activate DELETE /admin/accounts/{uid} 已存账号列表(仅元信息)/ 切换当前账号 / 移除档案(当前账号不可移除)
GET /admin/resources 官方余额(带缓存,?force=1 强刷)
GET /admin/checkin/status POST /admin/checkin/claim 签到状态 / 领取
GET /admin/growth/overview 成长任务总览(连登 / 热力格 / 猫猫 / 抽奖聚合,60s 缓存,?force=1 强刷)
POST /admin/growth/run POST /admin/growth/report POST /admin/growth/travel 手动执行完整任务链 / 活跃上报({count} 显式指定 1-10,缺省交由服务端按「配置条数 + 波动数」随机)/ 旅行巡检
POST /admin/growth/adopt POST /admin/growth/redeem POST /admin/growth/lottery POST /admin/growth/makeup POST /admin/growth/bonus 手动领养 / 兑换({tier}=7d/14d/28d)/ 抽奖(抽完 chances)/ 补签({date} 缺省昨日 CST)/ 领新手礼包与活动补偿
GET /admin/tasks 官方成长任务全量列表(默认 + 小程序口径合并),含 claimable/claimed/auto 标记
POST /admin/tasks/accept 接受任务({task_codes?},缺省=全部未接受;默认与小程序口径分开提交)
POST /admin/tasks/claim 领取单个任务奖励({task_code};默认任务走 Web 域、小程序任务走 mp 口径,均幂等)
POST /admin/tasks/auto 一键完成单个任务({task_code}):动作 → 有界轮询回读(异步计分)→ 达标即自动领奖
POST /admin/tasks/auto_all 一键完成全部可自动化任务(先批量 accept,再逐项执行;单项失败不阻断)
GET /admin/tasks/scan 只读扫描待办(未领取、未锁定、且有自动动作)
POST /admin/tasks/sweep 立即执行一轮补领清扫(只 accept/claim,不跑行为链)
GET /admin/tasks/actions 支持一键完成的任务清单(任务码 + 说明 + 是否小程序口径 + 是否尝试型)
GET /admin/compensation POST /admin/compensation/claim 活动补偿状态(只读)/ 领取(先查后领,无活动·已领·零额度均正常返回)
GET /admin/api-keys POST /admin/api-keys PUT /admin/api-keys/{id} DELETE /admin/api-keys/{id} API Key 增删改查
GET /admin/logs 请求日志(分页 + 筛选 model/key/status)
GET /admin/stats 仪表盘聚合
GET /admin/settings PUT /admin/settings 读 / 改配置(密码、region、签到、cron 等)
GET /admin/experiments PUT /admin/experiments 实验特性开关(读 / 改 {embeddings_enabled};env BUDDY2API_EMBEDDINGS_ENABLED 强制时 PUT 不生效)
GET /admin/models POST /admin/models/refresh 模型列表(含当前生效倍率)/ 手动重新拉取 /v3/config。倍率取自上游 models[].credits 与 modelPromotions 折扣活动,按请求时刻实时评估时段窗口;仅作展示参考,非计费接口

Web(go:embed 多页 + 软导航,无构建步骤、无外部依赖)

端点 说明
GET / 统计页(首页)。GET /dashboard 与 /dashboard/ 308 永久跳回 /(仅别名)
GET /account /keys /resources /growth /logs /labs /settings 账号 / 密钥 / 余额 / 任务 / 日志 / 实验 / 设置。深链、刷新、新标签页直接可用
GET /assets/app.css /assets/app.js /assets/alpine.js 内嵌样式 / 共享层 + 各页脚本(启动时按清单顺序拼接)/ Alpine.js 运行时

页面与静态资源均接受 GET / HEAD;其余方法回统一 JSON 405(Allow: GET, HEAD)。末斜杠只作别名: /keys/ → 308 → /keys(/dashboard[/] → 308 → /),一个页面只有一个规范 URL。

每页都是独立文档(<title> / data-page 各自正确),但内容区常驻全部 7 个 view:侧边栏 <a href> 由 app.js 拦截为软导航(切 view + pushState 换 URL),因此切页不重载文档、不重新请求资源、已加载数据保活。 保活例外:任务 / 日志两页声明 realtime,每次进入都会刷新(这两页会被后端按天/定时改写), 间隔 <5s 的重复进入退化为保活;会话过期(401)或退出登录会清空保活缓存,重新登录后当前页重新拉数据。 另有一类保活例外与凭证有关:导入并启用 / 扫码登录成功后立即强刷账号、余额、签到与任务数据 (后端同时清掉旧账号缓存并复位调度器日内状态),因此换账号不需要手动点刷新,也不会出现 「新账号显示上一账号余额」或「新账号当天被判定已签到/已上报而不执行定时任务」; 删除凭证则就地把账号口径状态清空并撤销余额/任务两页的保活(此刻无凭证,重拉只会报错), 不会继续展示已删账号的额度包/签到。两种跳转都会递增账号代次,使在途的旧账号响应落地即作废 —— 否则旧响应晚于新响应落地时,会把刚拉到的新账号数据覆盖回上一个账号的值。 页面与静态资源都带内容哈希 Etag(no-cache + If-None-Match → 304),仅 Alpine.js 走 1 天强缓存; 文本响应走 gzip(带 Vary: Accept-Encoding;首页 52KB → 约 12KB,app.js 50KB → 约 19KB), 但 Range 请求与 /v1 流式响应(SSE)不走压缩;全站响应带 X-Content-Type-Options: nosniff。

⚙️ 配置

优先级:env > data/config.json > 内置默认。env 统一 BUDDY2API_* 前缀:

env 说明
BUDDY2API_LISTEN 监听地址(二进制默认 127.0.0.1:10082;Docker 镜像内默认 0.0.0.0:10082)
BUDDY2API_REGION cn(默认,copilot.tencent.com)/ global(www.codebuddy.ai),两套端点凭证不互通,切换后需重新扫码登录
BUDDY2API_ADMIN_PASSWORD 管理密码(明文,启动时 bcrypt 哈希写回 config.json,优先级最高);未设置且无 hash 时默认 password
BUDDY2API_AUTO_CHECKIN 自动签到开关(默认关闭)
BUDDY2API_CHECKIN_MODE 签到方式(默认 fixed):fixed 按 cron 定时 / random 每天在时间范围内随机一个时刻
BUDDY2API_CHECKIN_CRON fixed 模式签到 cron,6 段含秒(默认 0 0 9 * * *)
BUDDY2API_CHECKIN_RANDOM_START / BUDDY2API_CHECKIN_RANDOM_END random 模式时间范围 HH:MM(默认 09:00 / 18:00,结束最晚 23:30)
BUDDY2API_CHECKIN_FALLBACK 末班兜底(默认开启):当天没签成时 23:50 尝试,若失败 23:55 重试,再失败当天放弃
BUDDY2API_AUTO_GROWTH 自动成长任务开关(默认关闭,仅国内版账号可用)
BUDDY2API_GROWTH_REPORT_CRON 上报+奖励链 cron,6 段含秒(默认 0 0 10 * * *)
BUDDY2API_GROWTH_TRAVEL_CRON 猫猫旅行巡检 cron(默认 0 0 9,21 * * *)
BUDDY2API_GROWTH_REPORT_COUNT 每日活跃上报条数 1-10(默认 10;领养前置 chat_5 需 5 条,同会话多轮、每条间隔 1.5 秒)
BUDDY2API_GROWTH_REPORT_JITTER 上报条数随机波动 ±N(默认 0=固定不波动,上限 10),每次执行在「条数 ±N」内随机取整,更像真人以降低风控判定
BUDDY2API_GROWTH_QUEUE_CRON 任务队列 cron,6 段含秒(默认 0 0 1 * * *):每日扫描待办并逐个执行动作
BUDDY2API_BLACKCAT_CRON 夜猫子 cron(默认 0 0 23 * * *):仅 23:00–08:00 窗口内计数,窗口外自动跳过
BUDDY2API_TASK_SWEEP_ENABLED 周期补领清扫开关(默认 true):分钟级只做 accept/claim,不跑任何行为链
BUDDY2API_TASK_SWEEP_MINUTES 补领清扫间隔分钟数(默认 15,上限 1440)
BUDDY2API_RESOURCE_CACHE_SECONDS 余额缓存秒数(默认 300)
BUDDY2API_LOG_RETENTION_DAYS 日志保留天数(默认 90)
BUDDY2API_LOG_MAX_SIZE_MB 日志表容量上限 MB(默认 50)
BUDDY2API_CHAT_TIMEOUT_SECONDS chat 上游响应头超时秒数(默认 60,1-3600)。上游自请求发出至开始响应的等待上限,超时即中止本次请求;流式连接建立后(含推理阶段)不再受超时约束。也可在管理后台「设置 → 基本」修改,改后需重启生效
BUDDY2API_EMBEDDINGS_ENABLED 嵌入端点实验开关强制值(true/false;设置后管理后台「实验」页的开关不再生效)
BUDDY2API_DATA_DIR 数据目录(默认 ./data)

指纹头伪装另有 CB_GATEWAY_USER_AGENT / CB_GATEWAY_STAINLESS_OS 等可选 env(一般无需修改),完整变量见 .env.example。

成长任务的 cron 时点为进程本地时区(Docker 部署若容器 TZ 非 Asia/Shanghai,时点需自行换算);错过当日上报时点时,下次启动 30 秒后会自动补跑一次(当日 22:00 前有效)。

💾 数据与安全

文件 说明
data/token.json 账号凭证
data/config.json 全局配置(含 bcrypt 密码哈希)
data/buddy2api.db SQLite(API Keys / 请求日志 / 缓存),只存元信息,不存对话内容
  • API Key 明文存储(管理页可复制完整 Key),校验用常量时间比对
  • 二进制直跑默认只监听 127.0.0.1;Docker(compose / 本文示例)默认全网卡监听 0.0.0.0:10082,局域网可直接访问——公网部署请务必放反代后并加 TLS,或改回仅本机监听
  • 会话 cookie 为 HttpOnly + SameSite=Lax,并在 HTTPS 链路(直连 TLS,或反代声明 X-Forwarded-Proto: https)下自动加 Secure
  • 出站请求复刻官方 CLI 指纹头;chat 请求绝不携带 refresh_token
  • 日志不记录请求/响应正文,只记元信息

📁 项目结构

Buddy-2API-Go/
├── main.go                # 入口
├── internal/
│   ├── config/            # 配置加载(config.json + env 覆盖)
│   ├── store/             # SQLite 数据层(API Keys / 日志 / 缓存)
│   ├── auth/              # 凭证:token.json 读写、JWT 解析、OAuth 设备流
│   ├── upstream/          # 上游客户端:chat 转发、embeddings、billing、checkin、growth(成长任务)、tasks/desktop/web(任务判据上报)、指纹头
│   ├── proxy/             # /v1/chat/completions 代理(流式透传 + 非流式聚合)与 /v1/embeddings
│   ├── apikey/            # OpenAI 端点 Key 管理(明文存储/随机/校验/限额)
│   ├── taskops/           # 成长任务编排(扫描 / Auto / AutoAll / Sweep,全局互斥与节流)
│   ├── admin/             # 管理后台 API(登录/账号/keys/日志/签到/余额/任务/设置)
│   ├── scheduler/         # 任务(签到状态机 + 成长任务链 / 旅行巡检 + 模型列表刷新 + 日志清理)
│   └── web/               # 前端(go:embed 多页 HTML + 内嵌 Alpine.js;shell.html + pages/ + assets/)
├── Dockerfile
├── docker-compose.yml
├── .env.example
├── LICENSE.txt
└── go.mod / go.sum

data/ 为运行时自动生成的数据目录,路径说明见上文 Docker 数据路径。

🛠️ 技术栈

Go 1.25+ · chi · modernc.org/sqlite(纯 Go,无 cgo) · robfig/cron/v3 · bcrypt · Alpine.js(内嵌)+ 手写 SVG 图表 · go:embed 单二进制

仅 3 个非标准库依赖:chi、modernc.org/sqlite、cron/v3,其余用标准库 + golang.org/x/crypto。

🙏 致谢与参考

📄 License

本项目采用 MIT 协议开源,仅供学习研究使用。

各版本变更见 CHANGELOG.md。

About

将 WorkBuddy 或 CodeBuddy 的 AI 服务转化为兼容 Openai 格式的 API

Topics

Resources

Stars

33 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages