Repository navigation
Releases: Funny1Potato/dsh-onebot-hub
Release list
v0.12.3
Full Changelog: v0.12.2...v0.12.3
v0.12.2
segment 模式从来没把图送进 prompt
#2 报的现象是:模型说收到了图片,可 onebot_hub_status 里 vision.parts 恒为 0,实际送进 prompt 的只有它自己生成的描述。三条根因叠在一起,前两条各自都能让整条路停摆。
一、能力探测 fail-closed。 imageCapable() 以前要求宿主明确声明 inputModalities 且含 image,探不到(字段缺失、或探测那一刻 provider 还没注册完)一律判“不能看图”,segment 直接跳过。而同一个模型在宿主自己的会话里看图完全正常——正是“这不是模型的问题”的反证。现在只有明确声明不支持才跳过;探不到、抛错一律按“能”试,真不能由宿主在提交时报错(does not support image input),把静默跳过换成可见错误。
二、快照拍在图片落地之前。 图和文字走两条路:图片要下载 → 存 blob → 回填 entry.media,通常晚几百毫秒;而快照在 #awaitVision 之后立刻拍。segment 模式没有“描述”可等,awaitVisionPending 立刻返回“没有在跑的”,于是永远拍在还没落地那一刻。
现在新增 hub.trackMedia() / awaitMediaPending(),与 trackVision 同一套形状(只等这一批点名的、有上限、失败也算结束),#awaitVision 在 segment / both 下先等图片落地:vision.segmentWaitMs(默认 1500,与 waitBeforeTurnMs 取较大者)。等的是同一个 promise——不轮询、不重扫。
三、诊断。 vision.stats.lastSkip 记四种跳过原因(mode / no-media / capability / empty),在 onebot_hub_status 里可见。以前 vision.parts 恒为 0 的时候,外部只能靠猜。
另两处
describe空回复的错误现在带模型名与流里实际吐出的前 120 字——是空流还是格式没解析出来,一眼能分。- 删掉
lib/vision.js里一句调试遗留注释(failed 77 / described 21是当年排查一个坏配置时的计数,不代表describe的稳定性),并写明不要拿它当依据。
升级
dsh plugin --profile <profile> add dsh-onebot-hub@0.12.2验的办法:私聊发一张图,onebot_hub_status 里 vision.parts 应该是 1 而不是 0,vision.lastSkip.reason 应该是 none。
Full Changelog: v0.12.1...v0.12.2
v0.12.1
修 QQ 官方通道在群里收不到消息。
修了什么
- 群里 @ 机器人不唤醒:官方的事件名就叫
GROUP_AT_MESSAGE_CREATE,但content里不含那个 @——只有用户自己打的字,甚至可能只剩一个空格。枢纽靠"at 段的 qq 等不等于self_id"判断在叫我,于是群里一条都不唤醒(私聊不需要 @,所以只表现为"群里收不到")。现在群消息一律补一个指向self_id的 at 段;READY里机器人的 openid 也会被记住,正文出现它时映射成self_id。 - 两个会话互相递话会死锁:递送要等"对面整轮跑完",于是 A 等 B、B 等 A,两边一起冻在前一个 tool call 上。现在最多等 1.2 秒(
cross.wakeGraceMs),超时按"已送出"返回并在回执里标queued——它表示进了对方队列,不是对方已经处理完。 onebot_session的list在官方通道下一个会话都列不出:先看本地名单(那里面是协议端时代的旧号,非空就不再兜底),兜底还把数组当对象取键。官方模式下不再看本地名单——能跟谁聊本来就该由平台决定。- README:工具数 30 → 31、补上漏掉的
onebot_task;「会话之间转达」与「QQ 官方上游」都标成实验性;定时任务那段总机会话的说明改成实际行为。
升级
dsh plugin --profile <你的 profile> add dsh-onebot-hub@0.12.1从 0.11.1 到 0.12.0 的完整清单(含 7 个预发布版本的全部内容)见 v0.12.0 的发布说明。
v0.12.0
新能力
会话之间转达(实验性,默认关)
onebot_session(全局工具,任何会话可见):list/relay/say/read/close- 一个会话把图片、小程序卡、合并聊天记录递给另一个会话的 agent,由那边自己决定发不发;两边还能在同一根线上来回说几句(每方 6 句 / 30 分钟 / 10 分钟没人说话就冷掉)
- 原文与转述分开算:私聊 → 群的原文默认禁止(进了群撤不回来),转述放行但要过隐私词表(住址、证件、工资、病历…)
- 会话目录:
cross.enabled打开后把"这个插件接了哪些群和私聊"列进提示词(off/names/full三档)。私聊里列全部私聊编号,群里只报数量——判断标准是这段提示词谁会看见 list另报一档外部会话(别的插件拉起的),只报和这个插件来往过、且现在活着的
定时任务
onebot_task:create/list/remove/run(fire是内部动作)- 四种
when:at:2026-11-01T08:00/after:3600/every:600(最少 60 秒)/every:daily@08:00 - 宿主管时钟,到点由枢纽叫醒目标会话——说什么、还是只是想一想,由那边的 agent 自己定
- 总机会话
onebot-hub::tasks只是收件地址:不注人格、不注记忆、不注目录,可agent.tasks.resetEvery定期轮换
上游可换 QQ 官方机器人(实验性)
upstreamType: official;设置页扫码绑定(出二维码,手机 QQ 扫)或手填appId/appSecret- 官方那套协议被装成一个"假的 OneBot 实现端"——时间线、档案、记忆、策略、下游一行都没改
- 虚拟数字号(sha256 派生,稳定且丢文件也算得回)、被动回复窗口(5 分钟 / 4 次)超了就地降级成主动消息并在回执里标出来
- 支持图片 / 语音 / 视频 / 文件(先上传到 QQ CDN)、引用回复、撤回
- 能力比协议端窄一大截:没有群成员列表、群名、群人数、历史消息、群管理;群里只有 @ 机器人时才有消息
- 官方模式下 agent 白名单不生效——那边平台自己有一份名单
语音
onebot_reply多了record段:本地文件 / URL /base64://;发不出去会指路- 语音合成:OpenAI 兼容 / 小米 MiMo(Token Plan、按量付费)/ MiniMax(国内站、海外站)/ 火山方舟 / 豆包语音 / 交给第三方插件的语音工具。音色、语速、格式、参考音频都能配;同一句同音色只合成一次
改进
- 跨会话读取按受众判:群会话读不到私聊,私聊只能读自己那条;白名单私聊默认吃超管名单
- 设置页:标题与保存条吸顶;宽度自适应(窄屏不再把输入框挤成一格);人设面板(下拉选默认人设 + JSON 直接改 + 新建/删除)
- 红包识别:
xml段标成[红包](能看见,领不了——领取要带号主登录态,协议层没有这个能力) - 记忆:活跃条目可标敏感、长期记忆带出处与日期、
onebot_person能记信息
修复
- 由agent进行了一次全盘审查:修 3 个 P0、17 个 P1、38 个 P2、12 个 P3,驳回 6 处并写明理由。集中在跨会话可见性判定、资源预算(内存 / 文件 / 句柄 / 字节上限)、以及"判错一次就永久停机"的不对称代价