阅读示例#
让我们导入示例角色卡
, 来理解脚本和前端界面的作用和区别.
导入角色卡后, 我们通过扩展设置, 可以在
和 中分别看到该角色卡有以下角色脚本和局部正则:
这分别对应了酒馆助手所支持的两类向酒馆注入代码的方式, 与模板文件夹中的 src/脚本示例
和 src/界面示例
文件夹一一对应.
脚本: 在后台运行一段代码#
我们首先启用 脚本-发布给玩家
, 将会收到一条弹窗提示:

这反映了脚本的功能: 在启用时执行一段代码, 可能上图那样的弹窗提示, 也可能是开始监听某些事件从而在事件发生时执行某段代码……
脚本可以在启用时执行一段代码. 除了上图那样的弹窗外, 你还能看到脚本新增了两个消息楼层:

脚本可以监听酒馆事件和酒馆助手事件. 例如, 让我们启用这个脚本, 然后通过
当我们点击保存时, 脚本将会监听到 "消息楼层被修改" 事件:

脚本也可以监听自己的按钮点击事件. 例如, 我们启用脚本后会在输入框上方看见
按钮, 点击它后, 脚本将会监听到 "玩家点击了晚上好按钮" 事件:
脚本还能监听自己的开关情况. 例如, 我们关闭脚本, 脚本会监听到 "脚本被关闭" 事件:

如果你点击预设防误触
脚本, 就会发现你在开启脚本时不能修改预设设置, 关闭脚本后可以修改. 这其实就是脚本在启用时执行了一段代码, 让你不能修改预设设置; 而又监听 "脚本被关闭" 事件, 在脚本关闭时执行代码重新允许你修改预设设置.
总的来说, 脚本的作用就是:
在开启时可以执行一段代码
在启用期间可以监听事件 (酒馆或酒馆助手事件、按钮点击事件、脚本被卸载), 从而在事件发生时执行代码.
如此, 你也许能理解 MVU 变量框架脚本做了什么: 启用它后, 它将监听 "接收到了新的消息楼层" 事件, 当事件发生时根据这个新楼层中的 _.set(...)
等命令来更新变量.
前端界面: 在前台消息楼层显示一个界面#
我们关闭脚本, 启用
中的 正则, 将会收到整整三条弹窗提示:
为什么是三条弹窗提示? 让我们关掉这个正则, 来仔细理解一下它是怎么起作用的.
实际上, 酒馆助手支持前端界面的方式很简单: 如果消息楼层中某个代码块内存在 html 代码 (尤其是 <body></body>
标签), 那么酒馆助手会自动将这个 html 代码渲染成前端界面.
例如, 如果我们在消息楼层中添加以下代码块, 它会被渲染成一个超大的红色 "你好":
代码块由以下部分组成:
开头单独一行
```代码语言
(建议用```text
, 原因在之后的进阶技巧中有解释)代码内容
结尾单独一行
```
```text
<body>
<span class="text-9xl text-red-600">你好</span>
</body>
```

但我们显然不想 AI 直接输出整个 html 代码块, 这既浪费 token 又容易出错. 有没有什么办法让 AI 只输出前端界面必要的剧情信息 (如角色当前穿着情况、所在位置等), 却又在酒馆页面上显示出 html 代码块从而渲染出前端界面呢? 酒馆正则的
功能正能实现这个功能.酒馆正则能够捕获 AI 回复和用户输入中的特定文本, 让它在某些用途下被替换为指定内容:
: 在发送给 AI 时被替换为指定内容. 例如预设的[不发送]思维链
正则将<thinking>
块替换为空字符串, 从而不让 AI 收到之前消息中的思维链内容.
: 在酒馆中显示时被替换为指定内容. 例如预设的[隐藏]思维链
正则将<thinking>
块替换为空字符串, 从而不让玩家在酒馆页面中看到思维链部分.两个都不勾选: 在 AI 输出接收到时或用户输入发送出去时就被永久替换掉

界面-发布给玩家
正则所做的, 就是捕获 AI 回复中尽可能多的字符, 即捕获全部文本, 并将其替换为 html 代码块.

回过头来, 为什么打开界面-发布给玩家
正则后会收到整整三条弹窗提示呢? 因为我们总共有三个消息楼层, 正则会依次捕获替换, 而酒馆助手由此渲染了三个前端界面:

为了进一步验证这一点, 我们点击你已经卸载界面!
提示; 当我们点击保存时, 酒馆助手又重新渲染这个前端界面而有了 你已经成功加载界面!
提示.
前端界面能做的不仅仅是显示而已, 你还可以和它交互而执行对应的代码. 例如, 我们点击示例中的前端界面, 将会发现这个界面变成了选择框, 而再点击将会发现自己发送了一条消息, 并且输入框右下角显示出正在生成的图标:

总的来说, 酒馆助手能将消息楼层中的 html 代码块渲染成前端界面, 并支持:
在前端界面加载完成时执行一段代码
在前端界面有效期间监听事件 (酒馆和酒馆助手事件、前端界面被互动、前端界面卸载), 从而在事件发生时执行代码
相比于脚本在后台运行、只受自己开关影响, 前端界面在页面上显示且与消息楼层高度绑定.