Skip to content

预设解耦

预设解耦将 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)完整加载。

相关页面

Built upon SillyTavern