[RFC] Accessor 数据同步标准化与 Email 数据源试点 #3354
zihengli-bytedance
started this conversation in
RFC
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
1. 总体定位
OV 的数据接入已经通过 Accessor 模式实现了主动拉取(WebFeedAccessor 抓整站、FeishuAccessor 拉文档、GitAccessor clone),但各 Accessor 在鉴权、增量、镜像、可靠性上各自为战。需要一套统一的数据同步定义,把这些跨源共性能力前置,在不同场景各自扩展:
类比 OV 内置的 Bot 模块:开源 Bot 定义了 Agent 使用 OV 的模式,Demo MVP 价值;商业化用生产级 ArkClaw 基于标准 MCP 协议对接。数据接入同理:两种实现范式,服务不同场景,汇入同一管线(Parser → AGFS → L0/L1/L2)。
本 RFC 做两件事:
2. 为什么需要标准化
2.1 数据范式全景 — 不只是文档
当前 Accessor 覆盖的主要是"文档批量导入",但 Agent 需要的 context 更多:
每种范式对标准的要求不同,标准设计必须留出扩展空间。本次试点选择的 email 属于"对话/交互"范式,恰好检验 cursor 抽象能否容纳文档水位之外的语义(见 6.2)。
2.2 四个维度的共性问题
鉴权:每个数据源鉴权体系完全不同(GitHub PAT/App/OAuth 三种、飞书三层 token、IMAP 用户名密码/OAuth2/App Password 协议级分裂)。现状是每个 Accessor 自己处理(WebFeed 不管、Feishu 自己搞 OAuth)。标准应该让 Accessor 声明需要什么认证(类型 + 字段),框架统一管理凭证存储、刷新、过期。
增量:全量重建无法规模化(飞书团队知识库 ~5000 篇全量 1 小时+,增量 <2 分钟;Confluence 企业空间 ~50000 篇全量不现实)。每个源的增量语义不同(GitHub
since、Notionlast_edited_time、IMAPSEARCH SINCE),但 cursor 的持久化和回灌是通用的——这部分标准化,Accessor 只管拉数据,框架管存取。镜像:源端删除了内容,OV 里残留脏数据——Agent 用了过时知识,比没有知识更危险。模式统一为:全量同步时 Accessor 返回完整 doc_id 集合,框架 diff 出孤儿,自动清理;增量模式不删除(看不到全貌)。
可靠性:中途崩溃要断点续传、单文档失败要隔离、限流要退避、超时要熔断、长任务要进度可见。Accessor 上报错误分类(transient/permanent)和进度,框架负责重试、隔离、持久化断点。
3. Accessor vs Connector:两种范式,一套语义
access()→ 本地目录 → Parser → AGFScan_handle()+access()明确一个命名决定:不把 Accessor 改名为 Connector。两个名字的区分本身承载"两种范式"的信息——Accessor 是开源、本地、实验优先的接入模式,Connector 是云端企业级的同步产品;同名会抹掉这层区分,"这是哪种 connector"每次都要额外说明。标准化的是语义,不是名字。
4. 标准接口设计
接口语义与商业化 Connector 的生产实现对齐,鉴权、cursor 增量、孤儿清理等机制已在商业化侧经过实际验证。Accessor 标准复用同一套语义,保持接口更轻,新增能力全部可选。
4.1 现有接口不变
写一个最简 Accessor 仍然只需要这三个方法。
4.2 新增标准类型
doc_ids非空时,框架 diffdoc_idsvs OV 中已有文档,自动清理孤儿;doc_ids为 None,不做删除——与商业化 Connector 行为一致(全量模式 diff 删除,增量不删);errors中 transient 由框架重试,permanent 隔离并记录。4.3 鉴权声明(可选能力)
Accessor 只声明需要什么认证(JSON Schema),框架兑现凭证的存储、加密和刷新:
框架的职责:检测到 Accessor 实现了
auth_spec(),就接管凭证存储、加密、WatchTask 刷新。4.4 增量同步(可选能力)
access()接受cursor/progress可选参数,返回AccessResult:4.5 标准能力总览
auth_spec() -> dict(JSON Schema)check(auth) -> ConnectionStatusaccess(source, cursor, ...)返回AccessResult.cursorLocalResource目录doc_idsAccessResult.errors(transient/permanent)progress(done, total)回调cursor是否为 None +doc_ids是否返回5. 框架侧职责
auth_spec()存取,静态加密,预留 OAuth2 refresh 钩子doc_idsvs 已导入文档集合,diff 后走既有删除路径6. 试点:EmailAccessor(IMAP)
6.1 为什么新增数据源,而不是改造存量
6.2 为什么选 email
auth_spec()的表达力;且 OAuth2(Gmail/M365 已关闭 IMAP 基础认证)只在 schema 层预留,scope 决策商业化已验证过,试点照抄。6.3 范围界定
auth_spec()声明type扩展位)sync_checkpoint时间水位,IMAPSEARCH SINCE;since_days防历史巨量回拉6.4 试点语义设计要点
<mailbox_hash[:8]>_<uid>兜底,跨 mailbox 不串号{"sync_checkpoint": <UTC ISO,Z 后缀>}时间水位<水位比较;== 水位的边界邮件下轮重拉,由下游去重兜底以上语义与商业化 Email Connector 保持一致,一致性通过内部对照验证。
6.5 验收标准
7. 代码结构(拟)
8. 推广节奏
不在只有 greenfield 样本时宣布标准定稿——试点验证"新源好不好写",第二波验证"存量迁移路径可行",两者都过才算标准成立。
9. 非目标
auth_spec()schema 预留);10. 设计原则
Open Questions
SourceType.EMAIL之外的 mailbox 层级映射(一个 mailbox 一个目录 vs 平铺)? (倾向一个 mailbox 一个目录,与商业化一致)All reactions