Repository navigation
Releases: yreidev/workbuddy2api-panel
Release list
v1.5.1
对照官方 npm 上新发的 CLI 2.174.0 核对了登录:登录和刷新令牌的接口没有变,网关不用跟着改。顺带补上两处跟官方不一致的地方。
修复
- 添加账号时,上游以「席位已满 / 授权已过期 / 试用已过期」(
12005/11212/11216)拒绝登录,面板直接显示原因和上游的提示,例如「登录被拒:席位已满(code=12005):…」。以前只显示http_error: upstream 403,看不出为什么。其他登录请求出错时,错误信息也带上上游的业务码和提示。 - 导入官方客户端格式的凭证时,到期时间按毫秒认:官方存的是毫秒,以前当成秒,网关一直以为令牌离到期还早、不会主动刷新,令牌真到期后这个号的对话全部 401。网关自己登录、刷新写的凭证不受影响。
- Docker 镜像:
ghcr.io/yreidev/workbuddy2api-panel:1.5.1(同一镜像还有1.5、1标签) - 升级方法:见部署与运维
- 校验:
sha256sum -c --ignore-missing checksums.txt - 完整变更:v1.5.0...v1.5.1
v1.5.0
上游成批风控一个域的账号时,网关会暂停这个域,不再把剩下的号一个个送进风控;被 11140 限制的号提示去官方申诉。渠道指纹多清洗几类常见的客户端提示词。账号池宽屏默认改成卡片;请求记录和运行日志分成两页,失败的请求直接显示原因。
新增
- 风控波暂停:15 分钟内同一个域有 2 个号被上游
11140「账号存在异常行为」限制,就把这个域其余的号暂停 30 分钟,账号池里显示为「风控暂停」,到期自动恢复,点「解冻」可提前恢复单个号。另一个域照常可用。阈值、统计窗口和暂停时长可在配置页的「账号池与流量治理」里改,阈值填0关闭,见网关与选号。 - 请求记录显示失败原因:失败的请求多一列「原因」,是回给客户端的错误消息(流中途出错时是上游的错误帧),最多 200 字,悬停看全文,搜索框也能搜;归档里一起保存。
- 渠道指纹清洗多认几类会被上游以
code 11128拦下的内容,系统提示词、用户、助手、工具消息里都会改:- 「You are … powered by / built on / created by …」这类自我介绍句,整句换成中性的一句;
- DeepSeek Harness 的提示词;
- OhMyOpenCode 插件的身份句。
变更
- 「请求记录」从「运行日志」页拆出来,侧边栏单独一个入口。「运行日志」只放网关的系统和任务日志,每次调用的流水行不再写进去(终端和
docker logs照常打印):以前三类日志共用最近 500 行,请求一多,签到结果和告警很快就被挤掉。频道改成「全部 / 任务 / 系统」,旧的「对话」频道链接会转到请求记录。 - 账号池宽屏默认显示卡片,放得下几列就排几列;冷却中的卡片描橙边、禁用的描红边,冷却原因和限流的模型单独列出,点卡片右上角的箭头看详情。搜索框那一行可以切回表格,选了哪种记在本浏览器;卡片视图用旁边的下拉排序,手机端也能排序了。
- 被
11140限制而禁用的号,原因从「重新登录」改成「去官方申诉」:这类号 token 是有效的,重新登录一般解不开。 - 面板里的悬停说明(积分、限流解封时间、User-Agent、积分构成分段等)不再用浏览器自带的小字提示,改成跟面板配色一致的提示框,悬停片刻淡入,用键盘 Tab 移到上面也会显示;代码、密钥和日志框的底色也统一跟随浅色 / 深色主题。
- Docker 镜像:
ghcr.io/yreidev/workbuddy2api-panel:1.5.0(同一镜像还有1.5、1标签) - 升级方法:见部署与运维
- 校验:
sha256sum -c --ignore-missing checksums.txt - 完整变更:v1.4.0...v1.5.0
最新构建 v1.5.1(50442a7)
随 main 分支自动更新的构建,与 Docker 镜像 latest 同步,下一次推送会覆盖这里的文件。正式版本见带版本号的 Release。
- 版本:
1.5.1 - 提交:50442a7
- 构建时间:2026-10-24 21:54(UTC+8)
- 校验:
sha256sum -c --ignore-missing checksums.txt
v1.4.0
面板有了网页图标。
新增
- 面板有了网页图标,浏览器标签页和手机主屏幕上都能认出来。
变更
- 更新开源许可,见仓库的 NOTICE;发布包和 Docker 镜像附带许可文件,「版本信息」窗口列出许可和源码地址。
- Docker 镜像:
ghcr.io/yreidev/workbuddy2api-panel:1.4.0(同一镜像还有1.4、1标签) - 升级方法:见部署与运维
- 校验:
sha256sum -c --ignore-missing checksums.txt - 完整变更:v1.3.0...v1.4.0
v1.3.0
可以给别人发客户端密钥了:每个密钥单独限到期、用量和模型,用量按密钥统计。Base URL 多写了 /v1 时,客户端能直接看到怎么改。
新增
- 面板新增「密钥」页,管理客户端密钥:给别人用时建一个发过去,不用再把
api_key发出去。- 客户端密钥只能调
/v1/*,登不了面板。api_key改叫管理员密钥,照旧能登面板、调全部接口,不受下面这些限制。 - 每个密钥可以停用、设到期时间、设每天(北京时间 00:00 重置)和总量的请求次数 / token / 积分上限、设模型白名单。
- 白名单按经模型路由改写后实际发上游的模型名匹配,只认
*通配;/v1/models只列放行的模型。 - 原文随时能复制、能重新生成;「接入方法」给出各客户端的填法。
- 客户端密钥只能调
- 被拦下的请求按入口协议回错误并说明原因:
- 停用、过期、删掉回 401;
- 白名单外的模型回 403;
- 到上限回 429,带
X-Should-Retry: false让 SDK 别自动重试,每天的上限另带到 00:00 的Retry-After。
- 请求次数只算成功的请求:没号可用、上游报错的事后退还,号池出问题时客户端的自动重试不会把次数烧光。
- 用量统计加密钥维度:
- 用量页多了「按密钥」明细,可以按密钥筛,整页只算这个密钥的请求;
- 请求记录多了「密钥」列,搜索也认密钥名;
- 1.3.0 之前的数据显示为「未区分」。
- 只要建过客户端密钥,
/v1/*就必须带有效密钥,api_key为空也一样,免得白名单和上限一绕就过。api_key为空时面板谁都能打开、看得到密钥原文,「密钥」页会提醒先设管理员密钥。 - 密钥存在数据目录的
api_keys.json(0600),备份时记得带上。
修复
- 请求发到
/v1/v1/...(客户端自己会拼/v1,Base URL 又写了/v1)时,网关回 400 并说明「Base URL 不要带 /v1」。以前回 404,Claude Code 收到 404 一律提示所选模型不存在或没有权限,看不出是地址写错了。Claude Code 的路径按 Anthropic 格式回,其余入口按 OpenAI 格式回;这类请求不校验密钥,也不打上游。
- Docker 镜像:
ghcr.io/yreidev/workbuddy2api-panel:1.3.0(同一镜像还有1.3、1标签) - 升级方法:见部署与运维
- 校验:
sha256sum -c --ignore-missing checksums.txt - 完整变更:v1.2.1...v1.3.0
v1.2.1
上游错误按官方客户端的错误码表重新归类,国际版 deepseek 不再因为一次「模型繁忙」整号停十分钟;客户端发来的压缩请求体也能正常处理了。
变更
- 上游错误先看业务码再看状态码和文案,码表和归类照官方客户端(内置 CLI 的错误码枚举),对照见官方客户端对照 · 错误码:
14003「模型繁忙」和每秒、每分钟限额(6001600260056006)没给重置时间时,只冷却这个号的这个模型约 30 秒,当场换号重试。以前落进通用 429,整个号冷却约 10 分钟:10-20 生产上两个国际版号各撞一次 14003 就全停了。所有号的这个模型都在冷却时回 429 并带Retry-After,客户端稍等重试即可;- 按模型限额从只认
6004扩到6000–6008,冷却到上游给的重置时间,换别的模型照样可用; - 额度用完的业务码(
1400114012140131401414019,以前只认14018)按余额不足冷却到次日 04:00,不再冷却十分钟后又被选中; 14015(授权过期)、14016(企业未激活)按账号故障软冷却,原因里带业务码;10105(同时进行的会话太多)账号冷却约 60 秒;- 流式回复中途的错误帧同样按业务码处置;
- 错误响应的
gateway_hint按业务码细分:模型繁忙、按模型限额、会话太多各有说明。
- 上下文超限按官方的词表认各家模型供应商的说法(
maximum context length、Input length too long、413Request Entity Too Large等),不罚账号、不换号、原文返回;以前只认11115和prompt is too long,其余的会被当成限流或普通错误换号重试。
修复
- 客户端发来压缩过的请求体(
Content-Encoding为 gzip、deflate、br、zstd,或没标头但内容是 gzip)时网关先解开再处理。以前原样转给上游,上游回11101(invalid character '\x1f'),生产 10-19 至 10-20 有四十多次。解不开或不是合法 JSON 的请求在网关就回 400,不再打上游。
- Docker 镜像:
ghcr.io/yreidev/workbuddy2api-panel:1.2.1(同一镜像还有1.2、1标签) - 升级方法:见部署与运维
- 校验:
sha256sum -c --ignore-missing checksums.txt - 完整变更:v1.2.0...v1.2.1
v1.2.0
Claude Code 和 Codex 可以直接接网关了,配上模型路由后客户端不用配模型。两个入口目前只用离线测试验证过翻译与转发,还没有拿真实的 Claude Code、Codex 跑过长对话。
新增
- Claude Code 入口
POST /v1/messages(Anthropic Messages 格式)与POST /v1/messages/count_tokens,Codex 入口POST /v1/responses(OpenAI Responses 格式)。请求翻译成 OpenAI 对话格式后走和/v1/chat/completions完全相同的流程:选号、换号重试、会话粘性、出站对齐、用量与请求日志都一样,回复再翻译回客户端的格式,流式逐帧转换。协议翻译用 CLIProxyAPI 的翻译层。错误按客户端协议返回;模型名不在上游目录里时直接回 404 并说明该设哪个变量,不拿每个号去试。count_tokens只按字数估算。Claude Code 用ANTHROPIC_API_KEY时发的x-api-key头也认。接法见 README 的接入客户端,细节见 API 参考。 - 模型路由:面板「模型与档位」顶部新增规则表,客户端发来上游目录里没有的模型名时,从上往下找第一条匹配的规则改用目标模型,三个对话端点都生效。只认
*通配、不区分大小写;目录里有的名字和带cn:/global:前缀的名字不改。可以一键把 Claude Code 三档(opus、sonnet、haiku)加到最前面;被前面更宽的规则挡住、永远轮不到的规则会标红;「试一下」输入模型名看会被怎么处理。规则存在config.json的model_routes,保存即生效,默认没有规则。
变更
- 一键更新的进度窗改成「下载安装包 → 校验并试运行 → 重启网关」三步,配一条贯穿全程的总进度条:下载按字节走,每做完一步填满一段;下载那一步做完后仍显示下了多少,重启时显示已等几秒;进度每 0.8 秒刷新一次(原来 1.5 秒,服务器上安装包一两秒就下完,常常看不到进度)。进度窗是正在运行的版本的页面,所以要从 1.2.0 再往后更新时才看得到。
- 从源码编译需要 Go 1.26(原来 1.22);Docker 镜像的编译环境同步升级。翻译层让程序变大:Linux x64 的发布包约 4.4 MB → 7.6 MB,解压后的可执行文件约 11.5 MB → 21.3 MB。
- Docker 镜像:
ghcr.io/yreidev/workbuddy2api-panel:1.2.0(同一镜像还有1.2、1标签) - 升级方法:见部署与运维
- 校验:
sha256sum -c --ignore-missing checksums.txt - 完整变更:v1.1.2...v1.2.0
v1.1.2
出站请求按官方 WorkBuddy 桌面端安装包对齐(国内版 5.8.3、国际版 5.8.4,两者都内置 CLI 2.161.0),依据和未对齐的项目见官方客户端对照。实测只用了国内版、国际版各几个个人免费号和少数几个模型(deepseek、glm、kimi),企业号、付费号以及 GPT、Gemini、Grok 都没有测到。
新增
-
国内版请求出错时照官方内置 CLI 换入口、换地址(国际版官方没有这一套,网关也不做):
- 对话换入口:
www.workbuddy.cn(或copilot.tencent.com)返回 408、502、503、504,连不上、超时(含响应头超时),或者 2xx 却没有内容时,同一请求改发备用入口wb.tencentbuddy.com一次;响应体retry_policy.retry为false时不换。60 秒内连续 3 次基础设施类失败就熔断 15 秒,期间直接发备用入口; - 对话换地址:DNS 解析失败时先换地址再换入口;408、502、503 和传输错误在换不了入口时换地址(504 不换)。候选地址是腾讯云 HTTPDNS 查到的 IP,备用入口另加官方内置的备用 IP;请求钉到这个 IP 上发,域名和证书校验不变。30 秒内失败过的 IP 跳过,上次成功的排第一个;同一请求换过的地址记住,后续重发沿用;
- HTTPDNS 照官方:调用方最多等 600 毫秒,查询本身不取消、查完写进缓存;单个请求连续 300 毫秒没有收发才算超时;结果缓存 300 秒,过了 225 秒在后台续期,续期时现取服务 IP 列表;缓存没命中时每次各查一路;
- 拉模型目录:5 秒总预算内依次试主入口、备用入口、备用 IP,408、502、503、传输错误或返回的目录无效时换下一个;
- 登录与刷新令牌不换入口(官方也不换);发起授权和刷新令牌在 408、502、503、传输错误或返回无效内容时依次换 HTTPDNS 地址重发。每次尝试单独计时:发起授权、刷新令牌 8 秒,轮询、取账号 4 秒;
chat_base_cn配成备用入口时只换地址,配成别的地址时整套不生效;- 生产(美国机房)实测:HTTPDNS 查到三个入口的 IP,钉到每个 IP(含备用 IP)拉模型目录都成功。这种网络下一次完整查询约 1.4 秒,第一次按没有结果返回,之后命中缓存。
见官方客户端对照。
- 对话换入口:
-
配置项
upstream.model_optimization(面板「上游与高级 → 出站请求」里的「允许上游用对话做模型优化」),默认关闭:每条对话都带X-Private-Data: true。两个安装包的产品配置都让「模型优化」默认关闭,所以这就是官方客户端没动过这个开关时的行为。打开等于在桌面端打开这个开关:个人号发false,企业号仍发true(新版官方 CLI 对企业号一律不允许)。保存即生效,见配置。
变更
-
客户端没传
conversation_id时,同一段对话的X-Conversation-ID不再每轮都换:对话的第一个请求新生成一个;历史里出现第一条助手回复以后,按「账号 + 系统提示词 + 第一条用户消息 + 第一条助手回复」认出这段对话,第一次认出时生成一个记在内存里,此后整段对话不变,两个域相同。记录在最后一次使用后保留 2 小时,网关重启或隔了更久再接着聊会换一个新 id,上游缓存断一次。官方客户端也是整段对话用同一个会话 id,上游的前缀缓存按它命中:实测glm-5.2在会话 id 稳定时第二轮 8 次全部命中,每轮换新 id 只命中 3/10,没命中的一轮积分是命中时的 3 倍多。加上第一条助手回复,开头逐字相同的两段不相干对话仍会拿到不同的 id;两个域、4 个模型共 29 次串会话测试,都没有带出别的对话的内容。1.1.0、1.1.1 里「每轮新生成」「国内版客户端没给就不发」的做法由此取代,见会话粘性。 -
会话 id、轮次 id、消息 id 改成官方的形状(内置 CLI 2.161.0 的
uuidv7()):会话 id 是带连字符的 36 位 UUID v7,轮次 id 和消息 id 是去掉连字符的 UUID v7,前 48 位都是生成时的毫秒数。以前都是随机或哈希出来的 32 位十六进制,按内容派生的会话 id 和轮次 id 现在第一次派生时生成、记在内存里。链路头的 span id 改为每条消息单独随机,不再截消息 id。 -
任务中心和各类上报不再发带网关名字的 id:以前对话活跃上报、夜间对话、领养前置、连登上报、任务中心的事件链里,会话 id、轮次 id 是
wb2api-rm-…、wb2api-tpl-…、wb2api-<毫秒>这类自造值,消息 id 是msg-pb、msg-…-assistant这类值,定时任务的名字是「wb2api 自动化」。现在都用上面官方形状的 id,三个chat_message_*事件带同一个模型消息 id,定时任务名改成「每日资讯简报」。真发了对话的几处(夜间对话、体验模型的对话任务),上报和这次对话用同一个会话 id、轮次 id。 -
网关不再自动补
prompt_cache_key(客户端自己带的照转)。官方客户端不发这个字段,实测它也没有让哪个模型的缓存命中变多,glm-5.2每轮换新会话 id 时带上它反而命中更少。1.0.0 同步自上游的「prompt_cache_key回退到会话键」和 1.1.0 里「prompt_cache_key仍按会话键区分不同对话」的做法一并去掉。 -
新会话分配账号时也看成本分层:先只留这个模型最便宜的一层(实测免费 > 尚无观测 > 实测收费,成本探索照常),再按会话键挑号。以前新会话不看成本分层,会绑到实测收费的号上,即使池里还有免费的号。已经绑定的会话不因此换号,见选号策略。
-
企业号补上部门全名:官方给有部门全名的账号在桌面端请求上带
X-Department-Info、在上报事件里带enterprise,网关以前没存这一项。现在登录时取账号就存进凭证文件的account.departmentFullName(命令行登录工具和login.sh也写),1.1.2 以前的凭证文件在下一次刷新令牌时补上;有值才发,个人号不变。池里没有带部门的企业号,没有实测。 -
国内版请求全部改发官方产品入口
www.workbuddy.cn。以前对话、刷新令牌、登录、模型目录、成长任务和任务中心发往copilot.tencent.com(官方的备用入口),积分、签到、积分补偿、开学季活动和小程序上报发往www.codebuddy.cn(桌面端里只用于网页链接)。生产对比了两个域名:对话、模型目录、积分与签到状态、成长任务和猫猫旅行的查询、任务中心的专家列表、登录的发起授权和轮询,结果都相同。会改动账号状态的请求,网关本来就会自动做的几样用新代码在生产上真做了一次:两个域各刷新一个号的令牌、3 个号的旅行领奖、1 个号的旅行出发,都成功;其余的用必然失败的参数按新形状发(今天已签过的签到、没完成的任务领奖、不存在的兑换档位、没有次数的抽奖、已领过的积分补偿、小程序领不存在的任务等),都返回业务错误,说明路径和认证都对。面板添加国内版账号时打开的授权页随之变成www.workbuddy.cn。详见官方客户端对照。 -
对话请求:
- 补上官方每条都带的
X-Agent-Intent、X-Agent-Type、X-Private-Data、W3Ctraceparent与单行b3;企业号多带一个与企业 ID 同值的X-Tenant-Id; - 带了思考档位时补
reasoning_summary: "auto"; X-Product由WorkBuddy改成SaaS:官方请求框架给经过它的每个请求都加部署类型,两个安装包都是SaaS;- 去掉官方对话请求里没有的头:
Origin、Referer、Accept-Language、X-CodeBuddy-Request、X-Machine-ID、X-Session-ID、X-Root-Request-ID、X-Device-Token,以及个人号的X-No-Enterprise-Id、没有登录域时的X-No-Department-Info; - User-Agent 改成内置 CLI 的取值:国内版
WorkBuddy/5.8.3 WorkBuddy/5.8.3 CLI/2.161.0,国际版WorkBuddy/5.8.4 workbuddy-ai/5.8.4 CLI/2.161.0;X-IDE-Version跟着改成 5.8.3 / 5.8.4。
- 补上官方每条都带的
-
积分、签到、上报、外观、专家列表这些请求改成桌面端后台服务的形状:
- UA 由单段的
WorkBuddy/5.5.4改成<应用名>/<版本> WorkBuddy/<版本> CLI/2.161.0,应用名国内版是WorkBuddy、国际版是workbuddy-ai; - 补上官方请求框架每个请求都带的
X-Requested-With、X-Product: SaaS和X-Request-ID(32 位十六进制,每次新生成);X-Domain改成登录域(任务中心几个请求以前填的是带https://的完整地址); - 不再带
X-CodeBuddy-Request; Accept-Language只在积分查询上带,值为zh或en(以前每条都带zh-CN/en-US);X-Device-Token只在签到上带。
- UA 由单段的
-
各类请求的
Accept-Encoding照官方各自的取值发(以前都是 Go 默认的gzip):- 桌面端的请求(对话、刷新令牌、登录、模型目录、积分、签到、上报等)是请求框架 axios 的
gzip, compress, deflate, br; - 网页登录码请求是 Node 内置 fetch 的
br, gzip, deflate,另补它默认带的Accept-Language: *、Sec-Fetch-Mode: cors; - 官网网页和国际版注册页是 Chrome 的
gzip, deflate, br, zstd,小程序网页是 iOS WebKit 的gzip, deflate, br; - 响应按
Content-Encoding解压,br、zstd 用 andybalholm/brotli、klauspost/compress。生产实测上游目前不压缩响应,对话流照常。
- 桌面端的请求(对话、刷新令牌、登录、模型目录、积分、签到、上报等)是请求框架 axios 的
-
设备与平台按 macOS 版官方客户端对齐(对照的两个安装包都是 macOS 版)。以前上报事件里写的是 Windows,Windows 版官方会带腾讯闭源 SDK 算出的设备标识 qimei36,网关做不出来;macOS 版官方本来就不带它和
X-Device-Id-List。具体是:- 桌面端上报和对话活跃上报的公共字段照 5.8.3 的事件处理器补齐:系统
darwin/arm64/24.6.0、cpuModel: Apple M2、8 核、16 GB,machineId改成 macOS 的大写 UUID 形状,补上cpuModel、企业号的enterpriseId,后台服务事件的sessionId改为空串,去掉 5.5.6 才有的presentAt;对话活跃上报以前只有业务字段,现在也带这些公共字段; - 官网网页、client-login 和国际版注册页的 UA 改成 Mac 上的 Chrome 152(国际版注册以前是 Windows 上的 Chrome 120),
Sec-CH-UA-Platform改成"macOS"; - 网页上报照官网前端的公共参数:
os/osVersion由 UA 解析(macOS/10.15.7,以前是Win32/10.0),补上sessionId、username、type、product: UserCenter,machineId改成 32 位十六进制,去掉arch; - 生产实测这几种上报都返回成功,成长任务列表正常。见官方客户端对照。
- 桌面端上报和对话活跃上报的公共字段照 5.8.3 的事件处理器补齐:系统
-
积分查询改用官方桌面端的三个接口:汇总、付费包、免费包同时查,两个域路径相同。余额以汇总为准,单包额度按官方读精确值字段。以前的
/v2/billing/meter/get-user-resource在官方 5.8.3 里已经没有了;生产对比,按旧接口整数字段算出的余额和官方汇总对不上,新算法一致。命令行积分工具cmd/credit改用同一套查询,企业号改查企业额度,不限量的企业号标unlimited、不计入总计。见官方客户端对照。 -
签到前先查签到状态:活动没开或今天已签就不再发签到请求(官方桌面端也是先查状态,用户点了才签)。国际版不再先试一遍不带
/v2的签到路径。 -
成长中心(任务、猫猫旅行、连登、抽奖、补签卡、兑换)、积分补偿、新手礼包、试用、账号资料(同步昵称)改成官网网页的形状:这些接口官方只在官网网页上调,桌面端点“成长中心”打开的就是浏览器。请求发往官网域,带
X-Client-Platform: web和浏览器的 UA、客户端提示(Sec-CH-UA*)、Sec-Fetch-*,不带X-User-Id、X-Domain等桌面端的头。认人照官方的流程用网页登录态:先用账号令牌换一次性登录码(POST /v2/plugin/device/auth/code),再打开/console/client-login换到 session Cookie(照浏览器跟随它的跳转打开目标页),之后这些请求只带 Cookie、不带Authorization;Cookie 失效(401)时自动重取一次。每个账号一份登录态,只存在内存里,重启后重取。另外:任务列表先查订阅任务状态;接受任务改用不带/v2的路径;领奖、领养等不再带空请求体,旅行领奖发{};兑换、抽奖的client_token带上网页的前缀;新手礼包先查领取状态,开放且没领过才领。国际版没有成长体系,任务列表直接返回空,不再请求上游。见官方客户端对照。 -
小程序限定任务(列表、接受、领奖)改成官网网页嵌在微信小程序里的形状:发往官网域(以前发往对话域),带
X-Client-Platform: miniprogram、Authorization: Bearer和微信小程序 web-view 的 UA,其余和网页相同;不再带旧版 CLI 的X-CodeBuddy-Request、X-User-Id、X-Domain、X-Device-Token。开学季活动的接口和小程序埋点上报以前没设 UA(发的是 Go 默认的Go-http-client/1.1),改用同一个小程序 UA。领奖不再在 400 时改走网页领奖(官方小程序只有这一种形状)。生产实测任务列表正常,领不存在的任务回「任务没完成」。 -
登录(面板添加账号和命令行登录工具)改成官方桌面端后台服务的形状:发起授权的
platform国内版改为workbuddy、国际版改为workbuddy-ai;带上官方的X-No-Authorization等标记、X-Custom-Channel-Id和后台服务的 UA;不再带旧版 CodeBuddy CLI 的 UA 和Origin、Referer;国内版取账号改用/v2/plugin/account;国际版取到账号后照官方再取一次账号列表/v2/plugin/accounts(失败只记日志)。链路头照官方:每次登录生成一个登录会话 id,发起授权、轮询、取账号带同一条 trace 的X-Trace-ID、b3、X-B3-*(国际版发起授权不带这几个,官方也不带)和各自子 span 的traceparent;授权页地址追加version=<客户端版本>,国内版另加traceparent、loginSessionId、login_owner_id。生产实测发起授权、轮询、取账号都正常,加了参数的授权页两个域都能打开;国内版扫码登录走完了整个流程:扫码后拿到令牌和账号,按面板的方式落盘、读回,再用它拉模型目录、查积分包都成功。见官方客户端对照。 -
刷新令牌改成官方的形状和流程:
- 请求体
{}(以前没有请求体),仍带X-Auth-Refresh-Source: plugin,补上X-Product: SaaS、X-Request-ID和根 span 的链路头,去掉官方没有的Origin、Referer、Accept-Language、X-CodeBuddy-Request、X-Machine-ID、X-Session-ID; - 刷新成功后用新令牌取一次账号(国内版
/v2/plugin/account,国际版/v2/plugin/accounts),照官方挑出对应的那个账号,把昵称、部门全名等合并进本地,再照官方比对身份(账号类型、企业 id、oneidAccountId、部门全名、idp、令牌的tokenType和登录域),变了就当刷新失败;取不到账号、新令牌和旧的一样也当失败,新令牌不写回。为此凭证文件多存账号的type、oneidAccountId、idp和令牌的tokenType,1.1.2 以前的文件第一次刷新时补上、不比对。uid 对不上照官方保留本地账号、照常用新令牌(以前当刷新失败); - 生产实测两个域各刷新一个号:两个令牌都换了,旧的访问令牌刷新后仍能用;有效期国内版 30 天、国际版约 1 年。
- 请求体
-
模型目录:
- 个人号只用内置 CLI 的 UA 拉一次
/v3/config,拉到的和官方桌面端是同一份;请求头同样是官方请求框架的形状; - 不再换成 IDE、CLI 的 UA 各拉一遍,也不再调只给企业号用的企业模型接口;
- 企业号改用官方的企业模型接口
/console/enterprises/{企业 ID}/config/models(两个域都是),带chat标签的模型并进名单,和/v3/config合并。以前国内版用/console/enterprises/personal/models、国际版用/v2/enterprises/personal/models,都不是官方的接口。池里没有企业号,没有实测; - 名单更准:去掉的
glm-4.7、glm-5.0、o4-mini、auto-chat、deep-model实测都用不了;国内版新增 18 个、国际版新增 8 个;带思考档位的模型国内版从 12 个增加到 18 个,国际版从 10 个增加到 18 个。
代价有三条:
- 少数模型的可选档位收窄到桌面端的范围,例如国内版
deepseek-v4-pro只有 high / xhigh,请求 low 会被提到 high,扣费更多; - 只在旧目录里出现的模型(国内版
default,国际版gpt-5.3-codex、enhance-1.0)不再列出,但直接请求照样转发;国际版专属的名字不带前缀时默认发往国内版,要加global:前缀; - 国内版几个模型在
/v1/models里显示的最大输出从 393,216 变成桌面端目录里的 128,000,这个值只用于展示,不截断请求。
- 个人号只用内置 CLI 的 UA 拉一次
-
任务中心:
- 桌面端上报的 UA、
X-IDE-Version、事件里的版本号和提交号从 5.5.6 一起改成国内版 5.8.3,和其余请求用同一个版本;事件的公共字段见上面的「设备与平台」; - 专家对话改成普通对话请求的形状,只多带官方的
X-Expert-Id,团队专家另带X-Expert-Team-Task: true,不再带x-codebuddy-request;会经过上面的备用入口切换; - 网页上报照官网的
sendBeacon发(Content-Type: text/plain;charset=UTF-8),用网页登录态(Cookie),事件里的 UA 和请求头一致; - 各事件的业务字段照 5.8.3 逐个核对改齐(以前照的是 5.5.6 的抓包):
- 对话链补上官方带的会话 id、轮次 id、模型等字段,去掉官方普通对话里没有的空
buddyId、buddyName; - `buddyapp_enter_clic...
- 对话链补上官方带的会话 id、轮次 id、模型等字段,去掉官方普通对话里没有的空
- 桌面端上报的 UA、
v1.1.0
新增
- 导出凭证:账号池可以勾选账号后「导出凭证」,表头勾选框一次选中当前筛选结果,手机端在搜索框旁「全选」;单个账号在详情里导出。单个账号得到
workbuddy-<uid>.json,和数据目录里的凭证文件一模一样;多个账号得到一个 JSON 数组文件。文件里是能直接登录的凭证,请妥善保管。 - 企业版模型:每个国内版企业号单独拉一份自己的模型目录,拉的时候带齐企业身份(否则上游给的是个人号的名单)。只在企业号目录里出现的模型,比如企业开通的 Claude,会出现在
/v1/models和面板「模型与档位」里并标「企业专属」,请求只派给目录里有它的企业号;别的号能用、企业号自己目录里没有的模型,也不再派给这个企业号。做法参考了 dsh-workbuddy-connect 与 cli2api,见企业版模型。 - 导入认网关自己的凭证:「添加账号 → 导入 JSON」除了 cockpit tools 的文件,也能导入上面导出的文件(单个或批量),企业 ID、国内版 / 国际版、设备 token 原样保留,适合备份或迁到另一台网关。
变更
- Go 模块路径改为
github.com/yreidev/workbuddy2api-panel。只影响从源码编译或引用本仓库代码的人;镜像、二进制和配置不受影响。
修复
- 打开跨域负载均衡后,国际版账号几乎分不到不带前缀的请求:带会话的请求(客户端没传会话 id 时网关也会自己算一个,所以几乎是全部请求)分配账号时只在国内版号里挑。现在会话也在两域合池里分配,新会话可能绑到国际版号;已经绑定的会话不换号,等绑定过期(默认 30 分钟没有请求)、请求失败或绑定的号暂时用不了时才重新分配。
- 导入企业版账号时不再顺带签到(企业版没有签到,上游会拒绝)。
- 国际版企业号对话时不再声明「无企业」,改为带上企业 ID,与 cli2api、dsh-workbuddy-connect 的做法一致(国际版企业号尚未实测)。
- 客户端没传
conversation_id时,网关不再把自己算出的会话键当作X-Conversation-ID发给上游。这个会话键只由系统提示词和第一条用户消息决定,开头相同的两段不相干对话会得到同一个值,上游可能把它们当成同一个会话。prompt_cache_key仍按会话键区分不同对话,前缀缓存命中不受影响。 - 同样是客户端没传
conversation_id时,两段对话的内容撞上不再共用同一个X-Conversation-Request-ID:以前开头相同、中途走向不同的两段对话在同一位置发同一句话(比如「继续」),或者首轮逐字相同(同样的系统提示词和第一句话,中转站的渠道测试也是这样),上游会把它们并成一轮。现在每次用户发言新生成一个值,同一轮里的工具调用续轮凭网关转出去的工具调用 id 找回它,换号重试也沿用它,上游用量明细照旧按轮合并;网关重启时正在进行的那一轮会拆成两条记录,见会话粘性。 - 非流式请求:上游同时给了结构化的工具调用、正文里又带工具调用标记时,不再用从正文还原出来的调用覆盖真实的调用。
- 任务列表「全部接受」:常规任务都接受过时,不再直接回「所有任务均已接受」而漏掉还没接受的小程序任务(如小程序首对话)。
- 任务中心「使用平台专家」类任务:上游回复里同一段数据先出现别的 id、后出现服务端请求 id 时,不再误报「未找到服务端 requestId」。
- 国际版模型列表:
/v3/config探测全部失败、只剩企业端点而且它只给模型名时,不再当成探测失败(以前会把国际版号的模型列表清空);探测到的模型顺序也固定按 id 排列,不再每次刷新都变。 - 连登奖励日志:奖品内容超长截断时不再把中文切成半个字(日志里会出现乱码)。
- 命令行签到工具
signin_bin:token 在两小时内过期时先刷新再签到。以前时长单位写错,只有已经过期的 token 才会刷新,快过期的 token 可能在签到途中失效。
- Docker 镜像:
ghcr.io/yreidev/workbuddy2api-panel:1.1.0(同一镜像还有1.1、1标签) - 升级方法:见部署与运维
- 校验:
sha256sum -c --ignore-missing checksums.txt - 完整变更:v1.0.0...v1.1.0
v1.0.0
首个独立编号的版本。此前随上游编号(最后一个是 1.13.0-panel),从这一版起按语义化版本单独编号;相对上游与原始项目的全部能力见项目来源与上游同步。
新增
- 独立版本号:每个版本在 GitHub 上有对应的 Release(附五平台二进制和本版更新内容),Docker 镜像同时打
1.0.0、1.0、1三个版本标签。 - 更新提醒:网关每 6 小时读取一次仓库里的更新日志,有新版本时面板弹窗列出新版本的变更和升级方法,没升级前侧栏版本号旁一直显示「有新版本」;可在配置页「服务」关闭(
panel.update_check)。 - 一键更新:「有新版本」弹窗里点「更新到 vX」,网关从 GitHub Release 下载当前平台的程序,核对 sha256、试运行通过后放进数据目录的
bin/,再优雅停机、原地重启到新版,页面自动刷新。程序自带的版本保持不变:新版连续 3 次没能稳定运行会自动退回;点侧栏版本号打开「版本信息」,可以立即检查更新或手动退回。支持 Linux 与 macOS,Windows 仍需手动升级,详见一键更新。 - 本次更新:升级后第一次打开面板,弹窗列出这次升级包含的变更。
- 积分补偿:任务中心的「积分补偿」弹窗逐账号查询官方补偿活动,可单号领取或领取全部;签到排程会自动检查并领取。已禁用账号照常列出、可单独领取,但不参与「领取全部」。
变更
- 到期提醒在点「检查」之前,先用账号池的本地快照显示每个账号最早一批到期的积分。
- 同步上游至
6b31db6:客户端没传conversation_id时,prompt_cache_key回退到会话键;请求发出前剔除工具名为空的工具调用。
- Docker 镜像:
ghcr.io/yreidev/workbuddy2api-panel:1.0.0(同一镜像还有1.0、1标签) - 升级方法:见部署与运维
- 校验:
sha256sum -c --ignore-missing checksums.txt