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

- 装配只认 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
+24 -18
View File
@@ -41,16 +41,16 @@ function samplePreset() {
describe("assemblePresetProbe", () => {
it("fills the sandwich with sample lore, history, and the current turn", () => {
const messages = assemblePresetProbe(samplePreset(), {
message: "我推开门。",
});
const messages = assemblePresetProbe(
samplePreset(),
{ message: "我推开门。" },
{ squash: "none" },
);
expect(messages.map((m) => [m.role, m.content])).toEqual([
["system", "MAIN"],
[
"system",
`### 任务契约\n\n${PROBE_SYSTEM_PROMPT}\n\n### 试跑设定\n\n${DEFAULT_PROBE_CONTEXT.loreBefore}`,
],
// 任务契约并进预设自有的 main 条目,不再单独一条
["system", `MAIN\n\n${PROBE_SYSTEM_PROMPT}`],
["system", `### 试跑设定\n\n${DEFAULT_PROBE_CONTEXT.loreBefore}`],
["system", DEFAULT_PROBE_CONTEXT.history],
["user", "我推开门。"],
["system", "PHI"],
@@ -58,17 +58,20 @@ describe("assemblePresetProbe", () => {
});
it("omits empty optional bags", () => {
const messages = assemblePresetProbe(samplePreset(), {
message: "你好",
loreBefore: "",
history: "",
loreAfter: "",
postTurn: "",
});
const messages = assemblePresetProbe(
samplePreset(),
{
message: "你好",
loreBefore: "",
history: "",
loreAfter: "",
postTurn: "",
},
{ squash: "none" },
);
expect(messages.map((m) => m.content)).toEqual([
"MAIN",
`### 任务契约\n\n${PROBE_SYSTEM_PROMPT}`,
`MAIN\n\n${PROBE_SYSTEM_PROMPT}`,
"你好",
"PHI",
]);
@@ -84,7 +87,10 @@ describe("runPresetProbe", () => {
expect(result.completed).toBe(false);
expect(result.reply).toBeNull();
expect(result.messages.some((m) => m.content === "我推开门。")).toBe(true);
// 缺省 strict:system 段会折进 user,所以只断言正文没丢
expect(
result.messages.map((m) => m.content).join("\n"),
).toContain("我推开门。");
});
it("returns the model reply when complete is provided", async () => {