Angelus Memory Graph 是 luna-agent-base 的正式 alpha 核心记忆子系统,负责为 agent 提供长期对话历史管理、关键记忆提取、上下文压缩与记忆使用追踪。
负责:
- Episode history graph — 将对话轮次记录为 DAG 节点;
- Context selection — 每轮 agent 调用前选择需注入 prompt 的历史节点;
- Context packing — 将旧上下文压缩为 summary node;
- Pinned memory — 提取不可压缩的关键记忆(公式、约束、接口定义、用户偏好);
- Memory retrieval — 根据当前输入检索相关记忆;
- Memory usage trace — 记录本轮注入的记忆、agent 声称使用的记忆、runtime 验证结果。
不负责:
- 执行图调度、tool 权限、agent 创建/删除、swarm 加载、graph_editor_tool 的动态图修改 —— 这些仍由 luna-agent-base 现有 runtime 处理。
core/memory/
├── __init__.py
├── types.py # EpisodeNode, KeyMemory, MemoryContextPlan, MemoryUsageTrace
├── episode_graph.py # DAG episode 图与压缩
├── memory_store.py # KeyMemory 存储与 canonical 去重
├── planner.py # LLM 驱动的上下文决策
├── context_builder.py # 按分区构造 prompt
├── lifecycle.py # 记忆生命周期规则
├── usage_trace.py # 使用追踪与验证
└── runtime.py # AgentMemoryRuntime orchestration
node_id,user_content,assistant_contentparent_ids,child_idsis_summary,summarizes,summarized_byactive,archived,created_at,metadata
memory_id,content,kindkind可选值:fact,formula,constraint,preference,api_contract,project_goal,timeline_constraint,decision,warning
tags,source_node_ids,pinned,packable,statusstatus可选值:candidate,committed,rejected
created_turn_id,canonical_key,confidence,metadata
selected_node_ids,selected_memory_idspack_triggers,compressed_node_ids,summary_node_idsmemory_queries,prompt_messages,token_estimate,reasoning
injected_memory_ids,declared_used_memory_ids,verified_used_memory_idsinvalid_memory_refs,unused_injected_memory_ids,verification_notes
- 当前轮提取的新记忆只能进入
candidate状态; candidatememory 不允许注入当前轮 prompt;- 回答完成后,runtime 校验 candidate memory;
- 校验通过后变为
committed; - 只有
committed且created_turn_id早于当前轮的 memory,才能被注入 prompt; pinnedmemory 不允许被 summary packing 改写;formula/constraint/api_contract默认pinned=True, packable=False;- 普通
fact/decision/timeline_constraint默认可以不 pinned,但timeline_constraint应在 prompt 中作为约束类记忆单独展示。
压缩后状态:
pack_triggers: 触发压缩的节点;compressed_nodes: 实际被压缩的节点;summary_nodes: 新生成的摘要节点。
压缩后原始节点不删除,而是 active=False, archived=True,并在 summarized_by 中记录摘要节点 id。活跃图使用摘要节点接续后续对话,归档图仍可追溯原始节点。
最终状态打印区分:
- 【Active Graph 活跃图】
- 【Archived Graph 已归档节点】
- 【Pinned Memory 永久记忆】
- 【All Memory 全部记忆】
构建 prompt 时区分不同类型记忆:
【Pinned Memory / 精确保留记忆】
- [M0] ...
【Timeline Constraints / 时间线约束】
- [M2] ...
【Semantic Memory / 语义记忆】
- [M4] ...
【Packed History / 压缩历史】
- [S6] ...
【Recent Turns / 最近对话】
User: ...
Assistant: ...
在 Agent.round_call 中加入 AgentMemoryRuntime hook:
before_round:检索 committed memories,构建 prompt context,决定是否压缩旧上下文,返回MemoryContextPlan。after_round:写入 episode node,提取 candidate memories,校验并 commit,写入 usage trace。
config.toml:
[app.memory_graph]
enabled = true
max_context_nodes = 6
pack_keep_recent = 2
enable_usage_trace = true
enable_candidate_memory = true新增模块默认可关闭,不破坏现有行为。
初期使用 JSON 文件持久化:
agents/<swarm_name>/runtime_info/memory/
├── episode_graph.json
├── memories.json
├── memory_events.jsonl
└── usage_traces.jsonl
后续可接入 ContentStore 适配器。
新增测试覆盖:
test_episode_graph_compression.py— 压缩后 summary node、archived 状态、active pathtest_pinned_memory.py— pinned 默认、canonical 去重test_memory_lifecycle.py— candidate 不可注入、commit 后可用test_context_builder.py— prompt 分区test_usage_trace.py— 注入记录、invalid 声明、candidate 使用判 invalid
本模块基于参考实现 memory_graph 重构而来,已整合进 luna-agent-base 的现有 agent runtime、FastAPI、run session、runtime_info 和 ContentStore 架构。