MD 状态:🌱 更新:2026/6/11

Hivemind (Activeloop) 架构分析

[!info] 知识库定位 这是一篇 项目案例 / 架构分析,重点记录”这个项目如何落地某些概念和工具”。 通用概念链接到 related_concepts;工具评估和使用方法链接到 related_tools

Activeloop 出品的跨 Agent 共享记忆平台——为 Claude Code、OpenClaw、Codex、Cursor、Hermes、pi 等编码 Agent 提供统一的会话捕获、模式挖掘和技能传播基础设施。核心理念:“一个工程师的 Agent 周一解决了迁移难题,周二团队里每个 Agent 都能执行这个模式。“

核心问题与约束

Hivemind 试图解决一个现实问题:编码 Agent 之间的经验无法传递。每个 Agent session 是孤立的——A 工程师的 Claude Code 解决了一个棘手的 bug,B 工程师的 Cursor 完全不知道。

核心约束包括:

约束维度具体表现
Agent 异构性6+ 种 Agent(Claude Code / Codex / Cursor / OpenClaw / Hermes / pi),各自有不同的 hook 机制、配置格式和运行时
Hook 机制不统一Claude Code 用 Marketplace Plugin,Codex 用 hooks.json,Hermes 用 shell hooks,pi 用 Extension API——不存在统一的扩展点
实时性要求SessionStart 时必须立即可用(auto-pull 技能),不能阻塞 Agent 启动
隐私边界团队共享但组织隔离,workspace 级别不能泄露;用户可以选择关闭捕获
零额外 API Key摘要生成和技能挖掘复用宿主 Agent 自身的 CLI,不引入独立 API Key

数据依据docs/ARCHITECTURE.md 中每个 Agent 的 Integration Mechanism 表格,README.md 中的配置变量列表。

架构全景

graph TB
    subgraph "Agent 层(6 种异构客户端)"
        CC["Claude Code<br/>Marketplace Plugin"]
        CX["Codex<br/>hooks.json"]
        CR["Cursor 1.7+<br/>hooks.json"]
        OC["OpenClaw<br/>Native Extension"]
        HM["Hermes<br/>Shell Hooks + Skill"]
        PI["pi<br/>Extension API + AGENTS.md"]
    end

    subgraph "Hivemind 核心(共享层)"
        Hooks["Hook 适配层<br/>src/hooks/"]
        Core["共享核心<br/>src/ — API Client / Auth / Config / SQL"]
        MCP["MCP Server<br/>src/mcp/"]
        Embed["Embedding Daemon<br/>src/embeddings/<br/>nomic-embed-text-v1.5"]
        CLI["统一 CLI<br/>src/cli/ — install / skillify / rules"]
    end

    subgraph "存储与后处理层"
        DL["Deeplake 云存储<br/>sessions / memory / skills 表"]
        VFS["虚拟文件系统<br/>~/.deeplake/memory/"]
        WikiWorker["Wiki Worker<br/>后台摘要生成"]
        SkillWorker["Skillify Worker<br/>后台模式挖掘"]
    end

    CC --> Hooks
    CX --> Hooks
    CR --> Hooks
    OC --> Hooks
    HM --> Hooks
    HM --> MCP
    PI --> Hooks

    Hooks --> Core
    Core --> DL
    Core --> VFS
    Core --> WikiWorker
    Core --> SkillWorker
    WikiWorker --> DL
    SkillWorker --> DL
    Embed --> DL

    style Hooks fill:#f9f,stroke:#333,stroke-width:2px
    style Core fill:#bbf,stroke:#333,stroke-width:2px
    style DL fill:#fbb,stroke:#333,stroke-width:2px

架构风格:适配器-中枢-管道(Adapter-Hub-Pipeline)

