飞书文档同步

AiInsight Connector · 私聊动作

把飞书里的文档,原样搬进 AiInsight。

知识库空间或云文档文件夹里的每一份文件,按飞书里的目录结构,落到你在 AiInsight 里选定的一个目录下。之后按周期自动跑,跑完给你发报告。

想象一位定期上门的搬运工。你给他三样东西:门钥匙(让 insight 应用进得了你的飞书空间)、你的工牌(你的 AiInsight API key)、目的地地址(AiInsight 里的目标目录)。剩下的都是他的事。

入口 /同步文档 对象 知识库 · 云文档文件夹 落点 AiInsight asset 目录 周期 仅一次 · 6h · 12h · 每天 · 每周
飞书 📁 CUC 知识库 📁 规划 📄 年度规划.docx 📊 预算表.sheet 📁 制度 📄 报销流程 🧠 脑图(读不到) 📁 空目录 同步实例 按周期跑 应用凭据只读 用你的 key 写 AiInsight 📁 TSG / CUC 📁 飞书知识库 📁 CUC 知识库 📁 规划 📄 年度规划.docx 📊 预算表.xlsx 📁 制度 📄 报销流程.docx 📁 空目录 未同步清单 脑图 · 飞书读不到
目录结构一比一复制,读不到的文件不会让目录消失,只会进「未同步清单」。

01

一个任务只由三样东西组成

没有部门、没有目标池、没有运维登记。三样配齐就是一个固定任务,再加上周期这一个运行参数。

飞书来源

门钥匙:让 insight 应用进得来。

一个知识库空间的链接,或一个云文档文件夹的链接。

你要做的:把「aiInsight-企业知识平台」加为知识库的空间成员,或云文档文件夹的协作者。加谁,机器人就只能读到谁。

你的 AiInsight API key

工牌:搬运工以你的身份进门放东西。

同步用它写入。你能写的地方才会被写,不需要管理员。key 撤了,任务自然停。

你要做的:在 AiInsight 个人设置里生成一把 key,填进卡片。key 只在卡片回调里传一次,不进聊天记录,建好任务后加密存放。

目标目录

地址:东西放到哪个柜子下面。

AiInsight 里一个已存在的 asset 目录,共享的或你个人的都行。飞书的结构原样挂在它下面。

你要做的:在卡片里一级一级选,不用手输路径。只列你看得到的目录。

02

私聊机器人,三张卡片配完

下面是真实的对话顺序和卡片文案。没有自由文本猜意图:只认精确指令 /同步文档 和卡片按钮。发 /帮助 能看到可用指令。

/同步文档
aiInsight-企业知识平台
你还没有同步任务,填好下面两项就能建一个。
新建同步任务 填好两项,下一步选目标目录
知识库空间或云文档文件夹,先把 insight 应用加为成员或协作者。
https://xxx.feishu.cn/wiki/TQahw…
同步用它写入,只有你能写的地方才会被写。
在 AiInsight 个人设置里生成
提交

提交后服务端马上验证两件事:应用读不读得到这个链接,key 打不打得开 AiInsight。哪项不过,就把表单带着原因再发一次。

aiInsight-企业知识平台
能读到知识库「CUC 知识库」(前 50 项),key 也验证通过。接下来选目标目录。
选择目标目录 飞书的目录结构会原样挂在它下面

来源:CUC 知识库
当前位置:TSG

CUC
进入上一级就同步到这里取消
下拉框里选了目录再点「就同步到这里」,就同步到它下面;没选就同步到当前位置。
选 CUC → 就同步到这里
aiInsight-企业知识平台
已创建:「CUC 知识库」→ TSG/CUC,马上开始第一次同步。
飞书文档同步 任务用你自己的 AiInsight key 写入

CUC 知识库 → TSG/CUC · 每天 · 等待首次同步

同步周期
暂停现在同步删除改周期
新建同步任务

03

每一轮同步做什么

任务建好立刻跑第一轮,之后按周期到点再跑。每一轮都是一次完整走查,顺序固定。

