feat(parse): add-feishu-mindnote - #4319
Conversation
|
Hi @zihengli-bytedance, could you please take a look at this PR when you have a chance? Any feedback would be greatly appreciated. Thank you! |
zihengli-bytedance
left a comment
There was a problem hiding this comment.
发现 1 项 blocking 兼容性回归:Mindnote 支持不应使现有用户-token 飞书导入静默丢失图片。相关测试通过,但测试变更删除了已有的用户-token 媒体下载契约。
| # Feishu's Drive media endpoint is an application-identity API. | ||
| # Keep it on the tenant client even when the containing document | ||
| # was fetched with a user token (Mindnote itself is user-token-only). | ||
| client = self._get_client() |
There was a problem hiding this comment.
[Bug][Blocking] 用户 token 导入会静默丢失已有飞书文档的图片
这里将媒体下载固定为 tenant client,并且 access() 已不再把 feishu_access_token 传给 _resolve_image_refs。因此,用户只通过 args.feishu_access_token 导入私有 docx/sheet/bitable 时,正文仍能用用户身份读取,但没有应用凭证时 _get_client() 会失败;应用无文档权限时下载会返回 403。异常又被捕获为 None,最终正文成功、图片却只剩 feishu://image/... 引用。
这正是提交 07aa9dc775 曾修复的回归:基线实现会在提供用户 token 时声明 AccessTokenType.USER 并传入 request option;PR 还删除了对应测试。项目当前的 lark-oapi 1.5.3 生成请求也同时允许 USER/TENANT。若 tenant-only 是 Mindnote 的特有限制,请说明为何要改变所有既有文档类型的认证契约;否则请保留已有用户-token 媒体下载路径。
0cbdb32 to
49e73f4
Compare
|
感谢指出,确认这是一个兼容性回归。原实现将媒体下载固定为 tenant client,导致使用用户 token 导入私有 docx/sheet/bitable 时可能静默丢图。
|
PR 描述
变更概述
/mindnote/和/mindnotes/直接链接;obj_type=mindnote的节点,以及 Drive folder 中枚举到的 Mindnote;Closes #4187
问题背景
飞书 Wiki 可以包含 Mindnote 思维笔记节点,但原有
FeishuAccessor会将obj_type=mindnote判定为不支持的文档类型,导致该 Wiki 资源无法进入 OpenViking 的正常导入、读取和检索链路。
方案设计
Mindnote 正文通过以下官方接口读取:
实现复用现有
lark-oapiraw request 能力,并显式使用AccessTokenType.USER。如果没有传入args.feishu_access_token,请求会在 preflight 阶段失败;Mindnote Nodes 请求不会回退到 app 或tenant token。
节点处理采用以下策略:
Unattached nodes,避免正文静默丢失;Mindnote 图片先渲染为飞书图片引用,再进入现有图片处理链路。Drive media API 按飞书官方契约使用
AccessTokenType.TENANT和应用权限docs:document.media:download。单张图片下载失败保持best-effort 语义,不影响节点正文入库。
图片下载成功时,Accessor 返回包含
document.md和图片文件的临时目录,使 durable staging 和DirectoryParser 能同时保留 Markdown 与真实图片资源。
自动化验证
执行了本次改动直接相关的测试:
代码质量检查:
额外执行了包含目录扫描和目录导入的 156 项回归测试,其中 154 项通过。其余 2 项失败位于本次未
修改的代码,分别为 Windows 换行字节断言和
.gitignore路径分隔符断言,本 PR 未修改或规避这两个无关的平台差异。
真实端到端验收
使用真实 OpenViking server、公开资源 API 和真实飞书测试文档完成了以下验收:
read、限定资源范围的find和search均成功;配置说明
args.feishu_access_token传入具备mindnote:node:read权限的用户 token;FEISHU_APP_ID、FEISHU_APP_SECRET,并为应用身份开通docs:document.media:download;add_resource请求结构。