预设解耦
预设解耦将 Chat Completion 预设中的「生成参数」与「连接配置」分离,使切换预设不再意外改变 API 连接设置。
问题背景
在 SillyTavern 中,Chat Completion 预设(即 OpenAI / Claude 等 API 的预设)包含了两类本质不同的配置:
- 生成参数 — 提示词模板(System Prompt、Jailbreak 等)、采样参数(Temperature、Top-P 等)、上下文长度等
- 连接字段 — API 地址、API Key、模型名称、Chat Completion Source 等
这两类配置被打包在同一个预设对象中。当用户切换预设时,连接字段也会随之改变——这意味着切换一个提示词模板可能会把你的 API 地址从 Claude 切到 OpenAI,或者覆盖你精心配置的自定义 API 端点。
这种联动在实际使用中造成了大量困扰:
- 用户不敢随意尝试不同的预设,因为担心连接配置被覆盖
- 分享预设时必须手动清理连接信息,否则会泄露 API Key
- 角色卡作者无法为角色推荐预设,因为加载预设会破坏用户的连接设置
字段分类机制
Luker 将预设中的每个字段标记为「连接字段」或「生成参数字段」两类:
- 连接字段 — API 来源、自定义 URL、模型名称、反向代理地址、代理密码等
- 生成参数字段 — Temperature、Top-P、最大 Token 数等
这个分类是预设解耦的基础——所有涉及预设加载的逻辑都会检查字段类型来决定是否应用。
切换预设时自动跳过连接字段
当用户切换预设时,加载逻辑会遍历预设中的每个字段,自动跳过所有连接字段。这确保了切换预设只会改变生成参数,而不会触碰当前的 API 连接配置。
何时包含连接字段
只有在 Connection Manager 中显式切换连接配置时,连接字段才会被应用。普通的预设切换、角色卡绑定预设加载等场景都不会包含连接字段。
受影响的模块
预设解耦涉及三个核心模块的协调:
预设加载
- 维护连接字段与生成参数字段的分类逻辑
- 预设加载时根据场景决定是否包含连接字段
- 预设导出时可选择是否包含连接字段
预设管理器
- 预设选择器的界面感知解耦状态
- 预设保存时保留连接字段(确保预设文件完整),但加载时按分类过滤
- 支持角色卡绑定预设的特殊选项渲染
Connection Manager
- 连接配置独立于预设管理,拥有自己的保存和切换逻辑
- 切换连接时只应用连接字段,不影响当前的生成参数
- 连接配置的变更通过增量 patch 保存,参见增量同步
与角色卡绑定预设的关系
预设解耦是角色卡绑定预设功能的前提。正因为连接字段被隔离,角色卡才能安全地携带推荐预设——加载角色卡预设时,连接字段会被自动跳过,确保用户的 API 连接不会被覆盖。
如果没有预设解耦,角色卡绑定预设将无法实现:每次打开一个角色卡都可能把用户的 API 地址和密钥替换掉,这显然是不可接受的。
预设文件兼容性
预设解耦不改变预设文件的存储格式。连接字段仍然保存在预设 JSON 中,只是在加载时被选择性跳过。这意味着现有的预设文件无需迁移,也可以在需要时(如通过 Connection Manager)完整加载。
相关页面
- 角色卡绑定预设与人设 — 依赖预设解耦的上层功能
- 改进总览 — 所有技术改进的概述