Labs · 酒馆宏预览
{{char}} {{random}}
到底展开成什么,贴进来看。
写卡的时候宏全靠背,开局才发现拼错了。把开场白或提示词片段贴进来:每个宏的展开产物当场高亮, 悬停看它从哪个宏来,{{random}} 和 {{roll}} 一键重抽。页面下半是逐项核对过引擎实现的宏支持对照表。
贴一段带 {{char}}、{{random}} 的文本,展开结果出现在这里。
宏支持对照表
逐项对照引擎实际实现列出,写「支持」的都能在上面的输入框里当场验证。
| 语法 | 作用 | 支持状态 |
|---|---|---|
| {{char}} · {{character}} | 角色名(V3 卡的 nickname 优先) | ✓ 支持 |
| {{user}} · {{name}} | 用户名 / 你的身份名 | ✓ 支持 |
| {{persona}} | 用户人设描述 | ✓ 支持(演示值)本页留空演示 |
| {{scenario}} | 场景设定 | ✓ 支持(演示值)本页留空演示 |
| {{model}} | 当前模型 id | ✓ 支持(演示值)本页用演示值 |
| {{lastMessage}} · {{lastUserMessage}} · {{lastCharMessage}} | 最近一条消息 / 用户消息 / 角色消息 | ✓ 支持(演示值)依赖聊天状态,本页用占位值 |
| {{group}} · {{charIfNotGroup}} · {{groupNotMuted}} | 群成员名单(单聊回退角色名) | ✓ 支持(演示值)本页按单聊演示 |
| {{time}} · {{time::UTC+8}} | 当前时间(可带 UTC 偏移) | ✓ 支持按浏览器时间;App 按设备时间 |
| {{date}} · {{datetime}} · {{isodate}} · {{isotime}} · {{weekday}} | 日期 / 日期时间 / 星期 | ✓ 支持 |
| {{idleDuration}} | 距你上一条消息过了多久 | ✓ 支持(演示值)无聊天状态,恒为 just now |
| {{random:a,b,c}} · {{random::a::b::c}} · {{pick}} | 等概率抽一个 | ✓ 支持 |
| {{roll:1d20}} · {{roll 1d100}} · {{roll:20}} | 掷骰(NdM;裸数字 = 1dN) | ✓ 支持 |
| {{if::条件::甲::乙}} | 行内条件(条件非空且非 false/0 走甲) | ✓ 支持 |
| {{newline::N}} · {{space::N}} | 换行 / 空格(可计数) | ✓ 支持 |
| {{noop}} · {{comment}} · {{// 注释}} | 空操作 / 注释(展开为空) | ✓ 支持 |
| {{reverse::文本}} | 反转字符 | ✓ 支持 |
| {{setvar::k::v}} · {{getvar::k}} · {{addvar}} · {{incvar}} · {{decvar}} · {{deletevar}} · {{hasvar}} | 聊天变量族 | ✓ 支持本页在单次展开内生效;App 里跨轮持久 |
| {{setglobalvar::k::v}} 等 global 族 | 全局变量族 | ✓ 支持同上 |
| {{$名字}} | 变量简写读取 | ✓ 支持 |
| \{{char}} | 转义:按字面输出 | ✓ 支持 |
| {{outlet::名字}} | 取用世界书 outlet 条目 | — 本页不适用需要世界书激活语境,本页恒空(与「未激活输出空」的运行时行为同形) |
| {{wi::name}} · {{getarg}} | STscript 闭包宏 | ✗ 不支持App 同样未实现 |
| {{if}}…{{else}}…{{/if}} 块级 | 块级条件 | ✗ 不支持App 用行内 {{if::…}} 代替 |
这个工具怎么来的
宏引擎从 Foreverse App 的宏展开器移植——那套实现对齐酒馆 macros/definitions 的行为子集,覆盖身份宏(char/user/persona)、时间宏(time/date/weekday,含 UTC 偏移)、随机宏(random/pick/roll 的全部形态)、行内条件 {{if}}、变量宏全家(setvar/getvar/addvar/incvar 及 global 变体、{{$名字}} 简写),以及转义与注释语法。展开顺序(先写变量、再读变量、最后其余宏)与 App 三段管线一致,代表性用例搬进网页引擎自测全过。2026-07 移植。
上面的支持对照表不是照文档抄的——每一行都对着引擎实际实现核过,写「支持」的都能在输入框里当场验证。
它做不到什么
时间宏({{time}}/{{date}})按你浏览器的当前时间展开,App 里按设备时间——两边都是「本地时间」语义,但你现在看到的数字和聊天时的数字自然不同。
依赖聊天状态的宏({{lastMessage}}、{{idleDuration}})这里用占位值演示;{{outlet}} 需要世界书激活语境,这里恒为空。变量宏在单次展开内生效,App 里聊天变量跨轮持久。
常见问题
{{random:a,b,c}} 和 {{random::a::b::c}} 有区别吗?
没有,两种分隔符都合法:双冒号优先,没有双冒号时按逗号切。选项里本身要带逗号时用双冒号形态。每次生成时等概率抽一个——这也是开场白做「随机开局」的标准写法。
{{roll:d20}} 的完整语法是什么?
NdM 掷 N 个 M 面骰取总和:{{roll:2d6}} 是两个六面骰。N 省略默认 1({{roll:d20}}),裸数字当面数({{roll:20}} 等于 {{roll:1d20}}),还有个空格形态 {{roll 1d100}} 也认——检定类角色卡的高频写法。写错了(比如 {{roll:abc}})不会报错,按原参数输出。
宏会互相嵌套展开吗?
不会。展开是单遍的:{{getvar}} 取出来的值里就算带着 {{char}},也原样保留不再展开——酒馆和 App 的引擎都是这个行为,防止套娃失控。这个工具的标注模式能直接看到「产物里的宏形态没有被二次展开」。
未识别的宏会怎样?
原样发给模型——不报错也不消失。这正是「卡里写错宏名导致模型看到一堆花括号」的事故来源。这个工具会给未识别的宏画虚线下划线,写完卡先贴进来扫一眼,比开局后再发现便宜。