Skip to content
Practice019Public

About

Tencent CodeBuddy / WorkBuddy 的 OpenAI 兼容反向代理 | 多账号池 · 熔断 · 会话粘性 · 本地管理控制台

Topics

Resources

Security policy

Stars

28 stars

Watchers

0 watching

Forks

Latest commit

 

History

850 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

multi2api

multi2api

把 13 个 AI 上游聚合成 OpenAI 兼容 API 的多账号网关
统一鉴权 · 账号池轮转 · 熔断与冷却 · 会话粘性 · 定时签到与续期 · 管理控制台

这是什么

multi2api 是一个多上游聚合反代网关:把多个上游账号聚合成一个 OpenAI 兼容的 base_url + api_key。你的应用只认 OpenAI 协议,网关负责背后的上游选号、额度、 签到、续期、冷却与排障。

你的应用 ──► multi2api ──┬──► WorkBuddy          腾讯 CodeBuddy 桌面端(默认上游)
                         ├──► WorkBuddy AI       海外版(www.workbuddy.ai)
                         ├──► CodeArts           华为云 CodeArts
                         ├──► Loomy              讯飞 Loomy 桌面端
                         ├──► Cline              Cline 桌面端
                         ├──► TRAE               字节 TRAE
                         ├──► Raccoon Work       商汤小浣熊
                         ├──► LobsterAI          有道龙虾
                         ├──► Qoder              阿里 Qoder
                         ├──► Qoder(中国版)
                         ├──► ZCode              Z.ai / 智谱 GLM Coding Plan
                         └──► MiniMax Code       MiniMax(Anthropic Messages 协议)

⚠ 它不再是 WorkBuddy 专用。架构上"加一个上游 = 加一个目录 + 实现一组接口 + 配置加一段,核心零改动"——这是本项目最硬的判据,由 internal/gateway/arch_test.go 的可执行断言守着(不是约定):

  • 核心包不得依赖任何具体上游
  • 上游之间不得互相依赖
  • 新增上游只需在 cmd/server/main.go 加一行 registry.Register(...)

从 4 个上游扩到 13 个的过程中,核心包一行没改 —— 这条判据是实践过的,不是口号。

✨ 核心能力

能力 说明
🔌 OpenAI 兼容 POST /v1/chat/completions(流式/非流式)、POST /v1/images/generations(生图)、GET /v1/models、GET /healthz;任何 OpenAI SDK 直接可用
🧠 统一账号池 多上游账号混在一个池:健康/冷却/熔断/禁用/在途状态机,按权重自动选号,坏号自动摘除
🎨 生图 生图端点 + 对话工具自动注入:拿任一对话题一句"画一张…"就自动调生图模型。返回可预览的裸 URL(见下方说明)
🛠️ 对话工具注入 上游自报工具(Loomy 的生图 / 联网搜索)。agent 框架零配置可用 —— 客户端自带的工具原样透传,网关注入的自己执行
🔄 自动调度 定时签到、保活、旅行领奖、额度刷新、凭证续期——全部由各上游自报的清单生成,加新上游核心零改动
❤️‍🩹 自愈机制 主动健康检查(每 10 分钟探测冷却/熔断中的账号并提前恢复)、熔断错误按时间窗衰减(零散错误不攒坏账号)、凭证续期连续失败自动禁用
🛡️ 错误治理 硬冷却(额度耗尽)/软限流/会话失效/内容拦截分类处置:该换号换号、该禁用禁用。上游的业务失败是 HTTP 200 + body 里的业务码的,也按业务码处置
🖥️ 管理控制台 /ui 单页:仪表盘 / 账号池 / 模型目录 / 对话测试 / 请求日志 / 设置 / 上游专属标签页
🔑 安全默认 api_key 鉴权、密钥只在本机注入、昵称自动打码、凭证按上游分子目录存放

📸 界面预览

仪表盘

账号池

Loomy 新手任务

Loomy 邀请码

