fix: prompt 配置默认显示实际的内置 prompt 文本

- 添加 DEFAULT_PROMPTS 常量包含全部 6 个默认 prompt
- textarea 留空时自动填充默认文本
- 用户可直接看到并修改当前使用的 prompt
This commit is contained in:
Youzini-afk
2026-03-24 17:26:36 +08:00
parent 58304e7253
commit f3936b2d0a

109
panel.js
View File

@@ -8,11 +8,108 @@ import {
getVectorIndexStats,
} from "./vector-index.js";
// ==================== 默认 Prompt 文本 ====================
// 这些文本会显示在配置页中,供用户查看和修改
const DEFAULT_PROMPTS = {
extract: [
"你是一个记忆提取分析器。从对话中提取结构化记忆节点并存入知识图谱。",
"",
"输出格式为严格 JSON",
"{",
' "thought": "你对本段对话的分析(事件/角色变化/新信息)",',
' "operations": [',
" {",
' "action": "create",',
' "type": "event",',
' "fields": {"summary": "...", "participants": "...", "status": "ongoing"},',
' "importance": 6,',
' "ref": "evt1",',
' "links": [',
' {"targetNodeId": "existing-id", "relation": "involved_in", "strength": 0.9}',
" ]",
" },",
" {",
' "action": "update",',
' "nodeId": "existing-node-id",',
' "fields": {"state": "新的状态"}',
" }",
" ]",
"}",
"",
"规则:",
"- 每批对话最多创建 1 个事件节点,多个子事件合并为一条",
"- 角色/地点节点:如果图中已有同名节点,用 update 而非 create",
"- 不要虚构内容,只提取对话中有证据支持的信息",
"- importance 范围 1-10普通事件 5关键转折 8+",
"- summary 应该是摘要抽象,不要复制原文",
].join("\n"),
recall: [
"你是一个记忆召回分析器。",
"根据用户最新输入和对话上下文,从候选记忆节点中选择最相关的节点。",
"优先选择:(1) 直接相关的当前场景节点, (2) 因果关系连续性节点, (3) 有潜在影响的背景节点。",
"输出严格的 JSON 格式:",
'{"selected_ids": ["id1", "id2", ...], "reason": "简要说明选择理由"}',
].join("\n"),
evolution: [
"你是一个记忆进化分析器。当新的记忆加入知识图谱时,你需要分析它与现有记忆的关系。",
"",
"你的任务:",
"1. 判断新记忆是否揭示了与旧记忆相关的新信息",
"2. 如果是,决定如何更新旧记忆的描述和分类",
"3. 建立新旧记忆之间的有意义连接",
"",
"输出严格 JSON",
"{",
' "should_evolve": true/false,',
' "reason": "进化理由",',
' "suggested_connections": ["旧记忆ID"],',
' "neighbor_updates": [',
' {"nodeId": "旧节点ID", "newContext": "修正描述", "newTags": ["标签"]}',
" ]",
"}",
"",
"进化规则:",
"- 仅当新信息确实改变了对旧记忆的理解时才触发进化",
"- 例如:揭露卧底身份 → 修正该角色之前事件中的动机描述",
"- 不要对无关记忆强行建立联系",
].join("\n"),
compress: [
"你是一个记忆压缩器。将多个同类型节点总结为一条更高层级的压缩节点。",
"",
"输出格式为严格 JSON",
'{"fields": {"summary": "...", ...}}',
"",
"规则:",
"- 保留关键信息:因果关系、不可逆结果、未解决伏笔",
"- 去除重复和低信息密度内容",
"- 压缩后文本应精炼,目标 150 字左右",
].join("\n"),
synopsis: [
"你是故事概要生成器。根据事件线、角色和主线生成简洁的前情提要。",
'输出 JSON{"summary": "前情提要文本200字以内"}',
"要求:涵盖核心冲突、关键转折、主要角色当前状态。",
].join("\n"),
reflection: [
"你是 RP 长期记忆系统的反思生成器。",
'输出严格 JSON{"insight":"...","trigger":"...","suggestion":"...","importance":1-10}',
"insight 应总结最近情节中最值得长期保留的变化、关系趋势或潜在线索。",
"trigger 说明触发这条反思的关键事件或矛盾。",
"suggestion 给出后续检索或叙事上值得关注的提示。",
"不要复述全部事件,要提炼高层结论。",
].join("\n"),
};
let panelEl = null;
let overlayEl = null;
let graphRenderer = null;
let mobileGraphRenderer = null;
// 由 index.js 注入的引用
let _getGraph = null;
let _getSettings = null;
@@ -530,12 +627,12 @@ function _refreshConfigTab() {
settings.embeddingAutoSuffix !== false,
);
_setInputValue("bme-setting-extract-prompt", settings.extractPrompt || "");
_setInputValue("bme-setting-recall-prompt", settings.recallPrompt || "");
_setInputValue("bme-setting-evolution-prompt", settings.evolutionPrompt || "");
_setInputValue("bme-setting-compress-prompt", settings.compressPrompt || "");
_setInputValue("bme-setting-synopsis-prompt", settings.synopsisPrompt || "");
_setInputValue("bme-setting-reflection-prompt", settings.reflectionPrompt || "");
_setInputValue("bme-setting-extract-prompt", settings.extractPrompt || DEFAULT_PROMPTS.extract);
_setInputValue("bme-setting-recall-prompt", settings.recallPrompt || DEFAULT_PROMPTS.recall);
_setInputValue("bme-setting-evolution-prompt", settings.evolutionPrompt || DEFAULT_PROMPTS.evolution);
_setInputValue("bme-setting-compress-prompt", settings.compressPrompt || DEFAULT_PROMPTS.compress);
_setInputValue("bme-setting-synopsis-prompt", settings.synopsisPrompt || DEFAULT_PROMPTS.synopsis);
_setInputValue("bme-setting-reflection-prompt", settings.reflectionPrompt || DEFAULT_PROMPTS.reflection);
_setInputValue("bme-setting-panel-theme", settings.panelTheme || "crimson");
}