Source Bundle

全局证据页

总览和横向对照的原始 docs 内容。

证据页
怎么用这页
  • 左上角是文档名,下面是带行号的原始内容。
  • 学习页里的源码锚点会跳到这里的具体行号。
Docs

原始文档与行号

这些内容直接来自当前仓库的 docs/。

00-总览.md
`repos/` Agent Context / Memory 源码分析总览
1
# `repos/` Agent Context / Memory 源码分析总览
2
3
## 1. 分析范围
4
5
本目录覆盖 `E:\Agents\agent-memory\repos` 下 6 个仓库:
6
7
- `claude code`
8
- `codex`
9
- `hermes-agent`
10
- `langmem`
11
- `letta`
12
- `mem0`
13
14
目标不是复述项目说明,而是基于源码、测试、配置、migration、运行时路径解析逻辑,分析这些项目的:
15
16
- `context` 组装方式
17
- `summary / compaction` 机制
18
- `history` 与 `session/thread` 持久化
19
- `short-term memory` 与 `long-term memory`
20
- `检索路径`
21
- `state` / 存储后端
22
- 多 agent / 多线程 / 多 session 关系
23
24
## 2. 阅读方法
25
26
### 2.1 术语约定
27
28
- `context`:某一轮真正送进模型、或即将送进模型的可见上下文。
29
- `history`:消息历史、turn 历史、命令历史、thread transcript 等历史记录容器。
30
- `summary / compaction`:为缩短上下文窗口而进行的摘要、裁剪、压缩、窗口重写。
31
- `short-term memory`:面向当前 session/thread 的近程记忆,例如运行中缓存、当前会话摘要、最近消息窗口。
32
- `long-term memory`:跨 session/thread 持续存在、可被重新召回的记忆。
33
- `state`:除消息正文外的持久化运行时状态,例如 SQLite 元数据、线程表、job 表、路径布局、memory root。
34
35
### 2.2 证据原则
36
37
- 结论只以源码和测试为准。
38
- 如果某个行为主要由测试揭示,文档中会明确标成“测试验证到的行为”。
39
- 每份专题文档的每一节末尾都附有 `源码锚点`,用于回到实现位置核对。
40
41
## 3. 仓库分类
42
43
### 3.1 终端型 / 交互式 Agent Runtime
44
45
- [claude code](./claude%20code.md)
46
- [codex](./codex.md)
47
- [hermes-agent](./hermes-agent.md)
48
49
这三类项目都不是单一 memory 库,而是完整 agent runtime。阅读时要优先区分:
50
51
- 模型可见 `context`
52
- `history` / transcript
53
- 运行时 `state`
54
- 可跨会话复用的 memory
55
56
### 3.2 Memory / Context 工具库
57
58
- [langmem](./langmem.md)
59
- [mem0](./mem0.md)
60
61
这两类项目更像“可嵌入的 memory 能力层”:
62
63
- `langmem` 偏 `LangGraph/BaseStore` 场景,关注摘要节点、memory 抽取器、工具封装、命名空间与后台反射。
64
- `mem0` 偏“抽取式长期记忆”,关注向量库、SQLite 历史、实体链接、混合检索与 procedural memory。
65
66
### 3.3 Agent 平台 / 服务器型系统
67
68
- [letta](./letta.md)
69
70
`letta` 同时包含:
71
72
- block/core memory
73
- 会话与消息 ORM
74
- archive/passage 长期记忆
75
- 可选 git-backed memory
76
77
因此它既有 runtime,又有平台化持久层。
78
79
## 4. 文档树
80
81
```text
82
docs/
83
├─ 00-总览.md
84
├─ 01-横向对照.md
85
├─ claude code.md
86
├─ claude code/
87
│ ├─ 01-架构与范围.md
88
│ ├─ 02-context管理.md
89
│ ├─ 03-memory实现.md
90
│ ├─ 04-存储与状态.md
91
│ └─ 05-调用链、压缩与边界.md
92
├─ codex.md
93
├─ codex/
94
│ ├─ 01-架构与范围.md
95
│ ├─ 02-context管理.md
96
│ ├─ 03-memory实现.md
97
│ ├─ 04-存储与状态.md
98
│ └─ 05-调用链、压缩与边界.md
99
├─ hermes-agent.md
100
├─ hermes-agent/
101
│ ├─ 01-架构与范围.md
102
│ ├─ 02-context管理.md
103
│ ├─ 03-memory实现.md
104
│ ├─ 04-存储与状态.md
105
│ └─ 05-调用链、压缩与边界.md
106
├─ langmem.md
107
├─ langmem/
108
│ ├─ 01-架构与范围.md
109
│ ├─ 02-context管理.md
110
│ ├─ 03-memory实现.md
111
│ ├─ 04-存储与状态.md
112
│ └─ 05-调用链、压缩与边界.md
113
├─ letta.md
114
├─ letta/
115
│ ├─ 01-架构与范围.md
116
│ ├─ 02-context管理.md
117
│ ├─ 03-memory实现.md
118
│ ├─ 04-存储与状态.md
119
│ └─ 05-调用链、压缩与边界.md
120
├─ mem0.md
121
└─ mem0/
122
├─ 01-架构与范围.md
123
├─ 02-context管理.md
124
├─ 03-memory实现.md
125
├─ 04-存储与状态.md
126
└─ 05-调用链、压缩与边界.md
127
```
128
129
## 5. 推荐阅读顺序
130
131
### 5.1 先看横向共性
132
133
先读 [01-横向对照.md](./01-横向对照.md),建立下面几个问题的统一框架:
134
135
- 谁在组装模型可见 context
136
- 谁在维护历史
137
- 谁在做 compaction / summary
138
- 谁在保存 long-term memory
139
- 谁负责检索和召回
140
- 数据到底落在哪
141
142
### 5.2 再按类型深入
143
144
如果想看完整 agent runtime:
145
146
1. [claude code](./claude%20code.md)
147
2. [codex](./codex.md)
148
3. [hermes-agent](./hermes-agent.md)
149
150
如果想看 memory 能力库:
151
152
1. [langmem](./langmem.md)
153
2. [mem0](./mem0.md)
154
155
如果想看平台型实现:
156
157
1. [letta](./letta.md)
158
159
## 6. 快速索引
160
161
- `claude code`:`context.ts`、`utils/claudemd.ts`、`memdir/*`、`services/SessionMemory/*`
162
- `codex`:`codex-rs/core/src/codex.rs`、`context_manager/*`、`memories/*`、`state/*`
163
- `hermes-agent`:`run_agent.py`、`agent/*`、`plugins/memory/*`、`hermes_state.py`
164
- `langmem`:`short_term/summarization.py`、`knowledge/extraction.py`、`knowledge/tools.py`、`reflection.py`
165
- `letta`:`schemas/*`、`prompt_generator.py`、`services/*manager.py`、`context_window_calculator/*`
166
- `mem0`:`mem0/memory/main.py`、`storage.py`、`utils.py`、`configs/prompts.py`
167
168
## 7. 交叉阅读提示
169
170
- `claude code` 与 `codex` 都同时存在 `context`、`history`、`compaction` 和单独的 memory 管线,但设计边界不同。
171
- `hermes-agent` 与 `letta` 都有“多条并行 memory 路径”,前者偏插件 provider,后者偏平台内建模型。
172
- `langmem` 与 `mem0` 都是 memory 能力层,但 `langmem` 偏工作流节点与 store namespace,`mem0` 偏抽取、去重、检索与存储。
173
01-横向对照.md
6 个仓库的横向对照
1
# 6 个仓库的横向对照
2
3
## 1. 对照维度
4
5
本文统一按以下维度对照:
6
7
- `context 组装`
8
- `压缩 / 摘要`
9
- `短期历史`
10
- `长期 memory`
11
- `检索路径`
12
- `存储后端`
13
- `多 agent / 线程关系`
14
15
详细证据与源码锚点都下沉在各仓库专题文档中,这里只给结论级对照。
16
17
## 2. 总表
18
19
| 仓库 | context 组装 | 压缩 / 摘要 | 短期历史 | 长期 memory | 检索路径 | 存储后端 | 多 agent / 线程关系 |
20
| --- | --- | --- | --- | --- | --- | --- | --- |
21
| `claude code` | `context.ts` + dynamic system prompt sections + memory files 注入 | `/compact`、`microcompact`、`SessionMemory` 摘要与 compaction | transcript、命令 history、compact boundary 后消息视图 | `memdir` 文件型 memory + `SessionMemory/summary.md` | `/context` 分析视图、memory files 加载、远端 session history | 项目目录 transcript、`~/.claude/projects/.../memory/`、session-memory 目录 | 存在 subagents 目录与远端 session history,但 memory 主要按 session/project 组织 |
22
| `codex` | `build_initial_context()` + `build_settings_update_items()` + `ContextManager` | auto-compact、remote compact、window generation 重建 | `ContextManager` 历史、`history.jsonl`、thread rollout truncation | `core/memories` phase1/phase2 pipeline + `memory_summary.md` | startup memory jobs、phase2 selection、memory tool 读 summary | SQLite `state_5.sqlite` / `logs_2.sqlite` + `codex_home/memories/` + `history.jsonl` | thread、subagent、spawn edges 都进 state DB,memory 以 thread 为候选单位 |
23
| `hermes-agent` | `prompt_builder.py` + `run_agent.py` + provider system block | `ContextCompressor` + tool output slimming + summary fallback | `state.db` transcript、gateway JSONL/SQLite 双写 | 内建 `MEMORY.md/USER.md` + 外部 provider 插件 | `session_search`、provider prefetch、provider recall/search | SQLite `state.db`、本地 memory 文件、各 provider 自有后端/配置文件 | session、gateway、provider、subagent 路径并存,但以 session 为主轴 |
24
| `langmem` | `summarize_messages` / `SummarizationNode` + runtime namespace | 短期摘要节点,把旧消息压成 running summary | 运行中 messages + `RunningSummary` 状态 | `MemoryManager` / `MemoryStoreManager` 写 `BaseStore` | `create_memory_searcher()`、`search_memory` 工具、dilated windows | 注入式 `BaseStore`,namespace 由 runtime config 决定 | 不是完整 agent,更多是 graph/store 级 workflow 组合 |
25
| `letta` | `PromptGenerator` 用 `Memory.compile()` + metadata 组 system prompt | `Summarizer` 的静态缓冲和部分驱逐摘要 | `MessageManager` + `ConversationManager` + `conversation_messages` 顺序表 | core blocks memory + archive/passage + 可选 git-backed memory | message search、archival memory search、archive/passage 检索 | SQL ORM、可选 TPUF、可选 memfs/git repo + Postgres cache | conversation、group、multi-agent、git-backed memory 路径并存 |
26
| `mem0` | 抽取 prompt 只拼最近消息窗口 + 已有 memories | 无通用 conversation compaction;procedural memory 走摘要式生成 | SQLite 最近消息窗口、history 表 | 向量库存 memory、本地/远端 embedder、entity store、procedural memory | 语义检索 + keyword + BM25 + entity boost + rerank | 向量库 + SQLite `history/messages` + entity collection | 主要按 `user_id/agent_id/run_id -> session_scope` 组织,不是 thread runtime |
27
28
## 3. 按维度看差异
29
30
### 3.1 `context` 谁来组装
31
32
- `claude code`:更偏“会话级缓存 + 文件注入”,`memdir` 与 `claudemd` 进入 prompt。
33
- `codex`:更偏“turn 级差分注入”,首次全量、之后增量。
34
- `hermes-agent`:更偏“prompt builder + provider hook”。
35
- `langmem`:更偏“工作流节点”,上下文本身就是 graph state。
36
- `letta`:更偏“Memory.compile() -> PromptGenerator -> ContextWindowCalculator”。
37
- `mem0`:更偏“为 memory 抽取服务的 prompt 上下文”,不是完整对话 runtime。
38
39
### 3.2 `summary / compaction` 谁负责
40
41
- `claude code`:压缩同时影响用户上下文缓存、session memory、消息视图。
42
- `codex`:压缩直接重写历史和 window generation。
43
- `hermes-agent`:压缩是核心能力,带 tool output 瘦身和 summary fallback。
44
- `langmem`:摘要就是产品能力本身。
45
- `letta`:摘要器负责驱逐旧消息时生成 summary message。
46
- `mem0`:没有统一的对话压缩主线,重点在抽取式记忆生成。
47
48
### 3.3 `history` 和 `memory` 是否分离
49
50
- 明显分离:`claude code`、`codex`、`hermes-agent`
51
- 半分离但同平台管理:`letta`
52
- 以 store 为主、history 不是第一对象:`langmem`
53
- SQLite history 主要服务抽取,不等于 long-term memory:`mem0`
54
55
### 3.4 `long-term memory` 的落点
56
57
- 文件目录:`claude code`
58
- SQLite state + 文件同步:`codex`
59
- 本地文件 + provider backend:`hermes-agent`
60
- `BaseStore` namespace:`langmem`
61
- blocks/archive/git repo:`letta`
62
- 向量库 + entity store:`mem0`
63
64
### 3.5 多 agent / 多线程关系
65
66
- `codex` 与 `letta` 的线程/会话/子 agent 关系最结构化。
67
- `claude code` 与 `hermes-agent` 有多 agent 能力,但 memory 仍主要围绕 session/project。
68
- `langmem` 和 `mem0` 更像被别的 agent runtime 调用的能力层。
69
70
## 4. 阅读建议
71
72
- 如果你关心“终端 agent 怎样做 context 差分和压缩”,优先看 `codex` 与 `claude code`。
73
- 如果你关心“插件式外接 memory provider”,优先看 `hermes-agent`。
74
- 如果你关心“平台如何统一消息、block memory、archive 与 git-backed memory”,优先看 `letta`。
75
- 如果你关心“怎么把 memory 能力嵌到自己的 agent/workflow 里”,优先看 `langmem` 与 `mem0`。
76
77
## 5. 对照入口
78
79
- [claude code](./claude%20code.md)
80
- [codex](./codex.md)
81
- [hermes-agent](./hermes-agent.md)
82
- [langmem](./langmem.md)
83
- [letta](./letta.md)
84
- [mem0](./mem0.md)
85