请求日志

🐾 已接入上游

上游 账号形态 控制台能力
WorkBuddy(默认) OAuth 设备码登录 签到 / 保活 / 成长计划 / 猫猫旅行 / 任务一键完成
WorkBuddy AI(海外版) OAuth 设备码登录(www.workbuddy.ai) 对话 / 模型 / 额度查询(海外版无签到/成长/旅行,显式禁用)。按凭证的 channel 字段自动选域,国内与海外账号可同池共存
CodeArts OAuth + DPoP(约 2 小时 STS,自动续期) 签到(福利领取)/ 额度探测
Loomy session(无 TTL) 手机号验证码登录 / 新手任务一键完成 / 邀请码绑定 / 批量粘贴导入 / 额度实时查询 / 生图 + 联网搜索
Cline WorkOS 设备码轮询 余额查询 / 后台续期(不起本地端口,服务器部署天然可用)
TRAE JWT + 消费型 refreshToken 页内添加账号(浏览器授权) / 每日自动签到 / token 自动续期 / 权益包额度
Raccoon Work 浏览器授权(微信扫码 / 手机号) 积分余额 / 登录奖励 / onboarding 状态
LobsterAI 浏览器 OAuth 回跳 三步式签到领取积分 / 定时自动签到
Qoder / Qoder 中国版 PKCE 设备码 积分余额 / 每日签到 / WASM 加密推理桥
ZCode API Key(OpenAI 协议)或 OAuth JWT(Anthropic 协议) 额度查询 / 令牌诊断 / 粘贴导入。首个非 OpenAI 协议的上游 —— JWT 通道需要协议转换
MiniMax Code(中国版) OAuth 设备码 + PKCE(不起本地端口) 积分余额 / 每日签到(幂等)/ 粘贴导入。第二个 Anthropic 协议族上游 —— 只有 Anthropic 端点,没有 OpenAI 形态

🚀 快速开始

A. 下载预编译二进制

到 Releases 下载对应平台包(用 SHA256SUMS.txt 校验):

  • Windows:wb2api-server-windows-amd64.zip(exe + config.example.json + start.bat)
  • Linux:wb2api-server-linux-amd64.tar.gz / wb2api-server-linux-arm64.tar.gz
  • macOS:wb2api-server-darwin-amd64.tar.gz / wb2api-server-darwin-arm64.tar.gz

全部五个平台由 CI 构建(本机不手工上传产物),命名统一为 wb2api-server-<goos>-<goarch>.<zip|tar.gz>。

# Windows
unzip wb2api-server-windows-amd64.zip
cp config.example.json config.json     # 编辑:开上游、填 api_key
./wb2api-server -config config.json

B. 从源码构建

go build -o wb2api-server ./cmd/server    # Go ≥ 1.22(CI 用 1.22.5)
./wb2api-server -config config.json

添加账号

