创作者文档
美化规范
这篇是 Foreverse 聊天美化的机制参考:单条消息里能放什么(HTML / fv-card / 贴纸), 整卡美化的渲染链路怎么走,正则引擎支持到哪。所有条目对应 App 的真实行为, 照着写的卡导入即渲染。
快速开始
最快的路径:把下面这段发给任何一个 AI,让它替你生成美化代码,然后放进角色卡的开场白或消息里试渲染。
请生成一段用于聊天气泡的自包含 HTML + 内联 <style>。
需求:紫色渐变主题的状态栏卡片,白色描边,圆角,顶部一行标题。
约束:不要引用外部资源(图片/字体/JS 库都不行);不要用 min-height: 100vh;
所有样式写在一个 <style> 里;宽度自适应容器。生成结果整体放进 ```html 围栏里发出,Foreverse 会用内置 WebView 按你的样式渲染这条消息。 注意「不要引用外部资源」不是建议,是沙箱限制(见下文)。
单条消息语法
一条 AI 回复的文本会被按顺序切成若干段,每段按命中的语法各自渲染:
| 语法 | 渲染为 | 说明 |
|---|---|---|
```html … ``` | WebView 富渲染 | 完整 HTML/CSS 按作者意图渲染;每个围栏一个独立 iframe 作用域,高度自动回报 |
| 裸 HTML 块 | WebView 富渲染 | 无围栏但出现成对的 <div> / <section> / <style> / <table> / <svg> / <details> / <center> 时同样进 WebView |
```fv-card … ``` | 原生小卡片 | 围栏内是 JSON,不走 WebView,由 App 原生渲染(字段见下表) |
[[sticker:名字]] | 贴纸图片 | 名字 ≤40 字符;从该伴侣目录的 stickers/ 文件夹取同名图片,找不到时退化为文本徽标 |
| 其余文本 | 普通气泡 | 按 markdown 基础语法渲染 |
fv-card 字段(v1 · 三型)
| 字段 | 类型 | 说明 |
|---|---|---|
type | string | note(小纸条)/ countdown(倒数日)/ mood(心情卡);未知值按 note 渲染,向前兼容 |
title | string | 卡片标题;title 和 body 至少要有一个非空,否则整卡不渲染 |
body | string | 正文,可选 |
date | string | countdown 用,yyyy-MM-dd;App 自动算「还有 N 天 / 今天 / 已过 N 天」 |
emoji | string | mood 卡用 |
accent | string | 点缀色 #RRGGBB,留空用当前角色的 accent 色 |
```fv-card
{ "type": "countdown", "title": "见面纪念日", "date": "2026-08-14", "accent": "#8b5cf6" }
```整卡美化链路(状态栏 / 思维链 / 可点选项)
想让模型每一轮都输出主题化的状态栏、可折叠思维链、可点选项,走的是和桌面酒馆同构的三段链路:
模型输出纯文本 marker → 卡内美化正则替换成主题化 HTML → WebView 渲染三条铁律,违反任何一条都不渲染:
- marker 必须是纯文本符号(如
:::think、[状态|…]、:::scene、:::note、:::opt), 不能用<tag>当 marker——导入期净化会把卡片文本字段里的生 HTML 剥掉。HTML 只允许出现在正则的replaceString里。 - 美化正则要设
placement: [2](作用于 AI 输出)且markdownOnly: true(只在显示期跑, 不污染回喂给模型的历史)。 - 卡带 HTML 美化正则时,导入会自动打开该卡的富渲染开关,无需用户手动设置。
{{char}} / {{user}} 这类宏只在发给模型的 prompt 期展开,显示期不展开。 所以状态栏等展示字段里不要依赖宏——直接写角色名,或让模型在输出里带上。
正则规则
| 能力 | 支持情况 |
|---|---|
| 捕获组回引 | $1–$99、$<name>、{{match}} |
| 变长循环 / 递归替换 | 不支持——状态栏这类组件的字段数要固定(示范卡固定 4 个字段) |
| 作用域 | placement 控制作用于用户输入 / AI 输出;markdownOnly 控制只影响显示、不改写回喂历史 |
| 安全兜底 | 正则把内容替换成空时回退显示原文,不会白屏 |
WebView 能力与边界
富渲染 WebView 与桌面酒馆的渲染语义对齐,但运行在移动沙箱里。能力清单:
| 项 | 行为 |
|---|---|
| 内联 CSS / JS | 支持;每个 html 围栏一个独立 iframe 作用域,互不干扰 |
| 高度 | 自动回报 scrollHeight 撑开气泡;不要写 min-height: 100vh 这类撑满视口的样式 |
| 外部资源 | 禁止:file / content 访问被禁,远程 JS 库(如 jQuery CDN)不可用;外链点击转交系统浏览器 |
| TavernHelper 宿主 API | 支持 triggerSlash(/setinput、/send、/trigger 等)、getChatMessages、getCurrentMessageId、getWorldbook;generate() / generateRaw() 可真实触发二次生成 |
| 可点选项 | 选项 / 按钮 / 链接禁用文本选择,正文允许选择——点选项不会误选中文字 |
| 敏感信息 | 形如 token: 值 的内容在进入模型上下文前会被脱敏为 *** |
桌面端调好的美化卡在手机上行为一致是这套设计的目标;遇到渲染差异,把卡和截图发到 [email protected],我们按 P1 处理。