在 SillyTavern(ST)的圈子里,**“前端卡”**(Frontend Card / HTML Character Card)是一个进阶概念,它打破了传统角色卡“纯文字描述”的限制。 作为开发者,在重构“云酒馆”时,理解前端卡至关重要,因为它是 ST 社区目前最活跃、最“花哨”的部分。 ### 1. 什么是前端卡? 传统角色卡只包含姓名、描述、问候语等文本数据。而**前端卡**本质上是一个**以角色卡为载体的“微型网页应用”**。 它利用 ST 的扩展系统(Extensions)和 HTML 渲染能力,在聊天界面注入自定义的 HTML、CSS 和 JavaScript。常见的表现形式形式包括: * **状态栏**:显示角色的好感度、心情、体力值。 * **互动 UI**:点击按钮触发特定的指令或对话。 * **视觉小说(VN)模式**:将背景、立绘和对话框完全重新设计。 * **RPG 系统**:自带背包、商店、任务系统。 --- ### 2. 实现原理(ST 源码逻辑) 前端卡的实现主要依赖以下几个技术点: #### A. HTML 注入 ST 允许在 `World Info`(世界书)或者角色卡描述中使用特定的标签。最常用的是配合 **Quick Reply(快速回复)** 扩展或特定的 **Extension 钩子**。 * **逻辑**:后端读取到包含 HTML 字符串的数据,前端通过 `$.append()` 或 `innerHTML` 将其塞进 DOM。 #### B. JavaScript 脚本执行 这是前端卡的“灵魂”。制作者通常会将加密或压缩后的 JS 代码嵌入在角色卡的“深度提示词”(Depth Prompt)或世界书条目中。 * **执行机制**:ST 并没有为这些脚本提供沙箱环境。脚本运行在全局作用域下,可以直接通过 `window.SillyTavern` 对象访问 ST 的内部函数(如 `printMessage()`, `setVar()`, `token` 等)。 #### C. 通信与状态同步 前端卡通过以下方式与 ST 核心交互: * **Macros(宏)**:利用 `{{getvar::hp}}` 渲染变量。 * **Slash Commands**:通过 JS 调用 `/setvar key=value` 来更新后端数据。 * **Event Listeners**:监听 `character_selected` 或 `message_received` 事件来刷新 UI。 --- ### 3. 重构时的“重难点”与注意事项 如果你希望“云酒馆”完全兼容这些前端卡,你在使用 **React + Go** 重构时会面临巨大的架构挑战: #### **1. 安全性(最致命的问题)** * **ST 原版**:因为是单机运行,JS 随便跑,顶多是用户自己害自己。 * **你的公共平台**:这是 **跨站脚本攻击(XSS)** 的重灾区。如果用户 A 上传了一张“前端卡”,用户 B 导入后,这张卡里的 JS 脚本可以直接偷走用户 B 的浏览器 `LocalStorage`(包含你的平台 Token)或者劫持 API Key。 * **解决方案**: * **必须隔离**:绝对不能直接在 React 主页面插入角色卡的 HTML/JS。 * **Iframe 沙箱**:将前端卡的渲染逻辑放在一个独立的、跨域的 `