<p align="center">
  <strong>OMEM</strong><br/>
  共享记忆，永不遗忘
</p>

<p align="center">
  <a href="https://github.com/ourmem/omem/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-blue.svg" alt="License"></a>
  <a href="https://ourmem.ai"><img src="https://img.shields.io/badge/hosted-ourmem.ai-green.svg" alt="Hosted"></a>
  <a href="https://github.com/ourmem/omem"><img src="https://img.shields.io/github/stars/ourmem/omem?style=social" alt="Stars"></a>
</p>

<p align="center">
  <a href="README.md">English</a> | <strong>简体中文</strong>
</p>

---

## 问题

你的 AI 助手每次对话都失忆 -- 而且各自为战。

- 🧠 **失忆** -- 每次新对话从零开始。偏好、决策、上下文全没了。
- 🏝️ **孤岛** -- 你的代码 Agent 不知道写作 Agent 学到了什么。
- 📁 **绑定设备** -- 记忆存在一台机器上，换设备全部丢失。
- 🚫 **无法共享** -- 团队 Agent 之间知识完全隔绝，每个 Agent 都在重复发现相同的东西。
- 🔍 **笨搜索** -- 只有关键词匹配，没有语义理解，没有相关性排序。
- 🧩 **没有集体智能** -- 即使 Agent 在同一个团队工作，也没有共享的知识层。

**ourmem 解决所有这些问题。**

## ourmem 是什么

ourmem 让 AI Agent 拥有共享的持久记忆 -- 跨会话、跨设备、跨 Agent、跨团队。一个 API Key 重连一切。

