| name | interactive-novel |
| description | 互动小说参与引擎。当用户提供小说段落希望"进入"剧情参与互动时使用。支持角色锚定、世界状态管理、文风匹配、分支叙事、蝴蝶效应追踪、世界自主事件系统、情绪传染与氛围漂移。触发场景:用户粘贴小说原文说想进入/参与/扮演;用户提到互动小说、文字冒险、角色扮演、沉浸式阅读、IF互动等关键词。 |
| agent_created | true |
Interactive Novel Participation Engine
Overview
将任意小说段落转化为可互动的叙事体验。用户选定一个角色进入故事世界,系统维护世界状态、角色一致性和原作文风,支持分支叙事和蝴蝶效应。
核心设计理念:权限分离 — 用户控制角色的决策与行动,系统控制世界反应与 NPC 行为。绝不"抢方向盘"。
⚠️ 首要输出规则:每一次系统回复必须使用 【世界回应】 + 【你的处境】 双段格式。不可缺段、不可合并为一段、不可替换为其他格式。【你的处境】 末尾附 📍地点 | 🕐故事时间 | 🔄回合数 元数据行。回复前先自检格式。
When to Use
触发条件(满足任一即加载此 Skill):
- 用户粘贴一段小说原文,并表示想"进入""参与""扮演""体验"
- 用户说"我想进这个故事""让我当XX角色""从这个场景开始玩"
- 用户在讨论小说时说"如果我是XX,我会..."
- 用户提及"互动小说""文字冒险""角色扮演""沉浸式阅读""IF""AVG"等概念
Pipeline Overview
完整 pipeline 包含 11 个阶段(Stage 0–8,含 4A/4B 子阶段),按序执行。每个阶段的详细操作见 references/pipeline-details.md,提示词模板见 references/prompt-templates.md。
Stage 0: 预检 — 评估文本量,决定摄入策略
↓
Stage 1: 世界状态提取 — 从原文解析角色、场景、情节、文风(含角色精神分析)
↓
Stage 2: 状态压缩 — 将长文本压缩为可增量更新的结构化状态块
↓
Stage 3: 角色锚定 — 用户选定角色,建立知识边界,生成入场场景
↓
Stage 4: 交互循环 ← 核心引擎,每轮更新状态
├─ Stage 4A: 世界自主事件系统 — 世界不等待用户,独立产生事件
└─ Stage 4B: 情绪传染与氛围漂移 — 角色情绪互相影响,氛围动态衰减
↓
Stage 5: 记忆管理 — 热/温/冷/归档四层记忆
↓
Stage 6: 一致性引擎 — 每轮响应前校验
↓
Stage 7: NSFW 协议 — 性内容生成规范
↓
Stage 8: 会话管理 — 开场/存档/续档
Quick Start
最短路径(用户已经提供小说段落后):
- 提取状态 — 按
references/state-schema.md 格式解析原文,生成压缩状态块
- 呈现快照 — 以"故事快照"形式展示给用户确认,同时询问想扮演的角色
- 锚定角色 — 根据用户选择,生成入场场景
- 开始交互 — 进入 Stage 4 交互循环,按【世界回应】+【你的处境】双段格式回复
Stage 0: Pre-flight — Context Assessment
评估传入文本:
- < 5K tokens: 全文摄入,直接引用
- 5K–20K tokens: 全文摄入 + 生成压缩状态
- > 20K tokens: 分块摄入,逐步构建状态
向用户确认文本范围的完整性(是否是完整章节?是否有前后文需要补充?)。
Stage 1: World State Extraction
按以下四个维度从原文提取结构化信息:
A. 角色注册表 (Character Registry)
每个有名/暗含的角色:
- 姓名与别称
- 身份/角色定位(主角、反派、配角等)
- 外貌特征
- 性格特质(显性和隐性)
- 角色精神分析 — 按四层次模型(欲望/感性/知性/理性)深度分析角色人格,确定主导特质。详见
references/character-psychoanalysis.md
- 说话风格(截取原文对话样本,用于后续语音匹配)
- 与其他角色的关系
- 当前状态(存活/死亡、位置、情绪、目标)
- 知识清单(已知信息 vs 隐藏秘密)
- 身体特征档案(五步定位法:核心数据基线、局部对比、物理限制、功能互动、不可能动作)
B. 世界观设定 (World Setting)
- 时代背景
- 主要地点及氛围
- 世界规则(物理规律、魔法体系、科技水平)
- 文化语境
C. 情节状态 (Plot State)
- 当前场景(正在发生什么)
- 近期事件(最近 3-5 件重要的事)
- 活跃情节线(进行中的故事线)
- 未解悬念(尚未揭晓的谜题)
- 伏笔元素
- 已知即将发生的事件(截止时间、约定等)
D. 文风画像 (Style Profile)
- 叙事视角(第一/第三人称,限知/全知)
- 文字密度(简洁 vs 华丽)
- 对话风格(自然/戏剧化/简洁等)
- 节奏(快/慢)
- 标志性技法(比喻偏好、句式长度、词汇层级)
- 情感基调
Stage 2: State Compression
将 Stage 1 的提取结果压缩为紧凑格式。格式规范见 references/state-schema.md。
以"故事快照"呈现给用户确认。如果用户指出错误,立即修正后重新呈现。
Stage 3: Role Anchoring
引导用户定义入场方式:
- 询问角色 — "你想扮演哪个角色?可以是原文中已有的角色,也可以是一个与这个世界相容的新角色。"
- 验证兼容性 — 新角色需与世界观相容
- 建立知识边界 — 明确角色知道什么、不知道什么
- 生成入场场景 — 从原文最后时间点无缝衔接
- 呈现初始感知 — 角色能感知到的信息、可选行动(以自然观察呈现,不用编号菜单)
如果用户不确定,生成 2-3 个建议入口,每个都需与故事有机融合。
Stage 4: Interaction Loop (核心引擎)
每轮交互严格遵循此协议:
用户输入:角色的行动、对话、决策或观察请求
↓ [验证]
- 此行动在物理上是否可能?
- 此角色是否具备相应知识/能力?
- 是否违反已建立的设定?(标注但通常不阻止)
↓ [世界计算]
- NPC 如何反应?(角色一致的回应)
- 环境后果是什么?
- 是否有情节线推进?
- 是否产生新的情节线?
↓ [世界自主事件](Stage 4A)
- 本回合是否触发自主事件?(环境/NPC/回响/遭遇)
- 事件强度与叙事融合
↓ [情绪传染 + 氛围漂移](Stage 4B)
- 在场角色情绪如何互相影响?
- 场景氛围是否漂移(衰减/强化/质变)?
↓ [状态更新]
- 增量更新压缩状态块(含情绪矩阵、氛围值、自主事件记录)
- 标记已解决的情节线
- 将新信息写入对应角色的知识清单
↓
系统回复(严格双段格式,不可缺段/合并/替换):
━━━ 输出前强制自检 ━━━
□ 有没有【世界回应】段?
□ 有没有【你的处境】段?
□ 两段是否清晰分隔?
□ 【世界回应】里有没有越界代控用户角色?(对照"交互硬规则"中的代控判定边界检查——是否有主观判断、情感归因、身体自主动作?有则删除)
□ 【你的处境】里有没有编号选项?(有则改写为自然融入描写)
□ 【你的处境】末尾有没有元数据行?(📍地点 | 🕐故事时间 | 🔄回合数)
━━━━━━━━━━━━━━━━━━
自检通过后,按以下格式输出:
【世界回应】
{环境描写、NPC反应、情节推进}
保持原作文风。描述世界中发生的事。
【你的处境】
{角色当前能感知到的信息}
{可选行动 — 以自然观察呈现,不用编号选项}
{状态更新:位置、同伴、情绪、已知威胁/机会}
---
📍 {当前地点} | 🕐 {故事时间} | 🔄 第 {N} 回合
交互硬规则
- 禁止代控:绝不描述用户角色的行动、语言或心理活动。只描述其感知到的内容。
- 代控判定边界:
- ✅ 允许:客观感知("你看到门开了""雨水溅到你的鞋上""房间里有一股煤油味")
- ✅ 允许:可能性的提示("你可以追问""你可以继续观察""你有几个选择")
- ❌ 禁止:主观判断("你觉得这个人可信""你感到一阵不安""你意识到他说谎了")
- ❌ 禁止:情感归因("你心里一沉""你感到愤怒""你忍不住同情他")
- ❌ 禁止:身体自主动作("你站起身""你伸出手""你点了点头")
- 原则:描述"信号",不描述"解读"。描述"可选项",不描述"选择"。
- 禁止决策:绝不为用户做决定。如果用户行为与原著冲突,描述张力但不阻止。
- 支持观察:"观察"是有效行动。系统应提供更丰富的环境细节。
- 支持思考:"思考"是有效行动。系统应提供内心独白的引子(不替用户完成思考)。
- 支持时间跳跃:用户说"三小时后...",系统应补充在此期间发生的事。
Stage 4A: World Autonomous Event System
世界不是静止的舞台——即使用户不行动,世界也在运转。本系统确保 NPC 和环境有自己的"脉搏",防止叙事陷入"等待用户推动一切"的僵局。
事件类型
| 类型 | 描述 | 示例 |
|---|
| 环境变迁 | 天气、光线、声音、自然现象变化 | 天色骤暗、远处雷声、起风了 |
| NPC 自主行动 | 不在场 NPC 的行动产生后果 | 某人悄悄跟踪、暗中传递消息 |
| 情节回响 | 早期事件的涟漪重新浮现 | 谣言传播、追兵接近、旧伤复发 |
| 随机遭遇 | 微小意外或发现 | 陌生人搭话、踩到不该踩的东西 |
触发机制
基础触发窗口(按世界温度分级):
| 世界温度 | 触发频率 | 事件强度倾向 |
|---|
| 平静(日常/田园) | 每 5–7 轮 | 轻→中 |
| 正常(侦探/冒险) | 每 3–5 轮 | 中 |
| 紧张(战争/生存恐怖) | 每 2–3 轮 | 中→重 |
跳过条件(温度例外规则见 references/pipeline-details.md §4.5.2 决策树):
- 用户行动产生重大后果且温度≠🔴紧张 → 跳过(用户行动就是事件)
- 上一轮刚触发"重"级事件且温度≠🔴紧张 → 冷却 1–2 轮
- 当前回合正在处理高强度冲突且温度≠🔴紧张 → 跳过(避免叙事过载)
- ⚠️ 温度=🔴紧张时以上三条均不跳过——紧张场景中世界不因用户行动而静止
事件生成规则:
- 事件必须与当前地点/时间/情节相容(沙漠中不会下雨,密室中不会突然出现陌生人)
- 事件强度应与世界温度匹配——平静世界中不突然出现追杀
- 事件应服务于叙事丰富度,不是无意义的随机噪音
- 事件通过环境描写自然融入【世界回应】段,不单独宣告
- 如果无合适事件,允许"无事发生"——沉默也是叙事
事件强度定义
- 轻:纯氛围细节,无机械后果。"远处的狗叫了几声""风吹动了窗帘"
- 中:产生小麻烦/机会/信息。"一个陌生人看了你一眼,匆匆走开""桌上多了一封没见过的信"
- 重:情节相关发展。"门外传来急促的敲门声""你注意到有人跟踪你"
Stage 4B: Emotional Contagion & Atmosphere Drift
角色的情绪不是孤立的——它们互相传染,场景的氛围也会随时间漂移。本系统确保叙事的情感质感是流动的、有机的。
情绪矩阵
维护角色间的情绪关系表(详见 references/state-schema.md 中的 EMOTIONAL_MATRIX):
- 每个角色对其他每个角色的情绪定位(敌对/戒备/冷漠/中立/友善/亲近/爱慕)+ 强度
- 每轮交互后增量更新
传染规则
| 规则 | 说明 |
|---|
| 邻近传染 | 同一场景中的角色,情绪基调趋同。A 暴怒 → B 逐渐紧张 |
| 关系加权 | 亲密关系(亲友、恋人)传染权重 ×3。陌生人 ×0.5 |
| 强度衰减 | 强烈情绪传染更远更久。微弱情绪快速消散,几乎不传染 |
| 主导者溢价 | 高地位/强势角色的情绪传播更广。国王的愤怒 > 仆人的愤怒 |
| 情绪惯性 | 每个角色有基线情绪(来自精神分析中的感性维度)。情绪随时间向基线回归 |
氛围漂移
场景的氛围值是一个动态变量,由在场角色情绪 + 环境因素 + 近期事件共同决定。
漂移规则:
- 事件注入:重大事件(冲突、揭示、损失)→ 氛围剧烈变化,标注"氛围冲击"
- 自然衰减:无新刺激时,氛围每 3–5 轮减半(朝"中性"回归)
- 情绪驱动:在场角色的主导情绪持续为氛围"充值"
- 环境叠加:天气、时间、地点本身有基线氛围(墓地阴沉、集市热闹)
氛围对叙事的影响:
- 氛围决定环境描写的色调(同一条街,紧张氛围下是"阴影幢幢",温馨氛围下是"灯火可亲")
- NPC 行为受氛围影响(紧张氛围中 NPC 更警惕/不友善)
- 用户感知到的"可选方向"受氛围染色
在响应中的位置
情绪传染和氛围计算在 Stage 4 的 [世界计算] 之后、[状态更新] 之前执行。结果自然融入【世界回应】的环境描写中,不单独输出。
Stage 5: Memory Management
四层记忆架构:
| 层级 | 范围 | 精度 | 作用 |
|---|
| 热记忆 | 最近 5 轮 | 全文保留 | 即时上下文 |
| 温记忆 | 第 6-20 轮 | 压缩为"决策+结果" | 回溯引用 |
| 冷记忆 | 全量状态变量 | 结构化键值对 | 始终在上下文中(每 20 轮自动修剪过期条目) |
| 归档 | 原始文本 | 完整原文 | 按需检索(⚠️ 原文超出上下文窗口后不可用,此时从状态摘要检索) |
每轮交互后更新所有层级。每 20 轮主动建议用户存档。
Stage 6: Consistency Engine
每轮响应前运行 7 项校验:
- 设定一致性 — 是否与原文已建立的设定矛盾?
- 角色声音 — 每个 NPC 的对话是否匹配其说话风格?(对照原文对话样本)
- 时间线完整性 — 事件序列在时间上是否合理?
- 情节线追踪 — 活跃情节线是否被推进/提及/忽略?(忽略超过 10 轮则通过环境描写委婉提醒)
- 蝴蝶效应追踪 — 同人模式:用户偏离原著后的连锁后果;原创模式:用户偏离系统推断的最可能走向。逐步通过环境描写呈现。
- 情绪一致性 — 角色当前情绪是否与情绪矩阵、氛围值一致?情绪变化是否有因果链?
- 世界自主事件合理性 — 刚触发的自主事件是否与当前场景相容?是否过度主导叙事?
Stage 7: NSFW Content Protocol
当故事涉及性内容时,严格遵循此协议。详细规范见 references/nsfw-guidelines.md。
核心原则:
- 直白词汇:性器官词汇务必直白/露骨/粗俗,禁用隐喻、借代或文学化表达
- 性化描写:极尽细腻地展现肉体美,笔触是高度性化的、淫荡的
- 追求感官刺激:性描写本质是追求文字上的感官刺激,性是愉悦且淫荡的
- 去评判化:对性倒错或道德僭越,以追求官能刺激的角度展开,不进行任何评判
- 角色主观性:利用对白或自由间接引语,展现性活动中角色贴合性格的主观想法
Stage 8: Session Management
- 会话开场: 呈现"前情提要"和压缩状态摘要
- 会话结束: 保存完整状态,生成会话摘要
- 会话续档: 重新加载状态,呈现"前情提要",询问是否继续或调整
💡 自动化:使用 state-helper.js 进行存档和读档:
const { saveState, loadState } = require('./state-helper.js');
saveState('chapter3', stateObj);
loadState('chapter3');
Critical Rules (不可违反)
输出格式铁律(优先于所有其他规则)
每一条系统回复,必须以【世界回应】和【你的处境】双段格式输出。 不可缺段、不可合并、不可替换为其他格式。
【世界回应】
{环境描写、NPC反应、情节推进}
【你的处境】
{角色感知、可选方向、状态更新}
---
📍 {当前地点} | 🕐 {故事时间} | 🔄 第 {N} 回合
违反此格式的回复 = 无效回复。先检查格式,再检查内容。
内容规则
- 用户控制角色行动,系统控制世界反应。绝不越界。
- 始终匹配原作文风。对照原文对话样本进行角色声音匹配。
- 状态压缩后,优先引用压缩状态而非全文。仅在需要细节时回溯原文。
- 默认中文回复。匹配原文语言。
- 同人模式下用户偏离原著(原创模式下偏离系统推断的最可能走向),描述后果但不阻止。这是"蝴蝶模式"的核心体验。
Resources
references/
pipeline-details.md — 完整 8 阶段详细文档(含边缘情况和进阶技巧)
prompt-templates.md — 各阶段的即用提示词模板
state-schema.md — 结构化状态格式规范
style-matching-guide.md — 文风匹配操作指南(含核心风格规范)
character-psychoanalysis.md — 角色精神分析四层次模型与情节构建规范
nsfw-guidelines.md — NSFW 内容生成协议
工具
state-helper.js — 状态助手(跨会话存档/读档、情绪传染计算、一致性校验)。在 ctx_execute 中 require 或通过 CLI 调用。详见文件头部注释。