内容
<h1 align="center">OpenPersona</h1>
<p align="center">
<b>一款为您记忆人际关系的AI。</b>
</p>
<p align="center">
开源、AI原生的关系记忆层 —<br/>
跨越 <b>iMessage</b> · <b>WhatsApp</b> · <b>Telegram</b> · <b>微信</b> · <b>Slack</b> · <b>Gmail</b> ·<br/>
以及您正在使用的任何聊天工具。
</p>
<p align="center">
<code>v0.4.5</code> · macOS · <b>私人测试版</b> · 公开源码 ~v0.5
</p>
---
## 为什么存在
我构建了一个功能墓地。
两周前,OpenPersona 是一个 *"本地优先的承诺图"* — 从您的即时通讯历史中提取每个承诺、事实和事件到一个可查询的数据库,然后可视化它。我构建了
30+ 个命令行命令。5 个仪表盘视图(今日 / 收件箱 / 网格 / 自我视图 / 搜索)。5 个
收集器。一个 launchd 守护进程。一个菜单栏应用。一个 15 工具的 MCP 服务器。SvelteKit + FastAPI +
SQLite + Markdown 往返。700+ 测试。它在纸面上看起来很漂亮。
但我几乎没用过它。
两周的试用期很短,但信号已经很明显:在 30+ 个命令行命令中,我只使用了 4 个。我从未主动打开收件箱或网格视图。在 200 个提取的承诺中,一半是噪音。
产品的最大缺陷是 **作者没在使用它**。
问题不是质量,而是 **类别**。我构建了一个 SaaS 风格的 CRM,用于不适合 SaaS 形态的工作。真实的关系不是表格中的承诺和事实 —
它们是关注、质地、时间。每天打开仪表盘的模式是健康应用和商业智能工具的墓地。我直接陷入了这个陷阱。
所以我删除了半个代码库,并将框架调整了。数据层保持不变(SQLite +
Markdown 往返是值得保留的部分)。其他一切都围绕一句话重建:
> **OpenPersona 不要求您打开它。它为您记忆人际关系。**
产品现在大部分是隐形的。它存在于您已经使用的界面中:
- 您的 **锁屏** — 一行文字,一瞥全天
- 您的 **推送通知** — 语音匹配,AI 编写,只有在需要时
- 您的 **Apple 日历事件描述** — 会议前自动注入简介
- 一个 **自然语言聊天快捷键** (⌘⇧Space)— 询问任何关于任何人的问题
仪表盘仍然存在作为备份。它们默认隐藏。**如果您发现自己每天打开这个应用,我的工作就失败了。**
---
## 它能做什么
四个界面。这就是产品。
### 🔒 锁屏小工具
一行文字在您的锁屏上。 *"Maya · 静默 21 天。"* *"Vincent 在 14:00。"*
一览无余。持续更新。原生 macOS WidgetKit (Swift)。
### 📱 推送通知
产品在需要说话时会说话。
- **早晨推送(8 点)** — *"今日 · 3 件事。"* 具体、可行、确定性排名。
- **会议前简报(5 分钟前)** — *"Vincent @ Cathay · 上次通话 9 天 · '介绍 Eileen' 开放。"*
- **漂移检测** — 当内部关系超过您的基准沉默时。
每个通知都是 **语音匹配** 的:由 AI 以您的语气编写,按收件人生成,
绝非模板化。轻触一下即可显示通过平台原生应用发送的草稿回复。
### 📅 Apple 日历事件自动准备
对于任何具有已知人员的行历事件,OpenPersona 会在 **事件描述字段** 中写入会议前简报,提前 N 小时。您打开 Calendar.app(您现有的工作流程);简报已经在那里。无需检查新应用。无需记住标签。
### 🔍 自然语言聊天(⌘⇧Space)
全局快捷键打开一个 LLM 聊天,锚定在您的关系图上。询问任何问题:
```
> 谁在 Cathay?
> Bob 上周关于什么说了些什么?
> 以我的语气草拟给 Maya 的回复
> 我这个星期应该联系谁?
```
取代所有传统的搜索栏、筛选器和仪表盘查询。
---
## 数据来源
OpenPersona 从您实际使用的即时通讯平台读取对话。
| 平台 | 即时 API | 离线导出 | 备注 |
|---|---|---|---|
| **iMessage** | ✅ 交付中 | — | 直接 `chat.db` 读取 · SMS 垃圾邮件过滤 · 服务感知 |
| **微信** | ✅ 交付中 | — | 通过 [`wechat-cli`](https://github.com/Chen17-sq/wechat-cli) 子进程 |
| **WhatsApp** | 测试版(`wacrawl`) | ✅ 交付中 | `OPENPERSONA_WHATSAPP_EXPORT_DIR` 用于导出聊天 .txt |
| **Telegram** | 测试版(Telethon) | ✅ 交付中 | `OPENPERSONA_TELEGRAM_EXPORT_JSON` 用于桌面导出 |
| **Gmail** | ✅ 交付中(IMAP + OAuth) | — | `op auth gmail` 运行循环流程;API + IMAP 路径均活跃 |
| **Outlook** | 测试版(Microsoft Graph) | ✅ 交付中 | `OPENPERSONA_OUTLOOK_EML_DIR` 用于 .eml 目录 |
| **Slack** | — | ✅ 交付中 | `OPENPERSONA_SLACK_EXPORT_DIR` 用于 `slackdump` / 工作区导出 |
| **Discord** | — | ✅ 交付中 | `OPENPERSONA_DISCORD_EXPORT_DIR` 用于官方导出或 DiscordChatExporter JSON |
| **Apple 健康** | — | ✅ 交付中 | 导出 ZIP → `health:*` 事实在 `me` (`op apple-health-sync`) |
| **您的平台** | 🤝 随时 | 🤝 随时 | [收集器协议](docs/architecture.md) — 3 种记录类型,2 种功能,发送 PR |
> **诚实现实栏目** (paperboy P2 #31):"交付中" 指代码路径用合成夹具运行端到端。测试版标记的实时路径需要用户令牌/桌面二进制安装 + 实际帐户来验证;它们是代码完整但仅 iMessage + 微信由维护者针对真实数据每天进行测试。运行 `op collectors-status` 查看您的机器上连接了什么。
收集器层是 **一个协议** — 三种记录类型(`Source`、`Message`、`Event`),两个实现函数(`iter_messages`、`iter_events`)。任何发出消息的东西都可以插入。每个新的收集器都会丰富每个 OpenPersona 用户的图表;我们在上面的层面上竞争。
---
## 诚实:成本、隐私、我们发送给哪个 AI
OpenPersona 是本地优先的 **存储**。LLM 提取调用您选择的云提供商。
- **存储**:您的图表中的每个字节都保留在您的 Mac 上。SQLite + 每人 Markdown,
`0700` 目录权限,原子写入。
- **LLM 调用**:每条消息提取都会将消息文本发送到您配置的提供商(默认为 DeepSeek,支持 OpenAI / Anthropic / Ollama)。
- **成本** (DeepSeek V4 Flash,默认):大约 **$0.50–$5 每月**,取决于即时通讯量 + AI 原生深度(会议前简报、语音匹配推送、每周人物刷新)。
- **完全本地模式** *(实验性 - 参见警告)*:传递 `--local-only` 以通过 Ollama(Qwen 32B 或类似)路由所有内容。您的数据永远不会离开您的 Mac。
现实世界的权衡(审计 P2 #52):
- **硬件**:Qwen 32B 使用约 32GB RAM。建议 M3+。
- **速度**:30 天微信提取 = 4–6 小时 vs 云上约 5 分钟。
- **质量**:中文承诺提取精度下降约 20% vs DeepSeek;请先在您的数据上验证。
- **推荐用例**:法律 / 医疗 / 金融背景对话。路线图上有混合模式(语音本地,云提取)。
- **敏感内容过滤器**:信用卡、OTP 代码、密码格式在任何 LLM 看到它们之前在收集器层被丢弃。
- **每人开关 + 批量忘记**:`op forget --person <id>` 原子移除一个人在所有表中的记录,并进行审计日志。
**姿态(私人测试版)**:90+ 传递依赖项中无 0 CVEs · `bandit` 基线清理 · 每 commit 均通过 `ruff` 绿色校验 · **1015 个单元测试**,涵盖收集器 / 提取器 / 存储 / API / MCP / CLI / 代理层 / SPA / CSP / 内联编辑 / 小工具 xcodeproj / 架构索引审计 / Gmail OAuth 流 / MCP 写门 / 架构版本控制 / 微信群分类 / 变更检测 / 锁屏小工具质量门 / a11y 边界 / Markdown 往返 / 冷启动注意力得分基线。完整威胁模型随 alpha 包发布;当源码公开时移至 `docs/security.md`。
> **测试范围诚实** (paperboy P2 #33):1015 为单元 + 集成测试,带有模拟 LLM。真实数据烟雾(DeepSeek 调用 + 实际 chat.db + EventKit + Swift 小工具)由维护者手动测试 - 不在 CI 中。添加 e2e 夹具的 PR 非常受欢迎。
---
## 试用 - 私人测试版用户
如果您有私人测试版邀请,您会收到一个 `.whl` 和一个 `install.sh` — 将两者放入一个文件夹,运行:
```bash
bash install.sh
op quickstart
```
在 `quickstart` 完成后的 30 秒内,您将收到您的第一个推送。
日常命令(`op --help` 中的完整命令集):
| 命令 | 功能 |
|---|---|
| `op remember` | 运行提取(增量 - 仅拾取新消息) |
| `op recall <person>` | 按需生成某人的简介 |
| `op forget --person <id>` | 跨所有表的原子删除 |
| `op merge <src> <dst>` | 当实体解析拆分一个实体时合并两个人物行 |
| `op dedupe` | 查找和合并重复的人物 / 承诺 |
| `op clean` | 从图表中清除噪音 |
| `op doctor` | 全面的就绪诊断 |
对于 Claude Desktop / Cursor 集成:
```bash
op mcp # stdio MCP 服务器 - 参见 docs/mcp.md
```
---
## 对于开发者 - OpenPersona 作为一个层
OpenPersona **不仅是一个产品,也是一个层,其他人可以集成**。主要有三种集成方式:
### MCP(推荐用于 AI 代理)
MCP 服务器(**17 种工具** - 8 种读取 + 6 种写入 + 1 种简介合成 + 2 种存档)为 Claude Desktop / Cursor / 任何 MCP 兼容的代理提供直接访问您的关系图 + 本地即时通讯消息库 via stdio。参见 [`docs/mcp.md`](docs/mcp.md)。
### HTTP API(Agent Native,用于其他所有)
| 端点 | 用途 |
|---|---|
| `GET /api/changes?since=<iso>` | 从游标开始轮询变更馈送 |
| `GET /api/messages?person_id=…` | 查询 **本地即时通讯存档** - 无需重新拉取 chat.db 读取完整历史 |
| `GET /api/schema/{entity}` | 每个实体的 JSON 架构,用于代码生成 |
| `POST /api/webhooks` | 注册回调 URL - 激活递送守护进程 |
| `POST /api/bulk/promises` | 多行插入,带有重试安全的 `idempotency_key` |
| `GET /api/openapi.json` | 完整的 OpenAPI 3.1 规范 |
| `GET /api/docs` | 交互式 Swagger UI |
### 收集器协议(用于新 IM 平台)
三种记录类型,两个实现函数。任何发出消息的东西都可以插入。参见
[`docs/architecture.md`](docs/architecture.md)。
---
## 为什么是私人测试版 - 以及是什么使其公开
目前源码是封闭的,因为 v1 轴仍在积极飞行。形状稳定在 **~v1.1** (~1 个月),届时本 README 的存储库将开放。
是什么限制了它:
- **v1 界面的真实数据验证** - 会议前简报 / 推送语音 / 聊天快捷键需要一周的某人的真实 iMessage + 微信历史来调优。封闭的 alpha 让我可以在不更改公共提交日志的情况下迭代。
- **锁屏小工具** - Swift / WidgetKit 工作正在进行中。v0.4 提供了 Xcode 项目生成器(`op widget-xcodeproj`);签名 / notarisation 是剩余的门槛。
- **Gmail OAuth 完成** - IMAP 路径在 v0.4 中交付;OAuth 刷新令牌流程是完整 Gmail API 的润色门槛。WhatsApp / Telegram / Outlook / Slack / Discord 都已交付 v0.4 离线导出路径。
已公开的内容:
- 此存储库(`Chen17-sq/OpenPersona`)跟踪 **策略 + 路线图 + 联系方式**。 [`docs/`](docs/) 中的所有内容都是真实且最新的。
- [@Chen17-sq](https://github.com/Chen17-sq) 的公共贡献图上的每日提交可见(私人存储库提交表面)。
受限的是真实数据验证,而不是构建本身。**当提取器针对某人的真实 iMessage / 微信 / Gmail 历史一周的数据成立时,源码将开放。**
### 想要早期访问?
- **电子邮件** - [schen.aldrich@gmail.com](mailto:schen.aldrich@gmail.com) 附上一行关于您如何使用它的说明
- **LinkedIn** - [Aldrich Chen](https://www.linkedin.com/in/aldrich17siqi/)
- **微信** - `18574843907` (提及 OpenPersona)
- **在此处开启一个问题** 描述您的用例 - 我阅读每个问题,它塑造了 v1.1 版本
---
## 架构
```
surface 锁屏小工具(Swift,v0.4 xcodeproj 生成器) · 推送(macOS 原生) ·
日历事件注入 · ⌘⇧Space 聊天快捷键 · 人物页面(Bauhaus,默认隐藏) ·
MCP 服务器(17 种工具)
intelligence 流式提取(每条消息的 LLM 判断) · 每人语气校准 ·
语音匹配 AI 推送生成 · 行为推理(最后联系,节奏,漂移) ·
隐含反馈观察器(工作流拦截,无按钮) ·
Wave E 联系人元数据(生物 / 关系 / 偏好 / 标签 / 日期 / 学校)
persona SQLite + 每人 Markdown - 原子,可锁定,可 git-diff 安全,往返安全 ·
原始消息存档(每条消息持久化,代理通过 /api/messages 或 MCP query_messages 查询) ·
内圈持久化层(top-20 / next-30,每晚根据注意力得分重新计算)
────── 收集器协议 ──────
collectors iMessage · 微信 · WhatsApp(实时 + 离线) · Telegram(实时 + 离线) ·
Gmail(IMAP + API 存根) · Outlook(Graph + .eml) · Slack(离线) · Discord
(离线) · Apple 健康(导出 ZIP) · macOS 日历(双向) ·
iCal URL(Google / iCloud / Outlook) · 您自己的
我们从对话中提取结构化行。 我们 **不** 捕获屏幕,OCR 图像,
或转录音频 - 它们通过收集器协议插入。 带上您自己的会议 AI 或可穿戴设备。
MCP 服务器通过 API 将图暴露给 Claude Desktop / Cursor / 任何 MCP 兼容的代理 -
询问 *"我对 Bob 承诺了什么?* 不需要离开聊天。 参见 [`docs/mcp.md`](docs/mcp.md)
用于工具清单。
## 路线图
| | 内容 | 状态 |
|---|---|---|
| **v0** *(已废弃)* | 5 个仪表盘界面 · Promise Grid · 日历推送/拉取 · 收件箱编辑 · 15 工具 MCP · 自动提取守护进程 | 被 v0.1 版本取代 |
| **v0.1** | Pivot — 锁定小部件管道 · 推送 · 日历注入 · 聊天热键后端 · 流式提取 · 承诺强度三层 · AI 叙述的肖像 · 语音匹配草稿 · 观察者 + 相关性 | 已发布 |
| **v0.2** *(当前,私有 alpha 版本)* | UX 润色(Toast / EmptyState / `?` / 乐观 UI / 个人页面 Svelte 重写)· 设置向导 + 源表格 · `op morning-push` 守护进程 · 终端通知后端 · **Agent 原生 HTTP API**(/changes, /schema, /webhooks, /bulk + 幂等性)· 状态横幅 · **主模式**(审计面板 · 冲突检测 · 陈旧评分 · `op identity-merge` 跨源电话匹配 · 组 + group_members 架构 · 冲突解决端点,附带主审 UI) | 已发布 |
| **v0.3** *(已发布)* | **原始消息存档**(持久本地 IM 数据集)· `op backfill` 用于完整历史拉取 · `/api/messages` 代理检索 · `op storage` 报告 · 网络钩子投递守护进程(v0.2 注册现在触发)· Ollama 本地模式(`op setup --only ollama`)· 群聊 LLM 提取(主题 / 会议组织者 / 潜水者 / 互相介绍) | 已发布 |
| **v0.4** *(已发布)* | **Wave E 联系人元数据提取器**(生物 / 关系 / 偏好 / 标签 / 日期 / 学校 / 备注,附带幻觉防护)· **核心圈层级持久性**(前 20 名核心 / 后 30 名密切,基于 `attention_score`,每日 04:00 重新计算)· **个人页面原始消息查看器**(延迟加载的存档时间线)· **MCP 存档工具**(`query_messages` + `message_archive_stats`,用于外部代理)· **6 条新的收集器离线路径**(WhatsApp 导出聊天 .txt / Telegram 结果.json / Gmail IMAP / Outlook .eml 目录 / Slack 导出 / Discord 导出)· **架构索引审计**(+6 个热点索引)· **Apple Health 同步 CLI**(`op apple-health-sync`)· **小部件 xcodeproj 生成器**(`op widget-xcodeproj`) | 已发布 |
| **v0.4.1** *(已发布)* | Wave E **接入每周周期**(周日 04:30,基于核心圈层)· `op metadata-extract` / `op tier-recompute` / `op doctor-schema` / `op collectors-status` CLI 命令 · **Gmail OAuth** 端到端(`op auth gmail` 运行循环流程;Gmail API 路径上线,标准库仅 — 无 `google-auth-oauthlib` 依赖)· IMAP 分页 + 最大线程警告 · `scripts/publish-pypi.sh`,附带预检 CHANGELOG 检查 | 已发布 |
| **v0.4.2** *(已发布)* | 外部审计第 1 轮:**微信 `@chatroom` 群组检测**(16k 消息的根本原因,所有聊天种类均为“私人”)· 提交管道 **质量底线**(丢弃 `what` < 5 个字符,无时间意图,审计精选拒绝集)· **噪音人群正则表达式**(捕获 `刚刚` / `吴+` / 测试装置泄漏 / 嵌入式群组提示)· **MCP 写入工具安全门**(`OPENPERSONA_MCP_WRITES_REQUIRE_REVIEW=1` 直接写入短路;审计日志法医跟踪始终开启)· **专用守护进程写入连接**(`db.daemon_writer()`,附带显式 BEGIN IMMEDIATE)· **架构版本框架**(`schema_versions` + 线性迁移) | 已发布 |
| **v0.4.3** *(已发布)* | 外部审计第 2 轮:**锁定屏幕小部件质量门**(≥1 个事实 + 层级偏好;不再在英雄界面显示零上下文占位符名称)· **摄入时间噪音过滤器**(在 `raw_messages.upsert` 和自动提取前检查 BROADCAST_BLOCKLIST,然后调用 LLM)· **从原始消息进行语音校准**(真实对话,非任务导向的承诺摘录)· **层级公开端到端**(PersonOut.tier · `?tier=inner` 过滤 · 核心/密切徽章 · /people 药丸行)· **`window.confirm` → ConfirmDialog`(Bauhaus 模态窗口,焦点陷阱,角色 = alertdialog)· **a11y 边界**(svelte:boundary + 跳过链接,WCAG 2.4.1)· **突变 CDC 日志**(真实 /api/changes 删除;修复 `op forget` 曾未到达网络钩子订阅者的 GDPR 违规问题)· **`op doctor --report`**(删减的错误包:架构 + 状态 + 审计尾部,零 PII) | 已发布 |
| **v0.4.4** *(已发布)* | 外部审计第 3 轮:**核心圈死循环修复**(在 /accept /dismiss /page-open /push-fired 记录交互;冷启动活动基准,以便第 1 天排名有意义)· **机密卫生**(备份默认排除 `llm.env` + `auth/`;审计日志 chmod 0600)· **UTC 时间戳** 在每次存储写入时(停止跨时区漂移,first_seen_at 与 last_seen_at)· **过去时态 + 自我提醒过滤器**(在提交管道和提示中丢弃“发了 X” / “我发送了 Y” + 提交者 == 委员会 == 我)· **Markdown 中的承诺 ID** `<!-- pr_xxx -->`,实现无损往返 · **速率限制拆分** {llm, read, mutate} 存储桶(不再出现收件箱批量接受的自我 DOS)· **从 display_name 中剥离日期后缀**(不再出现 `p_刘若琳-12-18`)· **`op cache --clear`** · **`op repair`**(孤儿源回填)· **`op uninstall --everything`** · **`op demo-mode`**(环境变量交换到 .demo,用于安全的现场演示)· **docs/README.md 导航** · **KNOWN_ISSUES.md → KNOWN_LIMITATIONS.md**(重新定义为设计选择)· **README Ollama 现实**(32GB RAM,4-6 小时,-20% 召回率注意事项) | 已发布 |
| **v0.4.5** *(现已发布)* | 外部审计第 4 轮 — 生产环境实时 bug:**锁定屏幕小部件差异感知写入**(曾在 100 秒内重写相同 JSON 11 次;现在通过 `os.utime` 修改时间戳,在内容不变时跳过重写)· **小部件冷却 + 新鲜度门控**(轮换而不是在一个项目上驻留;丢弃 `when_iso` > 6 小时在过去的承诺 — 不再为 10 天前的日期渲染“明天”)· **wechat-cli 已知失败聊天屏蔽列表**(在“找不到”后缓存 24 小时,因此公众号虚拟聊天不会在每个周期重试)· **audit.log 耐久性**(`fcntl.LOCK_EX` + `os.fsync`,以便并发 MCP 客户端不会损坏 + 崩溃不会丢失尾部)· **MCP 审查默认安全**(翻转语义:始终开启审查;用户选择直接写入,需通过 `OPENPERSONA_MCP_TRUST_AGENT=1`;旧版 `WRITES_REQUIRE_REVIEW=0` 仍然作为显式选择退出)· **MCP add_fact 提示注入强化**(关键前缀白名单 {bio, relationship, preference, tag, date, school, note, health, read, work};500 字符值上限) | 已发布 |
| **v1.0** *(+3 个月)* | 跨设备同步 · 插件市场 · 锁定屏幕小部件签名和分发 · PyPI 发布 · **源代码在此处公开** | — |
有关每日详细情况,请参阅 [`docs/roadmap.md`](docs/roadmap.md)。
有关规范的产品定义,请参阅 [`docs/product-spec.md`](docs/product-spec.md)。
---
## 贡献
源代码公开后(大约 v1.0),三个最具影响力的贡献将是:
1. **新的收集器** — 为您生活的任何 IM / 电子邮件 / 聊天平台实施 [`Collector Protocol`](docs/architecture.md)。三种记录类型,两个函数,实际测试覆盖率已经到位。v0.4 发布了 WhatsApp / Telegram / Gmail / Outlook / Slack / Discord 的离线导出路径 — 将这些扩展到实时 API 模式(例如 Gmail OAuth,Slack Web API)是下一步。
2. **代理集成** — OpenPersona 提供了代理原生 HTTP API(`/api/changes` 轮询,`/api/schema` 自省,`/api/webhooks` 推送,`/api/bulk` 容错写入)。在此基础上构建 CLI / 浏览器扩展 / 移动应用,并链接回此处。
3. **AI 原生语音调优** — 代码库中存在的提示。欢迎提交改进语音一致性,语言检测,每人语气匹配或承诺强度分类的 PR。
如果您维护一个上下文感知产品(会议 AI,可穿戴设备,自定义内部工具),并希望利用 OpenPersona 的图谱,请提出问题,我们将共同设计。
## 许可证
MIT(适用于源代码公开后)。
连接信息
猜你喜欢
暂无推荐服务器