dsh-stateless-chat-mode
给 DeepSeek Harness 用的无上下文 Chat 模式 Agent 预设:你发一句,模型回一句;下一句再发时,之前整段对话对模型来说不存在。
界面上对话记录一条不少,只有模型看不到。
新建会话时选 Stateless Chat。
和另外两个模式的关系
| Chat | Extreme Chat | Stateless Chat | |
|---|---|---|---|
| 系统提示词 | 聊天人设 | 空 | 空 |
| AGENTS.md / 技能目录 | 有 | 无 | 无 |
| 工具 | 联网搜索 | 无 | 无 |
| 历史上下文 | 保留 | 保留 | 每轮清空 |
Extreme Chat 是"不给模型任何附加信息",但它仍然记得你说过的话。Stateless Chat 在此之上再切断历史:模型每次只看到你最新那一句。
怎么做到"界面保留、模型看不到"
这不是清空界面,也不是删除日志,而是在模型可见的 surface 上做遮蔽。
DSH 里同一份会话有两个读法:
session.deriveMessages()—— 模型看到的历史,只读取 surface 上未被 shadow 的节点(dsh-session/lib/index.js:1681)session.snapshotEvents()—— 界面读的原始事件日志(dsh-session/lib/index.js:1454),完全不看 surface
所以只要在 surface 上遮蔽,模型就看不到历史,界面照旧。
这正是 compaction-basic 遮蔽旧轮次的官方做法:追加一个带 surfaceOp: { op: 'replace', startSeq, endSeq } 的节点,把一段连续 surface 节点整体替换成它自己。
替换成空 content 的 system 消息:deriveEventMessage() 对 system/message 有特判,content.length === 0 时返回 null,不产生任何 wire message(dsh-session/lib/types/surface.js:91-97)。等于"占住 surface 位置,但不给模型任何东西"。
边界怎么定
插件挂在 agent/pre-step 上,时机很关键:此时本轮用户输入还没有进入 surface(agent-loop.js:670 的 claim 只发事件,append 发生在 :860)。
所以不能按"最后一条用户消息"切,而按 turn/start 切:上一个 turn/start 之后新增的 surface 节点属于当前轮,之前的全部遮蔽。
几种情形:
- 第一轮开始:没有可遮蔽的历史,什么都不做
- 第二轮开始:把上一轮的 user + assistant 整体替换成一个空 system 节点
- 单轮多步(工具调用):当前轮已产生的节点在边界之后,保持可见
遮蔽失败只记一条 warn,不会让整轮对话失败——最坏情况是这一轮多带上一些历史。
安装
需要 DeepSeek Harness 0.2.1-rc.1 或更高版本。
plugin_manager install_bundle target github:TongenShen/dsh-stateless-chat-mode
安装后重启 DSH,新建会话时在预设选择里选 Stateless Chat。
注意事项
- 预设
id是stateless-chat,显示名Stateless Chat,order: 0。 - 只对新建会话生效;已经开始的会话保持原来的预设。
- 完全无系统提示词,模型收不到任何角色、语言、格式约束。回答风格飘忽属预期。
- 模型确实不记得上一轮。要它"接着刚才说的继续"是做不到的,这是设计目标而非缺陷。
- 界面上你仍然能看到完整对话,方便回翻。日志也完整保存,
session.snapshotEvents()读得到全部内容。 - 没有压缩:历史每轮都被遮蔽,上下文压力不会累积,也就不需要压缩。
卸载
plugin_manager remove_bundle target dsh-stateless-chat-mode
然后重启 DSH。
License
MIT
No comments yet. Be the first to write one.