控制台「账号池」分组行点「+ 添加账号」,各上游走自己的流程:

  • WorkBuddy / CodeArts / TRAE / LobsterAI / Qoder / Raccoon:点「添加账号」后 由网关用无痕窗口自动打开授权页(见下方 login.*)。 授权页里有各自的登录方式(扫码 / 设备码 / 手机号,取决于上游)。
    • Raccoon:打开的是官方登录页,页内有微信扫码与手机号短信两个 Tab。 过完滑块点授权后会回调到本机端口,网关当场换取凭证。
    • 窗口被关掉时可点「重新无痕打开」,或点「复制链接」粘贴到无痕/隐私窗口。
  • Cline:WorkOS 设备码轮询,不起本地端口 —— 服务器部署也能用。
  • ZCode:只需要粘贴一个 API Key,不需要打开浏览器、不需要验证码。 点「+ 添加账号」后粘贴 Z.ai 或 BigModel 的 Key(支持平台前缀 zai: / bigmodel:,以及 Coding Plan 标记 cp:,也支持一次粘贴多行)。
    • 平台可以省略 —— 网关会探测这把 Key 属于哪个平台并记在凭证上。
    • 只有走 Coding Plan 的 JWT 通道时才需要 zcode.jwt_captcha: true (那会用系统浏览器打开一个本机页面过一次滑块,需要图形界面)。
  • MiniMax Code:与 Cline 同型 —— 设备码 + PKCE 轮询,不起本地端口, 服务器部署也能用。点「+ 添加账号」会打开官方的设备授权页。
    • 也可以直接「批量导入」粘贴 token:单个 JSON 对象、[ ] 数组, 或把多个独立文件的内容依次粘进来(会自动合并)。
    • 客户端登录态文件(accessToken / refreshToken / expiresAtMs, camelCase)也认 —— 直接从客户端 auth.json 里复制即可。
  • Loomy:点「+ 添加账号」可输手机号 + 验证码登录;或点「批量导入」直接粘贴 JSON([{"phone":"...","userid":"...","session":"..."}],支持多条);或把凭证放进 auths/loomy/loomy-<uid>.json 后点「重载 auths」。

⚠ 关于无痕窗口:默认给浏览器一份独立 profile(临时目录), 这次授权从零 cookie 开始 —— 避免浏览器里已登录的账号把会话串到别的账号上。 代价是需重新输入账号密码。

生图怎么用

两种方式,任选:

# ① 对话里说一句(网关自动调生图模型)
curl http://127.0.0.1:7863/v1/chat/completions \
  -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
  -d '{"model":"loomy/deepseek-v4-flash-0731","messages":[{"role":"user","content":"画一张:赛博朋克城市夜景"}]}'

# ② 直接调生图端点(OpenAI 兼容)
curl http://127.0.0.1:7863/v1/images/generations \
  -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
  -d '{"model":"loomy/doubao-seedream-5-lite","prompt":"赛博朋克城市夜景","n":1,"size":"1024x1024"}'

生图模型会出现在 GET /v1/models 里,带 capabilities: ["image_generation"] —— 调用方据此知道该用 /v1/images/generations 而不是 /chat/completions。

⚠ 返回的图片 URL 是"裸 URL"(已剥掉 COS 签名)。这不是偷懒:上游给的是签名 URL,而它对 HEAD 请求必然 403(COS 把 HTTP method 也算进签名,URL 是按 GET 签的), 而预览器 / 取图器 / 文件发送队列通常先发 HEAD 探测 —— 一探测就失败, 表现为"图片无法预览 / 拿不到文件实体"。

原始签名 URL 保留在同级的 url_signed 字段里作兜底(bucket 若改成私有读, 会自动退回它)。

agent 框架里用(零配置)

网关把上游工具注入给模型,并在网关侧执行 —— 所以 agent 框架(DSH / Claude Code / Cursor 等)不需要在配置里声明任何工具:

模型调谁 谁执行 agent 框架看到什么
客户端自己的(bash / read / …) 客户端 正常的 tool_calls
网关注入的(generate_image / web_search) 网关 只见模型"直接回了张带图的 markdown"

即两边按工具名分工,互不打架。想关掉注入:server.disables_chat_tools: true (⚠ 只影响注入;客户端自己带 tools 时本就按名分工,与此开关无关)。

⚙️ 配置说明

全部配置在 config.json(参考 config.example.json)。核心项:

项 默认 说明
listen 127.0.0.1:7863 监听地址(默认只绑本机)
api_key — 调用方 Bearer 鉴权;为空则不鉴权(不建议)
auth_dir ./auths 凭证根目录,各上游分子目录存放
server.* — max_body_mb(请求体上限)、disables_chat_tools(关工具注入)
pool.* — 账号池:熔断阈值、在途上限、冷却时长、health_check_interval_seconds(冷却探活,默认 600s)、revive_probe_interval_seconds(解封探活,默认 86400s / 24 小时,设置页可改)
schedule.* — 签到 / 保活的间隔与开关(统一 30 分钟被动扫描)
session_sticky.* enabled=true / ttl=30m / gc_interval=5m 会话粘性:同一会话固定用同一账号
upstream.* 内嵌默认 出站身份(UA / 客户端版本 / 设备 token / IP 透传)
prompt.* 内嵌默认 系统提示词(mode = custom / passthrough,空值按 custom;file 可指向自定义文件)
upstash.* — 可选 Redis/Upstash 后端;不配则纯内存

