feat: iframe 支持外部链接渲染 + 剧情总结 Prompt 自定义 + 记忆包导入导出
[外挂卡片支持外链加载]
- 代码块直接写一个 URL 链接(或注释 <!-- xb-src: URL -->),小白盒会自动抓取并渲染成卡片
- 支持抓取失败自动降级为普通 iframe 直接显示
- 外链内容同样支持 {{xbgetvar::变量名}} 宏注入
[剧情总结 Prompt 全面开放自定义]
- 总结面板设置页新增 10 项 Prompt 编辑框,留空即使用默认值
- 包括:系统提示词、各段助手提示词、记忆注入模板等全部可改
- 记忆注入模板支持 {} 占位符替换成实际记忆内容
[剧情总结记忆包导入/导出]
- 新增「复制记忆包」按钮,一键把当前聊天的全部总结数据复制到剪贴板
- 新增「导入记忆包」按钮,把从别处复制来的记忆包 JSON 粘贴进来即可覆盖生效
- 方便跨设备、跨聊天迁移总结状态
This commit is contained in:
@@ -15,7 +15,7 @@
|
||||
import { getContext } from "../../../../../../extensions.js";
|
||||
import { xbLog } from "../../../core/debug-core.js";
|
||||
import { getSummaryStore, getFacts, isRelationFact } from "../data/store.js";
|
||||
import { getVectorConfig, getSummaryPanelConfig, getSettings } from "../data/config.js";
|
||||
import { getVectorConfig, getSummaryPanelConfig, getSettings, DEFAULT_MEMORY_PROMPT_TEMPLATE } from "../data/config.js";
|
||||
import { recallMemory } from "../vector/retrieval/recall.js";
|
||||
import { getMeta } from "../vector/storage/chunk-store.js";
|
||||
import { getStateAtoms } from "../vector/storage/state-store.js";
|
||||
@@ -208,27 +208,15 @@ function renumberEventText(text, newIndex) {
|
||||
* 构建系统前导文本
|
||||
* @returns {string} 前导文本
|
||||
*/
|
||||
function buildSystemPreamble() {
|
||||
return [
|
||||
"以上是还留在眼前的对话",
|
||||
"以下是脑海里的记忆:",
|
||||
"• [定了的事] 这些是不会变的",
|
||||
"• [其他人的事] 别人的经历,当前角色可能不知晓",
|
||||
"• 其余部分是过往经历的回忆碎片",
|
||||
"",
|
||||
"请内化这些记忆:",
|
||||
].join("\n");
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建后缀文本
|
||||
* @returns {string} 后缀文本
|
||||
*/
|
||||
function buildPostscript() {
|
||||
return [
|
||||
"",
|
||||
"这些记忆是真实的,请自然地记住它们。",
|
||||
].join("\n");
|
||||
function buildMemoryPromptText(memoryBody) {
|
||||
const templateRaw = String(
|
||||
getSummaryPanelConfig()?.prompts?.memoryTemplate || DEFAULT_MEMORY_PROMPT_TEMPLATE
|
||||
);
|
||||
const template = templateRaw.trim() || DEFAULT_MEMORY_PROMPT_TEMPLATE;
|
||||
if (template.includes("{$剧情记忆}")) {
|
||||
return template.replaceAll("{$剧情记忆}", memoryBody);
|
||||
}
|
||||
return `${template}\n${memoryBody}`;
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
@@ -1294,10 +1282,8 @@ async function buildVectorPrompt(store, recallResult, causalById, focusCharacter
|
||||
return { promptText: "", injectionStats, metrics };
|
||||
}
|
||||
|
||||
const promptText =
|
||||
`${buildSystemPreamble()}\n` +
|
||||
`<剧情记忆>\n\n${sections.join("\n\n")}\n\n</剧情记忆>\n` +
|
||||
`${buildPostscript()}`;
|
||||
const memoryBody = `<剧情记忆>\n\n${sections.join("\n\n")}\n\n</剧情记忆>`;
|
||||
const promptText = buildMemoryPromptText(memoryBody);
|
||||
|
||||
if (metrics) {
|
||||
metrics.formatting.sectionsIncluded = [];
|
||||
|
||||
Reference in New Issue
Block a user