预设兼容:按真实抓包对齐装配与包装层,补上声明式工具与预设正则。

- 装配只认 prompt_order.enabled;squash_system_messages 只合并相邻 system(新增 system 档,连接符按酒馆用单换行)
- 包装层:new_chat_prompt、示例对话(new_example_chat_prompt + <START> 切段 + name)、角色卡三块与 personality_format/scenario_format、{{user}}/{{char}} 取值、任务契约并进预设条目
- 工具协议:按 ToolBindings / 伪工具协议数据声明真 tools(presetToolPolicy=preset),工具描述用到的条目不再重复作为消息发出
- 正则:promptOnly 作用于对话历史(含 depth 过滤)、写入时脚本改写回复;{{//}} 注释按配平扫描
- tools/st-request-diff:真假上游抓包对比工具、三份预设的机制结论与实测报告
This commit is contained in:
2026-10-23 00:13:08 +08:00
parent ed09e5c831
commit 9dc927282f
94 changed files with 11558 additions and 413 deletions
@@ -0,0 +1,54 @@
// TavernHelper 只对"白名单里的预设"执行预设内置脚本。这个脚本把指定预设加进白名单并重载页面。
// 用法: node allow-preset-scripts.mjs --presets linux_1.3,Reborn2.4,NVWA-Galaxia-ST [--reload]
import { CdpSession, evaluate, sleep } from "./cdp.mjs";
import { waitStReady } from "./lib.mjs";
const argv = process.argv.slice(2);
const arg = (name, dflt) => {
const i = argv.indexOf("--" + name);
return i >= 0 ? String(argv[i + 1]) : dflt;
};
const presets = arg("presets", "").split(",").map((s) => s.trim()).filter(Boolean);
const reload = argv.includes("--reload");
const browserPort = Number(arg("browser-port", "8223"));
const stHint = arg("st-url", "127.0.0.1:8123");
const version = await (await fetch("http://127.0.0.1:" + browserPort + "/json/version")).json();
const cdp = await CdpSession.connect(version.webSocketDebuggerUrl, "browser");
const { targetInfos } = await cdp.send("Target.getTargets");
const target = targetInfos.find((t) => t.type === "page" && String(t.url).includes(stHint));
if (!target) throw new Error("没找到酒馆页面");
const { sessionId } = await cdp.send("Target.attachToTarget", { targetId: target.targetId, flatten: true });
await cdp.send("Runtime.enable", {}, sessionId);
const page = { cdp, sessionId };
const before = await evaluate(page, `(() => {
const s = window.SillyTavern.getContext().extensionSettings.tavern_helper.script;
return s.enabled;
})()`);
console.log("[scripts] 改前: " + JSON.stringify(before));
await evaluate(page, `(() => {
const ctx = window.SillyTavern.getContext();
const s = ctx.extensionSettings.tavern_helper.script;
const list = new Set(s.enabled.presets || []);
for (const name of ${JSON.stringify(presets)}) list.add(name);
s.enabled = { global: true, presets: [...list], characters: s.enabled.characters || [] };
ctx.saveSettingsDebounced();
return s.enabled;
})()`);
await sleep(1200);
const after = await evaluate(page, `(() => window.SillyTavern.getContext().extensionSettings.tavern_helper.script.enabled)()`);
console.log("[scripts] 改后: " + JSON.stringify(after));
if (reload) {
await cdp.send("Page.enable", {}, sessionId);
await cdp.send("Page.reload", {}, sessionId);
await sleep(1500);
await waitStReady(page, 120000, (msg) => console.log("[scripts] " + msg));
console.log("[scripts] 页面已重载并就绪");
const now = await evaluate(page, `(() => window.SillyTavern.getContext().extensionSettings.tavern_helper.script.enabled)()`);
console.log("[scripts] 重载后: " + JSON.stringify(now));
}
cdp.close();