前言¶
在 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)写入会话日志,由emotionprojection 单元纯同步 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。
典型用法¶
- 按上文安装并跑通
check-install.sh web。 - 在 DSH Web 设置 → 情绪分析器 中下载 / 选择模型(或用 curl 调用
/api/emotion-analyzer/v1/model/*)。 - 正常与主模型对话;每轮助手回复结束后插件自动打分并更新 projection。
- 在聊天页拖拽悬浮徽章,点击展开查看各维度分数与近期 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。