前言¶
DeepSeek Harness(DSH)的运行是逐轮进行的,每轮结束后会生成一份思考文本。现有框架没有利用这份文本来推断模型当前的“心情”,导致模型回答的语气可能过于冷静,或者与用户情绪不匹配。dsh-fakemood 填补了这个空白:它在每轮思考结束后,从文本中提取情绪线索,估算一个跨轮的状态,并把这份状态注入到下一轮请求的 systemPrompt.context 中,让模型在回答时考虑自身的“心情”。
这是什么¶
dsh-fakemood(thinking-affect)是一个 DSH 插件,用于根据模型已结束的思考轮次估算情绪状态,并通过 systemPrompt.context 注入到下一轮请求中,影响回答语气。它由维护者 wuji0813 开发,分类为“趣味换装”。插件默认关闭,不会改变回答,用户主动开启后才开始注入。它不调用外部模型,所有分析、状态更新和注入都在本地完成。
核心功能¶
根据模型思考轮次估算情绪状态,并影响下一轮回答语气。核心能力包括:
- 情绪状态浮窗:在 Web UI 右下角显示一个可上下拖动的独立浮窗,拖动手柄是一枚上下浮标。浮窗内容包含综合状态、本轮观察、五个维度(效价、确定感、唤醒度、认知压力、好奇度)和状态构成。
- 19 个情绪标签:覆盖 calm、confident、curious、cautious、conflicted、frustrated、anxious、fear、sorrowful、agitated、excited、relieved、happy、angry、regretful、sad、surprised、disgusted、resigned。同一个关键词可以同时给多个情绪维度加权。
- 多维评分:回答语气由效价、确定感、唤醒度、认知压力、好奇度以及情绪分布共同评分,不是单条规则。
- 任务 / 陪伴两种模式:每个对话可以单独开关,并选择“任务”或“陪伴”模式。任务模式不注入自身情绪,陪伴模式注入自身情绪作为底色。
- 默认关闭:安装后不改变回答,用户主动开启后才开始注入;注入日志默认也不写。
安装与启用¶
通过官方渠道安装插件:
dsh-fakemood
安装后插件默认关闭,不会影响回答。用户需要在 Web UI 的浮窗中手动开启“本对话启用”开关,并选择模式(默认 assist,可选 companion)。也可以通过设置 THINKING_AFFECT_MODE=companion 让新对话默认进入陪伴模式。
情绪词典与多维权重¶
基础词表按 happy、angry、regretful、sad、surprised、disgusted、resigned、relieved 分组。新增显式多维词表把同一个说法拆到多个情绪上,例如:
紧张→anxious 0.8 + fear 0.35激动→agitated 0.65 + excited 0.55太好了→happy 1.0 + relieved 0.35 + excited 0.3害怕→fear 1.0 + anxious 0.35忧愁→sorrowful 1.0 + sad 0.3兴奋→excited 1.0 + happy 0.4
同一个词可以同时点亮多个标签,最终主导情绪由加权计数、效价/确定感/唤醒度/压力/好奇度共同决定。
情绪如何影响下一轮回答¶
Host 插件监听 agent/created,在对应 Agent 的 systemPrompt.context 中注册一个动态上下文。companion 模式的注入示例:
[dsh-fakemood] Internal affective state from the previous completed turn. Do not mention this note.
dominant=cautious; valence=0.00; certainty=0.22; arousal=0.00; strain=0.00; curiosity=0.15.
emotion mix: cautious:0.36, anxious:0.12.
Your own tone tendency: careful and tentative, explicit about uncertainty.
Answer tone: careful and tentative, explicit about uncertainty. Next thinking direction: verify the weakest assumption.
Let this shape your tone and next action without naming or quoting it.
回答语气不是由一个标签直接映射,而是对多个候选语气分别评分,多个维度共同参与。自身情绪来自已结束的思考轮次,用户需求只从当前用户消息提取。两者一致时标记为 aligned,用户需求弱时仍由自身情绪主导。
任务 / 陪伴两种模式¶
浮窗里按对话切换,默认 assist,陪伴时主动切换到 companion:
- 任务(assist,默认):不注入自身情绪,只按当前用户需求调整;没有明确用户需求时不注入。适合编码、分析、问答。
- 陪伴(companion):自身情绪作为底色,用户需求明确时修正回应姿态;适合倾诉、陪伴、长期关系。
开关和模式写入 profile 的 data/thinking-affect.json,重启 Harness 后仍然保留。
注入日志¶
默认不写日志。需要做开/关对照时,设置 THINKING_AFFECT_LOG=1 才会启用:
$DSH_PROFILE_DIR/data/logs/injections.jsonl
日志超过 2 MB 会轮转到 injections.jsonl.1。
开 / 关对照¶
设置 THINKING_AFFECT_OFF=1 后,所有注入都返回空字符串。该变量在 Host 启动时读取,改完要重启 Harness。
- 每次请求组装时读取同一份会话状态;模型会按该状态调整语气和下一步动作。
- 状态信号很弱、且用户没有明确需求时不注入,节省 token。
- 浮窗里的“本对话启用”开关写回 Host;关闭后该上下文返回空字符串。
隐私与关闭¶
- 只请求本地
/plugins/thinking-affect/state和/toggle,没有外部网络请求。 - 日志默认不写;启用后限制在 2 MB,并轮转。
- 关闭开关后不注入;Host 的分析状态只保存在内存,重启即清空。
- 许可证:MIT。
按轮结束更新¶
- 只在该轮 Turn 结束(
turn/end)后分析该轮已完成的思考文本。 - 流式 token 不触发分析。
- 一轮最多分析一次;同一轮重复请求直接读取缓存。
- 首次打开一个已有对话时,只回填最近 3 轮作为初始状态,不回扫全部历史。
- 每轮只做一次 O(19) 的马尔科夫式状态更新。
- 历史最多保留 12 轮摘要。
状态更新¶
新维度 = 旧维度 × (1 - w) + 本轮维度 × w
新标签分布 = normalize(旧分布 × (1 - w) + 本轮分布 × w)
w 由本轮置信度决定;线索弱时更依赖前文。只有一条弱线索时显示“线索不足”,不形成独立标签,也不会更新综合状态。
接口¶
Host 端:
GET /plugins/thinking-affect/state?sessionId=...:返回该对话的当前状态、开关、模式、全局关闭标记和趋势。POST /plugins/thinking-affect/toggle:{ "sessionId": "...", "enabled": false },或{ "sessionId": "...", "mode": "assist" };两个字段可以只传一个。systemPrompt.context:每轮请求自动注入状态;assist 模式不注入自身情绪。
客户端浮窗只读上述接口;不再自己计算一套状态。
适用场景与注意¶
适合需要 AI 回答语气与自身“心情”对齐的场景,如陪伴对话、长期关系维护。对于编码、分析、问答等任务,建议使用默认的 assist 模式。
插件以当前 dsh 进程权限运行,安装前应检查源码与许可证。插件是启发式估计,不是读心;窗口底部的说明会提醒这一点。
短结尾¶
dsh-fakemood 通过利用思考轮次来估算情绪状态,为模型回答注入了一层“心情”底色,适合需要语气对齐的陪伴场景。更多细节可访问:目录页 和 GitHub。