Hivemind 采用三层架构,核心是一个适配器模式 + 后台管道处理的组合:

  1. 适配器层(Adapter):每种 Agent 一个 Hook 适配器(src/hooks/claude/src/hooks/codex/src/hooks/cursor/ 等),将异构的 Agent 事件统一转化为 Hivemind 内部事件格式。
  2. 中枢层(Hub):共享核心模块(src/)提供统一的 API Client、认证、配置和 SQL 工具,所有适配器共享同一套 Deeplake 交互逻辑。
  3. 管道层(Pipeline):后台 Worker(Wiki Worker + Skillify Worker)异步处理捕获的数据,生成摘要和技能。

为什么选这个风格:Agent 生态高度异构,适配器模式是唯一可行的解法——每个 Agent 的扩展机制完全不同。中枢层保证了”写一次存储逻辑,6 种 Agent 复用”。管道模式让捕获和后处理解耦,不阻塞 Agent 的主循环。

牺牲了什么:适配器层随着新 Agent 加入会持续膨胀;每个 Agent 的 hook 集合不完全一致(例如 Codex 缺少 SubagentStop),导致跨 Agent 的捕获粒度有差异。

核心模块解析

模块单一职责与其他模块的耦合点
src/hooks/将各 Agent 的生命周期事件转化为统一的 capture/recall 调用依赖 src/ 核心的 API Client 和 SQL 工具
src/hooks/claude/Claude Code 专用的 Hook 实现(7 个生命周期点)通过 Claude Code Plugin API 注册
src/hooks/codex/Codex 专用的 Hook 实现(5 个生命周期点)写入 ~/.codex/hooks.json
src/hooks/cursor/Cursor 专用的 Hook 实现(6 个生命周期点)写入 ~/.cursor/hooks.json
src/hooks/hermes/Hermes 专用的 Shell Hook 实现通过 ~/.hermes/config.yaml 注册
src/hooks/pi/pi 专用的 Wiki Worker独立 bundle 于 ~/.pi/agent/hivemind/
src/coresrc/共享的 API Client、Auth、Config、SQL 工具被所有 hooks 模块和 CLI 引用
src/mcp/MCP Server(Hermes 等使用)依赖核心模块,暴露标准 MCP 工具
src/embeddings/本地 Embedding Daemon(nomic-embed-text-v1.5)可选依赖,为语义搜索提供 768 维向量
src/cli/统一的 hivemind install CLI 和子命令编排安装、认证、skillify 管理
Wiki Worker会话摘要生成(后台异步)Shell out 到宿主 Agent CLI(claude -p 等)
Skillify Worker从会话中挖掘可复用模式 → SKILL.mdShell out 到宿主 Agent CLI,写入本地文件系统 + Deeplake

数据依据docs/ARCHITECTURE.md 的 Monorepo Structure 部分,package.jsonfiles 字段。

数据流分析

flowchart LR
    subgraph "Capture 阶段"
        A1["Agent Session<br/>prompt / tool call / response"]
        A2["Hook 触发<br/>PostToolUse / SessionEnd"]
        A3["写入 sessions 表<br/>Deeplake SQL"]
    end

    subgraph "Codify 阶段(后台异步)"
        B1["Wiki Worker<br/>摘要生成"]
        B2["Skillify Worker<br/>模式挖掘"]
        B3["写入 memory 表<br/>+ 768 维 embedding"]
        B4["写入 SKILL.md<br/>本地 + skills 表"]
    end

    subgraph "Propagate 阶段"
        C1["SessionStart<br/>auto-pull"]
        C2["symlink fan-out<br/>~/.claude/skills/ → 各 Agent skill root"]
        C3["Rules 注入<br/>SessionStart 时注入团队规则"]
    end

    subgraph "Recall 阶段"
        D1["用户自然语言查询"]
        D2["混合检索<br/>BM25 + 语义搜索"]
        D3["返回相关<br/>摘要 / 技能 / 规则"]
    end

    A1 --> A2 --> A3
    A3 --> B1 --> B3
    A3 --> B2 --> B4
    B4 --> C1 --> C2
    C3 --> D1
    D1 --> D2 --> D3
    A3 --> D2

