跨 harness 对比:记忆与上下文管理
这一维度把三件本来独立的事塞进了同一个话题下,理解它们的边界是读懂全部 61 个 harness 的前提:
- 上下文压缩(context compaction)——单次会话内,历史撑满模型窗口时怎么办。这是最普及、也最卷的一层,几乎每个成熟 harness 都有自己的答案。
- 长期/跨会话记忆(long-term memory)——会话结束后,什么东西被记住、下次怎么取回。这一层分化最剧烈:从”根本没有”到”pgvector 向量库 + 自编辑记忆块”跨度极大。
- 会话持久化(session persistence)——轨迹落在哪、怎么 resume/fork。这是最工程化、争议最小的一层,选型基本就是 JSONL vs SQLite vs Postgres vs git。
设计谱系
压缩这条轴上有一条清晰的能力阶梯:
- 不压缩:要么靠原生长窗口硬扛(AutoClaw 上 GLM-5.2 的 1M 窗口),要么纯尾部滑窗截断(OpenManus 的
messages[-100:]),要么干脆每轮全量累加(Trae,已核实无任何 token 预算检查)。 - 确定性截断/滑窗(不调 LLM):SWE-agent 的
LastNObservations、LangGraph 的trim_messages、AutoGen 的四种ChatCompletionContext(含”从中间 pop”的 middle-out 截断)、Semantic Kernel 的TruncationReducer、CAMEL 的window_size、UI-TARS 的图像滑窗。 - LLM 摘要式压缩:绝大多数主流编码 harness 的落点。差异在于摘要的结构化程度(见下)与触发时机。
- 结构化交接摘要:不是让模型随便总结,而是强制填一份固定字段的”交接笔记”。这是 2025 下半年以来的主流做法,Gemini CLI 的
<state_snapshot>XML、Kimi Code 的”第一人称写给未来自己的 handoff”、Zed 的 Goal/State/Context/Next/Pitfalls 五段、Amazon Q 的第三人称结构化要点、MiMo Code 的 11 字段 checkpoint 是这条路的代表。
记忆这条轴上分四个流派:
- 无长期记忆(记忆只活在单次 run 内):SWE-agent、smolagents、Cline、Roo Code、Trae、OpenManus、UI-TARS、GPT-Researcher、GPT Pilot、browser-use。
- 静态文件式(人工/团队手写,非学习型):
AGENTS.md/CLAUDE.md家族,见下文专节。 - 文件式自动记忆(LLM 自己往 markdown 里写、读、整理):Codex、Claude Code、Qwen Code、MiMo Code、Hermes、QwenPaw、DeepAgents 等。
- 向量/图数据库 RAG 记忆:Letta、AutoGPT、CrewAI、CAMEL、Agent Zero、Claude Flow、Google ADK、Agno 等。
对比表
| Harness | 上下文压缩 | 长期/跨会话记忆 | 会话持久化 |
|---|---|---|---|
| Claude Code | autoCompact(窗口−13k buffer)+ microcompact + CONTEXT_COLLAPSE + reactive 多层叠加,熔断器防连续失败 | 分叉子 agent extractMemories 写 memory/(受限权限,碰不到用户代码) | JSONL transcript,compact_boundary 显式边界 |
| Codex | 本地/远程/远程v2/token-budget 四变体 | 两阶段管线(抽取→全局 consolidation 子 agent),git baseline 目录,默认关 | rollout SQLite 索引 + 全文搜索,thread resume/fork |
| OpenHands | LLMSummarizingCondenser(替换较早一半,SOFT/HARD 触发) | 仓库根 AGENTS.md(非向量库) | EventLog 每事件一 JSON,append-only 可重放 |
| SWE-agent | history_processors 链(LastN/CacheControl/ClosedWindow…静态选定) | 无 | 每步写 .traj JSON(仅事后重放) |
| Aider | ChatSummary 递归二分摘要 | 无向量记忆;.aider.chat.history.md 可回放 | append-only markdown history |
| Cline | basic/agentic/自定义三策略,prepareTurn 每次调用前 | 无(仅 .clinerules 静态) | 每任务两文件 JSON(api + ui) |
| Roo Code | summarizeConversation(SYSTEM OPERATION,非破坏性标记) | 无(folded file context 仅压缩期用) | api_conversation_history.json + ui_messages.json |
| Goose | 0.8 阈值 + 工具对后台批量摘要,agent_invisible/agent_only 可见性魔术 | crates/goose 未内置;memory MCP 待考 | 本地 SQLite(WAL),含 parent_session 谱系 |
| OpenCode | 轮次切分 + 滚动摘要更新(非重来),Context Epoch 缓存友好 | SQLite event-sourced,session 可 fork | SQLite via Drizzle |
| Gemini CLI | 0.5 触发,<state_snapshot> 结构化 XML,含 prompt-injection 防御 | GEMINI.md 三级层级 + Auto Memory(挖掘归档转录) | ~/.gemini/tmp/.../chats/,—resume;git 影子仓库 checkpoint |
| Qwen Code | tryCompress,三档阈值明确对标 Claude Code | Auto-Memory 四动词 extract/dream/recall/forget,对标 CC 预取模式 | JSONL 树状(uuid/parentUuid)分支 |
| Cursor | preCompact hook(observe-only,不能改写) | 语义索引 + Instant Grep 双索引(分离新鲜度策略) | sessionStart/End hooks 注入 |
| Trae | 无(纯累加,仅单次工具输出 16k 截断) | 无(CKG 是代码结构记忆,非对话记忆) | 无(进程退出即丢) |
| Qoder | /compact + 自动,桌面端 40% 时给用户显式选项 | 静态 + 自动记忆(QODER_MEMORY=1);云端 Memory Stores 三层 | UUID session,resume/continue/fork |
| Kimi Code | full.ts 0.85 触发,第一人称 handoff 摘要,micro 已死代码 | 无长期库(逐 session wire.jsonl + AGENTS.md 静态) | ~/.kimi-code/sessions/,事件溯源 records |
| AutoClaw | 无(靠 GLM-5.2 1M 原生窗口替代压缩工程) | 四文件 SKILL/AGENTS/MEMORY/TOOLS.md,多分身隔离 | 每 Agent 独立 Session |
| Amazon Q | create_summary_request,第三人称结构化,overflow 触发 | semantic-search crate(BM25 + all-MiniLM 向量,本地 ONNX),默认关 | 本地 SQLite(rusqlite) |
| Devin | 未披露上下文内压缩算法(靠多 agent 清上下文) | Knowledge:trigger description + content,RAG 式召回,主动建议 | hypervisor 级 VM 快照(memory/进程树/文件系统) |
| Factory | PreCompact hook(manual/auto) | AutoWiki:多 agent 生成、增量再生、提交进代码库的文档产物 | .jsonl transcript |
| Copilot Agent | infiniteSessions 80% 后台/95% 硬阻塞 | citation 式即时校验记忆(放弃离线整理),28 天过期,跨 agent 共享 | ~/.copilot/session-state/ checkpoints |
| Junie | 显式生命周期事件(SessionStart source=compact) | fasterModel 承担”记忆抽取”(存储未披露);guidelines 静态 | 存最近 10 个 session |
| Kiro | 80% 阈值自动摘要 | Steering 文件(四种加载模式);autonomous agent 有真跨会话记忆 | ~/.kiro/sessions/cli/ json + jsonl |
| Replit | 未见对话压缩(靠子 agent 隔离) | 无(执行环境本身作记忆载体) | git commit + Postgres 快照联合 checkpoint |
| Amp | 90% 自动压缩,取代已移除的手动 Handoff | read_thread 跨线程检索(已重写为 subagent) | 服务端 Postgres(GCP),线程稳定 ID |
| v0 | 滚动摘要(recent + summaries of older) | Memories & Skills(团队级,仅访问控制文档化) | Versions 不可变检查点 + 沙箱文件系统 |
| Warp | 会话摘要 + 工具结果摘要;MoveMessagesToNewTask rewind | Agent Memory(跨 harness、Oz 自写、逐消息取用),未 GA | 本地↔云 handoff,第三方 transcript 落地 resume |
| Zed | auto_compact,五段式 COMPACTION_PROMPT,≥80k 才压 | 无 RAG(9 种规则文件注入) | 本地 SQLite(sqlez) |
| AutoGen | 四种可插拔 ChatCompletionContext(含 middle-out) | Memory 协议 + chromadb/mem0/redis/canvas 后端 | save_state/load_state pydantic |
| Semantic Kernel | Reducer opt-in(Truncation/Summarization 滚动摘要) | 13 个向量库后端(旧 SemanticTextMemory 已 deprecated) | ChatHistoryAgentThread(后端调用方自备) |
| Augment | ToolOutputTruncator + 未截断影子副本可恢复 | conversation-retrieval(历史会话语义检索,独立于代码库 RAG) | .augment/sessions/*.json,三级详略度 |
| LangGraph | trim_messages + RemoveMessage(摘要靠 langmem 外挂) | BaseStore 分层命名空间 KV + 可选语义索引 | Checkpointer(Sqlite/Postgres/Redis…) |
| CrewAI | 分块并行摘要,结构化 prompt | 统一 Memory 类,LanceDB,LLM-in-loop 编码/召回,复合打分 | Flow @persist 按 UUID,可 fork |
| DeepAgents | SummarizationMiddleware,摘要卸载到 markdown 文件 | MemoryMiddleware 自更新(AGENTS.md 风格,指导何时写回) | LangGraph checkpointer + O(N) DeltaChannel |
| MetaGPT | 无摘要(memory_k 硬截断) | RoleZero 溢出灌 Chroma RAG(默认关) | Team.serialize/deserialize team.json |
| smolagents | summary_mode 标志位(仅重规划时) | 无(推荐 step_callbacks 自己写 hook) | save/push_to_hub 存 agent 定义(非会话) |
| AutoGPT | Classic:LLM 逐 episode 压缩 | Platform:Graphiti 时序知识图谱(FalkorDB),带类型/过期/矛盾检测 | AgentManager save_state |
| browser-use | maybe_compact 双闸门 → <compacted_memory>;只带当前截图 | 无跨 run;FileSystem(todo.md/results.md)让模型自管 | AgentState 可序列化,add_new_task 追加 |
| Open Interpreter | Codex 底座压缩(run_auto_compact 等) | Codex memories 管线(子 agent consolidation),默认关 | rollout SQLite + ~/.openinterpreter |
| Claude Flow | memory-distill 蒸馏(非窗口 compaction) | sql.js + agentdb HNSW,BM25+dense 混合,rerank,EWC 持续学习,量化 | .hive-mind/sessions/,跨会话存活 |
| OpenManus | 尾部滑窗 messages[-100:](唯一机制) | 无 | 无(纯进程内存) |
| Agno | 只压缩 role==tool 的结果(不做全历史摘要),BETA | MemoryManager LLM 抽取事实,enable_agentic_memory 给增删改工具 | session/ + db/(20+ 后端) |
| UI-TARS | 只有图像滑窗(maxImagesCount),无文本压缩 | 无 | 多后端 storage provider(SQLite/File/Mongo/Memory) |
| Continue | 约 80% 触发,conversationSummary 标记,pruneLastMessage 兜底 | CLI 层无(IDE 侧有 codebase indexing) | ~/.continue/sessions/*.json,undo/redo 栈 |
| GPT Pilot | 粗糙写死(>150k 才 trim_logs) | 无向量库;结构化 ProjectState + knowledge_base,显式挑文件 | DB 版本化状态链(SQLite/Postgres),可重建工作区 |
| GPT-Researcher | embedding 相似度过滤(非 LLM 摘要)+ word-budget 裁剪 | 无跨会话 | 核心库无 checkpoint(MemorySaver 被注释) |
| AgentScope | compress_context 0.8 触发,5 字段 SummarySchema,on_compress_context 钩子 | AgenticMemory/mem0/reme 三后端可选 | AgentState pydantic 序列化 + Redis 服务层 |
| OpenAI Agents SDK | OpenAIResponsesCompactionSession(调 responses.compact) | Sessions 协议(SQLite/Redis/Mongo… 8+ 实现) | Session get/add/pop/clear |
| Kilo Code | 隐藏 compaction agent + prompt/compaction.txt,filterCompacted | 两套:kilo_local_recall(历史 session)+ kilo-memory(学习型 markdown) | SQLite(drizzle),message v2 part 化 |
| Letta | Summarizer partial_evict/trim 双模式 | 三层 MemGPT:core(in-context Block 自编辑)/ recall(hybrid)/ archival(pgvector) | 多 conversation 并行 + 隔离 block;MemFS git-backed |
| Google ADK | CompactionRequestProcessor,token 阈值 + 滑窗 + rolling summary | BaseMemoryService(Vertex Memory Bank / RAG),preload_memory 自动注入 | Session(in-memory/sqlite/db/vertex),state 作用域前缀 |
| Pydantic AI | ProcessHistory capability(before_model_request hook)+ provider-native CompactionPart | 核心未实现(独立 harness 包) | ModelMessages 可序列化(存储自备) |
| Agent Zero | 分层 Topic/Bulk 后台线程压缩(0.8 目标比) + 手动整会话压实 | FAISS 向量库(MAIN/FRAGMENTS/SOLUTIONS),后台自动抽取 durable 事实 | persist_chat JSON,支持分支 + time-travel |
| CAMEL | 渐进式 summarization(summarize_threshold + window_ratio 增量) | VectorDBMemory / LongtermAgentMemory 向量检索 | save/load_memory + MemoryToolkit 工具化 |
| Plandex | 滚动摘要(后台 goroutine summarizeConvo,最新摘要换最老消息) | codebase map 常驻(无向量库,模型基于符号名检索) | Postgres + 每 plan 一 git 仓库 |
| DeerFlow | DeerFlowSummarizationMiddleware(LangChain 继承),排序刻意靠前 | agents/memory 学习型(detect_correction/reinforcement,4-worker 巩固/汰旧),按 user_id 分域 | checkpointer + persistence(SQLite/DB) |
| Hermes | ContextCompressor 有损摘要,50%/85% 阈值,protect_last_n | MEMORY.md + USER.md 两文件有界(冻结快照,会话开始渲染一次) | SQLite + FTS5 全文检索;可选 Honcho |
| MiMo Code | Cycle/checkpoint/rebuild,11 字段,writer 子 agent 单写者 | 四层(session/project/global/history),FTS5 BM25,可导入 CC 记忆 | SQLite 全会话 trace |
| QwenPaw | Scroll strategy:EvictionIndex 记 seq 区间可逐字节召回(非摘要) | ReMe:auto memory→dream→proactive,BM25+向量 RRF 混合 | 写穿 history.db(SQLite),驱逐前先持久化 |
| Comate | 单对话自动压缩(算法未公开) | 项目级 Memory 自动演化;PGVector 代码库索引 | 历史对话面板 |
| CodeGeeX | 未找到证据(客户端不可见) | @repo/@workspace RAG(服务端授权) | globalStorage/agent/history.json 本地 |
| Anthropic 多 agent | compaction(保留架构决策/未解 bug/最近 5 文件) | 结构化笔记 + memory tool(文件式);子 agent 隔离即上下文管理 | Memory 存 plan(>200k 会被截断) |
分组讨论
一、“抽取与主循环解耦”——独立子 agent 写记忆
这是 2025 下半年最有影响力的记忆设计范式,核心洞见是:让主 agent 一边干活一边整理记忆,会污染它的注意力和 token 预算,所以把抽取整体搬出主循环。
Codex 是最完整的工程化实现:两阶段管线,Phase 1 后台从每个 rollout 抽取结构化记忆并脱敏入库,Phase 2 用一个无审批、无网络、仅限本地写、且关闭再委派的内部 consolidation 子 agent 去改写更高层 MEMORY.md,并用 ~/.codex/memories/.git 做 git baseline 算 diff。Open Interpreter 直接复用了这套 Codex 底座(同样的 memories/ 双 crate + consolidation 子 agent)。Claude Code 走同一思路但更轻:每次 query loop 结束时分叉一个 extractMemories 子进程,用受限 canUseTool(只允许在自动记忆目录内 Edit/Write)保证写记忆的子 agent 碰不到用户真实代码,还用游标 + 互斥保护避免重复写。Qwen Code 把它形式化成四个动词 extract/dream/recall/forget,并在设计文档里明确写明其 recall 预取模式对标 Claude Code 上游的 startRelevantMemoryPrefetch/settledAt——这是全部 dossier 里最直白的”抄谁”自述。
MiMo Code 把这个范式推到极致:它的 checkpoint-writer 是一个专职 subagent,博客原文”the main agent does not maintain its own memory”,并强加单写者不变式(single-writer invariant)——主 agent 对 11 个结构化字段只有只读权限,唯一写入通道是自由格式 notes.md,由 writer 每次 checkpoint 时读取归类后清空。它的 cycle/rebuild 概念也很独特:不删 DB 历史,只从 rebuild boundary 起重新切片,且刻意在上下文利用率 20%/45%/70%(而非 95%)时做增量抽取,理由是”lost in the middle 效应下高利用率时抽取最不可靠”。
二、结构化交接摘要——从”随便总结”到”填表”
早期压缩(Aider 的递归二分、OpenHands 的替换较早一半)只是让模型自由总结。新一代普遍改成强制填固定字段的交接笔记,因为自由摘要容易丢关键状态。
Gemini CLI 是这条路最结构化的:产出 <state_snapshot> XML,固定含 overall_goal/active_constraints/key_knowledge/artifact_trail/file_system_state/recent_actions/task_state 各段,还内嵌 prompt-injection 防御条款。AgentScope 的 SummarySchema(task_overview/current_state/important_discoveries/next_steps/context_to_preserve)与 CrewAI 的五段几乎逐字相同,说明这套字段已成事实标准。Zed 的 Goal/State/Context/Next/Pitfalls、Amazon Q 的第三人称结构化要点都是变体。Kimi Code 走了一个有格调的分支——把摘要 prompt 刻意设计成”写给未来的自己的第一人称交接笔记”而非第三方报告,还要求用对话原语言而非强制英文。
值得注意 Qwen Code 在压缩阈值设计上也明确对标 Claude Code 的 autoCompact.ts 绝对 token 阶梯并解释了为何改用三档方案,是 gemini-cli fork 血统之外又一次显式借鉴 CC。
三、共享底座:opencode 家族与 gemini 家族的压缩同源
有几组 harness 的压缩代码明显同源。OpenCode、Kilo Code、MiMo Code 都有一个隐藏的 compaction primary agent + prompt/compaction.txt + filterCompactedEffect 的相同骨架,OpenCode 的”轮次切分 + 滚动摘要更新(而非从头重来)+ Context Epoch 缓存友好”是这套设计的源头,Kilo 和 MiMo 是在其上的 fork/演化。Gemini CLI 与 Qwen Code 是另一条 fork 线(Qwen Code fork 自 Gemini CLI),压缩与会话格式高度一致。Cline→Roo Code→Kilo Code 是第三条血脉,但记忆设计上 Kilo 已大幅超出 Cline/Roo(后两者都无长期记忆)。
LangChain 生态也是共享底座:DeepAgents 和 DeerFlow 都基于 LangChain 的 SummarizationMiddleware,LangGraph 本身只提供 trim_messages/RemoveMessage 机制、把摘要器留给外挂的 langmem 包。
四、静态文件式”记忆”——AGENTS.md 家族
严格说这不是记忆(不自动积累),但功能上塑造了”跨会话被记住的东西”,几乎每个编码 harness 都有。AGENTS.md/CLAUDE.md 已成开放标准:Zed 一次性识别 9 种规则文件名(.rules/.cursorrules/.clinerules/.windsurfrules/copilot-instructions/AGENT(S).md/CLAUDE.md/GEMINI.md),Amp 兼容旧 AGENT.md/CLAUDE.md 并支持 YAML globs: 条件加载,Comate 明确读取 Cursor 的 .cursor/rules。分层发现(cwd 向上找到 .git + 全局覆盖)是通用模式,Factory、Junie、Kiro(Steering 文件四种加载模式最精细)、Qoder 都是这一套。
在此之上,一批 harness 让模型自己写这些文件,把静态记忆变成半自动记忆:Hermes 的 MEMORY.md + USER.md 两文件有界(800/500 token 上限),并有一个独特的”冻结快照”取舍——记忆只在会话开始渲染进 system prompt 一次,中途写入落盘但要下个会话才生效,为的是保住 prefix cache 稳定。AutoClaw 的四文件 SKILL/AGENTS/MEMORY/TOOLS.md 按内容类型分工。DeepAgents 的 MemoryMiddleware 明确指导模型”何时该 edit_file 写回、何时不该(临时信息除外)“。
五、向量/图数据库 RAG 记忆——重型玩家
需要真正跨会话语义检索的 harness 走向了向量库。Letta 是这一维度的教科书:三层 MemGPT 结构逐一对应代码——core memory 是嵌在系统提示里的一等 Block(模型可自编辑、有 size limit 和 read_only)、recall memory 是消息历史的 hybrid 检索、archival memory 是 pgvector 向量库(带 tags/时间过滤/top_k)。它还有 MemFS:记忆块投影成带 YAML frontmatter 的 markdown、git 版本化、system/ 目录每轮必进系统提示。这是所有 61 个里对记忆抽象得最系统、最”记忆即一等公民”的设计。
其余重型玩家各有侧重:AutoGPT 的 Platform 侧用 Graphiti 时序知识图谱(FalkorDB),带 SourceKind/MemoryKind/MemoryStatus 类型系统和 active/superseded/contradicted 矛盾检测——在记忆有效性建模上最超前。Claude Flow 堆料最狠:sql.js + agentdb HNSW + BM25 + cross-encoder rerank + rabitq 量化 + EWC 持续学习。CrewAI 的统一 Memory 是罕见的 LLM-in-the-loop 系统,编码/召回都调自己的 LLM 做子查询拆解和置信度路由,复合打分 = 时效衰减 + 语义 + 重要性。CAMEL(VectorDBMemory/LongtermAgentMemory)、Agent Zero(FAISS 三 Area + 后台自动抽取 durable 事实)、Google ADK(Vertex Memory Bank + preload_memory 自动注入 <PAST_CONVERSATIONS>)、Agno(20+ DB 后端)、Semantic Kernel(13 后端但旧接口 deprecated)、MetaGPT(RoleZero 溢出灌 Chroma)是其余代表。
六、“读时校验”派——对记忆陈旧/幻觉的务实答案
向量记忆的通病是陈旧和幻觉:存进去的事实可能已过时。Copilot 给了最有意思的答案:每条记忆是 {subject, fact, citations:[file:line], reason},agent 用前重新核对引用的代码位置,若引用失效就存一条修正版(自愈);GitHub 明确说考虑过离线整理服务但放弃了(成本高且仍需读时核对),并做了对抗性压力测试(故意植入指向不存在代码的恶意记忆,验证 agent 会发现矛盾并更新)。Devin 的 Knowledge 用 trigger description(自然语言短语匹配当前任务)做 RAG 召回,还有 Session Insights 回溯评估每条 knowledge 帮了还是误导了该 session——记忆质量的反馈闭环。Amp 的 read_thread 从被引用线程抽取信息,其 subagent 化重写后的 prompt 带显式纠错指令”不要止步于第一个匹配,检查后续是否有修订/覆盖它的消息”(一个线程实测被压缩 68 次、未压缩约 2100 万 token,逼出了这个设计)。
七、“永不丢失”派——精确可召回而非有损摘要
大多数压缩是有损的(摘要掉的东西回不来)。少数 harness 刻意做无损可召回。QwenPaw 的 Scroll strategy 是代表:被驱逐的中段折叠进一个 EvictionIndex,它记录的是精确的 seq 区间而非摘要,原始 turn 可逐字节恢复,通过 recall_history_python 工具(持久历史之上的沙箱 REPL)召回——这是 README “Never forgets” 的代码级兑现(仅 Scroll 策略;默认压缩模式仍有损)。QwenPaw 以 AgentScope 为底座,Scroll 正是挂在 AgentScope compress_context 的 on_compress_context 中间件钩子上定制的。Roo Code 走了个折衷:非破坏性压缩——旧消息只被 condenseId 标记为取代,磁盘上完整原始历史仍在,只在发 API 时过滤。Augment 的 UntruncatedContentManager 保留截断前影子副本,可通过 search-untruncated/view-range-untruncated 取回。
八、GUI/computer-use agent 的特殊记忆形态
面向屏幕操作的 agent 的上下文瓶颈不是文本而是截图。UI-TARS 的核心结论直白:只有图像滑动窗口(maxImagesCount 保留最新 N 张、旧图换文本占位符),无任何文本压缩/长期记忆/向量检索;一代还用 previousResponseId 走 stateful Responses API 让服务端保留上下文。browser-use 更进一步——核心设计不是无限追加消息列表,而是每步重建单条 state message,历史以文本 <agent_history> 描述形式塞进去;模型靠持久 FileSystem(todo.md/results.md)自己决定什么留在 context,默认只带当前截图。这类”模型自管上下文”的思路与 Anthropic 博客的”结构化笔记”、Claude Plays Pokémon 是同一血统。
九、会话持久化的选型光谱
这一层争议最小,选型基本是工程口味:
- JSONL trajectory:Claude Code、Factory、Kiro、SWE-agent 的
.traj。人类可读、append-only 是共同优点。 - SQLite:目前最主流。Goose(WAL + parent_session 谱系)、OpenCode/Kilo Code(Drizzle)、Kimi Code(事件溯源 records)、Zed(sqlez)、Hermes(+FTS5)、Amazon Q(rusqlite)。
- Postgres:走服务端/团队协作的选它。Amp(GCP)、Plandex(+每 plan 一 git 仓库)、LangGraph PostgresSaver。
- git-backed:把版本历史当一等公民。Replit 的 git commit + Postgres 快照联合 checkpoint、Gemini CLI 的影子仓库、Letta 的 MemFS、Codex 的 memories git baseline。
- 序列化对象(存储自备):AutoGen、Pydantic AI、OpenAI Agents SDK、smolagents(存 agent 定义而非会话)——框架派的典型做法。
- hypervisor 快照:只有 Devin——在 hypervisor 层快照完整 VM(内存/进程树/文件系统),让 agent 能跨越 PR review/CI 等待的异步间隙存活。官方自述这是千级并发下最难做可靠的一块基础设施,是”云端 agent”形态独有的记忆需求。
fork/handoff 能力也值得单列:Warp 的 Agent Memory 和会话 handoff 都跨 harness——能上传 Claude Code 的完整 transcript envelope 到服务端,恢复时在磁盘重新落地到 ~/.claude/projects/ 让原生 claude --resume 透明接手;Goose 能导入 Claude Code/Codex/Pi 的轨迹格式。这是 harness 互操作性的前沿。
最值得借鉴
1. Letta 的三层自编辑记忆(core / recall / archival)。 它是唯一把”记忆是模型可读写的一等公民”贯彻到底的设计:常驻上下文的 core Block 让模型能主动维护自己的工作记忆,recall 做会话历史检索,archival 做无限向量归档,三层各司其职、边界清晰,还用 MemFS 让每一层都 git 版本化、人类可读可编辑。对任何需要”agent 越用越懂你”的产品,这是最完整、最可复制的记忆骨架——它把 MemGPT 论文真正工程化了。
2. “抽取与主循环解耦”的子 agent 写记忆范式(Codex / Claude Code / MiMo Code)。 它解决的是一个被低估的问题:让主 agent 兼职整理记忆,会同时偷走它的 token 预算和注意力,而恰恰在上下文最满、模型最”笨”的时刻要它做最精细的抽取,是一笔坏交易。把抽取搬到独立子 agent(受限权限、不碰用户代码、不共享主 agent 注意力),既保护了主循环的性能,又用权限沙箱兜住了记忆写入的安全风险。MiMo 的单写者不变式和”20%/45%/70% 而非 95% 触发抽取”更是把这个洞见推到了极致。这两条思路——一个解决”记忆结构”,一个解决”记忆何时/由谁生成”——正交互补,合起来几乎覆盖了长期记忆设计的全部关键决策。