EverOS vs ByteRover:两种记忆系统范式的核心设计对比
两个都是给 AI Agent 提供长期记忆的开源项目,但设计哲学几乎完全相反。一句话概括:EverOS 是「我自己懂记忆」,ByteRover 是「你来想清楚,我帮你落盘和共享」。
EverOS bottom-up
Markdown 为真理源,框架自带 everalgo 算法把对话蒸馏成结构化记忆,并有 OME 离线反思自我精炼。像在做一个会自己整理思路的认知系统。
ByteRover CLI top-down
HTML Context Tree 为载体,由调用方 Agent 的 LLM 自己撰写 <bv-topic>,框架只做 schema 校验、写盘、版本控制、团队同步。
一、定位差异
| 维度 | EverOS | ByteRover CLI |
|---|---|---|
| 自我定位 | 本地优先的「记忆运行时」(memory OS) | AI 编码 Agent 的「上下文记忆 REPL/CLI」 |
| 主要使用者 | 应用、Agent harness、设备(横向 memory 层) | 编码 Agent(Cursor/Claude Code/Windsurf…)+ 团队 |
| 生态 | EverMind 全家桶(Raven / EverAlgo / HyperMem / EverMe / EverMemBench) | ByteRover Cloud + Hub/Connectors + 22+ Agent 集成 |
| License | Apache 2.0 | Elastic 2.0(开源但限制商用竞品) |
| 语言/栈 | Python 3.12,asyncio,aiosqlite,LanceDB,Pydantic v2 | TypeScript/Node,React-Ink TUI,isomorphic-git,Socket.IO |
二、核心设计哲学(最关键的分野)
EverOS —— Markdown-First,框架自动进化
Markdown (.md + YAML frontmatter) ← 唯一真理源
├─ SQLite ← 系统状态 / 审计 / cascade 队列(可重建)
└─ LanceDB ← 向量 + BM25 + 标量过滤(可重建)
- 删掉整个
.index/目录不会丢失任何记忆,cascade 守护进程会从.md树重建。 - 用户可直接用 VSCode/Obsidian/Vim 编辑 episode 文件,保存后框架只重新嵌入改动的那条 entry(entry-level diff)。
- 框架自带
everalgo(user_memory / agent_memory / rank / knowledge / parser)—— 无状态、无 I/O、无内联 prompt 的算法包,自己负责「提取 → 蒸馏 → 反思」。
ByteRover —— Context Tree + LLM-as-Curator,框架不持有 LLM
.brv/context-tree/ ← <bv-topic> HTML 文件树 + 自动生成 _index.md
├─ <bv-topic path=... title=...> ← 调用方 LLM 写
│ <bv-decision>/<bv-rule>/<bv-pattern>/<bv-fact>…
└─ summaries / manifest / archive ← 框架确定性生成(无 LLM)
- 知识的结构是 LLM 自己决定并撰写的(
<bv-topic>+ 一组受控的<bv-*>元素),框架只校验 schema、写盘、生成索引和摘要。 - 工具模式(
brv curateprotocol)下 ByteRover 完全不接触任何 LLM——通过needs-llm-step/correct-html状态机把「想内容」的工作外包给调用方 Agent 的 LLM。 - 强调 Git-like 版本控制(branch/commit/merge/push/pull)和团队同步。
三、数据模型对比
EverOS:八种业务记忆类型 + 三种写盘策略
| 类型 | 归属 | 策略 |
|---|---|---|
| episode / atomic_fact / foresight / profile | user | daily-log append / single-file rewrite |
| agent_case / agent_skill | agent | daily-log / skill 命名目录 |
| knowledge_document / knowledge_topic | global | knowledge 树 |
通过 <app_id>/<project_id>/<users|agents>/<owner_id>/... 路径分区,scope 编码在路径里而不是 frontmatter 里。frontmatter 用 Pydantic v2 强类型校验,有 4 级字段保护(L1 只读 / L2 系统 / L3 业务 / L4 用户)。
ByteRover:扁平化的 Context Tree + 受控 HTML 词汇表
- 单一数据单元:
<bv-topic path="..." title="...">,子元素包括<bv-decision>、<bv-rule>、<bv-pattern>、<bv-fact>、<bv-fix>、<bv-diagram>、<bv-task>、<bv-files>等。 - 没有预定义的「记忆类型」分类——类型由 path 和元素语义隐式表达。
- 配套三类派生产物(确定性、无 LLM):
_index.md/index.html(导航,全量重算)- summary frontmatter(
children_hash、compression_ratio、condensation_order、covers_token_total)—— 层级摘要,类似 Merkle 树 - manifest / archive
四、写入 / 读取路径
EverOS 写路径(强一致 + 异步进化)
POST /add → buffer (SQLite) → 边界检测 → 1 次 LLM 提取 MemCell
→ 同步写 episode.md(fsync,立即返回)
→ 异步:OME 策略生成 atomic_facts / foresight / profile / case / skill
→ cascade 守护进程 entry-level diff → LanceDB
一致性保证:写强一致(md 已落盘),读最终一致(LanceDB 通常亚秒级,最坏 10–15s)。LanceDB 不可用也不阻塞写入,变更缓存在 SQLite 的 md_change_state 队列里,崩溃重启后重放。
ByteRover 写路径(HITL 可审查)
brv curate "<intent>" → needs-llm-step(generate-html)
→ 调用方 LLM 产出 <bv-topic> HTML
→ 框架 schema 校验(最多 4 次重试:1 generate + 3 correct-html)
→ path-exists 防覆盖(除非 --overwrite,否则返回 existingContent 让 LLM 合并)
→ 写盘 + detached Phase 4(摘要 / manifest 重建)
→ 可选 review 流程(approve / reject)
核心特征:每次写入都是可审查、可回滚、可版本化的——非常 Git-like。
读取
- EverOS:
/search单次 LanceDB 查询 = BM25 + 向量 ANN + 标量过滤(hybrid retrieval)。 - ByteRover:
brv search纯 BM25(minisearch,零 LLM 成本);brv query才是 LLM 综合答案。论文里描述了五层渐进检索 Tier 0–4。
五、记忆进化(这是 EverOS 的独门武功)
EverOS 有 OME(Offline Memory Engine),一套 in-process 的异步策略引擎,策略可在 ome.toml 里热重载开关:
extract_atomic_facts/extract_foresight/extract_user_profileextract_agent_case/extract_agent_skill(聚类成技能)reflect_episodes(cron,默认关):选簇 → LLM 合并多条零散 episode 成一条叙事 → 重提原子事实 → 用deprecated_by字段废弃原条目。这是真正的「记忆自我精炼」。
ByteRover 没有等价的「自动反思」——它的进化机制是:
brv dream:后台 consolidation(synthesize / consolidate / prune),但是面向 context tree 的结构整理,而非语义蒸馏。- propagate-summaries / staleness:当某 topic 变更时,沿摘要树向上传播失效。
- RuntimeSignalStore:把「文件级使用/成熟度信号」放在 sidecar 里,不污染策展的 markdown。
六、多用户 / 多 Agent 模型
| EverOS | ByteRover | |
|---|---|---|
| 检索维度 | user_id × agent_id × app_id × project_id × session_id 五维正交 |
projectRoot × worktreeRoot × path × source origin(local/shared) |
| 隔离方式 | 路径分区(<app>/<project>/users/<user>/...) |
项目目录隔离(.brv/)+ worktree 指针 + source 链接 |
| 协作 | 无内建云同步(设计上可整目录拷贝/git) | ByteRover Cloud + brv vc 完整 git 工作流 |
EverOS 更像「个人/单设备的全息记忆层」;ByteRover 更像「团队共享的项目知识库」。
七、工程架构对比
EverOS(DDD 分层,import-linter 强制)
entrypoints (cli+api) → service → memory → infra/persistence
↑
component (llm/embedding/parser/rerank) + core + config 横切
错误体系是 AppError 四分支(Domain/Infrastructure/Capability/Configuration),用 Starlette MRO 派发到 HTTP 状态码。算法边界 everalgo 严格无状态、无 I/O,可被 EverOS Cloud、OpenClaw 插件等不同产品形态复用。
ByteRover(多进程守护 + 严格 ESLint 边界)
oclif (commands) ─┐
tui (React/Ink) ──┼──→ Socket.IO transport ──→ server daemon
webui (Vite) ─────┘ └─ agent pool (forked 子进程/project)
tui/不能 importserver//agent//oclif/(ESLint 强制)。- 守护进程通过 Socket.IO 路由所有命令;agent 在 forked 子进程里跑,按项目并发池管理。
- 强调 Outside-In 开发(先有 consumer 再定义 interface)和严格 TDD。
八、一张图总结
对话流 ──自动蒸馏──▶ 结构化记忆 (EverOS 主张)
│
raw stream ─► episode ─► atomic_fact ─► profile/skill
(OME 异步反思、deprecated_by 废弃、cascade 重建索引)
Agent LLM ──自己策展──▶ <bv-topic> HTML 树 (ByteRover 主张)
│
intent ─► generate-html ─► schema 校验 ─► 写盘 ─► summary/manifest
(协议编排、HITL review、git vc、cloud sync)
九、给 ByteRover 的建议:记忆的语义生命周期管理
EverOS 最值得 ByteRover 学的不是「向量检索」(那是路线分歧),而是记忆的语义生命周期管理——原子事实、废弃关系、反思合并。这些都是「写入后如何让记忆自我进化」的概念,和 ByteRover「LLM-curated」哲学不冲突,反而是它的自然延伸:既然写入时 LLM 已经理解了,那让它顺便抽出原子事实、标记取代关系、定期反思合并,是顺理成章的增强。
建议 1:激活原子事实(<bv-fact>)的独立检索路径
EverOS 的 extract_atomic_facts 策略从每个 episode 蒸馏出单句原子事实,独立存索引。这是它检索精度的关键——MaxSim 模式先在密度高 ~28× 的 atomic_fact 表做检索,再 max-pool 回父 episode,能捞回「长文档里某一句」的细粒度匹配。
<bv-fact> 元素已经存在,但当前检索路径没有专门利用它。可以让 brv curate 在写 <bv-topic> 时强制抽取 <bv-fact> 子元素,检索时对 bv-fact 单独建 BM25 子索引,做 topic-level 的 MaxSim——一个 topic 讲 5 件事时,能精确定位到具体那一句。移植难度:低。元素已在 schema 里,只是没有检索路径消费它。
建议 2:用 superseded-by 表达语义取代关系
EverOS 反思合并后,原 episode 不删,而是打 deprecated_by: <merged_entry_id> 标记,搜索自动 WHERE deprecated_by IS NULL 过滤。这区分了两种本质不同的「过时」:
| 关系 | 语义 | 当前 ByteRover 的处理 |
|---|---|---|
| 删除 | 这条知识错了 / 不要了 | brv vc 的 git 历史 |
| 取代 | 这条被那条更完整的替代了 | ❌ 无原生表达,只能靠 prune 或手动管理 |
<bv-topic> 加 superseded-by="path/to/new" 属性,或在 RuntimeSignalStore sidecar 里加 supersededBy 字段。brv search 默认过滤被取代的 topic,保留 --include-superseded 选项。移植难度:中。需要改检索过滤逻辑 + curate 协议增加「取代」语义,但和现有 git vc 正交,不冲突。建议 3:给 brv dream 增加语义反思能力
这是最有价值也最深刻的一步。ByteRover 当前的 brv dream 做的是结构整理(synthesize / consolidate / prune context tree),不是语义进化——它不会把「3 次零散讨论 JWT」合并成「1 条完整的 JWT 决策记录」。而 EverOS 的 reflect_episodes 是真正的「记忆自我精炼」:
# EverOS reflection orchestrator: Select → Merge → Re-extract → Deprecate
clusters = select_clusters(min_members=2)
for cluster in clusters:
merged = await llm.merge(cluster.episodes) # LLM 合并成一条叙事
new_facts = await extract_atomic_facts(merged) # 重提原子事实
for orig in cluster.episodes:
orig.deprecated_by = merged.id # 废弃原条目
brv dream 增加一个 consolidate-semantics 操作——找同 path 前缀或高 BM25 自相似度重叠的多个 <bv-topic>,让调用方 LLM 合并成一条,原条目标 superseded-by。难点在「找候选簇」:EverOS 用向量聚类,ByteRover 没向量,得用 path 前缀 + BM25 自相似度 + backlink 图聚类的组合。移植难度:中。dream 框架已有,加一个 operation 类型即可,且完全用调用方 LLM,不破坏零基础设施原则。移植优先级
| 建议 | 价值 | 难度 | 推荐 |
|---|---|---|---|
① 激活 <bv-fact> 检索路径 | 高 | 低 | 🟢 立刻做 |
② superseded-by 语义关系 | 高 | 中 | 🟢 立刻做 |
| ③ dream 语义反思 | 高 | 中 | 🟡 下个版本 |
十、选型建议
选 EverOS 如果你需要
把对话流自动变成可检索的长期记忆(聊天机器人、陪伴型 Agent、可穿戴设备);个人/单设备的全息记忆,希望 md 可读、可手编、可 git;离线反思、技能聚类等「记忆自我进化」能力;Benchmark 驱动(EverMemBench/LoCoMo)。
选 ByteRover 如果你需要
给编码 Agent(Cursor/Claude Code/Cline…)加可共享、可版本化的项目知识;团队协作、跨机器同步、HITL 审查;不想框架持有 LLM key,让现有 Agent 的 LLM 自己策展知识;Git 风格的 branch/merge 工作流。
参考文档:EverOS 源码 · ByteRover 论文 arXiv:2604.01599 · 前篇 ByteRover 深度解读。