核心循环:Capture → Codify → Propagate → Compound。每轮循环让 Agent 的能力在前一轮基础上累积。

数据依据README.md 的 “How it works” 段落,docs/SKILLIFY.md 的 skill 生成流程。

关键架构决策

决策 1:宿主 Agent CLI 作为 AI 后端(而非独立 API Key)

  • 背景:Wiki Worker 和 Skillify Worker 需要调用 LLM 来生成摘要和判断是否值得保留模式
  • 决策:Shell out 到宿主 Agent 自己的 CLI(claude -pcodex execpi --print 等),复用用户已有的认证和配额
  • 原因:零配置——用户不需要额外注册 API Key、不需要管理额外账单、不需要担心不同 Provider 的认证差异
  • 代价:依赖宿主 Agent CLI 的可用性和性能;如果 Agent CLI 不支持 headless 模式就无法使用
  • 风险:不同 Agent CLI 的输出格式和稳定性不同,Wiki Worker 需要为每种 CLI 做适配;CLI 调用的延迟比直接 API 调用高

数据依据docs/SKILLIFY.md 的 “Per-agent gate CLI” 表格,docs/SUMMARIES.md 的 “How a summary is generated” 部分。

决策 2:Deeplake 作为统一存储层(而非自建数据库)

  • 背景:需要存储结构化的会话数据、向量 embedding、技能文件,且要支持云端同步和 BYOC
  • 决策:使用 Activeloop 自家的 Deeplake 作为存储后端,通过 SQL 接口操作
  • 原因:Deeplake 原生支持张量数据(适合存储 embedding)、支持多种云存储后端(GCS/Azure/S3)、提供 SQL 查询接口;同时这是自家产品,技术栈完全可控
  • 代价:强耦合到 Deeplake 生态;用户需要理解 Deeplake 的概念模型(table、VFS 等)
  • 风险:Deeplake 的 SQL 实现有 quirks(如 docs/SKILLIFY.md 提到的 “UPDATE-coalescing quirk”,所以 skills 表采用 append-only 策略,从不 UPDATE)

数据依据README.md 的 “Security & storage” 部分,docs/SKILLIFY.md 中关于 append-only 策略的说明。

决策 3:自适应多 Agent Hook 适配(而非统一协议)

  • 背景:6 种 Agent 的扩展机制完全不同——Plugin / hooks.json / Shell Hooks / Extension API / AGENTS.md
  • 决策:为每种 Agent 编写独立的适配器,在 src/hooks/ 下各自实现,共享核心逻辑
  • 原因:现实是 Agent 生态没有统一的扩展协议;试图定义一个通用协议会牺牲每个 Agent 的最佳集成点。拥抱碎片化,在核心层统一
  • 代价:每新增一个 Agent 需要编写一套新的 Hook 适配器(约 200-400 行 TypeScript);维护成本随 Agent 数量线性增长
  • 风险:某个 Agent 大幅改动 hook 机制时,适配器需要同步更新;不同 Agent 的生命周期事件粒度不一致导致功能差异

数据依据docs/ARCHITECTURE.md 的 Integration Model 表格。

决策 4:本地 Embedding Daemon 作为可选组件

  • 背景:语义搜索需要 embedding,但 embedding 模型的依赖体积约 600MB
  • 决策:Embedding Daemon 默认关闭,通过 hivemind embeddings install 显式安装;关闭时静默降级为 BM25/lexical-only 搜索
  • 原因:600MB 的依赖对很多用户是门槛;lexcial search 对大多数场景已经足够
  • 代价:不安装 embedding 时语义搜索不可用,搜索质量下降;需要用户理解两种搜索模式的差异
  • 风险:用户可能不知道自己没安装 embedding,搜索体验不如预期但不报错

