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