各上游的配置段(都可以整段省略 —— 上游一律启用;要写就写 auth_dir 等):

⚠ 没有 enabled 开关(v1.8.0 起移除)。上游一律启用,段缺席也照常启用。 配置里残留的 "enabled": false 会被当成未知字段忽略。 要停用一个上游,把它的凭证从 auths/ 移走。

workbuddy · workbuddy_intl · codearts · loomy · trae · cline · raccoon · lobsterai · qoder · zcode · minimax

MiniMax Code 特有配置段:

项 默认 说明
minimax.auth_dir <auth_dir>/minimax 凭证目录(minimax-*.json)
minimax.account_base ""(官方 account.minimax.cn) OAuth 端点基址
minimax.api_base ""(官方 agent.minimax.cn) 业务 / 推理端点基址。⚠ 与 account_base 必须分开 —— OAuth 与业务是两个不同的 host,打错会得到 404(而 404 在本仓通常表示「账号不存在」)
minimax.timezone_id ""(按本机推断) 签到端点要的 IANA 时区。⚠ 它是 query 参数,而且放错位置也返回 HTTP 200(回 1406010011 invalid timezone_id)—— 所以「200 = 成功」在这个端点上不成立
minimax.pool_accounts true 是否并入核心账号池

⚠ MiniMax 只有 Anthropic Messages 一条通道(/mavis/api/v1/llm/v1/messages), 没有 OpenAI 形态的端点可退。所以它的协议转换是无条件的,走与本仓 ZCode JWT 通道同一份共享转换层(internal/anthroconv)—— 两个消费者 一套判据,不会分叉。

与 ZCode 不同的是:它不需要任何额外依赖(无验证码、无浏览器), 设备码登录在服务器上就能跑完。

协议事实来自开源参照实现的源码逐行提取,未在真实上游做过对话验证 —— 上游分组旁会显示这句提醒。

ZCode 特有配置段:

项 默认 说明
zcode.auth_dir <auth_dir>/zcode 凭证目录(zcode-*.json)。api-key 与 jwt 两种凭证共用
zcode.origin ""(按账号自动选) 平台基址。凭证里的 origin 优先 —— Z.ai(api.z.ai)与 BigModel(open.bigmodel.cn)是两套独立平台,同一个 Key 不能跨用
zcode.oauth_base ""(官方线上) 页内登录(CLI OAuth)的端点基址
zcode.billing_origin ""(官方线上) 额度查询端点的 origin。⚠ 与 oauth_base 必须分开:登录路径 /oauth/cli/init 不含 /api/v1,而计量路径 /api/v1/zcode-plan/… 自带它 —— 混用会拼出 /api/v1/api/v1/…(404)
zcode.pool_accounts true 是否并入核心账号池
zcode.jwt_captcha false JWT 通道的浏览器验证码求解。⚠ 需要图形界面 —— 服务器/容器部署下开了也必然超时

⚠ ZCode 的两条通道需要分清(这是本上游与其它所有上游最大的不同):

通道 协议 验证码 额外依赖 端点
api-key OpenAI 不需要 零 api.z.ai/api/paas/v4
jwt Anthropic 每请求要 浏览器 zcode.z.ai/api/v1/zcode-plan/anthropic

API Key 通道是推荐路径(粘贴即用、服务器可用)。Coding Plan 的 Key 走 /api/coding/paas/v4 —— 官方文档明示它与通用端点额度不互通, 所以凭证里要标 "coding_plan": true,否则会"有额度却报无额度"。

