OMI × Reflect 集成指南:把 AI 对话记忆自动沉淀为可检索的每日笔记
【免费下载链接】FriendAI that sees your screen, listens to your conversations and tells you what to do项目地址: https://gitcode.com/GitHub_Trending/fr/Friend
本文聚焦于 Friend(OMI)插件体系中的 Reflect 集成,讲解如何将 OMI 生成的对话记忆(Memories)、逐字稿(Transcripts)与行动项(Action Items)自动同步到 Reflect 笔记应用,并映射为正确的每日笔记。读完本文,你将掌握完整的授权与配置流程、各项配置参数的含义与建议取值,并能从源码层面理解对话数据经 webhook 脱敏投递、OAuth2 凭证安全存储的底层实现原理。
集成能力总览
OMI+Reflect 集成解决的核心问题是:佩戴式 AI 设备记录的对话经过结构化处理后,如何不经过人工搬运,直接进入用户的个人知识库。根据 官方集成指南,该集成提供以下能力:
- 记忆捕获:把 OMI 生成的 Memories 和/或 Transcripts 写入 Reflect;
- 对话映射:将每次对话按日期映射到 Reflect 的 Daily Notes(每日笔记);
- 行动项整合:将对话中提取的 action items 汇总到指定列表;
- 时区感知同步:按用户所在时区计算对话归属日期,确保笔记落在正确的日期页;
- 安全认证:基于 OAuth2 的授权机制,无需向第三方明文暴露口令;
- 可检索笔记:写入 Reflect 后即可借助 Reflect 的全文搜索能力检索历史对话。
这些指令内容存放在仓库的 plugins/instructions/reflect/README.md,而 插件架构说明 明确instructions/目录承载的是"供移动端 App 展示的按应用区分的指令/资源内容",即本文所述流程就是用户在 OMI 移动端看到的集成操作指引。
整体架构与数据流
从仓库的插件体系可以还原该集成的数据链路。OMI 的对话处理完成后,后端会按应用配置将对话数据投递给第三方服务;Reflect 集成即这一外部集成(External Integration)机制的一个具体落地。
核心数据模型定义在 插件 SDK:
Conversation:一次完整对话,包含transcript_segments(逐字稿分段)、structured(结构化摘要)、photos、plugins_results等字段;Structured:结构化后的对话摘要,包含title(标题)、overview(概述)、category(分类)、sections(分区笔记)、action_items、events;TranscriptSegment:带说话人、起止时间戳的逐字稿片段;ActionItem:从对话中提取的行动项,含description、due_at、completed、capture_confidence等字段。
后端在对话创建时向外部集成投递数据的入口在 backend/utils/app_integrations.py。其关键流程是:
- 获取用户已启用的应用,过滤出
triggers_on_conversation_creation()为真的应用(即triggers_on == 'memory_creation',见 backend/models/app.py); - 对对话数据执行
redact_conversation_for_integration脱敏后再序列化; - 拼接
?uid=<用户UID>到 webhook URL; - 通过
safe_request_target做 SSRF 防护校验,拒绝解析到内网/回环地址的目标; - 携带
X-Omi-Idempotency-Key幂等头投递,并受 webhook 断路器与并发信号量保护。
也就是说,OMI 侧只会把"允许外发"的那部分对话数据推送给集成服务,且每次投递都带幂等键、有 SSRF 防护与失败熔断,这是集成可靠性与安全性的第一道保障。
快速开始:授权并连接账户
1. 进入集成页面并完成授权
按指南所述,接入的第一步是打开 OMI+Reflect 集成页面,点击 "Start Authorization":
- 访问 OMI 中的 Reflect 集成入口页面;
- 点击 "Start Authorization" 发起授权;
- 如未登录,先登录你的 Reflect 账户;
- 确认授权,允许 OMI 访问你的 Reflect 数据。
这一授权交互在 OMI 后端由 backend/routers/oauth.py 支撑,其实现细节值得了解:
GET /v1/oauth/authorize会先校验app_id对应的应用存在且配置了外部集成(app_home_url),然后按应用声明的capabilities与actions生成权限说明清单,渲染授权确认页,并生成随机csrf_token(oauth.py);- 后端采用双重提交 CSRF 防护:同一个随机值既写入
HttpOnly+SameSite=Strict的omi_oauth_csrfCookie,又嵌入页面本身。/v1/oauth/token要求两者用常量时间比较一致,否则返回 403([oauth.py](https://link.gitcode.com/i/96328168a196cff7fc31f8cff4e83a94#L43-L51, L175-L179)),从服务端堵住了"state 被接受但从未校验"的缺口; - 用户确认授权后,携带 Firebase ID Token 调用
/v1/oauth/token,服务端验证身份得到uid,随后自动完成应用启用、安装计数、付费检查与 setup 完成状态校验(oauth.py),最后返回{uid, redirect_url, state}将用户带回集成方页面。
2. 授权后的回调与凭证保存
第三方集成服务在拿到 OAuth 回调后需要保存访问凭证。仓库中 plugins/oauth/conversation_created.py 提供了一个可对照的参考实现(Notion CRM 集成):
- 授权回调
/auth/notion/callback接收state与code,其中state直接携带用户uid,code用于向服务商换取 access token(conversation_created.py); - 换取令牌的客户端封装在 plugins/oauth/client.py,其
get_access_token以 Basic Auth(client_id:client_secret 的 Base64)调用 OAuth token 端点; - 凭证按 uid 存入 Redis,见 plugins/db.py 中的
store_*_api_key/get_*_api_key系列函数。
OMI+Reflect 集成同样遵循"token 只保存在集成服务侧、按 uid 隔离"的模型,OMI 后端本身不触碰第三方凭证。
配置详解:五个关键设置项
授权完成后会跳转到配置页,指南明确列出以下配置项,逐项说明如下。
选择 Graph(目标图谱)
选择本次集成要写入的 Reflect graph。Reflect 以 graph(图谱/工作区)为数据组织单元,不同 graph 之间相互隔离。若你有多个 graph(例如工作与个人分开),应在此明确指定,避免对话笔记写入错误的工作区。
配置 Memory Content(记忆内容)
- 开关记忆同步:启用/禁用"对话记忆写入 Reflect"这条链路;
- 设置列表名称:为 OMI Memories 指定目标列表名(示例值:"OMI Memories"),写入的每日笔记将落在该列表下,便于后续按列表筛选;
- 选择每条记忆包含的内容,可从以下项中勾选:
- Overview:
Structured.overview字段生成的对话概述; - Transcript:
Conversation.get_transcript()产出的逐字稿全文(含说话人标识); - Action Items:
Structured.action_items中提取的行动项; - Plugin data:对话的
plugins_results/apps_results,即其他插件在本次对话中产生的输出。
- Overview:
这些字段在 插件 SDK 模型 中均有明确定义,勾选项直接决定 payload 中哪些字段会被展开写入笔记。
配置 Action Items(行动项整合)
- 开关行动项整合:启用/禁用将对话中的行动项单独汇总;
- 设置汇总列表名称:为整合后的行动项指定列表(示例值:"✅ Action Items")。
启用后,每条对话中ActionItem.description、due_at等信息会被整理进独立列表,方便形成待办闭环。
设置时区(Timezone)
这是最容易被忽略、却直接影响数据正确性的配置。Reflect 以 Daily Notes(每日笔记)组织内容,而 OMI 记录的对话时间戳是 UTC 时间;只有结合用户时区换算,才能把一条对话归入正确的"那一天"的笔记页。指南原文强调该配置"IMPORTANT for mapping the correct date on your Reflect notes"——若时区设置错误,所有对话会整体错落到相邻日期,检索与回顾都会出现偏差。
保存配置
点击 "Save Configuration" 完成设置。配置以 uid 维度持久化(参考 plugins/db.py 的按 uid 存取模式),因此更换设备或重装应用后配置依然有效。
数据映射原理:对话如何变成每日笔记
结合 SDK 模型可以还原出写入逻辑:
- 后端在对话创建时向集成 webhook 投递
Conversation对象(携带created_at/started_at等时间字段); - 集成服务依据用户配置的时区,把
created_at换算为本地日期,定位到对应的 Reflect Daily Note; - 按配置展开
Structured.overview、TranscriptSegment文本、ActionItem列表等内容写入笔记正文与目标列表; - 写入完成后即可被 Reflect 的搜索、反向链接(backlink)能力索引。
由于 webhook 载荷由 SDK 模型 严格定义(Pydantic 校验),字段缺失或类型异常会在反序列化阶段被拦截,避免脏数据进入笔记库。
隐私与安全设计
指南特别强调两条原则,与源码实现相互印证:
- 仅发送选定数据:OMI 侧在投递前会执行
redact_conversation_for_integration脱敏(见 backend/utils/app_integrations.py),且集成方只读取用户在配置页勾选的内容字段——未勾选的字段不会进入 Reflect; - Reflect 数据不被 OMI 访问:认证方向是"用户授权 OMI 集成写入 Reflect",凭证(access token)保存在集成服务侧(参照 plugins/oauth/client.py 的 token 交换与 plugins/db.py 的按 uid 存储),OMI 后端不持有也不读取 Reflect 侧数据。
此外,webhook 投递链路内置 SSRF 防护、幂等键与熔断机制(backend/utils/app_integrations.py),OAuth 授权链路内置双重提交 CSRF 防护与 Firebase 身份核验(backend/routers/oauth.py),共同构成多层安全防线。
设置后续修改与故障排查
配置并非一锤定音:任何时候回到配置页即可调整 graph、列表名称、内容勾选项、行动项开关与时区,改动即时生效,无需重新走一遍授权。若发现笔记未同步,可按以下顺序排查:
- 确认集成页面上 OMI 与 Reflect 均处于已授权状态;
- 检查时区配置是否与当前所在地一致(错日最常见原因);
- 确认 Memory Content / Action Items 对应开关已启用;
- 确认所选 graph 与列表名称拼写无误。
关于 Reflect
Reflect 官方说明 中将其定位为一款面向深度思考的笔记与知识管理应用,核心能力包括:
- 网络化笔记:支持双向链接(backlinks),对话笔记可与既有知识互联;
- 跨平台同步:覆盖包括 iOS 在内的多端;
- 端到端加密:为笔记内容提供隐私保护;
- 日历集成:可与日程体系联动;
- 强大搜索:全文检索历史对话;
- AI 辅助:辅助笔记整理与想法生成。
将 OMI 的会议洞察接入 Reflect 后,对话记忆、行动项与个人知识库形成闭环:日常对话自动沉淀、按日期归档、可检索、可关联,真正实现"录完即用"。集成相关源码与模型定义可在 插件 SDK、OAuth 实现 与 参考集成实现 中继续深入阅读。
【免费下载链接】FriendAI that sees your screen, listens to your conversations and tells you what to do项目地址: https://gitcode.com/GitHub_Trending/fr/Friend
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考