Fix regex stage timing and implicit world info resolution

This commit is contained in:
Youzini-afk
2026-04-05 18:12:09 +08:00
parent 782d7fb3cd
commit 12f2a7a6eb
5 changed files with 136 additions and 22 deletions

View File

@@ -153,6 +153,65 @@ try {
const { applyTaskRegex, inspectTaskRegexReuse } = await import(
"../task-regex.js"
);
const {
createDefaultTaskProfiles,
isTaskRegexStageEnabled,
normalizeTaskRegexStages,
} = await import("../prompt-profiles.js");
const normalizedLegacyStages = normalizeTaskRegexStages({
finalPrompt: true,
"input.userMessage": false,
"input.recentMessages": false,
"input.candidateText": false,
"input.finalPrompt": false,
rawResponse: false,
beforeParse: false,
"output.rawResponse": false,
"output.beforeParse": false,
});
assert.equal(normalizedLegacyStages["input.finalPrompt"], true);
assert.equal(normalizedLegacyStages["input.userMessage"], false);
assert.equal(normalizedLegacyStages["input.recentMessages"], false);
assert.equal(normalizedLegacyStages["input.candidateText"], false);
assert.equal(normalizedLegacyStages["output.rawResponse"], false);
assert.equal(normalizedLegacyStages["output.beforeParse"], false);
assert.equal(
isTaskRegexStageEnabled(normalizedLegacyStages, "input.finalPrompt"),
true,
);
assert.equal(
isTaskRegexStageEnabled(normalizedLegacyStages, "input.userMessage"),
false,
);
assert.equal(
isTaskRegexStageEnabled(normalizedLegacyStages, "input.recentMessages"),
false,
);
assert.equal(
isTaskRegexStageEnabled(normalizedLegacyStages, "input.candidateText"),
false,
);
const defaultProfiles = createDefaultTaskProfiles();
const defaultExtractStages =
defaultProfiles.extract?.profiles?.[0]?.regex?.stages || {};
assert.equal(
isTaskRegexStageEnabled(defaultExtractStages, "input.finalPrompt"),
true,
);
assert.equal(
isTaskRegexStageEnabled(defaultExtractStages, "input.userMessage"),
false,
);
assert.equal(
isTaskRegexStageEnabled(defaultExtractStages, "input.recentMessages"),
false,
);
assert.equal(
isTaskRegexStageEnabled(defaultExtractStages, "input.candidateText"),
false,
);
globalThis.getTavernRegexes = () => {
throw new Error("legacy global getter should not be used in regex tests");

View File

@@ -456,6 +456,56 @@ try {
assert.equal(promptBuild.additionalMessages[0].content, "这是一条 atDepth 消息。");
assert.equal(promptBuild.debug.mvu.sanitizedFieldCount >= 0, true);
const noWorldInfoBlockSettings = {
taskProfiles: {
recall: {
activeProfileId: "custom",
profiles: [
{
id: "custom",
name: "无世界书显式块",
taskType: "recall",
builtin: false,
blocks: [
{
id: "u1",
type: "custom",
content: "角色: {{charName}}",
role: "user",
enabled: true,
order: 0,
injectionMode: "append",
},
],
},
],
},
},
};
const atDepthOnlyPromptBuild = await buildTaskPrompt(
noWorldInfoBlockSettings,
"recall",
{
taskName: "recall",
userMessage: "继续调查",
recentMessages: "我们继续调查那条线索",
charName: "Alice",
},
);
assert.equal(atDepthOnlyPromptBuild.debug.worldInfoRequested, true);
assert.equal(atDepthOnlyPromptBuild.debug.worldInfoAtDepthCount, 1);
assert.equal(atDepthOnlyPromptBuild.additionalMessages.length, 1);
assert.equal(
atDepthOnlyPromptBuild.additionalMessages[0].content,
"这是一条 atDepth 消息。",
);
assert.deepEqual(
atDepthOnlyPromptBuild.executionMessages.map((message) => message.role),
["user", "system"],
);
const { initializeHostAdapter } = await import("../host-adapter/index.js");
const partialBridgeCalls = [];
const partialBridgeEntriesByWorldbook = {