// 连到已开着的酒馆页面:清空当前角色的历史,并打印当前生效的预设/连接状态。 // 用法: node attach-clear.mjs [--browser-port 8223] [--st-url 127.0.0.1:8123] [--preset 名字] import { CdpSession, evaluate } from "./cdp.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 browserPort = Number(arg("browser-port", "8223")); const stHint = arg("st-url", "127.0.0.1:8123"); const presetName = arg("preset", ""); 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 out = await evaluate(page, `(async () => { const ctx = window.SillyTavern.getContext(); const jq = window.jQuery; const names = ctx.getPresetManager("openai").getPresetList().preset_names || {}; const want = ${JSON.stringify(presetName)}; if (want && names[want] !== undefined) { ctx.chatCompletionSettings.bind_preset_to_connection = false; jq("#settings_preset_openai").val(String(names[want])).trigger("change"); await new Promise((r) => setTimeout(r, 800)); } await window.SillyTavern.getContext().clearChat({ clearData: true }); const f = window.SillyTavern.getContext(); const s = f.chatCompletionSettings; return { availablePresets: Object.keys(names), preset: s.preset_settings_openai, temp: s.temp_openai, maxTokens: s.openai_max_tokens, functionCalling: s.function_calling, squash: s.squash_system_messages, stream: s.stream_openai, customUrl: s.custom_url, charName: f.name2, chatLen: f.chat.length, }; })()`); console.log("[attach] " + JSON.stringify(out, null, 1)); cdp.close();