数据依据README.md 的 “Semantic search (optional)” 部分。

请求链路

场景:一次 Skill 自动挖掘的完整流程

sequenceDiagram
    participant Agent as Claude Code
    participant Hook as Hook 适配器
    participant Core as 共享核心
    participant DL as Deeplake
    participant CLI as 宿主 CLI (claude -p)
    participant FS as 本地文件系统

    Note over Agent: 每隔 20 轮或 SessionEnd 触发

    Hook->>Core: 触发 Skillify Worker
    Core->>DL: 查询最近 10 个 sessions<br/>(新于 watermark)
    DL-->>Core: 返回 session 数据

    Core->>Core: 过滤:仅保留 prompt + assistant text<br/>(丢弃 tool calls / thinking)

    Core->>Core: 组装 gate prompt<br/>+ 现有 skills + 10 条对话 + 决策规则

    Core->>CLI: claude -p haiku --permission-mode bypassPermissions
    CLI-->>Core: JSON verdict: KEEP / MERGE / SKIP

    alt KEEP 或 MERGE
        Core->>FS: 写入 SKILL.md<br/>(<project>/.claude/skills/<name>/)
        Core->>DL: INSERT INTO skills 表<br/>(append-only, 不 UPDATE)
        Core->>Core: 更新 watermark
    else SKIP
        Core->>Core: 更新 watermark, 不写文件
    end

场景:SessionStart 时 auto-pull 技能

sequenceDiagram
    participant Agent as 任意 Agent
    participant Hook as SessionStart Hook
    participant DL as Deeplake
    participant FS as 本地文件系统

    Agent->>Hook: SessionStart 触发
    Hook->>DL: 查询 skills 表(所有作者的最新版本)
    DL-->>Hook: 返回技能列表

    Hook->>FS: 写入 ~/.claude/skills/<name>--<author>/SKILL.md
    Hook->>FS: symlink fan-out<br/>→ ~/.agents/skills/<br/>→ ~/.hermes/skills/<br/>→ ~/.pi/agent/skills/

    Note over Hook: 5 秒超时,失败静默吞掉
    Hook-->>Agent: 完成(不阻塞启动)

数据依据docs/SKILLIFY.md 的 “How a skill is generated” 和 “Auto-pull at SessionStart” 部分。

架构质量评估

质量属性设计手段(引用具体文件/文档)评估潜在风险
可用性5 秒 auto-pull 超时 + 失败静默吞掉(docs/SKILLIFY.md: “All failures are swallowed silently”)★★★★☆静默失败可能导致用户长期不知道技能未同步
可扩展性适配器模式:新 Agent 只需新增 src/hooks/<agent>/ 目录★★★★☆适配器维护成本随 Agent 数量线性增长;不同 Agent 的 hook 能力差异导致功能不一致
可维护性Monorepo + 共享核心(src/)+ TypeScript 强类型 + esbuild 打包★★★★☆6 种 Agent 的 build output 散布在不同目录(claude-code/codex/cursor/ 等),增加 CI 复杂度
性能异步 Worker 不阻塞主循环;本地 Embedding Daemon 可选;BM25 fallback★★★☆☆Shell out 到 CLI 调用 LLM 的延迟较高(vs 直接 API 调用);embedding 依赖 ~600MB 本地模型
安全性TLS + AES-256 at rest;Org/Workspace 存储层隔离;SQL 转义(sqlStr());~70 个白名单内置命令★★★★☆会话数据包含完整 tool input/output,敏感信息(密钥、凭证)可能被捕获;workspace 内所有用户可读所有数据
隐私性HIVEMIND_CAPTURE=false 可关闭;BYOC 支持自有存储;device flow 登录无 token 泄露★★★☆☆默认全量捕获(prompt + tool call + response),敏感操作需主动关闭

架构风险与改进建议

