feat: Agent 记忆系统替代预设功能,全功能协调运作
核心改造: - 取消 Agent 预设(保留兼容),新增 AI Agent 记忆系统 - 自动提取 → 存储 → 检索 → 注入上下文的完整记忆闭环 - 记忆类型:事实/偏好/规则/事件,支持重要性评分和标签 新增文件: - services/memory-manager.ts: 记忆管理核心 - 关键词+标签+重要性加权检索 - 会话结束自动提取(LLM 驱动) - 去重检测、使用频率追踪 - components/memory-panel.ts: 记忆管理面板 UI 修改文件: - types.d.ts: 新增 MemoryEntry/MemorySearchResult 类型 - db/chat-db.ts: 升级 v2,新增 memories 存储 - input-area.ts: 对话流集成记忆检索+自动提取 - agent-engine.ts: Agent Loop 注入记忆上下文 - settings-modal.ts: 记忆开关设置 - main.ts: 记忆系统初始化 - index.html: 记忆设置面板 HTML - style.css: 记忆面板完整样式 功能协调: - 对话流: 记忆检索 → RAG 检索 → 系统提示词组合 → 流式对话 - Agent Loop: 记忆检索 → 系统提示词注入 → 工具调用循环 - 会话结束: 自动提取关键信息 → 存入记忆库 - 跨会话: 记忆持久化 IndexedDB,新对话自动召回相关记忆
This commit is contained in:
@@ -14,6 +14,7 @@ import { isRagEnabled, performRagRetrieval } from './kb-modal.js';
|
||||
import { ChatDB } from '../db/chat-db.js';
|
||||
import { OllamaAPI } from '../api/ollama.js';
|
||||
import { runAgentLoop } from '../services/agent-engine.js';
|
||||
import { searchMemories, buildMemoryContext, markMemoryUsed, extractMemoriesFromConversation, isMemoryEnabled } from '../services/memory-manager.js';
|
||||
import { showToolConfirm } from './tool-confirm-modal.js';
|
||||
import type { ChatSession, ChatMessage, OllamaStreamChunk, RagSource, FileContent, ChatFile, ToolCallRecord } from '../types.js';
|
||||
|
||||
@@ -349,6 +350,24 @@ export async function sendMessage(): Promise<void> {
|
||||
if (systemPromptEnabled && systemPrompt) chatParams.system = systemPrompt;
|
||||
if (numCtx) chatParams.options = { num_ctx: numCtx, temperature };
|
||||
|
||||
// ── Agent 记忆注入 ──
|
||||
if (isMemoryEnabled()) {
|
||||
const userMessage = text || (msgsToAdd.find(m => m.role === 'user')?.content || '');
|
||||
if (userMessage) {
|
||||
const relevantMemories = searchMemories(userMessage, 6);
|
||||
if (relevantMemories.length > 0) {
|
||||
const memoryContext = buildMemoryContext(relevantMemories);
|
||||
chatParams.system = chatParams.system
|
||||
? (chatParams.system as string) + '\n\n' + memoryContext
|
||||
: memoryContext;
|
||||
for (const m of relevantMemories) {
|
||||
await markMemoryUsed(m.id);
|
||||
}
|
||||
appendSystemMessage(`🧠 已注入 ${relevantMemories.length} 条相关记忆`, 'memory-status');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let ragSources: RagSource[] | null = null;
|
||||
|
||||
if (isRagEnabled()) {
|
||||
@@ -454,8 +473,22 @@ export async function sendMessage(): Promise<void> {
|
||||
}
|
||||
|
||||
await saveCurrentSession();
|
||||
|
||||
// ── 自动提取记忆(非阻塞)──
|
||||
if (isMemoryEnabled() && freshSession.messages.length >= 6) {
|
||||
const currentSession2 = state.get<ChatSession | null>(KEYS.CURRENT_SESSION);
|
||||
if (currentSession2) {
|
||||
extractMemoriesFromConversation(
|
||||
currentSession2.messages.map(m => ({ role: m.role, content: m.content })),
|
||||
currentSession2.title
|
||||
).then(count => {
|
||||
if (count > 0) {
|
||||
console.log(`[Memory] 自动提取了 ${count} 条记忆`);
|
||||
}
|
||||
}).catch(err => console.warn('[Memory] 提取失败:', err));
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('[InputArea] 流式聊天错误:', err);
|
||||
document.querySelectorAll('.rag-status').forEach(el => el.remove());
|
||||
|
||||
if ((err as Error).name === 'AbortError') {
|
||||
|
||||
Reference in New Issue
Block a user