refactor: rebalance default prompt block roles

This commit is contained in:
Youzini-afk
2026-03-27 03:50:11 +08:00
parent 88db5d95ea
commit d52923a45a
7 changed files with 67 additions and 48 deletions

View File

@@ -209,7 +209,7 @@ const defaultSettings = {
compressPrompt: "", compressPrompt: "",
synopsisPrompt: "", synopsisPrompt: "",
reflectionPrompt: "", reflectionPrompt: "",
taskProfilesVersion: 2, taskProfilesVersion: 3,
taskProfiles: createDefaultTaskProfiles(), taskProfiles: createDefaultTaskProfiles(),
// ====== v2 增强设置 ====== // ====== v2 增强设置 ======

View File

@@ -1705,7 +1705,7 @@ function _refreshTaskProfileWorkspace(settings = _getSettings?.() || {}) {
function _patchTaskProfiles(taskProfiles, extraPatch = {}, options = {}) { function _patchTaskProfiles(taskProfiles, extraPatch = {}, options = {}) {
return _patchSettings( return _patchSettings(
{ {
taskProfilesVersion: 2, taskProfilesVersion: 3,
taskProfiles, taskProfiles,
...extraPatch, ...extraPatch,
}, },

View File

@@ -88,66 +88,66 @@ const BUILTIN_BLOCK_DEFINITIONS = [
{ {
sourceKey: "recentMessages", sourceKey: "recentMessages",
name: "最近消息", name: "最近消息",
role: "user", role: "system",
description: "注入最近的对话上下文片段。extract 和 recall 任务使用,提供 LLM 分析所需的对话历史。", description: "注入最近的对话上下文片段。extract 和 recall 任务使用,提供 LLM 分析所需的对话历史。",
}, },
{ {
sourceKey: "userMessage", sourceKey: "userMessage",
name: "用户消息", name: "用户消息",
role: "user", role: "system",
description: "注入当前用户的最新输入内容。recall 任务使用,用于匹配最相关的记忆节点。", description: "注入当前用户的最新输入内容。recall 任务使用,用于匹配最相关的记忆节点。",
}, },
{ {
sourceKey: "candidateNodes", sourceKey: "candidateNodes",
name: "候选节点", name: "候选节点",
role: "user", role: "system",
description: "注入待筛选的候选记忆节点列表。recall选择相关节点和 consolidation检测冲突任务使用。", description: "注入待筛选的候选记忆节点列表。recall选择相关节点和 consolidation检测冲突任务使用。",
}, },
{ {
sourceKey: "graphStats", sourceKey: "graphStats",
name: "图统计", name: "图统计",
role: "user", role: "system",
description: "注入图谱当前状态摘要(如节点数量、类型分布)。所有任务类型均可使用,帮助 LLM 了解图谱全貌。", description: "注入图谱当前状态摘要(如节点数量、类型分布)。所有任务类型均可使用,帮助 LLM 了解图谱全貌。",
}, },
{ {
sourceKey: "currentRange", sourceKey: "currentRange",
name: "当前范围", name: "当前范围",
role: "user", role: "system",
description: "注入当前处理的消息楼层范围(如「楼 5 ~ 楼 10」。extract 和 compress 任务使用。", description: "注入当前处理的消息楼层范围(如「楼 5 ~ 楼 10」。extract 和 compress 任务使用。",
}, },
{ {
sourceKey: "nodeContent", sourceKey: "nodeContent",
name: "节点内容", name: "节点内容",
role: "user", role: "system",
description: "注入待压缩的节点正文内容。compress 任务专用,包含需要合并总结的多个节点文本。", description: "注入待压缩的节点正文内容。compress 任务专用,包含需要合并总结的多个节点文本。",
}, },
{ {
sourceKey: "eventSummary", sourceKey: "eventSummary",
name: "事件摘要", name: "事件摘要",
role: "user", role: "system",
description: "注入近期事件时间线摘要。synopsis生成前情提要和 reflection生成反思任务使用。", description: "注入近期事件时间线摘要。synopsis生成前情提要和 reflection生成反思任务使用。",
}, },
{ {
sourceKey: "characterSummary", sourceKey: "characterSummary",
name: "角色摘要", name: "角色摘要",
role: "user", role: "system",
description: "注入近期角色状态变化摘要。synopsis 和 reflection 任务使用,帮助 LLM 了解角色动态。", description: "注入近期角色状态变化摘要。synopsis 和 reflection 任务使用,帮助 LLM 了解角色动态。",
}, },
{ {
sourceKey: "threadSummary", sourceKey: "threadSummary",
name: "主线摘要", name: "主线摘要",
role: "user", role: "system",
description: "注入当前活跃的故事主线摘要。synopsis 和 reflection 任务使用,帮助 LLM 把握叙事走向。", description: "注入当前活跃的故事主线摘要。synopsis 和 reflection 任务使用,帮助 LLM 把握叙事走向。",
}, },
{ {
sourceKey: "contradictionSummary", sourceKey: "contradictionSummary",
name: "矛盾摘要", name: "矛盾摘要",
role: "user", role: "system",
description: "注入近期检测到的记忆矛盾或冲突信息。reflection 任务专用,触发基于矛盾的深度反思。", description: "注入近期检测到的记忆矛盾或冲突信息。reflection 任务专用,触发基于矛盾的深度反思。",
}, },
]; ];
const DEFAULT_TASK_PROFILE_VERSION = 2; const DEFAULT_TASK_PROFILE_VERSION = 3;
const DEFAULT_PROFILE_ID = "default"; const DEFAULT_PROFILE_ID = "default";
const LEGACY_PROMPT_FIELD_MAP = { const LEGACY_PROMPT_FIELD_MAP = {
@@ -419,28 +419,28 @@ const TASK_CONTEXT_BLOCK_BLUEPRINTS = {
id: "default-recent-messages", id: "default-recent-messages",
name: "最近消息", name: "最近消息",
type: "builtin", type: "builtin",
role: "user", role: "system",
sourceKey: "recentMessages", sourceKey: "recentMessages",
}, },
{ {
id: "default-graph-stats", id: "default-graph-stats",
name: "图统计", name: "图统计",
type: "builtin", type: "builtin",
role: "user", role: "system",
sourceKey: "graphStats", sourceKey: "graphStats",
}, },
{ {
id: "default-schema", id: "default-schema",
name: "Schema", name: "Schema",
type: "builtin", type: "builtin",
role: "user", role: "system",
sourceKey: "schema", sourceKey: "schema",
}, },
{ {
id: "default-current-range", id: "default-current-range",
name: "当前范围", name: "当前范围",
type: "builtin", type: "builtin",
role: "user", role: "system",
sourceKey: "currentRange", sourceKey: "currentRange",
}, },
], ],
@@ -449,28 +449,28 @@ const TASK_CONTEXT_BLOCK_BLUEPRINTS = {
id: "default-recent-messages", id: "default-recent-messages",
name: "最近消息", name: "最近消息",
type: "builtin", type: "builtin",
role: "user", role: "system",
sourceKey: "recentMessages", sourceKey: "recentMessages",
}, },
{ {
id: "default-user-message", id: "default-user-message",
name: "用户消息", name: "用户消息",
type: "builtin", type: "builtin",
role: "user", role: "system",
sourceKey: "userMessage", sourceKey: "userMessage",
}, },
{ {
id: "default-candidate-nodes", id: "default-candidate-nodes",
name: "候选节点", name: "候选节点",
type: "builtin", type: "builtin",
role: "user", role: "system",
sourceKey: "candidateNodes", sourceKey: "candidateNodes",
}, },
{ {
id: "default-graph-stats", id: "default-graph-stats",
name: "图统计", name: "图统计",
type: "builtin", type: "builtin",
role: "user", role: "system",
sourceKey: "graphStats", sourceKey: "graphStats",
}, },
], ],
@@ -479,14 +479,14 @@ const TASK_CONTEXT_BLOCK_BLUEPRINTS = {
id: "default-candidate-nodes", id: "default-candidate-nodes",
name: "候选节点", name: "候选节点",
type: "builtin", type: "builtin",
role: "user", role: "system",
sourceKey: "candidateNodes", sourceKey: "candidateNodes",
}, },
{ {
id: "default-graph-stats", id: "default-graph-stats",
name: "图统计", name: "图统计",
type: "builtin", type: "builtin",
role: "user", role: "system",
sourceKey: "graphStats", sourceKey: "graphStats",
}, },
], ],
@@ -495,21 +495,21 @@ const TASK_CONTEXT_BLOCK_BLUEPRINTS = {
id: "default-node-content", id: "default-node-content",
name: "节点内容", name: "节点内容",
type: "builtin", type: "builtin",
role: "user", role: "system",
sourceKey: "nodeContent", sourceKey: "nodeContent",
}, },
{ {
id: "default-current-range", id: "default-current-range",
name: "当前范围", name: "当前范围",
type: "builtin", type: "builtin",
role: "user", role: "system",
sourceKey: "currentRange", sourceKey: "currentRange",
}, },
{ {
id: "default-graph-stats", id: "default-graph-stats",
name: "图统计", name: "图统计",
type: "builtin", type: "builtin",
role: "user", role: "system",
sourceKey: "graphStats", sourceKey: "graphStats",
}, },
], ],
@@ -518,28 +518,28 @@ const TASK_CONTEXT_BLOCK_BLUEPRINTS = {
id: "default-event-summary", id: "default-event-summary",
name: "事件摘要", name: "事件摘要",
type: "builtin", type: "builtin",
role: "user", role: "system",
sourceKey: "eventSummary", sourceKey: "eventSummary",
}, },
{ {
id: "default-character-summary", id: "default-character-summary",
name: "角色摘要", name: "角色摘要",
type: "builtin", type: "builtin",
role: "user", role: "system",
sourceKey: "characterSummary", sourceKey: "characterSummary",
}, },
{ {
id: "default-thread-summary", id: "default-thread-summary",
name: "主线摘要", name: "主线摘要",
type: "builtin", type: "builtin",
role: "user", role: "system",
sourceKey: "threadSummary", sourceKey: "threadSummary",
}, },
{ {
id: "default-graph-stats", id: "default-graph-stats",
name: "图统计", name: "图统计",
type: "builtin", type: "builtin",
role: "user", role: "system",
sourceKey: "graphStats", sourceKey: "graphStats",
}, },
], ],
@@ -548,35 +548,35 @@ const TASK_CONTEXT_BLOCK_BLUEPRINTS = {
id: "default-event-summary", id: "default-event-summary",
name: "事件摘要", name: "事件摘要",
type: "builtin", type: "builtin",
role: "user", role: "system",
sourceKey: "eventSummary", sourceKey: "eventSummary",
}, },
{ {
id: "default-character-summary", id: "default-character-summary",
name: "角色摘要", name: "角色摘要",
type: "builtin", type: "builtin",
role: "user", role: "system",
sourceKey: "characterSummary", sourceKey: "characterSummary",
}, },
{ {
id: "default-thread-summary", id: "default-thread-summary",
name: "主线摘要", name: "主线摘要",
type: "builtin", type: "builtin",
role: "user", role: "system",
sourceKey: "threadSummary", sourceKey: "threadSummary",
}, },
{ {
id: "default-contradiction-summary", id: "default-contradiction-summary",
name: "矛盾摘要", name: "矛盾摘要",
type: "builtin", type: "builtin",
role: "user", role: "system",
sourceKey: "contradictionSummary", sourceKey: "contradictionSummary",
}, },
{ {
id: "default-graph-stats", id: "default-graph-stats",
name: "图统计", name: "图统计",
type: "builtin", type: "builtin",
role: "user", role: "system",
sourceKey: "graphStats", sourceKey: "graphStats",
}, },
], ],
@@ -587,14 +587,14 @@ const DEFAULT_TRAILING_BLOCK_BLUEPRINTS = [
id: "default-format", id: "default-format",
name: "输出格式", name: "输出格式",
type: "custom", type: "custom",
role: "system", role: "user",
contentKey: "format", contentKey: "format",
}, },
{ {
id: "default-rules", id: "default-rules",
name: "行为规则", name: "行为规则",
type: "custom", type: "custom",
role: "system", role: "user",
contentKey: "rules", contentKey: "rules",
}, },
]; ];
@@ -768,10 +768,7 @@ function mergeDefaultTaskProfileBlocks(taskType, existingBlocks = []) {
? existing.name ? existing.name
: canonicalBlock.name, : canonicalBlock.name,
type: canonicalBlock.type, type: canonicalBlock.type,
role: role: canonicalBlock.role,
typeof existing.role === "string" && existing.role
? existing.role
: canonicalBlock.role,
sourceKey: canonicalBlock.sourceKey || "", sourceKey: canonicalBlock.sourceKey || "",
content: content:
canonicalBlock.type === "custom" canonicalBlock.type === "custom"

View File

@@ -45,7 +45,7 @@ assert.equal(defaultSettings.recallDiffusionTopK, 100);
assert.equal(defaultSettings.recallLlmCandidatePool, 30); assert.equal(defaultSettings.recallLlmCandidatePool, 30);
assert.equal(defaultSettings.recallLlmContextMessages, 4); assert.equal(defaultSettings.recallLlmContextMessages, 4);
assert.equal(defaultSettings.injectDepth, 9999); assert.equal(defaultSettings.injectDepth, 9999);
assert.equal(defaultSettings.taskProfilesVersion, 2); assert.equal(defaultSettings.taskProfilesVersion, 3);
assert.ok(defaultSettings.taskProfiles); assert.ok(defaultSettings.taskProfiles);
assert.ok(defaultSettings.taskProfiles.extract); assert.ok(defaultSettings.taskProfiles.extract);
assert.ok(defaultSettings.taskProfiles.recall); assert.ok(defaultSettings.taskProfiles.recall);

View File

@@ -36,7 +36,7 @@ const { buildTaskLlmPayload, buildTaskPrompt } = await import("../prompt-builder
const { createDefaultTaskProfiles } = await import("../prompt-profiles.js"); const { createDefaultTaskProfiles } = await import("../prompt-profiles.js");
const settings = { const settings = {
taskProfilesVersion: 2, taskProfilesVersion: 3,
taskProfiles: createDefaultTaskProfiles(), taskProfiles: createDefaultTaskProfiles(),
}; };
@@ -51,6 +51,16 @@ const extractPromptBuild = await buildTaskPrompt(settings, "extract", {
}); });
const extractPayload = buildTaskLlmPayload(extractPromptBuild, "fallback-user"); const extractPayload = buildTaskLlmPayload(extractPromptBuild, "fallback-user");
assert.equal(extractPayload.userPrompt, ""); assert.equal(extractPayload.userPrompt, "");
assert.equal(
extractPayload.promptMessages.filter((message) => message.role === "user").length,
2,
);
assert.deepEqual(
extractPayload.promptMessages
.filter((message) => message.role === "user")
.map((message) => message.blockName),
["输出格式", "行为规则"],
);
assert.deepEqual( assert.deepEqual(
extractPayload.promptMessages extractPayload.promptMessages
.map((message) => message.sourceKey) .map((message) => message.sourceKey)
@@ -76,6 +86,10 @@ const recallPromptBuild = await buildTaskPrompt(settings, "recall", {
}); });
const recallPayload = buildTaskLlmPayload(recallPromptBuild, "fallback-user"); const recallPayload = buildTaskLlmPayload(recallPromptBuild, "fallback-user");
assert.equal(recallPayload.userPrompt, ""); assert.equal(recallPayload.userPrompt, "");
assert.equal(
recallPayload.promptMessages.filter((message) => message.role === "user").length,
2,
);
assert.deepEqual( assert.deepEqual(
recallPayload.promptMessages recallPayload.promptMessages
.map((message) => message.sourceKey) .map((message) => message.sourceKey)

View File

@@ -15,7 +15,7 @@ const legacySettings = {
}; };
const migrated = migrateLegacyTaskProfiles(legacySettings); const migrated = migrateLegacyTaskProfiles(legacySettings);
assert.equal(migrated.taskProfilesVersion, 2); assert.equal(migrated.taskProfilesVersion, 3);
assert.ok(migrated.taskProfiles); assert.ok(migrated.taskProfiles);
assert.ok(migrated.taskProfiles.extract); assert.ok(migrated.taskProfiles.extract);
assert.ok(migrated.taskProfiles.recall); assert.ok(migrated.taskProfiles.recall);
@@ -71,12 +71,12 @@ assert.deepEqual(
"system", "system",
"system", "system",
"system", "system",
"user",
"user",
"user",
"user",
"system", "system",
"system", "system",
"system",
"system",
"user",
"user",
], ],
); );
assert.equal( assert.equal(
@@ -207,11 +207,18 @@ assert.equal(upgradedLegacyDefault.blocks.length, 11);
assert.equal(upgradedLegacyDefault.blocks[0].content, "保留我自己的角色定义"); assert.equal(upgradedLegacyDefault.blocks[0].content, "保留我自己的角色定义");
assert.equal(upgradedLegacyDefault.blocks[9].content, "保留我自己的输出格式"); assert.equal(upgradedLegacyDefault.blocks[9].content, "保留我自己的输出格式");
assert.equal(upgradedLegacyDefault.blocks[10].content, "保留我自己的行为规则"); assert.equal(upgradedLegacyDefault.blocks[10].content, "保留我自己的行为规则");
assert.equal(upgradedLegacyDefault.blocks[9].role, "user");
assert.equal(upgradedLegacyDefault.blocks[10].role, "user");
assert.deepEqual( assert.deepEqual(
upgradedLegacyDefault.blocks upgradedLegacyDefault.blocks
.slice(5, 9) .slice(5, 9)
.map((block) => block.sourceKey), .map((block) => block.sourceKey),
["recentMessages", "graphStats", "schema", "currentRange"], ["recentMessages", "graphStats", "schema", "currentRange"],
); );
assert.ok(
upgradedLegacyDefault.blocks
.slice(1, 9)
.every((block) => block.role === "system"),
);
console.log("task-profile-migration tests passed"); console.log("task-profile-migration tests passed");

View File

@@ -60,6 +60,7 @@ const customBlock = activeProfile.blocks.find(
); );
assert.ok(builtinBlock); assert.ok(builtinBlock);
assert.equal(builtinBlock.injectionMode, "prepend"); assert.equal(builtinBlock.injectionMode, "prepend");
assert.equal(builtinBlock.role, "system");
assert.ok(customBlock); assert.ok(customBlock);
assert.equal(customBlock.role, "user"); assert.equal(customBlock.role, "user");
assert.equal(activeProfile.regex.localRules.length, 1); assert.equal(activeProfile.regex.localRules.length, 1);