dsh-emotion-analyzer:本地 ONNX 情绪打分与会话悬浮监测

前言

在 DSH(DeepSeek Harness)里跑主模型对话时,助手每轮回复的「语气」往往只能靠人读一遍才能感知;若想把情绪状态挂进 Session、或在 Web 界面里持续看到趋势,通常要么接第三方情绪 API(额外联网与费用),要么自己写推理与 UI。下面介绍社区插件 dsh-emotion-analyzer(维护者 thatgfsj-dsh,分类:模型推理):在宿主进程内用 ONNX 对每条助手回复做本地打分,把累积状态投影进会话,并在 DSH 网站注入可拖拽悬浮框。

这是什么

dsh-emotion-analyzer 是 DSH 插件,版本 0.2.2(见仓库 package.json),要求 DSH >=0.2.1-rc.2 <0.3.0、Node >=22.18。代码许可 MIT;默认模型权重为 Apache-2.0,回退 legacy 模型为 CC-BY-NC-4.0(非商业),权重不随仓库分发。

一句话:本地 ONNX 推理为主模型回复打分 → 写入 Session projection → Web 端显示可拖拽情绪监测组件。推理阶段不联网、不消耗主模型 Token;仅用户主动下载模型时会访问 HuggingFace。

核心功能

本地推理与模型

  • 默认 Horizon-Labs/multilingual-emotions-small(GoEmotions 28 标签、36 语言、官方 INT8,约 256 MiB);legacy tabularisai(11 标签)保留为回退资产。
  • 使用 onnxruntime-node 在 CPU 上做 INT8 推理;装好后默认尝试 horizon-small,模型未下载时自动回退到 assets/ 里的 legacy(需按文档导出),两者都没有时插件静默降级、不影响聊天。
  • 多语言:默认模型覆盖 36 种语言;中文 / 英文按 CJK 占比显示语言标识。

统一情绪维度与映射

模型标签经可插拔 profile 映射到 7 个统一维度:愉快 pleasant、悲伤、愤怒、焦虑、反感 unwell、疑问 confused、平静。内置 legacy-11、go-emotions-28、zh-8 三套 profile;阈值过滤、衰减、步长、封顶等参数集中在 src/mapping.ts(如 THRESHOLD 0.2、DECAY 0.85、STEP_MAX 0.25、CAP 1.0)。

Session 与 Web 悬浮框

  • 每轮分数以 plugin:emotion-analyzer/turn(ignorable)写入会话日志,由 emotion projection 单元纯同步 fold;重启、fork 可恢复。
  • Web 端:Web Components + Shadow DOM;默认 64px compact 徽章(emoji + 中文情绪),可拖拽;点击展开分数条 / sparkline,再点 [—] 折叠。显示 / 隐藏由 Settings → 情绪分析器 控制。

数据流(DSH 0.2.1-rc.2 实际 API)

宿主事件 agent/turn-stopping 触发后,取最后一条 assistant 的 text block → EmotionScorer.score(text) → 追加插件记录并注册 emotion projection → 客户端 useProjection('emotion') → shell overlay → <emotion-monitor>。

安装与启用

插件需加入 web profile 的 bundle。官方 README 给出的安装方式如下(路径改为你本机克隆或解压后的目录,勿凭插件名拼接 github:owner/repo):

dsh plugin --profile web add /path/to/dsh-emotion-analyzer

必做:验证插件是否进入 profile 的 bundle 层:

bash scripts/check-install.sh web

输出 OK 才算安装成功。若提示 bundle missing,可先移除再在当前插件目录执行:

dsh plugin --profile web remove dsh-emotion-analyzer
dsh plugin --profile web add .

设置持久化在 $DSH_HOME/emotion-analyzer/config.json;模型下载到同目录 models/<id>/。

在设置页或通过 Host API 下载并选择模型后,下一轮生效。示例(<port> 替换为本地 DSH 端口):

curl -X POST http://127.0.0.1:<port>/api/emotion-analyzer/v1/model/download \
  -H 'content-type: application/json' -d '{"id":"horizon-small"}'
curl -X POST http://127.0.0.1:<port>/api/emotion-analyzer/v1/model/select \
  -H 'content-type: application/json' -d '{"id":"horizon-small"}'
curl http://127.0.0.1:<port>/api/emotion-analyzer/v1/state

首次回复会触发 ONNX 加载(legacy 约 1.5s,Horizon small 约 2–3s),之后单条约 9–20ms。onnxruntime-node / tokenizers 为原生模块,README 注明在 Linux + Node 24 上验证;Windows / macOS 需在目标机自行验证安装脚本与二进制下载。

模型预设(v0.2)

预设 许可 体积 语言 标签 说明
horizon-small(默认) Apache-2.0 268 MB 36 28 官方 INT8,可在线下载
horizon-base Apache-2.0 641 MB 36 28 更准但更慢 / 更大
legacy-tabularisai(回退) CC-BY-NC-4.0 279 MB 23 11 包内 assets,不可删除
zh-johnson-small MIT 待导出 zh 8 needsExport

完整预设、离线安装与风险见仓库 docs/models.md。

典型用法

  1. 按上文安装并跑通 check-install.sh web。
  2. 在 DSH Web 设置 → 情绪分析器 中下载 / 选择模型(或用 curl 调用 /api/emotion-analyzer/v1/model/*)。
  3. 正常与主模型对话;每轮助手回复结束后插件自动打分并更新 projection。
  4. 在聊天页拖拽悬浮徽章,点击展开查看各维度分数与近期 sparkline(趋势最多 30 轮,存于内存与 localStorage,不上传)。

调参需改源码中 src/mapping.ts 并重新构建插件,无单独远程配置项文档在此重复。

适用场景与注意

适合:希望在 DSH Web 会话里本地观察助手回复情绪趋势、并把状态留在 Session 里以便重启 / fork 恢复的智能体开发者;不想为情绪分析额外调用第三方模型 API 的场景。商用情绪模型请优先默认 horizon-small(Apache-2.0),避免误用 legacy-tabularisai 的非商业许可。

注意:

  • 插件以当前 DSH 进程权限运行;安装前应阅读源码与 LICENSE、docs/models.md 中的模型许可。
  • 会话日志中的插件记录含分数、语言、长度、FNV-1a 文本 hash 与时间,不含回复原文;推理只处理助手回复文本,且推理阶段不联网。
  • DSH 社区插件目录为独立站点,与 DeepSeek / 幻方无官方从属关系;生态理念是「一切皆插件」,本文仅介绍该仓库公开文档中的能力。

结尾

dsh-emotion-analyzer 把主模型每条回复的情绪用本地 ONNX 量化成 Session 状态,并在 DSH 网站提供可拖拽监测 UI,适合在 Harness 里做对话侧「情绪手环」式观测。目录页:https://www.skillhub.cn/plugins/thatgfsj-dsh/dsh-emotion-analyzer;源码与完整文档:https://github.com/thatgfsj-dsh/dsh-emotion-analyzer。

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

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

小夜