需要 账号。部署完成后,在面板登录或导入账号即可使用。
安装 Docker 和 Compose 后执行:
git clone https://github.com/csszyft/wb2api.git
cd wb2api
docker compose pull
docker compose up -d仓库中的 docker-compose.yml 使用已构建的 ghcr.io/csszyft/wb2api:latest,无需本地编译,也无需先复制 config.example.json。需要固定版本时,将 Compose 的 image 改为 ghcr.io/csszyft/wb2api:v1.9.45。
首次启动会在宿主机 ./data/config.json 生成配置和随机 api_key。打开该文件查看密钥,然后访问:
- 面板:
http://127.0.0.1:7863/panel/ - 客户端 API Base URL:
http://127.0.0.1:7863/v1 - 客户端 API Key:配置中的
api_key,与面板使用同一密钥
部署在服务器时,将 127.0.0.1 换成实际可访问的服务器地址或反向代理域名。
docker compose logs -f # 查看日志
docker compose restart # 重启现有容器
docker compose pull # 拉取新镜像
docker compose up -d # 使用新镜像重建服务,保留数据卷
docker compose down # 停止并移除容器,保留 ./data以下命令适用于 Bash / Linux / macOS;Windows 推荐使用 Compose,或使用后面的原生程序。
mkdir -p data
docker run -d --name wb2api \
--restart unless-stopped \
-p 7863:7863 \
-e TZ=Asia/Shanghai \
-e WB2A_AUTH_DIR=/app/data/auths \
-e WB2A_STATE_FILE=/app/data/state.json \
-v "$PWD/data:/app/data" \
ghcr.io/csszyft/wb2api:v1.9.45此方式与 Compose 使用相同的数据目录和端口。容器首次以 root 进入入口脚本修正数据卷权限,再降权为 UID 10001 运行服务。
从 本仓库 Releases 下载对应平台的压缩包并完整解压:
| 系统 | 文件名中的平台 |
|---|---|
| Windows 64 位 | windows_amd64.zip |
| Linux x86_64 | linux_amd64.tar.gz |
| Linux ARM64 | linux_arm64.tar.gz |
| macOS Intel | darwin_amd64.tar.gz |
| macOS Apple Silicon | darwin_arm64.tar.gz |
Windows 在解压目录打开 PowerShell:
.\wb2api.exe -config config.jsonLinux / macOS 在解压目录运行:
./wb2api -config config.json首次启动缺少配置文件时会自动生成,密钥在同目录的 config.json 中。若自行复制了 config.example.json,请把其中的 test_key 改成自己的密钥。
Windows 程序包还提供 start-wb2api.cmd、stop-wb2api.cmd、status-wb2api.cmd,用于后台启动、停止和查看状态。三件套管理由启动脚本创建的实例;前台运行的程序用 Ctrl+C 停止。
安装 Go,版本至少满足 go.mod 的要求,然后执行:
git clone https://github.com/csszyft/wb2api.git
cd wb2api
go build -trimpath -ldflags "-s -w" -o wb2api ./cmd/server
./wb2api -config config.jsonWindows 将输出名改为 wb2api.exe,使用 .\wb2api.exe -config config.json 启动。前端资源随 Go 程序内嵌,无需安装 Node.js 构建页面。
- 打开
/panel/,填写配置中的 API Key。 - 点击“添加账号”,选择国内或国际区域,打开授权链接并完成登录;也可以切换到“导入 JSON”选择凭证文件。
- 看到导入成功后,账号已经进入池中。激活、签到与余额在后台更新,无需重启。
- 在“模型与档位”查看所需区域的模型,或通过
/v1/models获取模型列表。 - 客户端选择 OpenAI 兼容接口,Base URL 填
http://服务器地址:7863/v1,Key 填api_key,模型名使用列表中的 ID。
凭证需要 UID、Access Token 和 Refresh Token 等必要数据;无法识别或缺字段的条目会显示具体原因。国际凭证例如 "domain":"www.workbuddy.ai","realm":"intl" 可自动识别,无需手改为 global。
以下示例使用 Bash;将 YOUR_API_KEY 和模型 ID 替换为实际值。示例 DeepSeek 模型需要国际服账号及对应模型可用。
curl -s http://127.0.0.1:7863/healthz
curl -s http://127.0.0.1:7863/v1/models \
-H 'Authorization: Bearer YOUR_API_KEY'
curl -sN http://127.0.0.1:7863/v1/chat/completions \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"model":"deepseek-v4.1-flash","messages":[{"role":"user","content":"你好"}],"stream":true}'非流式请求将 stream 改为 false。没有可用账号时,/healthz 可返回 503;这时先检查账号池,不能仅凭这个状态判断进程没有启动。
v1.9.45 新增“出口代理”页面。支持 HTTP、HTTPS、SOCKS5 和 SOCKS5h,账号的聊天、刷新凭证、余额、模型查询及任务请求统一走绑定代理。SOCKS5h 由代理端解析目标域名。
- 打开“出口代理”,设置每个 IP 允许绑定的 WorkBuddy 账号数,默认
1。 - 粘贴代理链接,点击“导入并检测出口”。默认勾选“检测完成后分配未绑定账号”,已有绑定保持不变。
- 检测完成后,出口列表显示实际公网 IP、容量和已绑定账号数。两条链接若检测出同一个 IP,共用该 IP 的容量。
- 勾选“启用账号代理”并保存。新账号自动分配可单独开启;也可按国内/国际区域一键分配,或逐账号选定出口。
完整链接示例(使用你自己的主机、端口、用户名和密码):
http://分组.代理账号:密码@主机:端口
socks5h://分组.代理账号:密码@主机:端口
sg、us 等仅为代理商定义的国家或分组用户名,程序保留你的输入。“代理账号”指完整代理用户名中的固定出口标识,和 WorkBuddy 账号分别管理。从基础链接生成时,程序在用户名后附加 .代理账号;其他供应商格式可用 {account} 指定位置,例如 socks5h://分组.{account}:密码@主机:端口。生成结果保存后固定,重启不会重新生成。
批量导入兼容 用户名:密码@主机:端口、主机:端口:用户名:密码、用户名:密码:主机:端口、竖线/逗号分隔及 JSON 的 host/server、port/server_port、username/user、password/pass 字段。没有协议的行使用页面选定的类型;无法确定字段顺序时提示改用完整 URL。特殊字符可用 URL 编码,如密码中的 @ 写为 %40。
代理池未启用时使用原出口。启用后,默认未绑定账号等待分配;如需继续用原出口,可打开对应开关或逐账号明确选择。绑定代理失败会单独报告代理错误,避免将健康账号计为故障;WAF 多账号拦截按实际出口 IP 隔离。代理出口故障不作为免费额度耗尽,也不触发 SG/国内付费回退。
代理与账号绑定保存在状态文件同目录的 proxy-pool.json,常见位置为 data/proxy-pool.json。该文件含代理认证信息,迁移时和现有数据目录一起保留。面板列表隐藏代理密码。程序检测出口 IP 后保存观测值,实际固定出口由代理商保证;代理商变更出口后可再次检测并调整绑定。
配置页可编辑大部分运行参数,完整字段参考 config.example.json。以下为相关配置片段,合并进已有配置即可:
{
"pool": {
"pick_mode": "sequential",
"reserve_credits": 50,
"deepseek_sg_fallback": true
},
"models": {
"strip_realm_prefix": true,
"realm_precedence": "global"
}
}| 设置 | 说明 |
|---|---|
pool.pick_mode |
sequential 为 Fill First,weighted 为加权选号;默认 weighted |
pool.reserve_credits |
保留积分线,默认 50;余额触底时按模型免费/低价判定限制消费 |
pool.deepseek_sg_fallback |
默认开启;国际免费 DeepSeek 全池耗尽后转 SG,SG 全池额度耗尽或已知余额达到保留线后,无前缀请求可继续转国内同名 4.1。国内按积分计费,需已知余额高于保留线;网络、WAF、忙碌、缺模型或余额未知不作为额度耗尽 |
models.strip_realm_prefix |
默认 true,对外模型列表使用裸名 |
models.realm_precedence |
默认 global,也可设 cn;应用于两域共有或归属未知的裸名模型 |
global.enabled |
国际区域路由开关,关闭时保留原有国内锁定行为 |
模型分组来自最近成功拉取的目录,启动预热、模型列表和面板查询会更新分组;暂时拉取失败保留已有记录。聊天路由读取本地快照,不为每次请求额外查询上游。上游之后给另一地区新增模型支持,成功刷新目录后即可参与对应区域路由。
每日 Token 限额在账号行“模型用量 / 限额”设置,按每个账号、每个模型分别保存。100M 是 100,000,000 Token,默认不限。达到上限后停止向该账号分配此模型的新请求;正在进行的请求会完成,因此最终用量可能略超限,未收到上游 usage 的请求也无法精确计量。
| 页面 | 用途 |
|---|---|
| 账号池 | 国内/国际账号状态、拖动排序、余额、签到、启停、测试对话、每日模型限额、凭证导出 |
| 用量 | 按账号、模型、区域和时间范围查看用量 |
| 积分构成 | 积分包剩余量、到期批次与到期提醒 |
| 模型与档位 | 分区模型目录、倍率、思考档位、上下文与输出上限 |
| 出口代理 | 批量导入代理、检测公网 IP、生成代理账号、设置每 IP 容量与固定账号绑定 |
| 任务中心 | 查看上游提供的成长任务与执行队列;活动与奖励以官方当期规则为准 |
| 配置 | 在线保存配置;需要重启的字段会显示提示 |
| 运行日志 | 请求记录、首字延迟、耗时、Token、错误结果,以及任务/系统日志 |
程序支持定时签到、活跃上报、旅行、Token 保活和余额刷新。国内与国际的接口与任务能力存在差异;已结束的活动或变更后的奖励以官方状态为准。
Compose 和上面的 Docker 命令只需持久化一个目录:
| 宿主机路径 | 容器路径 | 内容 |
|---|---|---|
./data/config.json |
/app/data/config.json |
配置和网关 API Key |
./data/auths/ |
/app/data/auths/ |
账号登录凭证 |
./data/state.json |
/app/data/state.json |
账号池状态、顺序、每日模型限额与计数 |
./data/usage.json |
/app/data/usage.json |
用量记录 |
./data/request-logs/ |
/app/data/request-logs/ |
启用归档时的请求元数据 |
原生程序默认凭证目录为 ./auths/、状态与用量位于 ./data/、配置为 ./config.json。完整迁移应同时备份配置、凭证和数据目录。面板“导出凭证”只导出登录凭证,不包含每日限额及历史用量。
升级前建议停止服务后备份数据,升级时保留原数据目录。容器升级用 docker compose pull 和 docker compose up -d;原生程序停止后替换程序包,再启动。
导入成功后余额还没显示? 凭证入池成功与余额刷新分开执行,稍后刷新面板。持续没有余额时检查运行日志中的后台激活、签到或余额查询错误。
模型列表加载失败? 点击“重新获取”,并确认对应区域有可用账号。测试弹窗可先使用默认模型,但实际是否可调用仍取决于账号及上游支持。
国内独有模型仍被发到国际? 确认运行版本至少为 v1.9.40,刷新对应区域目录;显式填写了 global: 前缀时仍按该前缀路由。
国际 4.1 和 SG 都用完了,国内同名模型仍没被使用? 升级至 v1.9.41,使用无前缀 deepseek-v4.1-flash,保持 SG 回退开启,并确认国内账号余额已刷新且高于保留积分线。显式 global: 仍固定在国际区;直接请求 deepseek-v4.1-flash-sg 也不会改成国内 4.1。新请求在国际免费额度或 SG 恢复后重新优先它们。
多图会话收到 413? server.max_body_mb 默认 0,表示关闭网关请求体上限。显式设为正数后,超过该大小会返回 413 request_body_too_large;可在配置页调大或置 0,保存即时生效。例如配置 32 时的响应如下:
{"error":{"message":"请求体超过网关内存护栏 32 MB:这是网关侧上限(防止单请求吃爆进程内存),不是上游限制;网关默认不设该上限(server.max_body_mb=0 = 不预拦截,大请求交上游自然响应),当前值由运维显式配置——可在面板「请求体上限」调大或置 0 关闭(保存即时生效)。多图会话易触发:历史图片每轮以 base64 重发(膨胀约 37%),请压缩图片或调大上限后重试","type":"api_error","code":"request_body_too_large"}}流中断或 WAF 错误? HTTP 200 只说明流已建立,不代表完整生成成功。请提供发生时间、版本、模型及对应运行日志;已经输出内容的流不能简单靠整段重试无缝续接。
配置保存提示 permission denied? 当前镜像的配置应位于可写的 /app/data/config.json。检查数据卷和 UID 10001 的写入权限;不要沿用旧版只读挂载 /app/config.json 的方式。
go test ./...
go vet ./...发布流程分为 程序包构建 与 容器镜像构建。正式版本由 Git tag 注入,镜像发布 v版本号 与 latest,支持 linux/amd64 和 linux/arm64。程序包支持 Windows、Linux 和 macOS,具体资产见 Releases。
反馈问题请前往 本仓库 Issues,附运行版本、部署方式、发生时间、模型、脱敏日志及复现步骤。不要上传 API Key、Access Token、Refresh Token 或完整凭证。
采用 MIT License,保留原作者版权与许可声明。本项目为非官方网关,请仅使用本人或获授权的账号,并遵守相关服务条款。服务默认提供 HTTP;公网使用时应配置鉴权与 HTTPS 反向代理。配置文件与导出凭证包含敏感数据,请妥善保存。