① 私聊通知你 「开始同步「…」→ 目录」 ② 先建根目录 锚点目录 / 来源名 ③ 逐个读飞书 目录优先 · 导出或下载 ④ 上传 AiInsight 同名文件 → 新版本 ⑤ 结果卡 含未同步清单 ③④ 之间每 50 个对象记一次进度;副本崩了,另一台从记录处接着跑,不重头。 某个文件读不到或传不上:记进清单,继续下一个。整轮失败:5 分钟后自动重试,连续 5 次后标为「失败,需要处理」。
一轮同步的固定顺序。锚点目录固定叫「飞书知识库」或「飞书云文档」。目录永远先于文件建立,所以哪怕一个文件都读不到,目录树也在。
目录先于文件
先在目标目录下建固定的锚点目录「飞书知识库」或「飞书云文档」,再建来源名目录;进入每个子目录也先建目录再处理内容。空目录、全部失败的目录,都会出现。
同名不覆盖
同一个文件再次同步,AiInsight 里生成新版本,旧版本保留。同一目录下两个同名文件夹,后者加固定后缀区分。
位置跟着飞书走
飞书里把文件挪到别的目录,下一轮在 AiInsight 里也挪过去,而不是再传一份。
失败不拖累别人
没权限、导出失败、类型不支持,只影响那一个对象。它进「未同步清单」,其余照常。
飞书里是什么怎么取到 AiInsight 变成
文档(新版 docx / 旧版 doc)导出任务标题.docx
电子表格 / 多维表格导出任务标题.xlsx
上传的文件(pdf、图片、压缩包…)直接下载原文件名,不改
目录 / 知识库节点本身只取结构同名目录
思维笔记、幻灯片等飞书不给导出的类型取不到未同步清单

04

你会收到什么

开始一条文字,结束一张结果卡,失败一条原因。都发在你和机器人的私聊里。

开始时
开始同步「CUC 知识库」→ TSG/CUC,完成后会把结果发给你。
结束时(数字为示例)
同步完成 文件已按飞书的目录结构放进 AiInsight

CUC 知识库 → TSG/CUC
同步文件 128 · 目录 17 · 删除 0 · 未同步 2
下次同步:09-11 08:00

未同步清单

· 产品脑图(飞书读不到:UnsupportedObjectType: mindnote)
· 供应商名单(飞书读不到:FeishuOpenApiError: 99991672 permission denied)
整轮失败时
「CUC 知识库」这一轮同步失败:API key 打不开 AiInsight,可能已失效。任务已停止,处理后在任务卡里点「继续」。

清单里每一项都说清三件事

哪个文件、卡在哪一步(飞书读不到 还是 AiInsight 写入失败)、原始错误。清单只保留本轮还失败的项;修好权限后下一轮自动从清单里消失。

任务的四种状态

等待首次同步刚建好,还没跑
运行中按周期正常跑
已暂停你按了暂停,或「仅一次」任务跑完了
失败,需要处理key 失效,或连续 5 轮失败;处理后点「继续」

周期可选

仅一次 · 每 6 小时 · 每 12 小时 · 每天 · 每周。「仅一次」跑完自动暂停,想再跑点「现在同步」。同步进行中再点「现在同步」会回「正在同步中,跑完会把结果发给你。」,不会排两份。

05

它做什么,不做什么

只做 AiInsight 已有的能力,不发明新概念。

会做

  • 知识库空间、云文档文件夹,整棵树搬过去。
  • 所有能导出或下载的文件类型,不挑格式。
  • 只写进你选的那个目录;写入身份就是你自己。
  • 每轮开始和结束都告诉你,失败列清单。
  • 任务归你一个人,可以随时暂停、改周期、删除。
  • 多个人、多个任务同时跑,互不影响。

不会做

  • 不碰知识库(kb)、不触发索引。它只是把文件放进 asset 目录。
  • 不替你删 AiInsight 里的东西:API key 没有删除权限。飞书里删掉的文件,AiInsight 里会留着。删除任务时也一样:「任务已删除,AiInsight 里已同步的内容保留。」
  • 不猜你的意思。不是 /同步文档 或卡片按钮,机器人不回。
  • 不读没授权的东西。应用不是成员或协作者的目录,飞书那边根本看不到。
  • 不把你的 key 存成明文,也不出现在任何消息里。

