yyh-001/dsh-meme

yyh-001/dsh-meme

聊天表情包:纯文本斗图、情绪主动发图、像 QQ/微信 一样发图、AI 自动学图、自定义表情包。

娱乐deepseek-harnessmemeqq-bot

中文 · English 预览表情包 · 图库市场 · 反馈问题 · 交流反馈群

能做什么

  • 一键发图:输入框旁点 😊,搜索、按图库或情绪筛选,点一张就发送。
  • 跟 AI 斗图:按情绪或关键词找图;Web 聊天里模型输出文字标记、前端显示图片,发图无需模型支持图片输入;QQ/微信等 IM 聊天里自动改走 dsh-im 原生图片发送。
  • 学会新图:上传图片后说「把这张图入库」,AI 自动识别分类和描述。
  • 管理与分享:多图库开关、上传与编辑、ZIP 导入导出、市场安装与更新。
  • 开箱即用:内置大肥鱼图库(24 张),零第三方运行依赖,使用 Node 内置 SQLite。

安装

在 DSH 中打开 插件 → 添加插件,输入 dsh-meme 并安装。

也可以安装到指定 profile:

dsh plugin --profile web add dsh-meme

需要 Node.js ≥ 22.13.0。旧包名 dsh-expression 已弃用,内部插件 ID 保留兼容。

开始使用

想做什么 · 怎么操作 自己发表情 · 点输入框旁的 😊,选图发送;支持搜索、多选筛选和悬停预览 让 AI 发图 · 说「发个开心的表情」或「找一张猫猫比心」 收藏一张新图 · 上传图片,再说「把这张图入库」;自动识图需要支持图片输入的模型 收藏动图 · 上传 GIF 直接入库;自动识图时会按时间抽帧,让 AI 看清动作而不是只看第一帧 查看大图 · 点击聊天里的表情;滚轮缩放,双击复位,Esc 或点背景关闭

对话效果:你发一张,AI 接着回一张。

图库管理

打开 设置 → 表情包:

  • 图库:点卡片管理图片;卡片开关决定 AI 能否使用该图库,可同时启用多个。支持新建、导入、导出、投稿和删除,有新版时显示「更新」。
  • 发现:预览市场图库,一键安装;Release ZIP 安装时校验 SHA-256。
  • 设置:修改扫描目录,开启或关闭 AI 主动发表情,编辑提示词,选择 AI 的发送方式(自动 / 纯文字 / 图片)。

默认扫描 ~/.dsh/meme-packs,设置保存在 ~/.dsh/dsh-expression.json,升级插件会保留。更多图库可在「发现」安装,也可导入别人分享的 ZIP。

「发送方式」只控制 AI 怎么发图,不影响前端把 [表情: 描述] 配成图片:自动(默认)按渠道来,Web 聊天写标记、IM 聊天发原生图片;纯文字只让 AI 用文字接梗,不发图片;图片要求 AI 每次挑好图都真的发出去。保存后下一条消息生效。

插件更新失败 / 更新后消失?

在市场里点「更新」时,宿主会用 pnpm 把 node_modules/dsh-meme 整个目录改名替换。Windows 上只要目录里还有打开的文件,rename 就会 `EPERM`,pnpm 只能报 exit 1;市场界面往往只留一行 exit 1,完整报错被截断,看起来像「没报错但失败了」。失败后目录可能只装了一半,再进市场会校验失败(例如提示 ENOENT ... cordis.patch.yml),插件列表里也找不到它。

