From d52923a45a159451d37990402311ddb2e64f4fd9 Mon Sep 17 00:00:00 2001 From: Youzini-afk <13153778771cx@gmail.com> Date: Fri, 27 Mar 2026 03:50:11 +0800 Subject: [PATCH] refactor: rebalance default prompt block roles --- index.js | 2 +- panel.js | 2 +- prompt-profiles.js | 75 +++++++++++++++---------------- tests/default-settings.mjs | 2 +- tests/prompt-builder-defaults.mjs | 16 ++++++- tests/task-profile-migration.mjs | 17 ++++--- tests/task-profile-storage.mjs | 1 + 7 files changed, 67 insertions(+), 48 deletions(-) diff --git a/index.js b/index.js index 4b37579..1958943 100644 --- a/index.js +++ b/index.js @@ -209,7 +209,7 @@ const defaultSettings = { compressPrompt: "", synopsisPrompt: "", reflectionPrompt: "", - taskProfilesVersion: 2, + taskProfilesVersion: 3, taskProfiles: createDefaultTaskProfiles(), // ====== v2 增强设置 ====== diff --git a/panel.js b/panel.js index fa9cedb..7c96ed5 100644 --- a/panel.js +++ b/panel.js @@ -1705,7 +1705,7 @@ function _refreshTaskProfileWorkspace(settings = _getSettings?.() || {}) { function _patchTaskProfiles(taskProfiles, extraPatch = {}, options = {}) { return _patchSettings( { - taskProfilesVersion: 2, + taskProfilesVersion: 3, taskProfiles, ...extraPatch, }, diff --git a/prompt-profiles.js b/prompt-profiles.js index 24a8bf5..2875017 100644 --- a/prompt-profiles.js +++ b/prompt-profiles.js @@ -88,66 +88,66 @@ const BUILTIN_BLOCK_DEFINITIONS = [ { sourceKey: "recentMessages", name: "最近消息", - role: "user", + role: "system", description: "注入最近的对话上下文片段。extract 和 recall 任务使用,提供 LLM 分析所需的对话历史。", }, { sourceKey: "userMessage", name: "用户消息", - role: "user", + role: "system", description: "注入当前用户的最新输入内容。recall 任务使用,用于匹配最相关的记忆节点。", }, { sourceKey: "candidateNodes", name: "候选节点", - role: "user", + role: "system", description: "注入待筛选的候选记忆节点列表。recall(选择相关节点)和 consolidation(检测冲突)任务使用。", }, { sourceKey: "graphStats", name: "图统计", - role: "user", + role: "system", description: "注入图谱当前状态摘要(如节点数量、类型分布)。所有任务类型均可使用,帮助 LLM 了解图谱全貌。", }, { sourceKey: "currentRange", name: "当前范围", - role: "user", + role: "system", description: "注入当前处理的消息楼层范围(如「楼 5 ~ 楼 10」)。extract 和 compress 任务使用。", }, { sourceKey: "nodeContent", name: "节点内容", - role: "user", + role: "system", description: "注入待压缩的节点正文内容。compress 任务专用,包含需要合并总结的多个节点文本。", }, { sourceKey: "eventSummary", name: "事件摘要", - role: "user", + role: "system", description: "注入近期事件时间线摘要。synopsis(生成前情提要)和 reflection(生成反思)任务使用。", }, { sourceKey: "characterSummary", name: "角色摘要", - role: "user", + role: "system", description: "注入近期角色状态变化摘要。synopsis 和 reflection 任务使用,帮助 LLM 了解角色动态。", }, { sourceKey: "threadSummary", name: "主线摘要", - role: "user", + role: "system", description: "注入当前活跃的故事主线摘要。synopsis 和 reflection 任务使用,帮助 LLM 把握叙事走向。", }, { sourceKey: "contradictionSummary", name: "矛盾摘要", - role: "user", + role: "system", description: "注入近期检测到的记忆矛盾或冲突信息。reflection 任务专用,触发基于矛盾的深度反思。", }, ]; -const DEFAULT_TASK_PROFILE_VERSION = 2; +const DEFAULT_TASK_PROFILE_VERSION = 3; const DEFAULT_PROFILE_ID = "default"; const LEGACY_PROMPT_FIELD_MAP = { @@ -419,28 +419,28 @@ const TASK_CONTEXT_BLOCK_BLUEPRINTS = { id: "default-recent-messages", name: "最近消息", type: "builtin", - role: "user", + role: "system", sourceKey: "recentMessages", }, { id: "default-graph-stats", name: "图统计", type: "builtin", - role: "user", + role: "system", sourceKey: "graphStats", }, { id: "default-schema", name: "Schema", type: "builtin", - role: "user", + role: "system", sourceKey: "schema", }, { id: "default-current-range", name: "当前范围", type: "builtin", - role: "user", + role: "system", sourceKey: "currentRange", }, ], @@ -449,28 +449,28 @@ const TASK_CONTEXT_BLOCK_BLUEPRINTS = { id: "default-recent-messages", name: "最近消息", type: "builtin", - role: "user", + role: "system", sourceKey: "recentMessages", }, { id: "default-user-message", name: "用户消息", type: "builtin", - role: "user", + role: "system", sourceKey: "userMessage", }, { id: "default-candidate-nodes", name: "候选节点", type: "builtin", - role: "user", + role: "system", sourceKey: "candidateNodes", }, { id: "default-graph-stats", name: "图统计", type: "builtin", - role: "user", + role: "system", sourceKey: "graphStats", }, ], @@ -479,14 +479,14 @@ const TASK_CONTEXT_BLOCK_BLUEPRINTS = { id: "default-candidate-nodes", name: "候选节点", type: "builtin", - role: "user", + role: "system", sourceKey: "candidateNodes", }, { id: "default-graph-stats", name: "图统计", type: "builtin", - role: "user", + role: "system", sourceKey: "graphStats", }, ], @@ -495,21 +495,21 @@ const TASK_CONTEXT_BLOCK_BLUEPRINTS = { id: "default-node-content", name: "节点内容", type: "builtin", - role: "user", + role: "system", sourceKey: "nodeContent", }, { id: "default-current-range", name: "当前范围", type: "builtin", - role: "user", + role: "system", sourceKey: "currentRange", }, { id: "default-graph-stats", name: "图统计", type: "builtin", - role: "user", + role: "system", sourceKey: "graphStats", }, ], @@ -518,28 +518,28 @@ const TASK_CONTEXT_BLOCK_BLUEPRINTS = { id: "default-event-summary", name: "事件摘要", type: "builtin", - role: "user", + role: "system", sourceKey: "eventSummary", }, { id: "default-character-summary", name: "角色摘要", type: "builtin", - role: "user", + role: "system", sourceKey: "characterSummary", }, { id: "default-thread-summary", name: "主线摘要", type: "builtin", - role: "user", + role: "system", sourceKey: "threadSummary", }, { id: "default-graph-stats", name: "图统计", type: "builtin", - role: "user", + role: "system", sourceKey: "graphStats", }, ], @@ -548,35 +548,35 @@ const TASK_CONTEXT_BLOCK_BLUEPRINTS = { id: "default-event-summary", name: "事件摘要", type: "builtin", - role: "user", + role: "system", sourceKey: "eventSummary", }, { id: "default-character-summary", name: "角色摘要", type: "builtin", - role: "user", + role: "system", sourceKey: "characterSummary", }, { id: "default-thread-summary", name: "主线摘要", type: "builtin", - role: "user", + role: "system", sourceKey: "threadSummary", }, { id: "default-contradiction-summary", name: "矛盾摘要", type: "builtin", - role: "user", + role: "system", sourceKey: "contradictionSummary", }, { id: "default-graph-stats", name: "图统计", type: "builtin", - role: "user", + role: "system", sourceKey: "graphStats", }, ], @@ -587,14 +587,14 @@ const DEFAULT_TRAILING_BLOCK_BLUEPRINTS = [ id: "default-format", name: "输出格式", type: "custom", - role: "system", + role: "user", contentKey: "format", }, { id: "default-rules", name: "行为规则", type: "custom", - role: "system", + role: "user", contentKey: "rules", }, ]; @@ -768,10 +768,7 @@ function mergeDefaultTaskProfileBlocks(taskType, existingBlocks = []) { ? existing.name : canonicalBlock.name, type: canonicalBlock.type, - role: - typeof existing.role === "string" && existing.role - ? existing.role - : canonicalBlock.role, + role: canonicalBlock.role, sourceKey: canonicalBlock.sourceKey || "", content: canonicalBlock.type === "custom" diff --git a/tests/default-settings.mjs b/tests/default-settings.mjs index f899a6c..1db5d3b 100644 --- a/tests/default-settings.mjs +++ b/tests/default-settings.mjs @@ -45,7 +45,7 @@ assert.equal(defaultSettings.recallDiffusionTopK, 100); assert.equal(defaultSettings.recallLlmCandidatePool, 30); assert.equal(defaultSettings.recallLlmContextMessages, 4); assert.equal(defaultSettings.injectDepth, 9999); -assert.equal(defaultSettings.taskProfilesVersion, 2); +assert.equal(defaultSettings.taskProfilesVersion, 3); assert.ok(defaultSettings.taskProfiles); assert.ok(defaultSettings.taskProfiles.extract); assert.ok(defaultSettings.taskProfiles.recall); diff --git a/tests/prompt-builder-defaults.mjs b/tests/prompt-builder-defaults.mjs index 5072e2c..7c3a3e6 100644 --- a/tests/prompt-builder-defaults.mjs +++ b/tests/prompt-builder-defaults.mjs @@ -36,7 +36,7 @@ const { buildTaskLlmPayload, buildTaskPrompt } = await import("../prompt-builder const { createDefaultTaskProfiles } = await import("../prompt-profiles.js"); const settings = { - taskProfilesVersion: 2, + taskProfilesVersion: 3, taskProfiles: createDefaultTaskProfiles(), }; @@ -51,6 +51,16 @@ const extractPromptBuild = await buildTaskPrompt(settings, "extract", { }); const extractPayload = buildTaskLlmPayload(extractPromptBuild, "fallback-user"); 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( extractPayload.promptMessages .map((message) => message.sourceKey) @@ -76,6 +86,10 @@ const recallPromptBuild = await buildTaskPrompt(settings, "recall", { }); const recallPayload = buildTaskLlmPayload(recallPromptBuild, "fallback-user"); assert.equal(recallPayload.userPrompt, ""); +assert.equal( + recallPayload.promptMessages.filter((message) => message.role === "user").length, + 2, +); assert.deepEqual( recallPayload.promptMessages .map((message) => message.sourceKey) diff --git a/tests/task-profile-migration.mjs b/tests/task-profile-migration.mjs index 3ebbc83..455ad9b 100644 --- a/tests/task-profile-migration.mjs +++ b/tests/task-profile-migration.mjs @@ -15,7 +15,7 @@ const legacySettings = { }; const migrated = migrateLegacyTaskProfiles(legacySettings); -assert.equal(migrated.taskProfilesVersion, 2); +assert.equal(migrated.taskProfilesVersion, 3); assert.ok(migrated.taskProfiles); assert.ok(migrated.taskProfiles.extract); assert.ok(migrated.taskProfiles.recall); @@ -71,12 +71,12 @@ assert.deepEqual( "system", "system", "system", - "user", - "user", - "user", - "user", "system", "system", + "system", + "system", + "user", + "user", ], ); assert.equal( @@ -207,11 +207,18 @@ assert.equal(upgradedLegacyDefault.blocks.length, 11); assert.equal(upgradedLegacyDefault.blocks[0].content, "保留我自己的角色定义"); assert.equal(upgradedLegacyDefault.blocks[9].content, "保留我自己的输出格式"); assert.equal(upgradedLegacyDefault.blocks[10].content, "保留我自己的行为规则"); +assert.equal(upgradedLegacyDefault.blocks[9].role, "user"); +assert.equal(upgradedLegacyDefault.blocks[10].role, "user"); assert.deepEqual( upgradedLegacyDefault.blocks .slice(5, 9) .map((block) => block.sourceKey), ["recentMessages", "graphStats", "schema", "currentRange"], ); +assert.ok( + upgradedLegacyDefault.blocks + .slice(1, 9) + .every((block) => block.role === "system"), +); console.log("task-profile-migration tests passed"); diff --git a/tests/task-profile-storage.mjs b/tests/task-profile-storage.mjs index cf29dad..8e5d69a 100644 --- a/tests/task-profile-storage.mjs +++ b/tests/task-profile-storage.mjs @@ -60,6 +60,7 @@ const customBlock = activeProfile.blocks.find( ); assert.ok(builtinBlock); assert.equal(builtinBlock.injectionMode, "prepend"); +assert.equal(builtinBlock.role, "system"); assert.ok(customBlock); assert.equal(customBlock.role, "user"); assert.equal(activeProfile.regex.localRules.length, 1);