dsh-sticker-hub:给 DSH 装一套本地表情包库

前言

在聊天型 agent 里做「配图」有几处别扭:图库散落在各处,图片没有结构化标签,agent 只能靠文件名猜哪张图符合语境;想给某个情绪配图,得先知道库里有没有、在哪、能不能发。lunchyspring 维护的 dsh-sticker-hub 想解决的就是这件事——把表情包做成一个本地的、可打标、可检索、可直接发送的资源库,装进 DeepSeek Harness(DSH)。

它的定位很清楚:插件本身不带任何图片,也不带任何密钥。图从哪个仓库 pull、用哪个 vision 模型打标、花谁的钱,都在你自己机器上决定。本文根据 GitHub README 的实测信息整理安装与用法。

这是什么

一句话:一个给 DSH 用的本地表情包库插件,提供打标、语义检索、自动配图、群聊里的「表情包大战」模式,以及 GUI 内联图。

  • 维护者:lukcyspring
  • 分类:趣味换装(社区目录 SkillHub 标注)
  • 特性:MIT 协议,纯 JS 无运行时依赖,Node ≥ 20
  • 仓库地址:https://github.com/lukcyspring/dsh-sticker-hub
  • 目录页:https://www.skillhub.cn/plugins/lukcyspring/dsh-sticker-hub

能做什么

README 的能力表如下:

能力 说明
本地图库 一个目录 + 一份 index-all.md 表格,人可读、可 git 管
打标 用你配的 vision 模型给新图生成「名字 / 情绪 / 标签 / 什么时候用」
检索 按想表达的意思找图,带防复读降权
发送 交给任意「发文件」工具(默认 QQ 的 qqbot_send_file),不回文字
大战 开关 / 触发词 / 连发三张,任一条件进入,之后只回图
GUI 内联图 聊天窗口里直接显示表情包,不需要 QQ / IM 通道
设置页 DSH 界面「设置 → 表情包库」直接改,不用重启

几个值得展开的点:

  1. 插件注册了只读图片路由,sticker_show 会把地址拼成同源绝对地址再返回 markdown,聊天窗口里直接出图,不走 IM 文件通道。路由只接受回环地址,路径锁死在图库目录内。
  2. 「表情包大战」进入后只回图不写字;你一开始打字,这一局就结束。它怎么知道你在发图?通道插件会把下行图片存成本地文件并把路径交给 agent,agent 再调 sticker_learn 或 sticker_search + sticker_send。
  3. 正文标记 [sticker:名字] 是推荐用法:在回复正文里写 [sticker:变身],通道层拆成文字段 + 图片段顺序发出。名字找不到就用情绪词同类随机,都对不上就丢掉标记,绝不硬凑。

三个前提

  1. DSH 装好并能跑:桌面版或 CLI 均可,Node ≥ 20,能打开设置、能装插件(~/.dsh/profiles/<name>/)。
  2. 接一个能收发图片的 IM 通道(推荐 QQ)。QQ 的做法是:在 q.qq.com 注册开发者 → 创建机器人应用 → 记下 AppID 与 AppSecret → 在沙箱配置里加测试群 → 在 DSH 里装 @tencent-connect/dsh-qqbot → 扫码绑定。没有 QQ 也能用插件,工具和检索照常,只是发不出去(sticker_send 会把文件路径还给你)。
  3. 配一个 vision 模型。只有「给新图自动打标」需要它,任意 OpenAI 兼容的 endpoint 都行,README 给了 OpenAI、DMXAPI 中转、本地 ollama 三种示例。密钥不建议写进插件配置,放到一个一行文本文件里,把路径填给 keyFile。

安装

README 给出三种安装方式:

# 方式 A:直接从 GitHub 装
dsh plugin --profile desktop add github:lukcyspring/dsh-sticker-hub

# 方式 B:从本地目录(开发中,改完代码立刻见效)
cd ~/.dsh/profiles/desktop
npm install /path/to/dsh-sticker-hub --no-save

# 方式 C:发布到 npm 之后
dsh plugin --profile desktop add dsh-sticker-hub