JWT 通道必须做协议转换,因为实测它的 OpenAI 形态不存在:

/api/v1/zcode-plan/paas/v4/chat/completions   → 404   想当然的路径
/api/v1/zcode-plan/anthropic/v1/messages      → 401   只有这个

ZCode 凭证格式(auths/zcode/zcode-<uid>.json):

{"auth": {"kind": "api-key", "api_key": "你的Key.secretKey", "coding_plan": false}}

或直接在控制台「添加账号」粘贴 Key。也支持平台前缀与 Coding Plan 标记:

zai:你的Key.secretKey          指定平台(Z.ai)
bigmodel:你的Key               指定平台(BigModel)
cp:你的Key.secretKey           标记为 Coding Plan 的 Key

「添加账号」的浏览器行为(login.*):

项 默认 说明
login.open_browser true 点「+ 添加账号」时由网关自动用无痕窗口打开授权页;false = 只回授权链接
login.isolated true 给浏览器一份独立 profile(临时目录,48h 后自动清理):这次授权从零 cookie 开始,代价是需重新输入账号密码;false = 复用当前 profile,仅开无痕窗口
login.browser ""(自动探测) 显式指定浏览器可执行文件路径;探测顺序 Edge → Chrome → Brave → Chromium(macOS 走 open -n -a)

本机没有任何受支持的浏览器、或运行在无 GUI 环境时,启动日志会说明原因, 「添加账号」自动退回「复制链接 → 粘贴到无痕窗口」的老路径(功能不受影响)。

Loomy 特有配置段:

项 默认 说明
loomy.client_data_dir ""(自动探测) 本机 Loomy 客户端 Local Storage 目录(决定本机拾取/额度回退)
loomy.login_mode auto auto 先本机拾取 / sms 只走手机号验证码 / local 只本机拾取
loomy.sms_* 内嵌默认 讯飞账号网关(base_url / app_id / access key),一般不用改

TRAE 特有配置段:

项 默认 说明
trae.auth_dir <auth_dir>/trae 凭证目录(trae-*.json,嵌套或扁平两种形态都认)
trae.refresh_interval_seconds 1800 后台 token 自动续期扫描间隔(<=0 关闭)
trae.checkin_enabled true 每日自动签到(30 分钟扫一次,幂等)
trae.agent_base_url / ug_base_url / oauth_base_url 内嵌默认 三个 host 覆盖(一般不用改)

🖥️ 管理控制台

访问 http://127.0.0.1:7863/ui。需要登录(见下)。

首次登录怎么做(三步)

  1. 启动程序,浏览器打开 http://127.0.0.1:7863/ui;
  2. 因为账号库还是空的,页面会让你创建管理员:填用户名 + 口令(8–128 位)、 答一道人机校验题(本地 SVG 算术题)。这一步建出来的是管理员(角色 10), 只可能成功一次;
  3. 之后再打开 /ui 就是登录页,用刚建的这个账号登录。

这个部署只有一个账号,就是你在第 2 步建出来的那个管理员。 想换口令用顶栏的 「改密码」;真的忘了口令,就备份后删掉 data/accounts.json 重来(等于重新首启)。

为什么不是"能注册成员、只是先关掉"

用户口径(2026-10-19):「我们那个用户和管理员,我觉得可以只要一个管理员就行了, 只要一个账号。用户其实可以不用。」⇒ 成员这个角色被取消了,不是被停用:

  • 建号只剩一条路(账号库为空时的那次首启 bootstrap),服务端写死管理员角色;
  • 账号库非空之后,POST /admin/auth/register 整体关闭 —— 一律 403 + 稳定码 register_closed(文案:「本部署为单账号管理员模式:注册只在 账号库为空时开放(用于建第一个管理员),账号已存在则注册入口关闭。请用管理员账号登录。」);
  • 请求体里塞 role 之类字段会在解码层被拒(400 bad_request)—— 没有任何姿势 能建出非管理员账号;
  • 改造前留在盘上的非管理员历史记录:加载不崩、打一条启动日志点名,登录回 401 member_retired(文案「成员账号已取消,请用管理员账号登录」,前端据此回登录页)
    • 一条服务端日志;旧会话在 SessionStore.Lookup 就被拒并顺手撤销。 ⚠ 错误码顺序是先验口令再看角色,所以配错口令仍是 bad_credentials, member_retired 不构成"这个用户名存在吗"的枚举口。

