dsh-story-mode
Verifieddsh-story-mode · v1.0.0 · MIT · Web UI
Story Mode (故事模式) agent preset for DeepSeek Harness: role-play GM persona, three-way choices, .md memory cards and world book, context distillation and prompt wrapping.
Install
dsh plugin add dsh-story-mode Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
故事模式(Story Mode)
给 DeepSeek Harness 增加一个名为 故事模式 的 Agent 预设:选中它新建的会话里, AI 不再扮演编码助手,而是担任互动小说的叙事者与主持人(GM),由玩家用自然语言 (或回复选项)推动剧情。
在哪里使用
- 在 Web 界面点击新建会话;
- 在新会话页面的 Agent 预设 选择器里选择 故事模式;
- 直接输入题材(例如「悬疑,发生在雨夜的旅馆」)或输入
开始,让 AI 给出开篇。
预设只影响选用它的会话,其他会话不受影响。
「三条走向」开关
故事模式会话的输入框上方、靠右有一个开关(平时只有开关本身,鼠标移入才浮出「走向开关」四个字; 整行与输入框卡片同宽并右对齐,开关右边缘与输入框右边缘齐平):
- 关(默认):按人格提示词,每轮结尾给 2–3 个选项;
- 开:每个请求都会附加一条写作要求,让 AI 在叙事正文之后、依据上一轮已发生的情节, 恰好给出 3 条互斥的走向(含每条的风险/代价)。
实现方式与自带的 plan 模式同构:
| 部分 | 说明 |
|---|---|
/choices on /choices off |
Host 命令,只在故事模式会话的命令菜单里可见;开关点击时由客户端调用。 |
storyChoices 会话投影 |
从 command/run / command/done 折叠出开关状态,刷新、重开、fork 后都能恢复。 |
| required 运行时上下文 | 开关打开时每个请求注入写作要求;required 让它能穿透 complete 人格与「关闭可选运行时上下文」。 |
conversation.input.dock 客户端槽 |
开关本身。只在 agentPreset === "story" 的会话里渲染,所以其他模式的会话看不到它。 |
也可以在输入框里直接打 /choices on 或 /choices off。
前后置提示词
包裹的是整个请求,而不是单条输入。每次组装模型请求时读取当前会话工作区下的两个文件:
| 文件 | 落点 |
|---|---|
settings/front.txt |
系统提示词最前面(人格段落开头的 {{story_front}} 变量) |
settings/end.txt |
请求最末尾(order 最大的 required 运行时上下文,追加在最后一条消息之后) |
模型实际看到的是 front + 完整的系统提示词与全部对话 + end:
- 每次组装请求都重新读文件,改完下一轮立即生效;
- 两个文件都不存在或为空时,对应位置为空;只存在一个时只加那一侧;
- 单个文件上限 64K 字符;
prompt-wrap不能单独移除:人格模板引用了story_front变量,移除后渲染会失败;- 聊天记录里显示的仍是原始对话,包裹只作用于模型请求。
工作区初始化
输入框上方最左侧是「文件夹 + 加号」按钮:按当前会话的工作目录一次性创建其它插件需要的目录与初始文件。
| 产物 | 用途 |
|---|---|
settings/front.txt、settings/end.txt |
前后置提示词(空文件,等你填内容) |
记忆/角色/角色.md |
角色记忆起始模板(把「记忆管理」的角色目录指到这里) |
记忆/箱庭/箱庭.md |
箱庭记忆起始模板 |
- 幂等:已存在的目录/文件一律跳过,不覆盖你写过的内容;
- 点击后行右侧会显示结果(含两个记忆目录的完整路径),8 秒后自动消失;
- 也可以直接输入
/init-workspace。
记忆管理
走向开关左侧有一个齿轮(设置控件)。点击它,会在输入框上方展开「记忆管理」底部面板:
| 项 | 说明 |
|---|---|
| 角色记忆存储位置 | 一个目录;目录内全部 .md(含子目录)当作酒馆角色卡:人物设定、关系、口吻等。 |
| 箱庭记忆存储位置 | 一个目录;目录内全部 .md 当作沙盒化酒馆世界书:世界规则、地点、势力、历史等。 |
| 确认并刷新 | 校验两个目录、统计 .md 数量,把配置写进当前会话。 |
- 配置存在会话日志里(
storyMemory投影),刷新、重开、fork 都能恢复; - 面板打开时,未配置的一侧会自动预填默认目录:
<工作区>/记忆/角色、<工作区>/记忆/箱庭(与「初始化工作区」创建的目录一致,由/memory-defaults命令返回); - 保存后,每一轮请求都会重新读取两个目录下的全部
.md,作为 required 运行时上下文注入, 模型回复前必须先消化这些记忆; - 上限:单次最多 200 个文件、12 万字符,超出部分会在注入文本里注明;
- 子目录会被递归读取,所以「一个根目录下分
角色/与箱庭/」也可以(两个配置都指向该根目录); - 相对路径按会话工作目录解析,建议直接填绝对路径。
上下文提纯
当一轮结束(agent 空闲)且上下文占用 ≥ 80% 时,会自动弹出「上下文提纯」窗口; 齿轮左侧的 Test 按钮则可以随时手动触发,不需要超过 80%。
窗口里是模型整理后的两节 Markdown:## 角色状态、## 箱庭状态。文本可自由改写,
点右下角 确认 后会按小节拆开,写入 <角色目录>/状态提纯.md 与
<箱庭目录>/状态提纯.md(覆盖上一次提纯结果,手写的其他 .md 不受影响)。
上下文不会自动清理:压缩/重置会话由你自己处理(新建会话,或用
/compact之类的方式)。 提纯只负责把「该记住的东西」落进记忆文件,避免你手动重置后丢失设定。
模型调用使用当前会话的模型路由;提纯结果会原样返回给客户端(也记录在 /purify 的命令事件里)。
记忆目录未配置时会提示先到「记忆管理」里设置。
组成
| 行 | 插件 | 作用 |
|---|---|---|
story-guard |
dsh-story-mode/story-guard |
在预设作用域内屏蔽部署级全局工具(shell、搜索、文件等),保证故事会话里只有对话,没有工具调用。 |
persona |
@deepseek-ai/dsh-persona |
以 complete: true 只保留叙事者人格提示词,屏蔽通用编码助手的人格与运行时上下文。 |
choices |
dsh-story-mode/choices |
/choices 命令、storyChoices 投影、「三条走向」运行时上下文。 |
prompt-wrap |
dsh-story-mode/prompt-wrap |
story_front 变量(系统提示词开头)与末尾运行时上下文:用 settings/front.txt、settings/end.txt 包裹整个请求。 |
memory |
dsh-story-mode/memory |
/memory 命令、storyMemory 投影、每轮读取全部 .md 记忆并注入的运行时上下文。 |
purify |
dsh-story-mode/purify |
/purify、/purify-apply 命令:整理角色/箱庭状态并写入记忆文件(上下文由用户自行重置)。 |
scaffold |
dsh-story-mode/scaffold |
/init-workspace 命令:按当前工作区创建 settings/ 与记忆目录、初始 .md 文件。 |
compaction |
@deepseek-ai/dsh-compaction-basic / command-compact |
长故事自动压缩上下文,并提供 /compact 手动压缩命令。 |
修改
调整叙事风格:编辑
cordis.patch.yml中persona.config.prefix的提示词。增加/去掉工具:在
plugins列表里增删行;story-guard必须保持第一个, 否则它会把预设自己注册的工具也当成全局工具处理。修改后需要重新安装让 Loader 重新读取补丁:
plugin_manager remove_bundle dsh-story-mode plugin_manager install_bundle <本仓库绝对路径>\story-mode已有会话保留创建时的插件版本,请新建会话验证改动。
卸载
plugin_manager remove_bundle dsh-story-mode