Repository navigation
Releases: masknull/dsh-workbuddy-connect
Release list
v0.6.11-alpha.1 — 对齐网关渠道校验头族(实验性预发布)
⚠️ 测试版(ALPHA)· 实验性更新本版本为测试版本,本次更新属于实验性内容,可能不会被下一个版本收录。 请仅在测试账号上试用;生产环境请继续使用稳定版 v0.6.10。
这个版本解决什么
上游 WorkBuddy / CodeBuddy 网关自 2026-10-15 起在国际版逐步启用「渠道校验」:请求缺少官方客户端的会话追踪头时直接返回 HTTP 400 / code 11128 / msg "request illegal",其中 displayMsg.zh 为「请求被拦截,请重新发送」、displayTips.zh 为「这次调用没通过渠道校验,可能不是官方客户端发出的。请用官方版本重新发送。」这类拒绝被归到兜底的 client,界面上只显示「无效请求」,读起来像插件坏了,而不是「上游没认出这台客户端」。
Added
- 补齐会话追踪头族:
X-Conversation-ID、X-Conversation-Request-ID、X-Conversation-Message-ID、X-Request-ID。 X-Conversation-ID按会话稳定,取会话首条用户消息派生。X-Conversation-Request-ID按「用户一次发送」稳定,一条工具链的多次往返仍是同一个值,不会被上游计成多次请求。X-Conversation-Message-ID与X-Request-ID每请求新值且两者同值,与官方客户端一致。- 调用方已经带上的 id 一律保留;body 非 JSON 时仍然可以归因。
- 补齐
X-Agent-Intent: craft,其中X-Agent-Type: main仅国际版发送,国内构建没有这个身份,发出去等于冒充另一套客户端。 - 探测请求与真实消息共用同一套网关头,因为能通过探测、真实消息却被拒的探测没有意义。
Fixed
- 修复 v0.6.10 引入的回归:积分与额度快照缓存此前只用
uid做键,而缓存是两个变体共享的进程级缓存,当 CN 与国际版账号拿到同一个 uid 时,先打开的那张卡会把余额答给另一张卡;现在缓存键包含变体身份,两张卡各自独立,该场景由dual-routes用同 uid 双变体复现并已修。
验证
- 单元测试:35 个文件、447 项全部通过,其中包含新增的
gateway-headers10 项。 tsc --noEmit:0 错误。- 构建:通过。
- 线上冒烟(真实凭证、免费模型):CN 200、INTL 200;对照组去掉首条 system 后 INTL 稳定返回
400 / 11128 "first message is not system prompt",说明闸门本身是活的,按账号与部署灰度开关。
已知限制
- 本版本对 11128 是否真正生效我们没有条件验证:渠道校验按账号与部署灰度开启,手头账号当前尚未被开关命中,因此无法构造真实拒绝场景来证明补头后会被接受;正因为它只经过无害性验证、没有经过有效性验证,所以以 alpha 形式发布,请以实际使用结果为准。跟踪 issue:#7
- 本版本补齐的是「会话头」这一道,上游还有其它独立闸门,包括首条必须是 system,以及社区报告中补齐三个头后仍被拒的第三道,因此不保证所有 11128 都能解决。
- 11128 的错误分类仍笼统归为
client,本次未改。 - 国内版目前未观测到该闸门开启,本次对国内版只加共享头族,实测无影响。
v0.6.10
兼容性与性能
-
修复「Default」思考档位导致首条消息直接 400 / 11133:DSH 把 pi-ai 的
off档显示为 Default,而 pi-ai 会硬编码发出reasoning_effort: "off"(不读档位映射)。WorkBuddy 上游只接受minimal/low/medium/high/xhigh/max/none,其余拼写一律以400 {"code":11133,"msg":"the request parameters were rejected by the model provider"}拒绝。现在转发前会按 catalog 声明的defaultEffort(如deepseek-v4.1-flash为high)归一化off/disabled/default/auto;catalog 未声明时才省略该字段,交由上游默认。 -
移除
store字段:DSH 0.2.1 随附的pi-ai1.3.0 会给每次 chat 调用带上store: false,上游不使用该字段,转发前一并删除。 -
设置卡片不再卡在「正在读取账号…」:状态接口此前在返回前同步等待积分查询,而账单接口实测耗时 0.7s–19.1s(自身超时 30s,国际版还有两条路径回退),且没有缓存。现在冷查询最多等 5s,超时先返回账号与模型信息(不带积分),成功结果按账号缓存 60s,后台请求跑完后自动填充缓存。
验证
- 对真实上游逐档位验证:
off/disabled/default/auto→defaultEffort(high)→ 200;low/high/max→ 原样 → 200。 - 卡片:首次打开 ≤5s 返回账号信息,60s 内重复打开即时命中缓存。
- 与请求其余内容无关:97 个真实工具定义、真实系统提示、187KB 请求均为 200。
依赖
- 无变更。宿主要求仍为 DSH ≥ 0.1.7-rc.1。
v0.6.9 — 国际版被拦截时改用备用聊天路径,额度耗尽单独上报
兼容性与健壮性
-
国际版在被 WAF 拦截时改用备用聊天路径:国际版有两条聊天路径,插件按
/console/chat/completions→/v2/chat/completions顺序尝试,此前只有"路由未命中"(404/405)才回退。当 console 路径返回腾讯 WAF 拦截页(403,HTML)时,这段 HTML 会被当作消息的最终失败原样抛出(workbuddy upstream client (http 403): <!DOCTYPE html>…),而能正常服务的备用路径不会被尝试。现在 403 且响应体是 HTML 拦截页时会改走/v2/chat/completions;403 若是普通 JSON 错误(权限类)则保持不回退。 -
额度耗尽与限流分开上报:国际版余额耗尽的响应是
429 {"code":14018,"msg":"Credits exhausted."},此前 429 一律按限流处理,上层会对这次终结性拒绝反复重试,用户看到的是"限流"而非"额度不足"。现在 429 带明确额度措辞(Credits exhausted、14018、积分不足、额度用尽等)时归类为额度耗尽并直接上报;含糊措辞(如quota exceeded)仍按限流处理,避免把健康的被限流账号误判成余额不足。 -
失败时不重复请求备用路径:余额耗尽与限流都属于账号级状态、两条路径表现一致,因此 429、408、401、402 与 5xx 不触发跨路径重试——既不把请求量翻倍,也不对已被限流的账号继续施压。404/405 的原有回退保持不变。
-
单条路径的传输故障不再中止整次尝试:两条路径各自独立处理异常,一条路径 TLS 握手失败(已观测到)会继续尝试另一条;调用方取消(abort)仍立即返回、不重试。
依赖
@earendil-works/pi-ai放宽为>=0.85.1(原^0.85.1)。
v0.6.8
新增
- 插件面板内的设置入口:左侧边栏「插件」→ 已安装 →「WorkBuddy 连接器」卡片,点开详情页即见完整配置(PAT、双区域开关、模型开关、每日签到、侧栏额度),与「设置 → 插件设置」为同一组件、同一份配置,任一处保存两处同时生效。该入口在插件面板内默认展开;设置页内卡片行为不变(默认折叠)。宿主未提供此挂载点时(旧版 DSH)自动回退为原单入口,功能不受影响。
不兼容变更
- 最低宿主版本提升至 DSH 0.1.7-rc.1:本版起仅支持 0.1.7 线,DSH 0.1.5 的兼容路径(设置分区、legacy settings.yaml 迁移、settings.plugin.item 座位)已全部移除;仍需 0.1.5 的用户请留在 0.6.7。peer/dev 依赖线同步升至 0.1.7-rc.1+。
修复
- 探测记录不再被误清:切换账号时只会清除上一个账号的探测记录;新账号自己的记录(重启前写入、或运行中 seed 的)此前会被整个记录文件的清空操作连带删除,现已修复。
v0.6.7 - 兼容dsh0.1.7-rc.1+
dsh-workbuddy-connect — Release Notes
0.6.7
迁移:配置存储改为插件自有文件(0.1.5 / 0.1.7 行为一致,不再走宿主设置写通路)
新增
- 配置的唯一事实源改为插件自有文件
<profile>/.dsh-workbuddy-connect/settings.json,与凭证、catalog 缓存同目录。 - 一次性迁移:文件不存在时,从 profile entry 的旧值播种,并从
settings.yaml/settings.yaml.imported读取本插件 0.1.5 时代的三个 section(workbuddy/workbuddy-ai/workbuddy-quota)——宿主只导入“名字与 profile 条目 id 相同”的 section,这三个名字不被导入,数据只存在于那份文档里,由插件自行读取。 - 新增 HTTP 设置面
GET/POST /plugins/dsh-workbuddy-connect/settings(loopback + per-process key 鉴权),供浏览器侧读取整体配置。 - 迁移完成后,自动把 profile patch 里本插件写过的字段删掉,只删自己的。
性能
- 模型开关/上下文/额度卡等字段支持批量一次写入(原逐字段多次写入各有一次全树重组);单次保存实测为一次本地原子写,代价恒定,与宿主后续版本对设置写入的优化无关(0.1.7-rc.2 已改善切换模型时的等待)。
修复
- 模型禁用状态重启后丢失:装配各 variant 时直接读 entry 配置,而迁移清理后 entry 已空 → 每次重启都回到“全选”。改为读“entry + 自有文件”的实时视图。
- 「设置 - 模型」页看不到 WorkBuddy:provider 目录行的
settingsNs用的是 0.1.5 命名空间(workbuddy/workbuddy-ai),而 0.1.7 按 profile 条目 id(llm-workbuddy)投影设置表单,名字对不上 → 该页中此 provider 不显示。改为按宿主线取正确的名字(0.1.7 用条目 id,0.1.5 保持旧命名空间)。 - 会话模型列表中价格缺失时显示空白:改为在模型名后显示「价格暂不可用」。
- 促销过期后的价格显示:上游把促销折扣价直接写进模型行,促销结束后原价不可恢复。此前显示为“价格未知 — 刷新后更新”(承诺了做不到的事),现在:
- 设置卡片显示最后倍率 + 过期标注(如
x0.00(限时免费已过期))——保留credits与促销标签随rateUnknown一起投影; - 会话模型列表显示「价格暂不可用」,绝不拿已结束的促销价冒充现价(尤其不会继续显示“免费”);
- 促销仍在有效期内的模型照常显示倍率与徽章。
- 设置卡片显示最后倍率 + 过期标注(如
- 迁移种子规则的默认值改为从 schema 的
meta.default读取,消除“手写默认值与 schema 不一致导致旧配置永远不同步”的一类问题。
兼容性
宿主要求:DSH ≥ 0.1.5-rc.2(0.1.5 线终点)。该下限已写入 package.json 的 engines.dsh,宿主会按它跳过不兼容的版本并提示。peer:cordis ^4.0.2、schemastery ^3.18.2、dsh-settings ≥ 0.1.5-rc.1 及 dsh-llm / dsh-llm-pi-ai / dsh-home-paths / dsh-atomic-write / dsh-attachment / dsh-host-webserver ≥ 0.1.5-rc.1、@earendil-works/pi-ai ^0.85.1、react ^18.2.0。
| 宿主版本 | 状态 | 说明 |
|---|---|---|
| 0.1.5-rc.2 | ✅ 支持 | 最低支持版本 |
| 0.1.7-rc.1 | ✅ 已验证 | 端到端实测:迁移、国内 14 项 / 国际 19 项禁用模型从旧文档恢复、模型开关重启持久、「设置 - 模型」页渲染、过期促销显示 |
| 0.1.7-rc.2 | ✅ 支持 | 该版本改善了切换模型时的等待,本插件路径不受影响 |
为什么两个版本行为一致:配置不再经过宿主设置服务,而是插件自有的 <profile>/.dsh-workbuddy-connect/settings.json;各 variant 装配时读“entry + 自有文件”的实时视图。宿主之间设置写通路的差异(0.1.7 的 configEditor.edit 全树 reconcile、describe() 按条目投影、volatileOnly 快路径)都不参与读写,因此不存在“某版本下写入慢 / 写入后 catalog 失效 / 重启回默认”的版本性差异。
按宿主线取值的两处(运行时探测,不写版本号判断):
| 探测点 | 0.1.5 | 0.1.7 |
|---|---|---|
| cleanup 写入通路 | configEditor 不存在 → 走设置服务 replace |
configEditor 存在 → configEditor.edit |
provider 目录行 settingsNs |
旧命名空间(workbuddy / workbuddy-ai) |
profile 条目 id(llm-workbuddy) |
已知版本差异(有意取舍):
- 0.1.7 的「设置 - 模型」页目前只为该 provider 占位:本版本修复了此前该页完全不显示 WorkBuddy 的问题(目录行命名空间与 0.1.7 的条目投影对不上),页面上现在能正确列出该 provider。但该页的字段编辑器只覆盖宿主自己的 provider,模型开关一类插件配置没有编辑入口,请到「设置 - 插件设置」的 WorkBuddy 卡片操作;0.1.5 上同样使用插件卡片,两个版本入口一致。这是“配置以自有文件为唯一事实源”的必然结果:不再向宿主注册第二套可写表单,避免出现两个数据源。
- 会话中的模型列表(模型选择器)两个版本一致,均遵循禁用清单。
迁移来源(0.1.5 时代配置):插件自行读取 settings.yaml / settings.yaml.imported 中的 workbuddy / workbuddy-ai / workbuddy-quota 三个 section——宿主只导入名字与 profile 条目 id 相同的 section,这三个名字不被导入,数据只存在于那份文档里。js-yaml 缺失时该层自动跳过,其余功能不受影响。
设置入口变更(自本版本起)
自 0.6.7 起,本插件的设置卡片固定在「设置 - 插件设置」共享块内(排位 20)。此前入口(0.1.5 时代的插件 tab / provider 目录行)不再承载配置编辑:
- 模型开关、上下文窗口、签到/额度等全部配置 → 「设置 - 插件设置」的 WorkBuddy 卡片;
- 0.1.7 的「设置 - 模型」页现在能列出 WorkBuddy,但该页只为宿主自己的 provider 提供字段编辑器,插件配置的编辑请用插件卡片(0.1.5 同样如此,两个版本入口一致)。
升级注意
- 首次启动自动完成迁移与 patch 清理;国内/国际两套禁用模型清单、上下文窗口偏好、签到/额度设置都会从旧配置恢复。
- 若列表里个别模型显示“倍率(限时免费已过期)”,是上游该促销已到期但未更新价格,属数据源现状,不影响模型可用性。
v0.6.6 - 支持每日福利签到调度与签到日志
新特性 / Features
- 新增《签到日志》Tab:在设置卡片 Tab 末尾(
status->context->models->details->checkin)新增《签到日志》(Check-in log)标签页。 - 每日福利签到调度器:
- 支持后台定时自动签到,默认每天北京时间 10:00(UTC+8)执行;
- 支持断点追赶与自检机制(Catch-up),在启动或登录就绪后若今日未签自动补签;
- 支持并发锁防护,状态及最近 30 条历史记录持久化保存。
- 通用签到协议支持:
- 支持国内版与国际版通用每日签到接口(
/v2/billing/meter/daily-checkin),针对不同区域自动适配对应网关域名与专属请求头; - 智能识别“今日已签到”(
already-claimed幂等状态)与签到发放额度,签到成功后自动更新日志与额度。
- 支持国内版与国际版通用每日签到接口(
- 签到交互与配置卡片:
- 在设置卡片顶部提供每日自动签到开关及签到时刻(时:分)自定义设置;
- 签到日志面板提供“立即签到”、“刷新”、“清空日志”快捷操作,直观展示历史签到状态与获得额度。
来源 / Sources
- UI 与后台调度架构:参考自 dsh-qoder-connect 的签到调度器(Catch-Up / Cron / Lock)、状态持久化设计以及签到日志组件(CheckInLogTable)与交互样式。
v0.6.5 - 支持模型开关与批量控制
新特性 / Features
- 新增《模型开关》Tab:在设置卡片“状态”与“上下文窗口”之后新增《模型开关》(Model Toggles)标签页。
- 模型独立启用/关闭:支持对上游拉取的每一个模型进行单独开关控制,关闭后自动从 DSH 核心可用模型列表过滤并实时通知前端刷新(llm/adapters-updated)。
- 批量操作与搜索:支持按模型名称/ID 快速模糊搜索,支持单页全选复选框(含半选状态),提供一键“批量开启”与“批量关闭”。
- 国内版/国际版独立隔离:国内版(workbuddy)与国际版(workbuddy-ai)的模型开关配置彼此独立存储、互不干扰。
- 默认全开:上游新拉取或默认状态下的模型保持开启,无需手动逐个打开。
v0.6.4 — 设置页合并为单张 WorkBuddy 卡片
0.6.4 — 设置页合并为单张 WorkBuddy 卡片
改动
- 三张卡片合并为一张:设置 → 插件里原来是「WorkBuddy侧栏展示」+ 国内版卡片 + 国际版卡片三个入口,现在收拢为一张 WorkBuddy 卡片。展开后最上方是侧栏额度展示设置,紧接着是 国内版 / 国际版 分段标签,标签上的圆点直接显示该版是否已登录;选定版本后,其下是该版的账号、余额、模型列表、登录/导入与推理档位检测。切换标签即切换到另一版,两版数据互不混用。
- 未登录不再能开启侧栏额度:未登录版本的开关置灰,且写入侧加了两道拦截——即使绕过置灰状态直接触发,也写不进设置;侧栏额度卡片在未登录时点击不再打开明细页(样式同步为置灰、无手型)。此前存在窗口:先开启开关、再退出登录,侧栏会留下一张永远报错的额度卡片。
- 登录状态实时联动:导入凭据、完成登录、切换账号、退出登录都会立即反映到开关与标签圆点上,不用重开设置页;侧栏卡片与明细页共享同一份最新结果。
- 上下文窗口排版:模型行的窗口数值与其默认值改为同一行右对齐(
Hy4 preview 1M 默认 300K),不再上下两行堆叠。
文档
- README 中英文同步为「一张卡片 + 国内版/国际版标签」的描述。
测试
- 新增
tests/unified-card.spec.ts(11 例),覆盖卡片形态与每一道未登录拦截。 - 修好三个既有红测:
catalog-lifecycle.spec.ts仍在数据目录根读写缓存文件(0.6.1 起已迁到state/下);client-variants.spec.ts用英文"AI"校验中文标题(国际版中文标题 0.6.1 已改为「国际版」);reasoning-merge.spec.ts未等待上下文销毁且只等 provider 注册,负载下会把模型解析到已被上一个用例注销的 provider 上。
兼容
无数据迁移,模型通道、凭据存储、登录与额度接口均未改动,卸载重装或升级即可;已保存的偏好(含「使用上游声明的最大上下文窗口」)原样沿用。
安装
dsh plugin --profile web add github:masknull/dsh-workbuddy-connect需要 DSH 0.1.5-rc.1+、Node 22+。
v0.6.3 — 修复明细页切换版本的「未登录」误报
0.6.3 — 修复明细页切换版本的「未登录」误报
修复
- 明细页切换版本不再误报未登录:只开启一个版本的侧栏卡片时,打开明细页后切换到另一个版本的标签页,会显示「请先登录」——因为该版本没有任何入口拉取过数据。现在切换标签页(或点击另一张侧栏卡片)会自动获取对应版本的数据(新鲜度规则仍然生效,间隔内的读取直接复用缓存)。
v0.6.2 — 修复侧栏卡片自动更新
0.6.2 — 修复侧栏卡片自动更新
修复
- 侧栏额度卡片自动更新恢复:共享数据源重构时误删了侧栏卡片的定时轮询,导致卡片只在打开页面时获取一次。已恢复按设置间隔(默认 5 分钟,可自定义)自动刷新——隐藏页面时跳过,页面恢复可见立即补拉一次。点击后的明细页保持原有缓存策略(间隔内复用缓存,「刷新」按钮强制获取)。