ZOYKUHot Board

baibai-git/st-baibai-toolsDokümantasyon

对酒馆的部分功能优化

Dil Bildirimi:Yerelleştirilmiş belge bulunmuyor. Orijinal resmi İngilizce sürüm görüntüleniyor.
npm i st-baibai-tools

柏宝箱

柏宝箱是一个 SillyTavern 第三方扩展,主要用来缓解移动端、长聊天、海量角色/正则/预设场景下的卡顿。它会在不改变 SillyTavern 原有使用方式的前提下,接管部分高开销的列表渲染、接口请求、编辑器和滚动行为。

当前版本:1.1.5

功能总览

  • 移动端输入框、自动补全和聊天编辑时的响应优化
  • 长聊天 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 压缩

启用 聊天保存请求 Gzip 压缩 后,扩展会对公网访问下的 /api/chats/save 和 /api/chats/group/save 请求体进行 Gzip 压缩。本地地址和局域网地址会自动跳过;如果压缩请求失败,会自动用未压缩请求重试。

消息完成提示音

启用 生成完成后播放提示音 后,扩展会在消息生成正常结束时播放当前选择的提示音。手动停止生成时不会播放。

搭配黑名单自动重试时,提示音会等待黑名单检查完成:需要继续重试的中间回复不播放;最终通过检查,或总重试次数耗尽并保留最后回复时,只播放一次。即使最后回复仍命中黑名单,次数耗尽也会提示。关闭提示音开关后始终不自动播放;取消重试不会补响。

提示音支持三种来源:

  • 内置音频:使用扩展 video 目录里的内置音频。扩展加载时不会预加载全部音频,只会在试听或播放当前选中音频时加载对应文件。
  • 音频 URL:直接把 URL 保存到扩展用户配置中,适合多个设备共用同一个 SillyTavern 服务端配置。
  • 本地文件:上传后保存到当前浏览器的 IndexedDB,只在本机当前浏览器可用,不会写入 SillyTavern 用户配置。

设置面板提供 试听 按钮和音量滑块,方便切换音频后直接确认效果。

移动端可以开启 生成中静音保活。开启后,扩展会在消息生成期间循环播放一段内联静音音频,尽量降低浏览器切到后台后被冻结、导致完成提示音无法播放的概率。它只在移动端、提示音开启且正在生成时运行,可能增加少量耗电。

生成失败自动重试

生成失败自动重试 设置区同时提供请求失败重试和 黑名单命中自动重试,两者独立开关,但共用 最大重试次数。报错重发和黑名单重新生成都计入同一轮总次数,不会因重新生成而重置。例如最大重试次数为 3,报错已重试 2 次后,黑名单只剩 1 次重试机会;手动发起新一轮生成才重新计数。