账号与口令落在 data/accounts.json(bcrypt 哈希,明文不落盘),会话落在 data/sessions.json。这两份都在 data/ 下、已 gitignore。

三种凭据分工(别混用)

凭据 用在哪 怎么给
账号口令 你自己用浏览器进控制台 登录页 → HttpOnly 会话 cookie(页面里不存任何凭据)
admin_token 脚本/CI 打 /admin/*、或 ?token= 一条链接免口令进控制台 Authorization: Bearer <admin_token>;http://127.0.0.1:7863/ui?token=<admin_token>
api_key 调 /v1/*(给调用方) Authorization: Bearer <api_key>

⚠ 破坏性变更:api_key 不再能进管理面。以前它同时是门禁,于是 "给客户端配一把对话 key"等于"交出管理台"。现在 GET /status 与 /admin/* 只认「会话」或 admin_token。若你有脚本用 api_key 打 /status,改成 admin_token。用 api_key 打这些接口会拿到 401 auth_required。

改造前那种成员账号(角色 1)已取消:它拿到的是 401 member_retired (「成员账号已取消,请用管理员账号登录」)。两者刻意分开 —— auth_required 是"没带凭据",member_retired 是"这个账号在这个版本里不再是身份", 前端对两者都回登录页,运维看日志能一眼分辨。

角色(只有一种)

  • 管理员(10):控制台的全部面板与端点。
  • 成员(1) 已取消:这个值只作为只读兼容常量留着,用途是"把盘上的旧记录 认出来再拒掉"(见上)。没有任何代码路径会建出它,也没有任何面板按它分流 —— 管理面原先那张"成员白名单"整张删掉了,canAccess 只判管理员。 历史遗留的 403 forbidden_role 分支保留为 fail-closed(口径下不可达,代码里有注释)。

反批量(默认全开,四层各自独立)

层 缺省 表现 关掉/调整
限速 20 次 / 20 分钟 / IP 第 21 次 429 rate_limited(带 Retry-After) console.auth_rate_limit / auth_rate_window_seconds
请求体上限 8 KB 超了 413 body_too_large 固定值(改代码)
人机校验 开 未答/答错 400 captcha_required;未启用时发题端点 404 captcha_disabled console.disable_captcha: true
会话签发上限 开 短时间疯狂登录 → 429 固定值(改代码)

console.disables_register 在本版本已不改变行为(键仍被解析,旧配置文件照收; 启动日志会如实说明,不静默忽略):单账号口径下"能不能建号"只有一个答案 —— 账号库空不空,也就是注册入口是否开放。改造前它和"库空不空"是两个来源,必然有一天 互相矛盾(配置说开、库里已有账号 ⇒ 页面给出一个点了必然 403 的入口)。

面板

  • 仪表盘:网关状态(账号总数 / 健康)+ 调用统计(总请求 / 成功率 / 消耗 token / 平均 TTFB 等)+ API 接入信息。
  • 账号池:每个上游一张表(列集由上游自报,首列统一为「上游」;昵称自动打码), 行内动作(签到 / 额度 / 保活 / 禁用 / 移除)按上游自报渲染。
  • Loomy 专属标签页:新手任务(一键完成单账号 / 全部账号)、邀请码(绑定别人的码、 查看自己生成的码,含 active/exhausted 状态)。
  • 模型 / 对话测试 / 请求日志 / 设置:日常排障所需都在页面上。
  • 顶栏:当前登录者 + 角色标记 + 改密码 + 登出。 ⚠ 改口令不需要重启:当前这个浏览器当场继续可用,其它设备的登录立即失效 (要改别人的口令、或改部署级凭据,走 API 管理页的两个「轮换」按钮 —— 同样免重启、立即生效)。

🔌 API

curl http://127.0.0.1:7863/v1/chat/completions \
  -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
  -d '{"model":"loomy/deepseek-v4-flash-0731","messages":[{"role":"user","content":"hi"}],"stream":true}'
  • 模型名带上游前缀:loomy/xxx、workbuddy/xxx、codearts/xxx…;裸模型名走默认上游。
  • GET /v1/models:各上游目录合并(含生图模型,带 capabilities 标注)。
  • POST /v1/images/generations:OpenAI 兼容生图。
  • GET /healthz(无鉴权,负载均衡友好);GET /status(需控制台身份且必须是管理员)。
  • 管理 API:/admin/*(默认只建议本机使用,需要会话或 admin_token)。

🛡️ 安全与合规

  • 网关默认只绑本机;对外暴露请自行加反向代理与更严格的鉴权。 ⚠ 一旦映射到公网,空库时的首启就是"陌生人在你机器上建账号"的入口, 而建出来的那个账号还是管理员 —— 所以反批量四层默认全开(见上), 并且建议先在本机把管理员建好再映射出去:库非空之后那个端点就是 403 register_closed,没有可打的入口。
  • 控制台的登录凭据只以 HttpOnly cookie 形式存在浏览器里,页面源码与 localStorage 里都没有任何钥匙;/ui 的响应体搜不到 api_key/admin_token。
  • 凭证按上游分目录存于 auths/(已 gitignore);控制台昵称自动打码。
  • Loomy 短信登录的签名 key 随官方安装包分发(官方注释自述"混淆而非加密"),可通过 loomy.sms_* 覆盖。
  • 本项目面向自有账号的自动化管理与协议理解;请遵守各上游的服务条款与额度限制, 控制并发、避免滥用。

🛠️ 开发

go build ./... && go vet ./...        # 构建 + 静态检查
go test ./... -count=1                # 全量测试(含假上游契约测试,CI 中不跳过)
gofmt -l .                            # 格式检查

⚠ Windows 上 gofmt -l . 会误报(CRLF 被当成格式问题)。本地判真实情况要先 LF 归一化再查;CI(Linux)不受影响。

⚠ go test -race 在 CI 里是 advisory(continue-on-error: true)。 本机若无 gcc 则跑不了 —— 不要假装跑过。

  • 架构:internal/gateway 是唯一接缝 —— Provider 4 方法 + 若干可选扩展点 (登录流程 / 凭证加载 / 额度探测 / 每日动作 / 列集自报 / 凭证寿命 / 后台任务 / 生图 / 对话工具 / 诊断端点……)。加新上游不改核心; internal/gateway/arch_test.go 自动约束包依赖方向(判据是包级依赖图, 不是源码文本匹配)。
  • CI(.github/workflows/ci.yml):go mod tidy 检查 / build / vet / gofmt / 全量测试(五项门禁,缺一不可合)。
  • 发布(.github/workflows/release.yml):打 v* 标签自动构建 五个平台(windows-amd64 / linux-amd64 / linux-arm64 / darwin-amd64 / darwin-arm64)、生成 SHA256SUMS.txt 并挂到 GitHub Release。 发布 Release 的说明由人写(含回滚方案),workflow 只负责产物。

免责声明

本项目仅用于对自有账号/自有软件协议的理解与自动化,请遵守各相关平台的服务条款。

About

Tencent CodeBuddy / WorkBuddy 的 OpenAI 兼容反向代理 | 多账号池 · 熔断 · 会话粘性 · 本地管理控制台

Topics

Resources

Security policy

Stars

28 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages