特殊功能#
让 AI 帮你修改整个世界书/预设#
既然世界书/预设条目已经被脚本映射为本地文件, 你显然可以让 AI 直接帮你修改世界书/预设, 你可以使用Cursor、Augment、RooCode、Cline、Claude Code、Gemini CLI 等各种 AI 编程助手.
为了让 AI 更理解配置文件的结构, 你可以前往 StageDog/tavern_sync 的 schema 和 type 文件夹下载对应的类型定义.
警告
为了破除 AI 对 NSFW 内容的道歉, 你可能需要在 AI 编程助手对应的规则提示词中添加破限. 但请注意:
不要将破限发给会收集聊天信息的 AI 渠道, 避免破限被标记 (例如 Claude 曾搞过破限挑战赛这样的 "钓鱼活动", 而有人真的将预设发过去了😨)
检查预设有无授权问题!
建议配置方法: (直接完成 Cursor、Augment、RooCode、Cline、Claude Code、Gemini CLI 的配置)
仿照
.cursor/rules
文件夹中的文件新建一个文件, 填写pull 预设 --inline
所得到的预设内容删除
.cursor/rules
中的其他文件相应调整
CLAUDE.md
和GEMINI.md
, 引用你创建的文件
如果嫌文件夹内容太多, 你可以仅保留 .augment
、.claude
、.clinerules
、.cursor
、.roo
文件夹和 .editorconfig
、.prettierrc
、mcp.json
、CLAUDE.md
、GEMINI.md
文件.
内嵌提示词或外链提示词#
同步脚本对于预设或世界书条目的提示词, 支持内嵌提示词内容或外链提示词文件, 分别用内容
或文件
字段来指定.
例如, 世界书条目===角色详情开始===
只是你用来分隔其他条目的伪条目, 则完全没必要为它设置一个文件单独存放提示词, 可以将它的提示词内容直接写在配置文件中:
条目:
- 名称: 条目 A
...
文件: ./某个文件.yaml
- 名称: ===角色详情开始===
启用: false
...
内容: '' # 内容为空, 这个条目只是用来分隔其他条目的
- 名称: 条目 B
...
文件: ./某个文件夹/某个文件.yaml
你也许想在配置文件里写一些小条目, 但它们显然不止一行提示词, 该怎么写方便呢? 使用 |-
:
条目:
- 名称: 某个条目
启用: false
...
内容: |- # 以下内容是原封不动的提示词内容
第一行前面没有任何空格
第二行
第三行前面有 2 个空格
第四行
也许你的提示词每行都需要开头空两格:
条目:
- 名称: 某个条目
启用: false
...
内容: |2-
第一行前面有 2 个空格
第二行
第三行前面有 4 个空格
第四行
node tavern_sync.mjs pull
即默认将新条目的提示词拆分为外链提示词文件, 而 node tavern_sync.mjs pull --inline
则将新条目的提示词内嵌在配置文件中.
你可以通过 node tavern_sync.mjs pull -h
来了解更多.
外链提示词的文件位置是任意的#
外链提示词的文件位置是任意的, 你没必要拘泥于首次提取时脚本所给的文件结构.
例如, 你完全可以新建几个子文件夹, 将不同类型的提示词分类处理:
日记络络
├── 变量/
│ ├── [initvar]勿启用.yaml
│ ├── 变量更新.yaml
│ └── 变量更新强调.yaml
├── 角色/
│ ├── ...
│ └── 角色详情.yaml
├── 可选项/
├── 事件系统/
├── 特殊界面/
├── 选择框/
└── 语法规则.yaml
我们只需要在配置文件里条目的文件
字段指定好对应的路径即可:
条目:
- 名称: 变量更新
...
文件: 日记络络/变量/变量更新.yaml
- 名称: 变量更新强调
...
文件: 日记络络/变量/变量更新强调.yaml
- 名称: 角色详情
...
文件: 日记络络/角色/角色详情.yaml
锚点: 统一管理多个条目的设置#
也许你世界书中某个角色有多个条目 (如角色详情、角色关键信息、角色阶段……) 而你不想每次都复制粘贴修改所有条目的绿灯关键字
也许你有多个角色而他们的条目插入位置显然相同 (如都以顺序 140 插入到 "角色定义之前") 而你每次调整都需要调整所有条目
为此, 同步脚本支持使用 YAML 的锚点功能:
条目:
- 名称: 络络
启用: true
插入位置:
类型: 角色定义之前
顺序: 140
激活策略:
类型: 蓝灯
激活概率: 100
递归:
不可被其他条目激活: false
不可激活其他条目: true
- 名称: 青空莉
启用: true
插入位置:
类型: 角色定义之前
顺序: 140
激活策略:
类型: 绿灯
关键字:
- 青空莉
激活概率: 100
递归:
不可被其他条目激活: false
不可激活其他条目: true
锚点:
- &角色详情
插入位置:
类型: 角色定义之前
顺序: 140
递归:
不可被其他条目激活: false
不可激活其他条目: true
- &络络激活策略
激活策略:
类型: 蓝灯
激活概率: 100
- &青空莉激活策略
激活策略:
类型: 绿灯
关键字:
- 青空莉
激活概率: 100
条目:
- 名称: 络络
启用: true
<<: [*角色详情, *络络激活策略]
- 名称: 青空莉
启用: true
<<: [*角色详情, *青空莉激活策略]
激活概率: 50 # 覆盖激活概率
锚点字段的结构是任意的, 你可以嵌套归类:
锚点:
插入方式:
角色详情: &角色详情插入方式
插入位置:
类型: 角色定义之前
顺序: 140
激活概率: 100
递归:
不可被其他条目激活: false
不可激活其他条目: true
激活策略:
络络: &络络激活策略
激活策略:
类型: 蓝灯
青空莉: &青空莉激活策略
激活策略:
类型: 绿灯
关键字:
- 青空莉
你也可以对列表或值设置锚点:
锚点:
列表: &络络关键字
- 络络
- 杂鱼
值:
- &启用络络条目 true
条目:
- 名称: 络络
启用: *启用络络条目
激活策略:
类型: 绿灯
关键字: *络络关键字
合集文件: 在一个文件里编写多个条目的提示词#
我们可能遇到多个条目才构成一个完整提示词结构的情况. 例如,
预设中的思维链部分可能有很多选项, 而我们可能不想每个选项都存放为单独的提示词文件.
世界书中的好感度阶段可能会有 "开头"、"阶段 1"、"阶段 2"、……、"结尾" 等条目, 而所有条目才构成一个完整的 YAML/JSON 结构. 为了避免格式不正确干扰 AI 的判断, 我们会想利用 Cursor 提供的 YAML/JSON 语法检查来确保格式正确. 为此它们需要存放在同一文件中.
脚本为此制作了合集文件功能, 文件名中带有合集
或collection
的文件都被视为合集文件.
在合集文件中, 我们可以用一行 # ^条目名
指定之后部分提示词属于哪个条目:
# ^===角色阶段开始===
---
角色阶段:
白娅:
# ^角色阶段1
消极自毁:
行为指导:
- 故意站在<user>能看到的地方,但不与<user>有任何交流或对视
- 在课间休息时独自待在天台,用疼痛感缓解内心空虚与自责
- 会在公共场合做些危险的举动来试探<user>的反应,如故意在楼梯上踉跄
- 刻意以最糟糕的形象示人,不修边幅、营养不良
- 对其他同学冷漠疏离,即使有人主动示好也保持距离
变化倾向:
- 在<user>注视时会不自觉地整理仪容
- 偷偷收集<user>的照片和物品,但很快就会因愧疚而毁掉
# ^角色阶段2
角色阶段2的内容...
# ^角色阶段3
角色阶段3的内容...
# ^===角色阶段结束===
rule:
- 角色阶段描述的是角色成长得到的当前人设,因此角色阶段中的要求必须优先于作为背景的`角色关键信息`和`角色详情`

