Skip to content

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 兼容对话(流式透传 / 非流式聚合)
  • 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(详见 致谢与参考)。
  • 本项目定位为个人单账号使用,明确不接受“号池”(多账号池 / 多凭证轮询)相关的建议与提交,相关需求请勿提 Issue 或 PR。
  • 本项目不存储对话内容,数据库仅保存元信息(模型、token 数、耗时、状态码等)。
  • 成长任务(活跃地图上报 / 连登奖励 / 猫猫旅行等)默认关闭,属可选实验性功能:其实现为模拟官方客户端事件的活跃上报,可能不符合上游服务条款,存在触发风控、账号受限等风险,是否开启及其后果由使用者自行评估承担。

✨ 功能特性

模块 说明
单账号代理 一份凭证(data/token.json),OAuth 登录
OpenAI 兼容端点 /v1/chat/completions(流式 / 非流式)、/v1/models/health
多 API Key 随机 / 自定义 Key,支持备注、启停、使用量统计
官方余额 实时拉取额度包明细,本地聚合可用额度(剔除周期外幻影/已过期包),官方 TotalDosage 对照展示,标注到期 / 临期,可一键隐藏已用完 / 已过期额度包
每日签到 独立开关,cron 定时 / 时间范围内随机二选一,失败重试 + 末班兜底,也可手动领取(在「任务」页)
成长任务 活跃地图连登上报、连登奖励兑换/抽奖、补签卡、猫猫领养与旅行(仅国内版账号);错过时点启动自动补跑,默认关闭
仪表盘 请求量、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(可用 -dataBUDDY2API_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":"你好"}]}'

🖥️ 命令行参数

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

🔌 端点

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

端点 说明
POST /v1/chat/completions OpenAI 兼容 chat(流式透传 / 非流式聚合)
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 手动刷新 / 测试凭证 / 清空凭证
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)/ 抽奖 / 补签({date} 缺省昨日 CST)/ 领新手礼包与活动补偿
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/models POST /admin/models/refresh 模型列表(含当前生效倍率)/ 手动重新拉取 /v3/config。倍率取自上游 models[].creditsmodelPromotions 折扣活动,按请求时刻实时评估时段窗口;仅作展示参考,非计费接口

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

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

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

每页都是独立文档(<title> / data-page 各自正确),但内容区常驻全部 7 个 view:侧边栏 <a href>app.js 拦截为软导航(切 view + pushState 换 URL),因此切页不重载文档、不重新请求资源、已加载数据保活。 保活例外:任务 / 日志两页声明 realtime每次进入都会刷新(这两页会被后端按天/定时改写), 间隔 <5s 的重复进入退化为保活;会话过期(401)或退出登录会清空保活缓存,重新登录后当前页重新拉数据。 页面与静态资源都带内容哈希 Etagno-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)/ globalwww.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_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_DATA_DIR 数据目录(默认 ./data

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

成长任务的 cron 时点为进程本地时区(Docker 部署若容器 TZAsia/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 转发、billing、checkin、growth(成长任务)、指纹头
│   ├── proxy/             # /v1/chat/completions 代理(流式透传 + 非流式聚合)
│   ├── apikey/            # OpenAI 端点 Key 管理(明文存储/随机/校验/限额)
│   ├── 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 个非标准库依赖:chimodernc.org/sqlitecron/v3,其余用标准库 + golang.org/x/crypto

🙏 致谢与参考

📄 License

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

各版本变更见 CHANGELOG.md

About

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

Topics

Resources

Stars

5 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages