柏宝箱是一个 SillyTavern 第三方扩展,主要用来缓解移动端、长聊天、海量角色/正则/预设场景下的卡顿。它会在不改变 SillyTavern 原有使用方式的前提下,接管部分高开销的列表渲染、接口请求、编辑器和滚动行为。
当前版本:0.30.0
- 移动端输入框、自动补全和聊天编辑时的响应优化
- 长聊天 DOM 渲染优化,减少屏幕外楼层的布局和绘制开销
- 管理聊天文件弹窗请求加速、滚动优化和关闭清理
- 主页最近聊天直达目标聊天,避免先渲染角色上一次聊天
- 角色列表、Persona 列表和欢迎页最近聊天头像缩略图懒加载
- 角色搜索输入框拼音输入优化,减少中文输入法导致的频繁搜索和重绘
- OpenAI 预设切换、拖拽、开关、保存和 Token 统计刷新优化
- 预设内容、自定义 CSS、角色描述的 CodeMirror 编辑器优化
- 正则列表 Vue 分组管理器,支持分组、拖拽、批量移动和延迟保存
- 原版世界书优化与世界书新布局,减少原版交互、抽屉动画和 Select2 初始化带来的卡顿
- 自定义 CSS Shadow Property,缓解切换美化/主题时的大段 CSS 写入卡顿
- 翻译更新事件保存优化,避免自动翻译关闭时的无效长聊天保存
- 聊天保存请求 Gzip 压缩,公网访问时减少保存请求体积
- 消息生成完成提示音,支持内置音频、音频 URL 和本地文件
- 柏宝库分页/加速:Settings、扩展 Manifest 合并请求、角色列表、最近聊天、美化主题懒加载、消息后台生成、Tokenizer 批量计数
启用 长聊天渲染优化 后,扩展会在当前聊天楼层文本量较大时为消息楼层应用 content-visibility 和高度占位缓存,减少屏幕外楼层参与布局和绘制。进入聊天后会自动滚到底部,并用临时底部锚点处理初始加载期间的高度变化。
生成新消息或更新楼层时,扩展会尽量保持底部或最新楼层位置稳定,避免长聊天中常见的跳动、滚不到底和反复重排。
启用 减少加载楼层数 后,扩展会将 SillyTavern 的初始加载消息数量限制为最多 10 层。原值为 0(加载全部)或大于 10 时会自动改为 10,1 到 10 保持不变。扩展会监听原生设置变动,并在普通聊天或群聊读取前再次检查。
该设置限制的是初始渲染到页面的楼层数量;聊天文件仍会由 SillyTavern 完整读取。
管理聊天文件请求加速 只在普通角色聊天、空搜索、请求 /api/chats/search 时生效。扩展会先用轻量文件名列表渲染弹窗,再异步补齐文件大小、消息数、日期和预览文本。
管理聊天文件滚动优化 会对聊天文件行启用绘制隔离,缓解大量聊天文件时的滚动卡顿。
管理聊天文件关闭清理 会在管理聊天文件窗口关闭后清空已生成的聊天文件 DOM,减少关闭后的页面负担。
关键词搜索和群聊会自动回退到 SillyTavern 原始逻辑。
启用 主页进入聊天优化 后,从欢迎页最近聊天进入普通角色聊天时,会直接打开被点击的聊天文件,避免先渲染角色上一次激活的聊天再切换到目标文件。
启用 删楼后快速编辑 后,通过 SillyTavern 删除消息模式删楼后,可以立即打开上一层编辑区。若此时点击发送、继续、冒充或重新生成,扩展会先提交当前快速打开的编辑区,再继续执行原动作。
输入框响应优化:减少移动端 resize 触发的自动补全和 hotswap 重算。禁止输入法自动弹出:进入聊天、打开聊天文件管理、进入楼层编辑时拦截程序自动聚焦,手动点击输入框仍然可用。编辑楼层时禁用自动滚动:抑制移动端键盘挤压布局造成的聊天区滚动补偿。双击编辑楼层/三击编辑楼层:快速打开消息编辑器,两个开关互斥。
启用 聊天保存请求 Gzip 压缩 后,扩展会对公网访问下的 /api/chats/save 和 /api/chats/group/save 请求体进行 Gzip 压缩。本地地址和局域网地址会自动跳过;如果压缩请求失败,会自动用未压缩请求重试。
启用 生成完成后播放提示音 后,扩展会在消息生成正常结束时播放当前选择的提示音。手动停止生成时不会播放。
提示音支持三种来源:
内置音频:使用扩展video目录里的内置音频。扩展加载时不会预加载全部音频,只会在试听或播放当前选中音频时加载对应文件。音频 URL:直接把 URL 保存到扩展用户配置中,适合多个设备共用同一个 SillyTavern 服务端配置。本地文件:上传后保存到当前浏览器的 IndexedDB,只在本机当前浏览器可用,不会写入 SillyTavern 用户配置。
设置面板提供 试听 按钮和音量滑块,方便切换音频后直接确认效果。
移动端可以开启 生成中静音保活。开启后,扩展会在消息生成期间循环播放一段内联静音音频,尽量降低浏览器切到后台后被冻结、导致完成提示音无法播放的概率。它只在移动端、提示音开启且正在生成时运行,可能增加少量耗电。
启用 头像缩略图懒加载 后,角色列表、Persona 列表和欢迎页最近聊天会先用占位图渲染离屏头像,把真实 /thumbnail 地址暂存到 data-* 上。头像滚动到可视区域附近后再加载真实缩略图。
同时会给角色行、Persona 行和最近聊天行应用 content-visibility,并为图片设置 loading="lazy"、decoding="async" 和低优先级加载。浏览器不支持 IntersectionObserver 时,会自动退回原生懒加载提示。
启用 角色搜索输入框优化 后,扩展会在事件捕获阶段拦截角色搜索输入框的输入事件。中文拼音输入组合期间不会触发搜索,组合结束后再执行一次搜索,并额外加入 300ms 防抖,减少海量角色下的输入卡顿和 DOM 重绘。
启用 切换预设快速刷新 后,OpenAI / Chat Completion 预设切换时会先让移动端下拉框收起,再尽早渲染 prompt 列表,并把 Token 统计刷新放到列表显示之后执行。删除当前预设时,会自动选择下一项,删除最后一项时选择第一项。
预设界面折叠 默认开启。启用后,扩展会把 OpenAI 预设界面中不常用的设置块收进 预设设置 折叠区,减少预设页纵向占用。关闭后会把这些设置块还原到原位置。
启用 预设条目拖拽优化 后,扩展会绕过原生 jQuery UI sortable 的实时挤压布局。拖拽时原条目保留占位,浮动克隆跟随指针,只显示插入线,松手后再保存顺序。
移动端默认只允许长按左侧拖拽手柄;启用 手机预设条目整条拖拽 后,可以长按整条非按钮区域开始拖拽。正常滚动会取消待开始的拖拽,减少误触。
启用 预设快速操作 后,已有 prompt 条目的启用/禁用和保存只更新当前行,并延迟刷新 Token 统计,避免每次操作都重建整份列表。新建 prompt 仍使用 SillyTavern 原始逻辑。
启用 预设分组 后,prompt 条目可以用三点菜单里的星标收藏。已收藏条目会在列表标题分隔线下方的 收藏 区域显示为快捷镜像,只提供启用/禁用和编辑入口,不参与拖拽排序、分组归属、复制或删除。已收藏条目会常驻星标快捷按钮;收藏区域支持展开/收起,收起动画结束后会卸载内部条目以减少列表 DOM。
启用 预设内容 CodeMirror 编辑器 后,扩展会用 CodeMirror 替代 OpenAI prompt 条目内容 textarea,包括 SillyTavern 的放大编辑器。保存前会同步回原始表单字段;如果 CodeMirror 加载失败,会恢复原始 textarea。
保存条目后自动保存预设 默认关闭。开启后,保存 prompt 条目编辑时会额外触发当前 OpenAI 预设保存。
当柏宝库可用且启用 Tokenizer 计数请求批量加速 时,Prompt Manager 刷新 Token 统计会调用柏宝库批量计数接口,减少切换模型或刷新预设时的大量单条计数请求。接口不可用时会回退到原始 Token 统计流程。
启用 正则快速操作 后,扩展会用 Vue 管理器接管全局、预设和角色正则列表。
主要能力:
- 单条正则启用/禁用、编辑保存、删除时只更新受影响条目
- 支持正则条目拖拽排序、跨分组移动和保存分组归属
- 支持创建、重命名、删除、折叠正则分组
- 支持整组正则一键启用或禁用
- 支持上移/下移调整分组排序,未分组会保留默认兜底组
- 支持批量选择、批量启用/禁用、批量移动、批量删除和批量导出
- 支持把选中的正则批量移动到全局、预设或角色正则
- 导入正则后同步 Vue 列表和分组元数据
- 预设正则分组会写入预设扩展字段,并随整份预设导出、导入和重命名
- 正则保存会进入待保存队列,在面板关闭或页面生命周期事件中统一 flush,减少连续操作时的重复保存和重载
启用 原版世界书优化 后,世界书原版交互会延迟初始化较重的 Select2 控件、角色过滤选项和宏补全相关逻辑。启用 世界书新布局 后,插件会使用 Vue 接管世界书条目列表,并在新布局中使用更轻量的 transform 展开动画。
自定义CSS CodeMirror 编辑器 会用 CodeMirror 接管用户设置里的自定义 CSS 编辑区,并在离开编辑器或页面生命周期事件中再同步和应用样式,减少输入期间的样式重算。
切换美化优化 会拦截原生 #customCSS 的长文本写入,把值重定向到 JavaScript 内存属性,从物理层面避免浏览器因为向原生 textarea 写入大段 CSS 而触发布局和绘制卡顿。开启此项会自动开启自定义 CSS CodeMirror 编辑器。
移动端切换美化后切到后台再返回时,扩展会以 SillyTavern 当前主题的 power_user.custom_css 为准,重新校准 #custom-style、原生 textarea、CodeMirror 文档和 Shadow Property,避免新旧美化 CSS 混合残留。
启用 角色描述 CodeMirror 编辑器 后,角色描述长文本区域会替换为轻量 CodeMirror 6 编辑器。加载失败时会恢复 SillyTavern 原始输入框。
柏宝库相关开关位于扩展设置的 柏宝库 标签页。面板会显示服务、数据库驱动和 Early Bridge 状态,并提供手动刷新按钮。
这些功能依赖柏宝库接口或 Early Bridge;不可用时会自动回退到 SillyTavern 原生接口。
Settings get/save 加速:通过柏宝库 Early Bridge 接管/api/settings/get和/api/settings/save。扩展 Manifest 合并请求:启动加载扩展时一次性获取扩展清单和 manifest 缓存,减少大量/scripts/extensions/.../manifest.json请求;安装、更新、移动和切分支后只重新获取被操作扩展的 manifest。角色列表请求加速:把空请求的/api/characters/all替换为柏宝库快速角色列表接口。最近聊天请求加速:把主页/api/chats/recent替换为柏宝库快速最近聊天接口。美化主题懒加载:切换美化主题时按需读取目标主题配置,显示加载状态,并在加载完成后再应用主题。消息后台生成:普通单角色 Chat Completion 生成改用柏宝库 save-generate,生成完成后由后端写入聊天文件。Tokenizer 计数请求批量加速:Prompt Manager Token 统计使用柏宝库批量计数接口。
启用柏宝库 Settings 加速且 Early Bridge 可用时,切换美化主题会先拦截原生主题下拉框变更,再通过柏宝库按主题名读取目标主题配置。加载期间会显示“正在加载美化主题...”状态,避免用户误以为页面卡住。
主题配置加载成功后,扩展会同步 SillyTavern 的主题字段、颜色绑定、聊天显示方式和 Toastr 位置,并保存设置;如果加载失败,会回退到原来的主题选择并显示错误提示。这个流程只针对主题切换,不改变自定义 CSS 编辑器本身的保存方式。
启用 消息后台生成 后,普通单角色 Chat Completion 的 normal 和 regenerate 回复会走柏宝库 save-generate 接口。前端仍按 SillyTavern 原流程发起生成,但后端会在生成完成后直接把 AI 回复写入当前聊天文件,避免手机浏览器切后台、刷新或断线导致“前端拿到回复但还没来得及保存”的丢失场景。
流式生成仍会把内容实时返回给前端显示;非流式生成会等待后端生成完成后返回。生成成功并已由后端保存时,扩展会跳过原本紧随其后的 /api/chats/save,减少重复保存。刷新后如果发现当前聊天还有后台生成任务,扩展会用 jobId 恢复状态;任务完成后会用 SillyTavern 的消息插入流程恢复楼层,尽量触发正常的消息渲染事件。
暂停 SillyTavern 原生生成按钮会同时取消当前活跃的 save-generate job。取消时会丢弃后端已经生成但尚未保存的部分内容;API 服务明确返回错误时,前端会保留 SillyTavern 原生报错体验,刷新后不会重复提示本页已经收到过的同一个失败 job。
聊天记录分批进入 目前已禁用,柏宝库面板中的 长聊天分批加载 开关会保持关闭且不可点击,后端 fast-get 接口也会拒绝启用。进入聊天会继续使用 SillyTavern 原生完整聊天读取流程。
历史版本中启用该功能后,访问大聊天时会先请求尾部楼层,让页面尽快进入可读状态。完整聊天会在后台继续补全,补全完成后同步 SillyTavern 的聊天数组、校正楼层 ID、恢复滚动位置,并触发必要的聊天加载事件。
补全期间会临时拦截发送、编辑、删除、切换楼层和保存等操作,并提示“长聊天分批加载: 剩余批次还未加载完成,先不要进行操作”。保存请求会被跳过并返回前端成功响应,避免 SillyTavern 额外弹出通用连接错误。如果柏宝库完整补全失败,会尝试用 SillyTavern 原生聊天读取接口补全;状态过期或聊天切换时会停止本次补全。
启用 翻译更新事件保存优化 后,当自动翻译关闭且消息没有翻译缓存时,扩展会跳过翻译扩展在 MESSAGE_UPDATED 事件里的无效处理,避免长聊天编辑消息后反复触发全量保存。
如果自动翻译开启,或消息已经有翻译显示缓存,翻译扩展的原逻辑仍会执行。
检测到更新弹窗提示 开启后,扩展检测到可用更新时会弹出确认提示。关闭后仍会显示 new 标记和更新按钮。
本地测试时,扩展目录可以放在:
public/scripts/extensions/third-party/SillyTavern-Mobile-Resize-Guard
如果要通过 SillyTavern 第三方扩展安装器安装,请把本目录内容发布到单独仓库的根目录,确保 manifest.json 位于仓库根目录。
源码位于 src/,运行时加载的是 Vite 构建产物 dist/index.js(manifest.json 的 js 字段指向 dist/index.js?ver=版本号,版本号由 scripts/sync-version.mjs 从 package.json 同步)。修改 src/ 后需要重新构建才会生效:
npm install
npm run build # 生产构建(含 sourcemap 与压缩)
npm run watch # 开发监听构建
npx eslint src # 静态检查(no-undef 等)源码目录结构:
src/
index.js 入口:模块装配与顶层接线
features/ 原 index.js 拆分出的功能模块(主题、自定义CSS、正则、后台生成等)
preset/ 预设优化(原 presetOptimizations.js 拆分,index.js 为公共出口)
chat/ 聊天优化(原 chatOptimizations.js 拆分)
worldinfo/ 世界书页面优化(原 worldInfoPageOptimization.js 拆分)
floorDirectory.js 楼层管理器
saveGenerateDisplay.js 后台生成展示组件
settings.html 设置面板模板(构建时经 ?raw 内联)
宿主 SillyTavern 模块通过 @sillytavern/* 别名引用(如 @sillytavern/script、@sillytavern/scripts/utils),构建时解析为相对路径并保持 external,不会被打进产物。Vue、vue-draggable-next 与 CodeMirror 由 npm 依赖打包,全部内联进单个 dist/index.js(云端/高延迟环境下单个大文件比多个懒加载 chunk 加载更快)。
发版流程:改 package.json 的 version → npm run build(prebuild 自动同步 manifest.json 并刷新 ?ver= 缓存参数)→ 提交 src/、dist/ 与 manifest.json。
- 大多数优化都可以在扩展设置面板中单独开关。
- 依赖柏宝库的功能会检测接口状态;接口不可用、返回异常或不满足条件时会回退到 SillyTavern 原生行为。
- 聊天文件请求加速只处理普通角色空搜索;群聊和关键词搜索保持原生行为。
- CodeMirror 相关编辑器加载失败时会恢复原生 textarea。
- Gzip 保存请求仅在公网访问时启用,并在失败时自动改用未压缩请求重试。
- 消息完成提示音的内置音频按需加载;URL 音频能否播放取决于浏览器支持和远端访问情况;本地文件仅保存在当前浏览器;移动端静音保活只能提高后台播放成功率,无法绕过系统强制休眠、浏览器杀后台或省电策略。