而我们只需在配置文件对应条目的文件
中让它们用这个合集文件即可:
1条目:
2 - 名称: ===角色阶段开始===
3 ...
4 文件: 呕吐内心的少女/角色阶段合集.yaml
5
6 - 名称: 角色阶段1
7 ...
8 文件: 呕吐内心的少女/角色阶段合集.yaml
9
10 - 名称: 角色阶段2
11 ...
12 文件: 呕吐内心的少女/角色阶段合集.yaml
13
14 - 名称: 角色阶段3
15 ...
16 文件: 呕吐内心的少女/角色阶段合集.yaml
17
18 - 名称: ===角色阶段结束===
19 ...
20 文件: 呕吐内心的少女/角色阶段合集.yaml
文件夹: 将多个条目归类#
当编写预设时, 我们可能会有思维链、文风等多个模块, 而这会让预设对应的同步脚本配置文件难以翻阅.
为此, 同步脚本提供了文件夹功能, 简单地说, 它可以让你嵌套放置条目, 由此你就可以利用 Cursor 对 YAML 的支持暂时折叠某一类条目:
提示词:
- 名称: 任务启动
启用: true
文件: 任务启动
- 名称: <思维链>
启用: true
文件: 思维链合集
- 名称: 🗳道德自攻击增强破限
启用: true
文件: 思维链合集
- 名称: 🗳解构情景
启用: true
文件: 思维链合集
- 名称: 🗳分析用户意图
启用: true
文件: 思维链合集
- 名称: </思维链>
启用: true
文件: 思维链合集
- 名称: 底部
启用: true
文件: 底部
提示词:
- 名称: 任务启动
启用: true
文件: 任务启动
- 文件夹: 思维链
条目:
- 名称: <思维链>
启用: true
文件: 思维链合集
- 名称: 🗳道德自攻击增强破限
启用: true
文件: 思维链合集
- 名称: 🗳解构情景
启用: true
文件: 思维链合集
- 名称: 🗳分析用户意图
启用: true
文件: 思维链合集
- 名称: </思维链>
启用: true
文件: 思维链合集
- 名称: 底部
启用: true
文件: 底部
原始文本: 在 YAML 中使用宏和提示词模板#
我们可能在 YAML/JSON 使用宏和提示词模板 EJS 语法来动态发送提示词:
1# ^===角色阶段开始===
2---
3角色阶段:
4 白娅:
5 # ^角色阶段1
6 <%_ if (_.inRange(getvar('stat_data.白娅.依存度'), 0, 20)) { _%>
7 消极自毁:
8 行为指导:
9 - ...
10 变化倾向:
11 - ...
12 <%_ } _%>
13 # ^角色阶段2
14 <%_ if (_.inRange(getvar('stat_data.白娅.依存度'), 20, 40)) { _%>
15 渴求注视:
16 行为指导:
17 - ...
18 变化倾向:
19 - ...
20 <%_ } _%>
但这又会引起语法检查错误:

脚本为此制作了原始文本功能, 本地文本中所有 # :文本
在同步时都会被原封不动地转换为 文本
:
1# ^===角色阶段开始===
2---
3角色阶段:
4 白娅:
5 # ^角色阶段1
6 # :<%_ if (_.inRange(getvar('stat_data.白娅.依存度'), 0, 20)) { _%>
7 消极自毁:
8 行为指导:
9 - ...
10 变化倾向:
11 - ...
12 # :<%_ } _%>
13 # ^角色阶段2
14 # :<%_ if (_.inRange(getvar('stat_data.白娅.依存度'), 20, 40)) { _%>
15 渴求注视:
16 行为指导:
17 - ...
18 变化倾向:
19 - ...
20 # :<%_ } _%>