预设兼容:按真实抓包对齐装配与包装层,补上声明式工具与预设正则。
- 装配只认 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:
+71
-7
@@ -58,11 +58,15 @@ const sectionPersonaEl = document.getElementById("section-persona");
|
||||
const sectionPreferenceEl = document.getElementById("section-preference");
|
||||
const sectionPresetEl = document.getElementById("section-preset");
|
||||
const sectionStorageEl = document.getElementById("section-storage");
|
||||
const sectionChatEl = document.getElementById("section-chat");
|
||||
const preferenceCollectEveryEl = document.getElementById("preference-collect-every");
|
||||
const activeSettingsBarEl = document.getElementById("active-settings-bar");
|
||||
const settingsToastEl = document.getElementById("settings-toast");
|
||||
const contextTraceKeepEl = document.getElementById("context-trace-keep");
|
||||
const dictateFillRetriesEl = document.getElementById("dictate-fill-retries");
|
||||
const chatDragGainEl = document.getElementById("chat-drag-gain");
|
||||
const messageSquashEl = document.getElementById("message-squash");
|
||||
const presetToolPolicyEl = document.getElementById("preset-tool-policy");
|
||||
const probeDialog = document.getElementById("preset-probe-dialog");
|
||||
const probePresetNameEl = document.getElementById("probe-preset-name");
|
||||
const probeMessageEl = document.getElementById("probe-message");
|
||||
@@ -154,6 +158,7 @@ function switchSection(section) {
|
||||
sectionPreferenceEl?.classList.toggle("hidden", section !== "preference");
|
||||
sectionPresetEl.classList.toggle("hidden", section !== "preset");
|
||||
sectionStorageEl?.classList.toggle("hidden", section !== "storage");
|
||||
sectionChatEl?.classList.toggle("hidden", section !== "chat");
|
||||
renderPanelHeader();
|
||||
}
|
||||
|
||||
@@ -192,6 +197,9 @@ function renderPanelHeader() {
|
||||
btn.textContent = "导入 JSON";
|
||||
btn.addEventListener("click", () => presetFileEl.click());
|
||||
panelActionsEl.appendChild(btn);
|
||||
} else if (activeSection === "chat") {
|
||||
panelTitleEl.textContent = "直聊";
|
||||
panelSubtitleEl.textContent = "卡片拖动的跟手倍率";
|
||||
} else {
|
||||
panelTitleEl.textContent = "上下文";
|
||||
panelSubtitleEl.textContent = "上下文痕迹,以及对话落盘同轮补写次数";
|
||||
@@ -780,6 +788,15 @@ async function loadAll() {
|
||||
if (dictateFillRetriesEl) {
|
||||
dictateFillRetriesEl.value = String(state.settings.dictateFillRetries ?? 0);
|
||||
}
|
||||
if (chatDragGainEl) {
|
||||
chatDragGainEl.value = String(state.settings.chatDragGain ?? 1.5);
|
||||
}
|
||||
if (messageSquashEl) {
|
||||
messageSquashEl.value = state.settings.messageSquash ?? "follow-preset";
|
||||
}
|
||||
if (presetToolPolicyEl) {
|
||||
presetToolPolicyEl.value = state.settings.presetToolPolicy ?? "adapt";
|
||||
}
|
||||
renderActiveBar();
|
||||
renderProfiles();
|
||||
renderPersonas();
|
||||
@@ -1659,14 +1676,23 @@ presetFileEl.addEventListener("change", async () => {
|
||||
});
|
||||
lastImportedPresetId = report.preset.id;
|
||||
importReportEl.hidden = false;
|
||||
const escapeHtml = (text) =>
|
||||
String(text).replace(/[&<>"']/g, (c) =>
|
||||
({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" })[c],
|
||||
);
|
||||
const core = report.missingCoreIdentifiers?.length
|
||||
? `缺少 ${escapeHtml(report.missingCoreIdentifiers.join(" / "))}`
|
||||
: "框架完整";
|
||||
importReportEl.innerHTML = `
|
||||
<div>${[
|
||||
`已导入: ${report.preset.name}`,
|
||||
`条目: ${report.promptCount},启用: ${report.enabledCount}`,
|
||||
report.warnings.length ? `警告: ${report.warnings.join("; ")}` : "",
|
||||
]
|
||||
.filter(Boolean)
|
||||
.join("<br>")}</div>
|
||||
<div>已导入: ${escapeHtml(report.preset.name)}</div>
|
||||
<div>条目 ${report.promptCount},启用 ${report.enabledCount};顺序块 character_id=${escapeHtml(report.orderCharacterId ?? "?")}(${core})</div>
|
||||
${
|
||||
report.warnings?.length
|
||||
? `<ul class="import-report-warnings">${report.warnings
|
||||
.map((w) => `<li>${escapeHtml(w)}</li>`)
|
||||
.join("")}</ul>`
|
||||
: `<div>没有需要注意的项目</div>`
|
||||
}
|
||||
<div class="import-report-actions">
|
||||
<button type="button" class="btn-activate" id="activate-imported-preset">选用此预设并生效</button>
|
||||
</div>`;
|
||||
@@ -1820,6 +1846,44 @@ document.getElementById("btn-save-fill-retries")?.addEventListener("click", asyn
|
||||
}
|
||||
});
|
||||
|
||||
document.getElementById("btn-save-preset-runtime")?.addEventListener("click", async () => {
|
||||
try {
|
||||
const data = await api("/api/settings", {
|
||||
method: "PUT",
|
||||
body: JSON.stringify({
|
||||
messageSquash: messageSquashEl?.value ?? "follow-preset",
|
||||
presetToolPolicy: presetToolPolicyEl?.value ?? "adapt",
|
||||
}),
|
||||
});
|
||||
state.settings = data.settings;
|
||||
if (messageSquashEl) {
|
||||
messageSquashEl.value = data.settings.messageSquash ?? "follow-preset";
|
||||
}
|
||||
if (presetToolPolicyEl) {
|
||||
presetToolPolicyEl.value = data.settings.presetToolPolicy ?? "adapt";
|
||||
}
|
||||
showToast("已保存预设运行设置");
|
||||
} catch (err) {
|
||||
showToast(err.message, true);
|
||||
}
|
||||
});
|
||||
|
||||
document.getElementById("btn-save-drag-gain")?.addEventListener("click", async () => {
|
||||
try {
|
||||
const n = Number(chatDragGainEl?.value ?? 1.5);
|
||||
const data = await api("/api/settings", {
|
||||
method: "PUT",
|
||||
body: JSON.stringify({ chatDragGain: n }),
|
||||
});
|
||||
state.settings = data.settings;
|
||||
const saved = data.settings.chatDragGain ?? 1.5;
|
||||
if (chatDragGainEl) chatDragGainEl.value = String(saved);
|
||||
showToast(`已保存:拖 100px 走 ${Math.round(saved * 100)}px`);
|
||||
} catch (err) {
|
||||
showToast(err.message, true);
|
||||
}
|
||||
});
|
||||
|
||||
document.getElementById("btn-save-context-keep")?.addEventListener("click", async () => {
|
||||
try {
|
||||
const n = Number(contextTraceKeepEl?.value ?? 5);
|
||||
|
||||
Reference in New Issue
Block a user