装完重启 DSH,设置里会出现「表情包库」一页。

README 特别提醒:DSH 的插件要同时出现在 profile package.json 的 dependencies 和 dsh.profile.bundles 里,只加依赖不写 bundles,宿主不会去加载它。

拉图库与打标

插件仓库里的 resources/ 附带了现成结构:18 张示例表情包,以及一份 614 张(已去重)的标签表,含文件 / 名字 / 情绪 / 标签 / 什么时候发。核实:完整图库不随 npm 包发布,需要 clone 仓库取得;其中 resources/gallery/ 的 18 张随仓库分发,另外 596 张只留标签,图靠 pull 从上游拉。

拉图和打标的 CLI 如下:

node bin/sticker-hub.mjs pull            # 全部拉
node bin/sticker-hub.mjs pull dsh-meme   # 只拉一个
node bin/sticker-hub.mjs stats           # 看看有多少张
node bin/sticker-hub.mjs tag --limit 20  # 先试 20 张看质量
node bin/sticker-hub.mjs tag             # 全量

图片落在 ~/.dsh/sticker-hub/library/gallery/,只有一层,按内容哈希去重;索引是 library/index-all.md。自己的图直接丢进 gallery 目录即可;在 QQ 里发给它,sticker_learn 也会自动入库。

打标质量有两个经验:GIF 要抽三帧拼图再送模型,只给中间一帧模型容易误读动作;标签写「在做什么」不写「像谁」,角色名留一两个即可,动作才是检索真正会命中的东西。

提供的工具

工具 作用
sticker_search 按意思找候选,返回名字 / 情绪 / 标签 / 什么时候用
sticker_send 挑一张并发送,默认只回路径,由调用方用发文件工具发
sticker_learn 把一张图入库并打标
sticker_battle 大战开 / 关 / 查状态 / 记一次「收到图」
sticker_stats 库有多大、标签多密、大战开没开
sticker_show 在 GUI 聊天窗里内联显示一张

最短路径:装插件 → 设置页填图库目录 → node bin/sticker-hub.mjs pull → tag → 在聊天里说「发个摸鱼的表情包」。

设置页与常见问题

「设置 → 表情包库」提供大战开关、触发词、连发阈值,图库目录(默认 ~/.dsh/sticker-hub/library),识图 Base URL / 模型 / 密钥文件路径,并实时显示库大小与各来源张数。改完立刻生效,不用重启。

README 列出的常见问题:图库是空的 多是没跑 pull 或 libraryDir 指错;识图未配置 多是模型没填或 keyFile 路径不对;识图 HTTP 400 多是图片太大(默认上限 8 MB)或 GIF 未抽帧;发不出图多是通道没有发文件工具或文件不在允许目录内。

适用场景与注意

适合想在 DSH 里做聊天配图、表情包互动的开发者,尤其是已经在用 QQ 机器人通道的人。插件以当前 dsh 进程的权限运行,装前应检查源码与许可证:代码为 MIT,但图片按各自上游来源的许可走,README 的 ATTRIBUTION.md 记录了每个来源的许可,转载图库前先看人家 README,其中大肥鱼系 265 张是 CC BY-NC 4.0,别商用。

另外,出站拦截的硬模式补丁和 [sticker:] 通道接法分别在 docs/HARD-MODE.md 与 docs/MARKER.md,都改的是通道插件的 dist,升级会覆盖,自己权衡。

卸载:

dsh plugin --profile desktop remove dsh-sticker-hub
rm -rf ~/.dsh/sticker-hub     # 图库与状态,确认后再删

小结

dsh-sticker-hub 的价值在于把表情包当作一个有结构、可检索、可管理的本地资源,而不是一堆散落的图片文件。库在本地、模型由你配、许可清楚,需要 QQ 通道才能玩「大战」,不需要也能在 GUI 里内联看图。

目录页:https://www.skillhub.cn/plugins/lukcyspring/dsh-sticker-hub
GitHub:https://github.com/lukcyspring/dsh-sticker-hub

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