🌐 **官网:** [ourmem.ai](https://ourmem.ai)

<table>
<tr>
<td width="50%" valign="top">

### 🧑‍💻 我用 AI 编程工具

安装你平台的插件就行。记忆自动工作 -- 开始对话时自动加载历史记忆，结束时自动保存重要信息。

**→ 跳转到 [快速开始](#快速开始)**

</td>
<td width="50%" valign="top">

### 🔧 我在开发 AI 产品

48+ 个 REST API 端点。Docker 一行命令自部署。把持久记忆嵌入到你自己的 Agent 和工作流中。

**→ 跳转到 [自部署](#自部署)**

</td>
</tr>
</table>

## 核心能力

<table>
<tr>
<td width="25%" align="center">
<h4>🔗 跨越边界共享</h4>
三级空间 -- 个人、团队、组织 -- 让知识在 Agent 和团队之间流动，全程溯源追踪。
</td>
<td width="25%" align="center">
<h4>🧠 永不遗忘</h4>
Weibull 衰减模型智能管理记忆生命周期 -- 核心记忆持久保留，边缘记忆优雅淡出。无需手动清理。
</td>
<td width="25%" align="center">
<h4>🔍 深度理解</h4>
11 阶段混合检索：向量搜索、BM25、RRF 融合、交叉编码重排、MMR 多样性，精准召回。
</td>
<td width="25%" align="center">
<h4>⚡ 智能演化</h4>
7 种协调决策 -- 创建、合并、取代、支持、情境化、矛盾、跳过 -- 让记忆越来越聪明。
</td>
</tr>
</table>

📖 **[记忆管线架构](docs/PIPELINE.md)** -- 深入了解 ourmem 如何存储、检索和演化记忆。

🔗 **[记忆共享架构](docs/SHARING.md)** -- 记忆如何跨 Agent 和团队流动：共享、溯源、版本控制和跨空间搜索。

## 功能一览

| 分类 | 功能 | 详情 |
|------|------|------|
| **平台** | 4 个平台 | OpenCode、Claude Code、OpenClaw、MCP Server |
| **共享** | 空间共享 | 个人 / 团队 / 组织，带溯源追踪 |
| | 溯源追踪 | 每条共享记忆携带完整来源链 |
| | 质量门控自动共享 | 规则在记忆创建时自动触发（异步、非阻塞） |
| | 向量嵌入传播 | 共享副本携带源记忆的向量嵌入，支持完整搜索 |
| | 幂等分享 | 重复分享返回已有副本（不创建重复） |
| | 版本追踪 | 记忆追踪版本计数器，共享副本通过 `?check_stale=true` 检测过时状态 |
| | 刷新过时副本 | 用源记忆最新内容和向量刷新过时的共享副本 |
| | 便捷分享 | 一步跨用户分享（`share-to-user`）和批量分享（`share-all-to-user`），自动创建桥接空间 |
| | 组织管理 | 一步创建组织（`org/setup`）和发布（`org/publish`），支持自动分享规则 |
| | 跨空间搜索 | 一次搜索覆盖所有可访问空间 |
| **摄入** | 智能去重 | 7 种决策：创建、合并、跳过、取代、支持、情境化、矛盾 |
| | 噪声过滤 | 正则 + 向量原型 + 反馈学习 |
| | 准入控制 | 5 维评分门控（效用、置信度、新颖度、时效性、类型先验） |
| | 双流写入 | 同步快速路径（<50ms）+ 异步 LLM 提取 |
| | 导入后智能化 | 批量导入 → 异步 LLM 重新提取 + 关系发现 |
| | 自适应导入策略 | 自动/原子/段落/文档 -- 启发式内容类型检测 |
| | 内容保真 | 保留原始文本，双路径搜索（向量 + BM25 搜索源文本） |
| | 交叉关联 | 通过向量相似度发现记忆间关系 |
| | 批量自去重 | LLM 在同一导入批次内去重事实 |
| | 隐私保护 | `<private>` 标签脱敏 |
| **检索** | 11 阶段管道 | 向量 + BM25 → RRF → 重排 → 衰减 → 重要性 → MMR 多样性 |
| | 用户画像 | 静态事实 + 动态上下文，<100ms |
| | 检索追踪 | 每阶段可解释性（输入/输出/分数/耗时） |
| **生命周期** | Weibull 衰减 | 按层级 β 值（核心=0.8、工作=1.0、边缘=1.3） |
| | 三层晋升 | 边缘 ↔ 工作 ↔ 核心，基于访问频率晋升 |
| | 自动遗忘 | 时间引用检测（"明天"、"下周"）自动设 TTL |
| **多模态** | 文件处理 | PDF、图片 OCR、视频转录、代码 AST 分块 |
| | GitHub 连接器 | Webhook 实时同步代码、Issue、PR |
| **部署** | 开源 | Apache-2.0 |
| | 可自部署 | 单二进制、Docker 一行命令、~$5/月 |
| | musl 静态编译 | 零依赖二进制，任何 Linux x86_64 可运行 |
| | 对象存储 | AWS S3 或任何 S3 兼容存储，支持 IAM 角色 |
| | 托管版 | ourmem.ai -- 无需部署 |

## 从孤立 Agent 到集体智能

大多数 AI 记忆系统把知识困在孤岛里。ourmem 的三级空间架构让知识在 Agent 和团队之间流动 -- 带溯源追踪和质量门控的共享机制。

> *研究表明，协作记忆可以减少高达 61% 的重复工作 -- Agent 不再重新发现队友已经知道的东西。*
> — Collaborative Memory, ICLR 2026

| | 个人空间 | 团队空间 | 组织空间 |
|---|---------|---------|---------|
| **范围** | 一个用户的多个 Agent | 多个用户 | 全公司 |
| **例子** | 代码 + 写作 Agent 共享偏好 | 后端团队共享架构决策 | 技术标准、安全策略 |
| **权限** | 仅所有者的 Agent | 团队成员 | 全组织（只读） |

**溯源追踪共享** -- 每条共享记忆携带完整来源链：谁共享的、什么时候、从哪里来。共享副本包含源记忆的向量嵌入，在目标空间中可通过向量搜索完整检索。

**质量门控自动共享** -- 按重要性、类别、标签过滤。规则在新记忆创建时自动触发。只有高价值洞察才能跨空间传播。

## 工作原理

```
┌──────────────────────────────────────────────────────────────────┐
│   你的 AI Agent（OpenCode / Claude Code / OpenClaw / Cursor）     │
│                                                                  │
│   会话开始 → 自动召回相关记忆                                       │
│   工作中   → 关键词检测触发召回                                     │
│   会话结束 → 自动捕获决策、偏好、事实                                │
└───────────────────────────┬──────────────────────────────────────┘
                            │ REST API（X-API-Key）
                            ▼
┌──────────────────────────────────────────────────────────────────┐
│                       ourmem 服务端                               │
│                                                                  │
│  ┌─ 智能摄入 ─────────────────────────────────────────────────┐  │
│  │  消息 → LLM 提取 → 噪声过滤 → 准入控制                      │  │
│  │  → 7 种协调决策（创建 / 合并 / 取代 /                        │  │
│  │    支持 / 情境化 / 矛盾 / 跳过）                             │  │
│  │  → 交叉关联发现 → 隐私脱敏                                   │  │
│  └────────────────────────────────────────────────────────────┘  │
│                                                                  │
│  ┌─ 混合检索（11 阶段）──────────────────────────────────────┐  │
│  │  向量 + BM25 → RRF 融合 → 交叉编码重排                      │  │
│  │  → Weibull 衰减加权 → 重要性评分                             │  │
│  │  → MMR 多样性 → 并行跨空间聚合                               │  │
│  └────────────────────────────────────────────────────────────┘  │
│                                                                  │
│  ┌─ 共享引擎 ─────────────────────────────────────────────────┐  │
│  │  个人 / 团队 / 组织空间                                      │  │
│  │  → 溯源追踪 → 基于版本的过时检测                              │  │
│  │  → 自动共享规则 → 一步跨用户分享                              │  │
│  └────────────────────────────────────────────────────────────┘  │
│                                                                  │
│  ┌─ 生命周期 ─────────────────────────────────────────────────┐  │
│  │  Weibull 衰减（核心 β=0.8 / 工作 β=1.0 / 边缘              │  │
│  │  β=1.3）→ 三层晋升 → 自动遗忘 TTL                           │  │
│  └────────────────────────────────────────────────────────────┘  │
└──────────────────────────────────────────────────────────────────┘
```

- **写一次，到处召回** — 记忆跨会话、跨设备、跨 Agent 持久存在
- **越用越聪明** — 协调机制自动合并、更新和标记矛盾记忆
- **跨越边界共享** — 个人 → 团队 → 组织的知识流动，全程溯源
- **无需手动管理** — Weibull 衰减处理生命周期，自动共享规则处理分发

## 核心概念

### API Key = 租户 ID = 你的身份

创建租户时，返回的 `id` **就是**你的 API Key。它们是同一个 UUID，没有独立的"租户 ID"。

```bash
curl -X POST https://api.ourmem.ai/v1/tenants -d '{"name": "alice"}'
# → {"id": "a1b2c3d4-...", "api_key": "a1b2c3d4-...", "status": "active"}
#          ↑ 同一个值 ↑
```

### API Key 与 Space ID 的区别

| 概念 | 说明 | 示例 | 数量 |
|------|------|------|------|
| **API Key** | 你的身份标识。放在 `X-API-Key` 请求头中。 | `a1b2c3d4-...` | 每用户 1 个 |
| **Space ID** | 记忆存储地址。每个 Space 是一个独立的数据库。 | `personal/a1b2c3d4-...` | 每用户多个 |

一个 API Key 拥有多个 Space：

```
API Key "a1b2c3d4"
  │
  ├── personal/a1b2c3d4     ← 自动创建，你的私有记忆
  ├── team/e5f6g7h8          ← 你创建的团队空间（你是管理员）
  ├── team/i9j0k1l2          ← 你被邀请加入的团队空间（你是成员）
  └── org/m3n4o5p6           ← 你加入的组织（你是只读）
```

### 分享 = 传递对方的 API Key

分享记忆给另一个用户时，把对方的 API Key 作为 `target_user` 传入：

```bash
# 把你的所有偏好分享给用户 Bob
curl -X POST https://api.ourmem.ai/v1/memories/share-all-to-user \
  -H "X-API-Key: your-api-key" \
  -d '{"target_user": "bobs-api-key", "filters": {"categories": ["preference"]}}'
```

系统自动在你和 Bob 之间创建桥接 Team Space，无需手动管理空间。

## 快速开始

### Agent 安装（推荐）

告诉你的 AI 助手一句话，它会自动完成所有操作 -- 创建 API Key、安装插件、配置、验证。

**托管版（ourmem.ai -- 无需部署）：**

| 平台 | 复制给你的 Agent |
|------|-----------------|
| **OpenClaw** | `Read https://ourmem.ai/SKILL.md and follow the instructions to install and configure ourmem for OpenClaw` |
| **Claude Code** | `Read https://ourmem.ai/SKILL.md and follow the instructions to install and configure ourmem for Claude Code` |
| **OpenCode** | `Read https://ourmem.ai/SKILL.md and follow the instructions to install and configure ourmem for OpenCode` |
| **Cursor / VS Code** | `Read https://ourmem.ai/SKILL.md and follow the instructions to install and configure ourmem as MCP Server` |

**自部署版（你自己的服务器）：**

| 平台 | 安装方式 |
|------|---------|
| **OpenClaw** | 运行 `openclaw skills install ourmem`，然后告诉 Agent：`setup ourmem in self-hosted mode` |
| **Claude Code** | `Read https://raw.githubusercontent.com/ourmem/omem/main/skills/ourmem/SKILL.md and install ourmem for Claude Code, self-hosted mode` |
| **OpenCode** | `Read https://raw.githubusercontent.com/ourmem/omem/main/skills/ourmem/SKILL.md and install ourmem for OpenCode, self-hosted mode` |

就这样。Agent 会处理剩下的一切。

**Skill 安装（替代方式）：**

如果你更喜欢命令行安装，可以直接安装 ourmem skill：

```bash
npx skills add ourmem/omem --skill ourmem -g
```

支持 44+ AI Agent，包括 Claude Code、OpenCode、Cursor 等。详见 [Vercel Skills CLI](https://github.com/vercel-labs/skills)。

---

<details>
<summary><b>手动安装</b>（不通过 Agent）</summary>

### 1. 获取 API Key

**托管版：**

```bash
curl -sX POST https://api.ourmem.ai/v1/tenants \
  -H "Content-Type: application/json" \
  -d '{"name": "my-workspace"}' | jq .
# → {"id": "xxx", "api_key": "xxx", "status": "active"}
```

**自部署版：**

```bash
docker run -d -p 8080:8080 -e OMEM_EMBED_PROVIDER=bedrock ghcr.io/ourmem/omem-server:latest
curl -sX POST http://localhost:8080/v1/tenants \
  -H "Content-Type: application/json" \
  -d '{"name": "my-workspace"}' | jq .
```

保存返回的 `api_key` -- 用它可以从任何设备重连到同一份记忆。

### 2. 安装插件

**OpenCode:** 在 `opencode.json` 中添加 `"plugin": ["@ourmem/opencode"]` + 在同文件中通过 `plugin_config` 配置 `apiUrl` 和 `apiKey`。

**Claude Code:** `/plugin marketplace add ourmem/omem` + 在 `~/.claude/settings.json` 设环境变量。

**OpenClaw:** `openclaw plugins install @ourmem/ourmem` + 配置 `openclaw.json` 中的 apiUrl 和 apiKey。

**MCP (Cursor / VS Code / Claude Desktop):**

```json
{
  "mcpServers": {
    "ourmem": {
      "command": "npx",
      "args": ["-y", "@ourmem/mcp"],
      "env": {
        "OMEM_API_URL": "https://api.ourmem.ai",
        "OMEM_API_KEY": "your-api-key"
      }
    }
  }
}
```

### 3. 验证

```bash
curl -sX POST "$OMEM_API_URL/v1/memories" \
  -H "X-API-Key: $OMEM_API_KEY" -H "Content-Type: application/json" \
  -d '{"content": "I prefer dark mode", "tags": ["preference"]}'

curl -s "$OMEM_API_URL/v1/memories/search?q=dark+mode" -H "X-API-Key: $OMEM_API_KEY"
```

</details>

## Agent 获得的能力

### 记忆工具

| 工具 | 用途 |
|------|------|
| `memory_store` | 保存事实、决策、偏好，智能去重 |
| `memory_search` | 11 阶段混合搜索（向量 + BM25 + 重排） |
| `memory_get` | 按 ID 获取特定记忆 |
| `memory_update` | 修改内容、标签、重要性、层级 |
| `memory_delete` | 删除记忆 |
| `memory_list` | 浏览记忆，支持过滤和分页 |
| `memory_ingest` | 智能摄入完整对话（LLM 提取） |
| `memory_profile` | 自动生成用户画像（静态事实 + 动态上下文） |
| `memory_stats` | 分析：标签分布、衰减曲线、关系图谱 |

### 共享工具

| 工具 | 用途 |
|------|------|
| `space_create` | 创建团队或组织空间 |
| `space_list` | 列出所有可访问的空间 |
| `space_add_member` | 邀请用户加入共享空间 |
| `memory_share` | 将记忆分享到任意空间，带溯源 |
| `memory_pull` | 将共享记忆拉取到个人空间 |
| `memory_reshare` | 用最新内容刷新过时的共享副本 |

> **便捷 API：** `share-to-user`（一步跨用户分享，自动创建桥接空间）和 `share-all-to-user`（批量分享）。MCP 提供 15 个工具 + 1 个资源。OpenCode/OpenClaw 提供 11 个工具 + 3 个钩子。

### 智能钩子

| 钩子 | 触发时机 | 效果 |
|------|---------|------|
| **SessionStart** | 新会话开始 | 近期记忆 + 用户画像自动注入上下文 |
| **KeywordRecall** | 会话中检测到关键词 | 相关记忆自动浮现，无需显式搜索 |
| **SessionEnd** | 会话结束 | 关键决策、偏好和事实自动捕获 |
| **Compaction** | 上下文窗口压缩 | 关键记忆跨压缩边界保留 |

## Memory Space

在 **[ourmem.ai/space](https://ourmem.ai/space)** 可视化浏览、搜索和管理你的 Agent 记忆 -- 查看记忆如何连接、演化和衰减。

## 安全与隐私

| | |
|---|---|
| **Rust 内存安全** | 无 GC、无数据竞争。所有权模型编译时保证安全。 |
| **租户隔离** | X-API-Key 认证 + 查询级租户过滤。每个操作验证归属。 |
| **隐私保护** | `<private>` 标签脱敏，存储前自动剥离敏感内容。 |
| **传输加密** | 全部 API 通过 HTTPS 传输。S3 服务端静态加密。 |
| **准入控制** | 5 维评分门控，低质量数据拒绝入库。 |
| **开源可审计** | Apache-2.0 许可。审计每一行代码，fork 它，运行你自己的实例。 |

## 自部署

```bash
# 最小化（仅 BM25 搜索，无需 embedding API）
docker run -d -p 8080:8080 ghcr.io/ourmem/omem-server:latest

# 使用 Bedrock embedding（推荐，需要 AWS 凭证）
docker run -d -p 8080:8080 \
  -e OMEM_EMBED_PROVIDER=bedrock \
  -e AWS_REGION=us-east-1 \
  ghcr.io/ourmem/omem-server:latest

# 使用 OpenAI 兼容 embedding
docker run -d -p 8080:8080 \
  -e OMEM_EMBED_PROVIDER=openai-compatible \
  -e OMEM_EMBED_API_KEY=sk-xxx \
  ghcr.io/ourmem/omem-server:latest
```

完整部署指南：[docs/DEPLOY.md](docs/DEPLOY.md)

### 对象存储（可选）

默认情况下 ourmem 将数据存储在本地磁盘。如需持久化和可扩展性，可配置 AWS S3 或任何 S3 兼容的对象存储：

```bash
# 添加到你的环境变量
OMEM_S3_BUCKET=your-bucket            # 启用 s3:// 方案
AWS_ENDPOINT_URL=https://s3.amazonaws.com
AWS_REGION=us-east-1

# 替代方案：OSS 兼容存储
OMEM_OSS_BUCKET=your-bucket           # 启用 oss:// 方案
OSS_ENDPOINT=https://oss-xx-internal.aliyuncs.com
OSS_ACCESS_KEY_ID=your-ak             # 或使用 ECS RAM 角色（自动发现）
OSS_ACCESS_KEY_SECRET=your-sk
```

> 如果同时设置了 `OMEM_S3_BUCKET` 和 `OMEM_OSS_BUCKET`，OSS 优先。

## 从源码构建

### 两种构建模式

| 模式 | 命令 | 二进制 | Bedrock | 运行环境 |
|------|------|--------|---------|---------|
| **glibc（完整版）** | `cargo build --release` | 动态链接，~218MB | ✅ AWS Bedrock | 与构建主机相同 glibc 版本 |
| **musl（便携版）** | 见下方 | 静态链接，~182MB | ❌ 仅 OpenAI 兼容 | **任何 Linux x86_64** |

### glibc 构建（支持 Bedrock）

```bash
cargo build --release -p omem-server
# 二进制：target/release/omem-server
# 要求：目标机器有相同或更新版本的 glibc
```

### musl 静态构建（便携，零依赖）

单个二进制文件，可在**任何 Linux x86_64** 上运行 -- 不需要 glibc，不需要任何库。

```bash
rustup target add x86_64-unknown-linux-musl

RUSTFLAGS="-C target-feature=+crt-static -C relocation-model=static" \
  cargo build --release --target x86_64-unknown-linux-musl \
  -p omem-server --no-default-features

# 二进制：target/x86_64-unknown-linux-musl/release/omem-server
# 静态链接，到处可运行
```

> **注意：** musl 构建使用 `--no-default-features`，不包含 AWS Bedrock 支持。请改用 `OMEM_EMBED_PROVIDER=openai-compatible`（如 DashScope、OpenAI）。原因是 `aws-lc-sys`（AWS 加密库）在 musl 静态链接时因 `dlopen(NULL)` 不兼容而崩溃（[aws-c-cal#213](https://github.com/awslabs/aws-c-cal/issues/213)），且 Rust 默认的 `static-pie` 输出在 musl-gcc 下会段错误（[rust-lang/rust#95926](https://github.com/rust-lang/rust/issues/95926)）。

### 传输到任意服务器

```bash
# 压缩
gzip -c target/x86_64-unknown-linux-musl/release/omem-server > omem-server.gz

# 复制到服务器
scp omem-server.gz user@server:/opt/

# 运行（无需任何依赖）
ssh user@server "gunzip /opt/omem-server.gz && chmod +x /opt/omem-server && /opt/omem-server"
```

## API 概览

| 方法 | 端点 | 说明 |
|------|------|------|
| POST | `/v1/tenants` | 创建工作空间，获取 API Key |
| POST | `/v1/memories` | 存储记忆或智能摄入对话 |
| GET | `/v1/memories/search` | 11 阶段混合搜索 |
| GET | `/v1/memories` | 列表查询，支持过滤和分页 |
| GET | `/v1/profile` | 自动生成的用户画像 |
| POST | `/v1/spaces` | 创建共享空间 |
| POST | `/v1/memories/:id/share` | 分享记忆到空间 |
| POST | `/v1/files` | 上传 PDF / 图片 / 视频 / 代码 |
| GET | `/v1/stats` | 分析与洞察 |

完整 API 参考（48+ 个端点）：[docs/API.md](docs/API.md)

## 文档

| 文档 | 说明 |
|------|------|
| [docs/API.md](docs/API.md) | 完整 REST API 参考 |
| [docs/PIPELINE.md](docs/PIPELINE.md) | 记忆管线架构 -- 存储、检索和插件集成流程 |
| [docs/SHARING.md](docs/SHARING.md) | 记忆共享架构、流程和教程 |
| [docs/DEPLOY.md](docs/DEPLOY.md) | Docker 与 AWS 部署指南 |
| [docs/PLUGINS.md](docs/PLUGINS.md) | 4 个平台的插件安装指南 |
| [docs/TWEETCLAW_OPENCLAW.md](docs/TWEETCLAW_OPENCLAW.md) | OpenClaw 工作流：将 TweetClaw X/Twitter 研究决策存入 ourmem |
| [skills/ourmem/SKILL.md](skills/ourmem/SKILL.md) | AI Agent 入门技能 |

## 许可证

Apache-2.0

---

<p align="center">
  <strong>共享记忆，永不遗忘。</strong><br/>
  <a href="https://ourmem.ai">ourmem.ai</a> · <a href="https://github.com/ourmem/omem">GitHub</a>
</p>