06

工程细节

给要维护它的人。上面的内容不需要这里也能理解。

部署形态:一个对话进程,两个同步进程
飞书 私聊 · 卡片回调 · 群消息 一个应用只有一条长连接 almanac-connector ×1 持有 WebSocket,路由 p2p / 群 / 卡片 只通过任务 API 写任务表 Postgres 任务表 来源 · 加密 key · root · 周期 · 游标 · 租约 HTTP :8087 almanac-document-sync-doc ×N ALMANAC_DOCSYNC_KIND=doc almanac-document-sync-wiki ×N ALMANAC_DOCSYNC_KIND=wiki 到期领任务 FOR UPDATE SKIP LOCKED · 租约 120s · 每页写回游标 tenant token 只读 HTTP,不碰长连接
同步实例不收消息、不引用 runtime / smart_groups / personal_chat。群聊和原有私聊逻辑完全不变:p2p 先按精确指令分流,卡片回调先按 document_sync: 前缀分流。
镜像
三个 Deployment 用同一个镜像,按环境变量决定角色。
横向扩展
同步实例任意副本数。一个任务同一时间只有一个副本持有租约;崩溃后游标和 run_id 还在,下一副本接着跑。
库表
document_sync_tasks · document_sync_folder_mappings · document_sync_uploads · document_sync_issues(独立迁移版本表,只增不改)
key 加密
AES-GCM,附加数据绑定 task_id + owner_open_id;换任务或换人都解不开。
飞书权限
wiki:wiki:readonly · drive:drive:readonly · drive:drive.metadata:readonly · docx:document:readonly · docs:document:export · im:message.p2p_msg:readonly
AiInsight 写入
POST /api/v1/insight/asset/documents/upload(conflict_strategy=version)· 建目录 · 移动
取内容
file → 直接下载;docx / doc / sheet / bitable → 导出任务轮询后下载;其余类型 → UnsupportedObjectType 进清单。
# 对话进程(连接器)
ALMANAC_CONNECTOR_DOCSYNC_TASK_API_URL=http://almanac-document-sync:8087
ALMANAC_CONNECTOR_DOCSYNC_TASK_API_TOKEN=…   # ≥32 字节,两者必须成对

# 同步进程
ALMANAC_DOCSYNC_KIND=doc | wiki
ALMANAC_DOCSYNC_POSTGRES_DSN=postgres://…
ALMANAC_DOCSYNC_FEISHU_APP_ID / FEISHU_APP_SECRET   # 同一个 insight 应用
ALMANAC_DOCSYNC_AIINSIGHT_BASE_URL=…         # 生产 gateway-inner
ALMANAC_DOCSYNC_CREDENTIAL_ENCRYPTION_KEY=…  # key 加密主密钥

07

现状(2026-09-10)

分清已验证、进行中和还没做的。

已验证生产飞书端到端
在生产的 aiInsight-企业知识平台应用上,/同步文档 → 表单 → 目录选择 → 建任务 → 开始通知 → 结果卡,全链路跑通。三个 Deployment 各 1 副本运行中。
已验证知识库 + 云文档两种来源
知识库空间和云文档文件夹都同步过,包括电子表格导出、无权限子树进清单、空目录建目录。
待处理分支未合并
代码在 feat/feishu-doc-wiki-connectors,生产跑的是该分支镜像。合到 main 后需要走一次正常发布。
待处理飞书删了,AiInsight 不删
API key 没有删除权限,结果卡里的「删除」数字是尝试次数。需要 AiInsight 侧给 key 开删除权限,或接受留存。
待处理飞书不给导出的类型
思维笔记、幻灯片等只能进清单。飞书导出接口支持范围之外,暂无办法。
未做LLM 意图识别
现在只认精确指令和按钮。以后加 LLM 也只是「猜一个动作然后弹确认卡」,猜错的代价是多点一下。