starkingcn/dsh-story

story-mode

面向 DeepSeek Harness 的故事模式预设:叙事 GM 人格、三条走向、.md 角色卡与世界书记忆、上下文提纯与前后置提示词。

AGI 架构探索

故事模式(Story Mode)

给 DeepSeek Harness 增加一个名为 故事模式 的 Agent 预设:选中它新建的会话里, AI 不再扮演编码助手,而是担任互动小说的叙事者与主持人(GM),由玩家用自然语言 (或回复选项)推动剧情。

在哪里使用

  1. 在 Web 界面点击新建会话;
  2. 在新会话页面的 Agent 预设 选择器里选择 故事模式;
  3. 直接输入题材(例如「悬疑,发生在雨夜的旅馆」)或输入 开始,让 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