dsh-emotion-analyzer:本地 ONNX 为助手回复打分,并投影到 DSH 会话界面

前言

在 DSH(DeepSeek Harness)里跑智能体时,主模型每条 assistant 回复的内容往往只留在消息流里,很难一眼看出「这一轮语气偏悲、偏怒还是偏平静」。若把整段对话再丢给云端情绪 API,会多一轮联网、多消耗 Token,也和 DSH「插件扩展宿主能力」的做法不太一致。

下面介绍社区插件 dsh-emotion-analyzer(维护者 Thatgfsj,分类:模型推理):在本进程内用 ONNX 对每条主模型回复做情绪打分,把累积状态写进 Session projection,并在 DSH Web 界面注入可拖拽的悬浮监测框。推理阶段不调用第三方模型 API;只有用户主动下载模型权重时才会访问 HuggingFace。

这是什么

dsh-emotion-analyzer 是面向 DSH >=0.2.1-rc.2 <0.3.0 的插件(package 版本 0.2.2)。代码许可为 MIT;默认在线模型权重为 Apache-2.0,包内回退用的 legacy 模型为 CC-BY-NC-4.0(非商业),商用需选用默认模型或自行替换。

一句话定位:本地 ONNX 推理 → Session 情绪投影 → Web 端悬浮框展示。

核心功能

本地推理与模型

  • 默认尝试 Horizon-Labs/multilingual-emotions-small(GoEmotions 28 标签、36 语言、官方 INT8,约 256 MiB);未下载时回退到 assets/ 中的 legacy tabularisai(11 标签)。两者皆无则静默降级,不影响聊天。
  • 使用 onnxruntime-node + tokenizers 在 CPU 上做 INT8 推理;推理阶段不联网,不额外消耗主模型 Token。
  • 多语言:默认模型覆盖 36 种语言;中文 / 英文按 CJK 占比显示语言标识。

统一情绪维度与 Session

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

每轮分数以 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 文本 → EmotionScorer.score(text) → 写插件记录并注册 emotion projection → Web 客户端 useProjection('emotion') → shell overlay → <emotion-monitor>。

安装与启用

插件以当前 DSH 进程权限运行;安装前应阅读仓库源码与许可证(尤其 legacy 模型的 NC 条款)。

从本地路径加入 web profile(命令来自官方 README,勿凭仓库名自行拼接 github: 安装串):

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 .

装好后默认尝试 horizon-small;模型尚未下载时会用 legacy 回退(legacy 需按文档导出量化后放入 assets/)。

在设置页或通过 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

设置持久化在 $DSH_HOME/emotion-analyzer/config.json;模型下载到同目录 models/<id>/,不进仓库。首次回复会触发 ONNX 加载(legacy 约 1.5s,Horizon small 约 2–3s),之后单条约 9–20ms。onnxruntime-node / tokenizers 为原生模块,README 注明在 Linux + Node 24 上验证;Windows / macOS 需在目标机自行验证。

典型用法与可调参数

日常使用时无需改代码:装好插件、在设置里下载并选中 horizon-small(或 horizon-base 等预设),正常与主模型对话即可;每轮 assistant 回复结束后自动打分并更新悬浮框与 projection。

若需微调「噪声过滤」与「多轮累积手感」,可改 src/mapping.ts 顶部常量(默认值与校准说明见 README):

常量 值 说明
THRESHOLD 0.2 聚合分低于该值视为噪声,整轮跳过
DECAY 0.85 每轮回落系数
STEP_MAX 0.25 单轮命中最大步长
CAP 1.0 统一维度封顶

适用场景与注意

适合:希望在 DSH Web 里直观观察助手回复情绪走势、且希望打分留在本机、不写进第三方 API 的开发者或自用部署。

注意:

  • 插件只把助手回复文本送入本进程 ONNX;会话日志中的插件记录含分数、语言、长度、FNV-1a 文本 hash 与时间,不含回复原文;悬浮框趋势最多 30 轮(内存 + localStorage),不上传。
  • DSH 社区目录(SkillHub 等)是独立站点,与 DeepSeek / 幻方无官方从属关系;安装插件前请自行审查源码与依赖。
  • Node 引擎要求 >=22.18;DSH 版本需落在 >=0.2.1-rc.2 <0.3.0。

结尾

dsh-emotion-analyzer 把「每条 assistant 回复的情绪」做成可恢复的 Session 投影,并在页面上用可拖拽悬浮框展示,适合在本地 Harness 里做对话侧的可视化监测,而不额外占用主模型 Token。

  • 目录页:https://www.skillhub.cn/plugins/Thatgfsj/dsh-emotion-analyzer
  • 源码与完整文档:https://github.com/Thatgfsj/dsh-emotion-analyzer
羽毛球分组比赛记分
小程序二维码

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

Xiaoye