黑名单每行一条:普通行按正文包含文本匹配,忽略英文大小写和空行;写成 /正则/标志 的行按正则匹配,例如 /504|bad gateway/i、/^\[Error\]/m。标志按浏览器支持的 JS 正则标志原样生效,常用 g i m s u y;正则不加 i 时区分大小写,g/y 只影响状态、不影响是否命中。无效正则和写不成合法 /正则/标志 形式的行(例如 /foo/ 后带空格、//、/foo/gi!)按普通文本处理,无效正则在控制台提示一次。单聊普通生成和重新生成完成并收尾后,读取本轮最新助手楼层的正文,命中任一条就调用 ST 原生重新生成,替换命中回复,不增加候选回复或重复发送用户消息。默认每轮合计最多额外重试 3 次,可设为 1 到 10 次;黑名单重试间隔 1.5 秒,等待期间可用酒馆停止按钮取消。总次数耗尽仍命中时,停止重试、保留最后回复并提示,由用户决定后续处理。

流式和非流式均支持;流式请求异常结束后,已显示的错误正文也会检查黑名单(例如 HTTP 503 Service Unavailable),不会把错误中止当成用户主动停止。不扫描历史聊天或独立思维链字段,不处理续写、候选回复、群聊和其他插件独立发起的辅助生成。开启 ST 原生自动切换回复时,本功能暂停以避免重复触发。命中黑名单的重试提示标题为 黑名单命中自动重试,与请求失败重试的 生成失败自动重试 分开展示。手动停止、切换聊天、编辑或切换当前生成楼层的候选回复、删除消息或修改黑名单设置会取消当前重试链;即使停止落在酒馆重建请求控制器的启动窗口里(停止事件已经发出、酒馆又拿着新控制器把这一代继续跑),这一代也不会重新武装重试,被打断的重试次数会继续沿用而不是清零;更新无关旧楼层不会取消。重试等待期间若聊天再次保存,会继续等保存收尾,不会直接丢掉这次重试。

消息替换、后台任务清理和聊天保存沿用原生重新生成及现有后台模块的流程;黑名单模块不再自行删除、保存或回滚聊天。检测依赖当前页面运行,关闭页面后不会在服务端继续执行黑名单检测;流式内容也可能先显示再被替换,不能撤销其他插件已处理的内容。

角色与头像优化

头像缩略图懒加载

启用 头像缩略图懒加载 后,角色列表、Persona 列表和欢迎页最近聊天会先用占位图渲染离屏头像,把真实 /thumbnail 地址暂存到 data-* 上。头像滚动到可视区域附近后再加载真实缩略图。

同时会给角色行、Persona 行和最近聊天行应用 content-visibility,并为图片设置 loading="lazy"、decoding="async" 和低优先级加载。浏览器不支持 IntersectionObserver 时,会自动退回原生懒加载提示。

角色搜索输入框优化

启用 角色搜索输入框优化 后,扩展会在事件捕获阶段拦截角色搜索输入框的输入事件。中文拼音输入组合期间不会触发搜索,组合结束后再执行一次搜索,并额外加入 300ms 防抖,减少海量角色下的输入卡顿和 DOM 重绘。

预设优化

预设备份自动清理

在柏宝箱的 柏宝库 页签中,自动清理旧备份 默认开启,已有的关闭设置不会被覆盖。每次成功创建备份都会检查数量,所有预设合计保留最新的 普通备份保留数量 份(默认 200),超限时从最旧的开始删除。

  • 有备注的备份免自动清理、不占普通备份名额;清空备注后重新参与清理。列表分别显示普通和受保护的份数。
  • 开启后,成功备份时静默清理超限部分,不再弹出自动清理确认框。手动开启或调低已启用的上限仍会先确认,取消则保留原设置。升级、刷新页面本身不会触发删除。
  • 备份保存失败、列表或元数据异常时不删除;删除失败时停止本轮并提示,下次成功备份后重试。清理不删除预设本体。
  • 清理期间打开备注等备份操作对话框会暂停后续删除,下次成功备份后再检查。设置沿用 ST 用户设置保存。
  • 只调用柏宝库现有列表和删除接口,无需修改柏宝库。这是页面运行期间维护的数量上限,不是服务器磁盘配额;关闭页面、断网或多设备并发时可能暂时超限。跨设备修改备注与清理不具备原子保证,应先完成重要备份的备注保存,再开启清理。全局淘汰可能清空不常用预设的历史。

切换预设快速刷新

启用 切换预设快速刷新 后,OpenAI / Chat Completion 预设切换时会先让移动端下拉框收起,再尽早渲染 prompt 列表,并把 Token 统计刷新放到列表显示之后执行。删除当前预设时,会自动选择下一项,删除最后一项时选择第一项。

预设界面折叠

预设界面折叠 默认开启。启用后,扩展会把 OpenAI 预设界面中不常用的设置块收进 预设设置 折叠区,减少预设页纵向占用。关闭后会把这些设置块还原到原位置。

预设条目拖拽优化

启用 预设条目拖拽优化 后,扩展会绕过原生 jQuery UI sortable 的实时挤压布局。拖拽时原条目保留占位,浮动克隆跟随指针,只显示插入线,松手后再保存顺序。

移动端默认只允许长按左侧拖拽手柄;启用 手机预设条目整条拖拽 后,可以长按整条非按钮区域开始拖拽。正常滚动会取消待开始的拖拽,减少误触。

预设快速操作

启用 预设快速操作 后,已有 prompt 条目的启用/禁用和保存只更新当前行,并延迟刷新 Token 统计,避免每次操作都重建整份列表。新建 prompt 仍使用 SillyTavern 原始逻辑。

预设收藏

启用 预设分组 后,prompt 条目可以用三点菜单里的星标收藏。已收藏条目会在列表标题分隔线下方的 收藏 区域显示为快捷镜像,只提供启用/禁用和编辑入口,不参与拖拽排序、分组归属、复制或删除。已收藏条目会常驻星标快捷按钮;收藏区域支持展开/收起,收起动画结束后会卸载内部条目以减少列表 DOM。

预设内容 CodeMirror 编辑器

启用 预设内容 CodeMirror 编辑器 后,扩展会用 CodeMirror 替代 OpenAI prompt 条目内容 textarea,包括 SillyTavern 的放大编辑器。保存前会同步回原始表单字段;如果 CodeMirror 加载失败,会恢复原始 textarea。

保存条目后自动保存预设 默认关闭。开启后,保存 prompt 条目编辑时会额外触发当前 OpenAI 预设保存。

Tokenizer 计数请求批量加速

当柏宝库可用且启用 Tokenizer 计数请求批量加速 时,Prompt Manager 刷新 Token 统计会调用柏宝库批量计数接口,减少切换模型或刷新预设时的大量单条计数请求。接口不可用时会回退到原始 Token 统计流程。

正则优化列表

启用 正则快速操作 后,扩展会用 Vue 管理器接管全局、预设和角色正则列表。

主要能力:

  • 单条正则启用/禁用、编辑保存、删除时只更新受影响条目
  • 支持正则条目拖拽排序、跨分组移动和保存分组归属
  • 支持创建、重命名、删除、折叠正则分组
  • 支持整组正则一键启用或禁用
  • 支持上移/下移调整分组排序,未分组会保留默认兜底组
  • 支持批量选择、批量启用/禁用、批量移动、批量删除和批量导出
  • 支持把选中的正则批量移动到全局、预设或角色正则
  • 导入正则后同步 Vue 列表和分组元数据
  • 预设正则分组会写入预设扩展字段,并随整份预设导出、导入和重命名
  • 正则保存会进入待保存队列,在面板关闭或页面生命周期事件中统一 flush,减少连续操作时的重复保存和重载

世界书与编辑器优化

原版世界书优化与世界书新布局

启用 原版世界书优化 后,世界书原版交互会延迟初始化较重的 Select2 控件、角色过滤选项和宏补全相关逻辑,屏幕外的收起条目也会跳过渲染(content-visibility),滚动时也不再逐条检查补全菜单,每页条目很多时切换世界书和滚动都更顺。启用 世界书新布局 后,插件会使用 Vue 接管世界书条目列表,并在新布局中使用更轻量的 transform 展开动画。

自定义 CSS 编辑优化

自定义CSS CodeMirror 编辑器 会用 CodeMirror 接管用户设置里的自定义 CSS 编辑区,并在离开编辑器或页面生命周期事件中再同步和应用样式,减少输入期间的样式重算。

切换美化优化 会拦截原生 #customCSS 的长文本写入,把值重定向到 JavaScript 内存属性,从物理层面避免浏览器因为向原生 textarea 写入大段 CSS 而触发布局和绘制卡顿。开启此项会自动开启自定义 CSS CodeMirror 编辑器。

移动端切换美化后切到后台再返回时,扩展会以 SillyTavern 当前主题的 power_user.custom_css 为准,重新校准 #custom-style、原生 textarea、CodeMirror 文档和 Shadow Property,避免新旧美化 CSS 混合残留。

角色描述 CodeMirror 编辑器

启用 角色描述 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 的消息插入流程恢复楼层,尽量触发正常的消息渲染事件。

支持 OpenAI / Custom 来源中单个 emit_complete_response 或 emit_complete_response_<字母数字后缀> 工具承载完整回复:保留上游请求的工具定义,后端把工具参数 JSON 的 content 转为普通 AI 正文,前端显示和后台保存使用同一份内容。工具参数分片会等收齐并校验后一次显示正文;普通文本回复仍实时显示,包括代理返回的错误正文。不执行通用工具调用,也不接管混合多个工具的请求。

后台接管与请求重试通过本轮主生成的一次性请求标记关联,不再比较整份请求体、计算内容指纹或维护带匹配超时的意图队列。预设脚本在 CHAT_COMPLETION_SETTINGS_READY 之后克隆 JSON、调整采样参数或提示词、加入上述防截断工具时,只要保留该标记,就仍能识别为同一次生成;实际发出的请求保留脚本改写后的内容。标记只在页面请求链中传递,由内层请求钩子在发送前移除,不写入 KV,也不传给柏宝库后端或远端 API。即使关闭自动重试或回退原生接口,也会移除标记。

参数准备事件只绑定本轮请求标记,不提前按工具列表、来源或候选数拒绝绑定;这些兼容性检查统一放在 fetch 接到最终请求时执行,避免后续预设脚本修正配置后仍漏接管。未绑定时,日志会区分事件未收到、生成类型不一致、准备期间切换聊天或关闭功能等原因,不输出提示词和密钥。

标记随新一轮生成替换,请求认领一次即清除,生成结束、停止或切换聊天时失效;不会因预处理耗时超过 60/120 秒就匹配失败。没有标记、标记属于其他生成、聊天状态不符或含不支持的工具时仍保守回退,不会仅凭接口 URL 接管辅助请求;控制台会给出具体跳过原因。请求一旦发出,断线或丢失响应不会再回退原生接口重复生成。

此兼容需要柏宝库后端 0.6.4 或以上,并重启 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 音频能否播放取决于浏览器支持和远端访问情况;本地文件仅保存在当前浏览器;移动端静音保活只能提高后台播放成功率,无法绕过系统强制休眠、浏览器杀后台或省电策略。
Resmi GitHub deposundan arşivlenmiş belge aynası · GitHub'da Gör
Anlık görüntü tarihi: 2026-11-08