[!danger] 风险点

  1. 全量捕获的隐私风险:默认捕获完整 prompt、tool input/output、assistant response。包括 HIVEMIND_CAPTURE=false 需要用户主动设置,且按 session 级别(无法按工具或内容类型过滤)。依据README.md 的 DATA COLLECTION NOTICE 表格。

  2. Deeplake SQL Quirks:skills 表被迫采用 append-only 策略(从不 UPDATE)来规避 Deeplake 的 “UPDATE-coalescing quirk”。这意味着 skills 表会持续膨胀,清理策略不明确。依据docs/SKILLIFY.md

  3. 宿主 CLI 依赖链:Wiki Worker 和 Skillify Worker 都依赖宿主 Agent 的 CLI 可用。如果用户的 claude CLI 版本不兼容或未安装,这些后台功能静默失败。依据docs/SKILLIFY.md 的 “Per-agent gate CLI” 表格。

  4. 跨项目技能冲突:同一 (name, author) 组合来自不同项目时在磁盘上冲突,后拉取的覆盖先拉取的(虽然保留了 .bak)。依据docs/SKILLIFY.md 的 “Cross-project caveat” 段落。

[!tip] 改进建议

  1. 细粒度捕获控制(优先级:高):增加按工具类型或内容模式的过滤规则(如”不捕获包含 API key 的 tool input”),而非只有全局开关。
  2. Skills 表清理策略(优先级:中):引入 version-based GC,定期清理被 MERGE 替代的旧版本行。
  3. CLI 可用性检测(优先级:中):在 Worker 启动前检查宿主 CLI 是否可用和版本是否兼容,不可用时明确通知用户而非静默失败。
  4. Embedding 状态提示(优先级:低):在搜索结果中标注”语义搜索未启用”提示,避免用户困惑于搜索质量。

可复用架构经验

值得借鉴的模式:

  • 适配器-中枢模式处理生态碎片化(适用条件:需要集成多种异构客户端,且无法控制它们的扩展协议)— src/hooks/ 下每个 Agent 一个适配器,src/ 共享核心。这种模式让 Hivemind 在 Agent 生态快速演化时保持灵活。
  • Shell out 复用宿主 CLI 做 AI 推理(适用条件:工具需要调用 LLM 但不想引入额外 API Key 管理负担)— Wiki Worker 和 Skillify Worker 都通过 claude -p / codex exec 等调用 LLM。用户零配置,代价是延迟和 CLI 可用性依赖。
  • 后台 Worker + Watermark 的增量处理(适用条件:需要从大量历史数据中异步挖掘模式)— Skillify Worker 用 watermark 文件跟踪已处理的 session,每次只处理增量数据。~/.deeplake/state/skillify/<project>.json
  • Symlink Fan-out 实现跨 Agent 技能分发(适用条件:多种工具共享同一套技能文件但各自读取路径不同)— hivemind skillify pull 写入 ~/.claude/skills/ 然后通过 symlink 分发到 ~/.agents/skills/~/.hermes/skills/ 等目录。
  • 静默降级策略(适用条件:可选功能不应阻塞主流程)— Embedding Daemon 不安装时 BM25 fallback;auto-pull 失败时静默跳过;VFS 操作失败时不崩溃。

值得警惕的反模式:

  • 静默吞掉所有错误(出现场景:auto-pull 和 Worker 执行中)— 虽然保证不阻塞,但用户完全无法感知功能是否真正在工作。应该在某处提供”最后同步状态”的可观测性。
  • Append-only 无清理(出现场景:skills 表的写入策略)— 规避了 UPDATE quirk 但引入了数据膨胀,长期运行后需要手动干预或引入 GC 机制。

关联概念

架构风格适配器模式 · 管道-过滤器架构 · 事件驱动架构 技术选型TypeScript · esbuild · Deeplake · tree-sitter 相关项目Claude Code · Hermes Agent · Petals 通用概念RAG · MCP · Agent Memory · Embedding · BM25 · 混合检索 工具笔记Deeplake