dsh-qqbot-muu v0.1
给 DSH(桌面端
@zaofan/dsh-qqbot插件)用的一套扩展 + 补丁。 同时提供一个最小但真实的 DSH 插件壳(index.js+cordis.patch.yml+dsh.bundle.patch), 让插件市场 /dsh plugin add能识别并加载它;扩展的安装仍由install.mjs完成。 本仓库不包含任何账号、Cookie、聊天记录或记忆数据库。
- 插件本体与最初来源:
@zaofan/dsh-qqbot(社区插件,本仓库所有补丁都基于它的客户端/服务端结构) - 本仓库做的事情:在插件之上补「记忆统一 + 按群隔离 + 省 token + 表情包 + B 站分享 + 浮窗重排」这些能力
- 版本:
0.1.0(第一个可安装版本) - 目标仓库:https://github.com/wuwo1979/dsh-qqbot-muu
1. 能力概览
| 模块 | 能力 |
|---|---|
| 两层记忆 | 个人层跨群统一(印象卡、熟识度:同一个 QQ 在哪都认识);群层按 scope 隔离(聊天台账、记忆、心情:A 群的恶言恶语不带坏 B 群) |
| 记忆库 | 统一 SQLite(memory.db),chat / mem 全部带 scope;私聊、每个群各自一份记忆 |
| 群分级 | 「特别关心群 / 普通群」两级。特别关心群:完整召回 + 沉淀 + 个人卡;普通群只看信息本身(不召回、不沉淀、不画像,仅一行「名字 · 等级」认人),省 token |
| 历史印象卡 | 全库历史消息 → 本地模型切片 → 汇总成跨群统一的个人卡(只吸收私聊 + 特别关心群的对话);每天自动重建,浮窗可手动重建 |
| 熟识度 | persona.fam:<senderId> 唯一事实源(个人层),自动迁移旧版 bond 数据,单会话设置与记忆页同源 |
| 批量回复门槛 | 一次勾选多个会话,批量写入 localModel.overrides(模式 + 最低分),不用一个个点 |
| 表情包 | 本地 qwen2.5vl:3b 视觉打标;主动发送带准入分、间隔、每小时上限、最近去重;发送失败明确告知 |
| B 站 | 扫码 Cookie(只存本机);视频以单条卡片分享(标题+封面+UP+播放/点赞+链接),分享记录留档可查 |
| B 站运营 | AI 自己写脚本 → 出分镜 → 配音 → 字幕 → 拼 mp4 → 草稿;主人一句「通过」自动投稿;还能改名、写评论/回复、拉数据留档 |
| 浮窗 UI | 记忆页折叠分组、群等级即时切换、批量门槛;群组管理把锤子/群发/入群审批收进子标签 |
| 工具路由 | 绘图/视频/表格/文档走云端算力;网页抓取/内容提取强制云端;本地模型只做记忆、情绪、轻量代答 |
| 语音 | TTS 发件箱、直发、丝滑度处理,出站统一走 outbox |
2. 目录
dshqqbot/.qqbot-extensions/ 扩展本体(inbound / outbound / hooks / tools / lib / 配置)
qqbot-mod/patches/ 客户端与服务端补丁(.mjs,支持 --check/--apply/--revert/--update)
qqbot-mod/scripts/ 自检脚本(node 直接跑)与本地视觉打标 CLI
data/harness/ 从 AppData 迁出的 DSH 数据(models / sessions / attachments)
scripts/migrate-appdata.ps1 把 AppData 里的 sessions/attachments 迁到 F 盘并留 junction
install.mjs 一键把扩展装进任意 bot 数据根
运行记录、迁移细节、聊天/记忆样例等文档只保留在本地,不随仓库发布(
.gitignore已忽略/docs/)。 本仓库不包含 QQ 聊天记录、B 站评论审核内容、memory.db、Cookie、Token 或任何 openid。
3. 安装
前置:
- Node.js ≥ 22.5(用到内置
node:sqlite) - Ollama(本地模型):
qwen2.5vl:3b(表情打标 / 识图)、nomic-embed-text(向量检索,可选) - DSH 桌面端,已安装
@zaofan/dsh-qqbot插件
# 1) 把扩展装进你的 bot 数据根(该目录下应已有 .qqbot / 记忆库等)
node install.mjs --data-root "D:\你的bot数据目录"
# 2) 拉本地模型
ollama pull qwen2.5vl:3b
ollama pull nomic-embed-text
# 3) 在 QQ 里发 /bot-restart,或重启 DSH 桌面端
补丁(可选,按需):
node qqbot-mod/patches/add-memory-panel.mjs --apply # 记忆页
node qqbot-mod/patches/merge-group-tabs.mjs --apply # 群组管理子标签
node qqbot-mod/patches/unify-fam-ui.mjs --apply # 熟识度统一入口
客户端补丁改完在 DSH 里按 Ctrl+R 重载;服务端补丁重启桌面端。插件升级后补丁可能需要重打(脚本带 --check)。
装完要改的配置
dshqqbot/.qqbot-extensions/memory-config.json:dataRoot改成你的 bot 数据根(install.mjs会自动替换标记位)dshqqbot/.qqbot-extensions/local-llm-config.json:同上dshqqbot/.qqbot-extensions/draw-config.json:只有用本地 SD 绘图才需要改(python/sd 路径),不用绘图可以忽略- B 站:首次用
/bili login扫码,Cookie 只写本机bili-cookie.json
4. 群分级与两层记忆怎么用
两层记忆
- 个人层(
scope = __global__):印象卡card:<senderId>、熟识度fam:<senderId>。同一个 QQ 用户跨群共用 —— 换到哪个群都认识,不会「不认人」。 - 群层(真实
scope):聊天台账chat、长期记忆mem、心情__mood各自独立。A 群的恶言恶语只影响 A 群的语气,不会带坏 B 群。
历史印象卡只吸收「私聊 + 特别关心群」里这个人自己说的话(群里不含小蓝的回复,避免 A 群的小蓝脾气被写进这个人的性格)。
群分级
- 浮窗「🧠 记忆」页 →「🏷 群等级」:点「设为关心 / 降为普通」,即时生效
- 也可以直接改
dshqqbot/.qqbot-extensions/data/group-tiers.json:
{ "defaultTier": "normal", "priority": ["群openid"], "normal": [], "profileInNormal": false, "digestNormal": false }
各等级的具体行为可在 memory-config.json 的 tierPolicy 覆盖:
| 项 | 特别关心群 / 私聊 | 普通群(默认) |
|---|---|---|
| 个人印象卡 | 完整卡 + 熟识度 | 只给一行「名字 · 等级」(不认识的陌生人一个字都不多花) |
| 长期记忆召回 | 开 | 关(只看当前信息本身) |
| 长期记忆沉淀 | 开 | 关 |
| 历史印象汇总 | 参与 | 不参与 |
| 记忆分身读写 | 事实 + 个人卡 | 只记心情/关系,读最近 5 条 |
普通群不写个人卡、不沉淀长期记忆;跨群记忆物理隔离。
5. B 站运营
口径:AI 自己写、主人只审、审核完自动上传。写操作(plan/approve/publish/rename/comment)只接受主人私聊;群里发会被拒绝并提示私聊。
配置:dshqqbot/.qqbot-extensions/bili-ops-config.json
| 项 | 默认 | 说明 |
|---|---|---|
publish.mode |
web |
web = Cookie 网页投稿自动上传;manual = 只交成片包 |
publish.requireApproval |
true |
必须先经主人审核 |
publish.autoPublish |
false |
改 true 才是免审直发 |
video.panels / secondsPer |
5 / 5 |
分镜数、每屏配音兜底时长 |
media.provider |
cloud |
B 站成片默认云端出图(Pollinations,1024×576,8 秒间隔);失败直接报错,不偷偷用本地(media.fallbackLocal=true 才回退) |
limits.dailyVideos |
1 |
每日最多投稿数(防乱发) |
schedule.enabled |
false |
定时只产出草稿,绝不自动发布 |
plan 生成草稿后会把封面 + 首屏图发到当前私聊给主人看;确认后再回「通过 <jobId>」。
DeepSeek Key 不入库:优先读环境变量 DEEPSEEK_API_KEY,其次 {dataRoot}/bili-ops-secret.json(已被 .gitignore 排除)。请求体只带选题、风格、分镜数、时长 —— 不含聊天记录、记忆库、Cookie、账号信息。
工具动作(bili_ops):
| action | 用途 |
|---|---|
plan topic=... |
AI 写脚本 → 出图 → 配音 → 字幕 → 拼 mp4 → 封面 → 草稿(状态 awaiting_review) |
approve jobId=... |
审核通过 → 自动投稿(失败自动退回成片包并给原因) |
reject jobId=... |
废弃草稿 |
publish jobId=... mode=manual |
只要本地产物(成片 + 分镜 + 配音 + .srt + 封面) |
comment bvid=... [generate] |
AI 写评论草稿,不发送 |
comment bvid=... approve [draftId] |
审核后自动发评论 |
engage bvid=... |
拉播放/点赞/币 + 生成建议回复(不自动发) |
rename uname=... |
改昵称(B 站限制 6 个月一次) |
list / show / records / status |
任务、记录、登录与额度状态 |
产物在 {dataRoot}/.qqbot/bili-ops/jobs/<jobId>/:video.mp4、cover.jpg、sub.srt、panels/、audio/、meta.json、README.txt。jianying.mode 改 draft 时额外导出剪映草稿工程(best-effort,版本不兼容时用素材包)。
工具调用(扩展工具 schema)
bili_ops / draw / storyboard 都使用宿主的扁平 value-schema:每个字段直接写 { type, description, enum?, required? },不要包成 JSON-Schema 的 { type:'object', properties:{...} }。包成后者会被宿主拒绝并只打一条 warn:
[channel-tools] 扩展工具注册失败 bili_ops: unsupported JSON schema:
parameters.type must be a value schema object
工具因此“消失”,模型就会绕过工具手写脚本。改完扩展后 /tools-reload(或重启 + /bot-restart)才会重新注册。
6. 隐私
仓库内不包含:
- 任何真实 openid / 群号 / 聊天记录
- B 站 Cookie / 登录信息 / DeepSeek Key(
bili-ops-secret.json) memory.db、bili-shares.jsonl、B 站运营产物(成片/分镜/配音)、表情包图库与索引- 本地模型缓存、日志、导出产物
install.mjs 只复制扩展里的代码与默认配置,不复制 data/、.state/、*.bak。
7. 来源与致谢
- 基础插件:
@zaofan/dsh-qqbot(客户端client/qqbot-settings.js、dist/features/*) - 本仓库:在上述插件之上做的扩展与补丁,思路与实现来自实际群聊运维中的问题复盘;与插件作者无隶属关系
- License:MIT
No comments yet. Be the first to write one.