给 AI 编程 Agent 的轻量心情指示器——把会话行为(连续失败、重复调用、活动强度)折叠成四态 Mood(顺利 / 困惑 / 受挫 / 过载),以低干扰的会话头部状态灯呈现。
安装
# Release 预构建包
dsh plugin --profile web add "https://github.com/Raphaelutumn/dsh-mood/releases/download/v0.1.0/dsh-external-dsh-mood-0.1.0.tgz"
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:Raphaelutumn/dsh-mood
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
“Your agent doesn't have feelings. But its behavior does. It's not science. It's a mood ring.”
dsh-mood 观察 Agent 最近怎么做事——连续失败、反复执行同一个工具、活动强度——把它翻译成一个简单的四态 Mood,并在会话头部用一颗低干扰的状态灯呈现:顺利 😊、困惑 😕、受挫 😤、过载 🤯。
机器可读的项目事实:llms.txt
30 秒演示
安装后刷新 dsh web,会话头部右侧就会出现状态灯。让 Agent 连续失败几次,它会从 😊 变到 😤;之后连续成功它回到 😊:
| 没有 dsh-mood | 安装 dsh-mood 后 |
|---|---|
| 你只能靠翻日志猜 Agent 眼下是顺利还是卡住。 | 一眼看清当前 Mood,得到可验证的 why(如 3 consecutive failures)和整场会话轨迹。 |
为什么需要 Mood?
编码 Agent 很擅长干活,但卡住和原地打转同样常见:连续失败、反复执行同一个工具、多信号同时叠加。你等它时最想知道的只是一句——“它现在看起来正常吗?”
Mood 不是玄学,是可解释的行为分类。每个 Mood 都来自真实观察到的信号,给你一个固定、可验证的 why。它不打断工作流,也不假装测量模型的心理。
| 一眼看懂进展 | 抓住卡死 | 低干扰 | 有点好玩 |
|---|---|---|---|
| 不用翻日志就知道现在是否正常。 | 连续失败 / 反复同一操作会给出提示。 | 它是状态灯,不是监控面板。 | 四态表情 + 会话轨迹,让你乐意看一眼。 |
它认识四种 Mood
| Mood | 含义 | 观察到什么 |
|---|---|---|
| 😊 GOOD | 一切正常 | 持续有效结果,无明显异常重复 |
| 😕 CONFUSED | 开始原地打转 | 反复执行相同 / 高度相似的操作 |
| 😤 FRUSTRATED | 连挂很明显 | 短时间连续明确失败 |
| 🤯 OVERWHELMED | 失控 / 过载 | 高活动 + 失败 + 重复等信号同时出现 |
多状态同时成立时的优先级:🤯 OVERWHELMED > 😤 FRUSTRATED > 😕 CONFUSED > 😊 GOOD。正常的高复杂度任务不会因为工具调用多就被误判为 OVERWHELMED——它需要多重异常信号同时命中。
工作原理
flowchart LR
A["session/event(tool result / tool call)"] --> B["滑动窗口:连续失败 · 同工具重复 · 活动强度"]
B --> C{"多状态同时成立?"}
C -- "OVERWHELMED" --> D["🤯 过载"]
C -- "FRUSTRATED" --> E["😤 受挫"]
C -- "CONFUSED" --> F["😕 困惑"]
C -- "否则" --> G["😊 顺利"]
D --> H["会话头部状态灯 + why + 轨迹"]
E --> H
F --> H
G --> H
状态机是纯 fold:session/event → MoodState → MoodProjection。宿主侧计算,浏览器经 useProjection('mood') 直接读结果,无外部依赖、可预测。
防闪烁设计
- 升级很敏感:连续失败 / 重复一达阈值立刻升到对应 Mood。
- 恢复很保守:回到 GOOD 需要连续几次成功,单个成功不会让它来回跳。
- 原因去重:同一原因在冷却窗口内不再刷屏,但真正的恢复 / 升级不会被吞掉。
- 会话轨迹:它记住整场的旅行(
😊 → 😤 → 😊),悬停即可回看。
快速开始
从 Release 包安装
Invoke-WebRequest `
-Uri 'https://github.com/Raphaelutumn/dsh-mood/releases/latest/download/dsh-external-dsh-mood-0.1.0.tgz' `
-OutFile '.\dsh-mood-0.1.0.tgz'
dsh plugin --profile web add .\dsh-mood-0.1.0.tgz
从 DeepSeek Harness 源码 checkout 运行时:
$env:DSH_HOME='D:\Deepseek harness\.dsh'
corepack pnpm --dir 'D:\Deepseek harness' dsh plugin --profile web add .\dsh-mood-0.1.0.tgz
从源码构建
git clone https://github.com/Raphaelutumn/dsh-mood.git
Set-Location .\dsh-mood
corepack pnpm install
corepack pnpm pack --pack-destination .
dsh plugin --profile web add .\dsh-external-dsh-mood-0.1.0.tgz
卸载
dsh plugin --profile web remove dsh-mood
若你直接使用 DeepSeek Harness monorepo,两个包
@deepseek-ai/dsh-mood(宿主)与@deepseek-ai/dsh-client-mood(客户端)已注册进dsh-base/dsh-web-app,随默认 profile 一并加载。
配置
| 字段 | 默认值 | 含义 |
|---|---|---|
confusedRepeatThreshold |
3 |
同一工具连续出现多少次判定 CONFUSED |
frustratedFailureThreshold |
3 |
连续失败多少次判定 FRUSTRATED |
overwhelmedSignalCount |
3 |
高活动 + 失败 + 重复三信号是否齐备判定 OVERWHELMED |
stableSuccessesToRecover |
2 |
回到 GOOD 所需连续成功数 |
changeCooldownMs |
60000 |
同一原因在多少毫秒内不重复刷屏 |
repetitionWindow |
12 |
用于重复检测的最近工具调用数 |
highActivityThreshold |
4 |
窗口内工具调用数多少视为“高活动” |
在 profile 的 cordis.patch.yml 中覆盖插件配置:
- id: mood
config:
frustratedFailureThreshold: 5
stableSuccessesToRecover: 3
changeCooldownMs: 30000
所有配置都必须是正整数。非法配置会直接导致插件加载失败,而不是静默失效。
兼容性
| 环境 | 支持和验证情况 |
|---|---|
| Node.js 20 / 22 / 24 | 与 DeepSeek Harness 一致 |
| DeepSeek Harness | 宿主 @deepseek-ai/dsh-mood + 客户端 @deepseek-ai/dsh-client-mood;独立包 @dsh-external/dsh-mood |
| 会话头部 UI | conversation.session.header.utilities 槽位(右对齐、加性、不污染消息流) |
模型看到的提示
Mood 是纯观察者:它不修改任何模型请求、不加 prompt、不拦截工具。ctx.mood.snapshot(session) 读取当前快照;mood/change 事件在 Mood 变化时通知宿主侧消费者。
常见问题
它会打断 Agent 吗?
不会。它是只读行为观察者,不插入提示、不否决/改写工具调用。状态灯只出现在会话头部,不污染消息流。
它是严格的科学测量吗?
不是。Mood 是可解释的行为分类,每个 why 都来自实际观察到的信号;它不假装测量模型的心理状态。
为什么恢复要连续几次成功?
为了避免在成功/失败交替时频繁闪烁。升级要敏感,恢复要保守,这是 PRD 的核心防闪烁设计。
行为细节
- 信号完全本地计算,不发外部、无数据库、无 Dashboard。
- 恢复需连续成功;重复原因有冷却去重;多信号同时命中才 OVERWHELMED。
- 阈值全部可用
Config按真实任务校准。
限制
- Mood 反映的是行为信号,不是任务进度的保证——持续失败未必等于卡死,但没有失败通常说明在推进。
- 当前是运行时内存状态,会话重启不持久化。
- 独立安装状态:这里的
@dsh-external/dsh-mood包基于当前 DeepSeek Harness 源码构建并运行。但发布到 npm 的 DSH 包仍停留在0.0.1-rc.1,尚未包含本插件依赖的 Web 端 API(conversation.session.header.utilities、useProjection)——因此在公开 npm 栈上,浏览器端的独立dsh plugin add安装暂不可行。它在 DeepSeek Harness monorepo 内运行、随默认 web profile 载入。待公开客户端栈追上后会再发布独立包。参见packages/dsh-mood/README.md。
参与贡献
欢迎提交 Issue 和边界清晰的 Pull Request。本地验证命令:
corepack pnpm install
corepack pnpm test
corepack pnpm typecheck
corepack pnpm build
请确保行为描述有测试支撑。本项目共 32 个测试(宿主 22 + 客户端 10)。
许可证
链接
同类插件
zhu1090093659/dsh-web#packages/dsh-task-board★ 8670
侧边栏多列任务看板:卡片交给真实 DSH 智能体会话执行,支持 cron 定时(Host 侧到点执行,关浏览器也生效)。
zhu1090093659/dsh-web#packages/dsh-web-all★ 8670
DSH Web UI 插件与皮肤合集:任务看板、git 图、右侧面板、远程移动端 UI、桌宠、实时 token 统计与皮肤中心。
MeteorNOX/DeepSeek-Balance-Whale-Widget★ 4631
右下角常驻的小鲸鱼挂件:余额、今日已用与每轮对话消耗(含峰谷价),余额预警与今日预算的泡泡内容都可编辑;泡泡点击序列模块化自定义,支持并列加权 A/B、随机台词与随机图片;内置 30+ 厂商模板(OpenAI / OpenRouter / Kimi / 硅基流动 / 方舟 / 智谱 / MiniMax 等),按模型查余额与订阅额度;另有任务结束音效、导入音频、自定义角色与资源管理。数据全在本机,无遥测。
ccch1mneyyy/dsh-TUI★ 4484
Claude Code 风格全屏终端 UI:像素鲸鱼顶栏、实时工作状态行、思考流式展开。
omdsh-dev/DSH-better-sidebar★ 4133
侧边栏完整工作台:内置文件渲染编辑、终端、Git 与子代理,支持三方插件注册新 Tab。
Devin-AXIS/deepseek-design#deepseek-idesign★ 1453
可视化设计工作室,支持网站、App 原型、海报、信息卡、报告和杂志的模板创建、元素编辑、选区级 AI 草稿衔接与导出。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。