0.1.59 起插件侧已修(issue #43):以前的版本在启动时会一直打开内置图库的 memes/dafeiyu-001/index.db(管理面板还有一条常驻可写连接),这个文件就在插件包目录里 → 更新时包目录被占住,pnpm 改名必然失败(ERR_PNPM_EPERM ... rename '..._tmp_...' -> '...dsh-meme')。现在图库索引只在启动时读一次进内存,上传/学图时临时打开、写完立刻关闭,内置图库激活时插件不再长期占用包内任何文件。这也解释了以前「有时成功有时失败」:激活的是 ~/.dsh/meme-packs 里的用户图库时不占包目录,激活内置图库时才会卡住更新。

在 0.1.59 之前更新失败的用户,仍按下面三步处理:

  1. 完全退出 DSH(托盘图标退出,任务管理器里确认没有 dsh / Electron 进程),重新打开后再点一次更新。
  2. 还失败,或插件已从列表消失:退出 DSH 后到对应 profile 目录手动更新(默认在 ~/.dsh/profiles/;桌面版是 desktop,Web / CLI 常见 web):
cd ~/.dsh/profiles/web
   pnpm add dsh-meme@latest

然后重新打开 DSH,在「设置 → 表情包」确认插件已启用。

  1. 图库和设置都存在 ~/.dsh(dsh-expression.json 等),更新或重装不会丢;仍不行可以先卸载再重装。

升到 0.1.59 之后仍更新失败,说明占用来自插件之外(宿主进程、杀毒软件或其它程序):把 profile 目录、市场里的 exit 1 上下文和是否有 ERR_PNPM_EPERM 一并反馈给 DSH 插件市场;插件这边已确认不再占用包内文件,有一个回归测试专门模拟 pnpm 改名(test/update-lock.test.mjs)。

国内网络 / 图库市场拉不到?

图库目录和预览图托管在 GitHub 上,国内直连 raw.githubusercontent.com / cdn.jsdelivr.net 经常超时,发现页于是显示「图库目录暂不可用(检查网络或稍后重试)」。插件默认走多镜像,通常无需配置:

  • 自动竞速:目录、清单 JSON、安装 ZIP 和逐图下载都会尝试原始地址和 ghfast.top、gh-proxy.com、ghproxy.net、cdn.jsdmirror.com、fastly.jsdelivr.net 等镜像,取最先成功的;封面和预览图逐个候选回退,并记住能用的镜像。
  • 磁盘缓存:成功拉到的目录存到 ~/.dsh/dsh-meme-catalog-cache.json,网络暂时不通时先用它显示,并提示「当前使用本地缓存」。
  • 安装仍校验 SHA-256:镜像只换下载通道,镜像返回的 ZIP 哈希对不上会自动换下一个,不会装进坏包。

拉不到时按顺序排查:

  1. 点发现页的 重试;
  2. 打开 设置 → 表情包 →「设置」,看「图库目录源」的 当前源,确认自定义地址没写错(地址错也会这样);
  3. 在「图库目录源」下拉框选 镜像源(只走国内加速节点,最稳);还不行再选 自定义地址,填一个你能访问的 catalog.json 地址并保存,或切回 自动。也可以直接改 ~/.dsh/dsh-expression.json 的 "remoteDirUrl"(""/auto = 自动、official = 官方直连、mirror = 国内镜像、或自定义 URL),即时生效。

自查镜像连通性(任一返回 200 即可):

curl -I https://ghfast.top/https://raw.githubusercontent.com/yyh-001/dsh-meme-packs/main/catalog.json
curl -o /dev/null -w '%{http_code}\n' https://cdn.jsdmirror.com/gh/yyh-001/dsh-meme-packs@main/catalog.json
curl -o /dev/null -w '%{http_code}\n' https://gh-proxy.com/https://raw.githubusercontent.com/yyh-001/dsh-meme-packs/main/catalog.json

分享自己的图库

  1. 在「图库」新建图包库,添加图片。
  2. 点 导出 得到 ZIP,朋友用 导入图库 即可安装。
  3. 想收录到市场,点 投稿:插件导出 ZIP 并打开预填的 GitHub 表单;登录后附上 ZIP、图片来源与许可,再提交审核。

请使用插件导出的 ZIP。GitHub 的「Download ZIP」是仓库源码压缩包,不能替代图库分享包。导出完成后仍需在 GitHub 提交,审核通过才会收录。

工具与扩展

工具 · 用法 send_meme · tag 按情绪随机抽图,query 按描述、关键词或文件名搜索;范围为所有启用的图库 learn_meme · 默认收录最近一张用户图片,也可指定 attachmentId 或 imageUrl

send_meme tag=happy
send_meme query="猫 比心"
learn_meme

情绪桶:happy / angry / sad / shy / confused / daily。模型应把候选中的 [表情: 描述] 原样写进回复;前端只在聊天内容中配图。没有合适的候选时,换关键词或用文字回复。

动图读取:learn_meme 和上传弹窗的 AI 识图支持 GIF 动图——先把动图按时间轴均匀采样成几帧、拼成一张带帧序说明的胶片条再送模型,所以 caption 能描述「猫疯狂摇头」这类动作,而不是只看见第一帧。原图照旧入库,聊天里仍然会动。动图 WebP / APNG 目前只能读帧数、时长等元数据(仍按第一帧识别),提示词里会注明它是动图。解码是纯 JS 实现,不引入第三方依赖。

通过 dsh-im 接入 QQ / 微信 / 飞书 / 企业微信等 IM 时,表情包会以该聊天的原生图片消息发出:插件按会话来源识别 IM 渠道后,send_meme 的候选会额外带绝对路径,模型随后调用 dsh-im 的 dsh_im_return_file 把图交给渠道;IM 聊天不渲染 [表情: 描述],所以不会再写标记。这条投递规则随主动斗图提示词一起自动注入——不需要先跟模型说明「可以在 QQ/微信里发表情包」。Web 聊天保持原来的 [表情: 描述] 配图方式,两种会话可以同时存在。

自建图库目录或市场源见 远程图库规范。通过 dsh-companion 也可接入 QQ 发图。

插件 HTTP 接口仅支持本机回环地址(localhost / 127.0.0.1 / [::1]),通过局域网地址或自定义域名访问会被拒绝。

代码采用 MIT 许可;图库图片的来源与使用许可请分别查看各图库说明。