Skip to main content
OpenClaw 通过官方 @openclaw/feishu 插件连接飞书/Lark(一个一体化协作平台):机器人私信、群聊、流式卡片回复,以及飞书文档/知识库/云盘/Bitable 工具。 状态: 已可用于生产环境,支持机器人私信和群聊。WebSocket 是默认事件传输方式(无需公网 URL);webhook 模式为可选。

快速开始

需要 OpenClaw 2026.5.29 或更高版本。运行 openclaw --version 检查。使用 openclaw update 升级。
1

运行频道设置向导

如果缺少 @openclaw/feishu 插件,则会安装它,然后进入设置流程:
  • 手动设置:从飞书开放平台(https://open.feishu.cn)或 Lark Developer(https://open.larksuite.com)粘贴 App ID 和 App Secret。
  • 二维码设置:在飞书应用中扫描二维码以自动创建机器人。此流程会将私聊锁定为你自己的账号(dmPolicy: "allowlist",使用你的 open_id)。
向导还会询问 API 域名(飞书 vs Lark)和群组策略。如果国内飞书移动端对二维码没有反应,请重新运行设置并选择手动设置。
2

设置完成后,重启网关以应用更改

入站持久性

OpenClaw 会在智能体分发前,持久化排队经过身份验证的 im.message.receive_v1drive.notice.comment_add_v1 信封。在 Webhook 模式下,持久化的 200 响应会携带 x-openclaw-delivery-accepted: durable;验证质询、非持久化事件类型和错误响应不会包含此标记,因此反向代理可以要求该标记,以区分持久化接受和普通的 200 响应。待处理或可重试的事件会在网关重启后继续保留,按聊天或文档维持序列化,并在活动中的完成记录或保留的完成记录存在期间,使用飞书事件 ID 抑制重复的队列条目。 如果某个 WebSocket 事件在有限次数的重试后仍无法持久化,OpenClaw 会关闭该 socket,并强制建立新的已认证连接,而不是在未提交的轮次之后继续处理。其他飞书事件类型,包括 reaction 和 VC 会议邀请,会使用其正常的事件路径,不会获得这种持久队列保证。

访问控制

私信

配置 channels.feishu.dmPolicy(默认:pairing)以控制谁可以给机器人发送私信: 批准配对请求:

群聊

群组策略 (channels.feishu.groupPolicy,默认:allowlist): 提及要求 (channels.feishu.requireMention):
  • 默认情况下需要 @ 提及,除非有效的群组策略为 "open";在这种情况下默认值为 false,因此无法携带提及的消息(例如图片)仍然可以到达代理。
  • 显式设置为 truefalse 以覆盖默认值;按群组覆盖:channels.feishu.groups.<chat_id>.requireMention
  • 仅广播的 @all@_all 不被视为机器人提及。消息中同时包含 @all 和直接提及机器人时,仍然算作机器人提及。

群组配置示例

允许所有群组,不需要 @ 提及

允许所有群组,但仍需要 @ 提及

仅允许特定群组

allowlist 模式下,你也可以通过添加显式的 groups.<chat_id> 条目来允许某个群组。显式条目不会覆盖 groupPolicy: "disabled"groups.* 下的通配符默认配置会应用于匹配的群组,但它们本身不会允许群组加入。

限制群组内的发送者

channels.feishu.groupSenderAllowFrom 为所有群组设置相同的发送者允许列表;按群组设置的 allowFrom 具有更高优先级。

机器人发送的消息

飞书默认会忽略由其他机器人发送的消息。若要允许机器人之间的群聊,请为应用授予 im:message.group_at_msg.include_bot:readonlyim:message:readonly 作用域,然后设置 allowBots
飞书仅在其他机器人 @ 该机器人时,才会投递由机器人发送的群组事件。现有的群组策略、发送者允许列表以及 @ 提及要求仍然生效。OpenClaw 会丢弃自己发送的消息,在每次文本或卡片回复中 @ 对方机器人,并应用共享的 channels.defaults.botLoopProtection 保护。

获取群组/用户 ID

群组 ID(chat_id,格式:oc_xxx

在飞书/Lark 中打开群组,点击右上角的菜单图标,然后进入设置。群组 ID(chat_id)会显示在设置页面中。 获取群组 ID

用户 ID(open_id,格式:ou_xxx

启动网关,向机器人发送一条私信,然后查看日志:
在日志输出中查找 open_id。你也可以查看待处理的配对请求:

常用命令

飞书/Lark 不支持原生斜杠命令菜单,因此请将这些内容作为纯文本消息发送。

故障排查

机器人在群聊中没有响应

  1. 确保机器人已加入群组
  2. 确保你 @提及了机器人(默认要求)
  3. 验证 groupPolicy 不是 "disabled"
  4. 检查日志:openclaw logs --follow

机器人收不到消息

  1. 确保机器人已在飞书开放平台 / Lark 开发者平台发布并通过审核
  2. 确保事件订阅包含 im.message.receive_v1
  3. 对于会议邀请自动加入,也要订阅 vc.bot.meeting_invited_v1
  4. 确保选择的是持久连接(WebSocket)
  5. 确保已授予所有必需的权限范围
  6. 确保网关正在运行:openclaw gateway status
  7. 检查日志:openclaw logs --follow
订阅 vc.bot.meeting_invited_v1 只会投递该事件。自动加入默认是关闭的。 如需全局启用:
如需仅为一个账号启用,省略顶层开关,并设置账号覆盖:
在代理收到加入轮次之前,邀请者仍会经过正常的飞书私信策略、白名单/配对、会话和回复路由。 加入还需要为应用身份配置一个可用的飞书 VC 加入工具,并带有 vc:meeting.bot.join:write 权限范围。例如,官方 lark-cli VC agent skill 提供了 vc +meeting-join
官方 lark-cli VC agent skill 当前将会议机器人操作标记为受限 beta 版。如果工具返回 ErrNotInGray 或错误码 20017,说明该应用或租户尚未启用该 beta;在排查普通权限授予之前,请先使用链接技能中的早期访问指南。

二维码设置在飞书移动应用中没有反应

  1. 重新运行设置:openclaw channels login --channel feishu
  2. 选择手动设置
  3. 在飞书开放平台中创建自建应用并复制其 App ID 和 App Secret
  4. 将这些凭据粘贴到设置向导中

App Secret 泄露

  1. 在飞书开放平台 / Lark 开发者平台重置 App Secret
  2. 更新配置中的值
  3. 重启网关:openclaw gateway restart

高级配置

多账户

defaultAccount 控制在出站 API 未指定 accountId 时使用哪个账户。账户条目会继承顶层设置;大多数顶层键都可以按账户覆盖。 accounts.<id>.tts 使用与 tts 相同的结构,并在全局 TTS 配置之上进行深度合并,因此多机器人飞书配置可以全局共享提供方凭据,同时只按账户覆盖 voice、model、persona 或 auto 模式。

消息限制

  • textChunkLimit - 出站文本分块大小(默认:4000 字符)
  • streaming.chunkMode - "length"(默认)在限制处拆分;"newline" 优先按换行边界拆分
  • mediaMaxMb - 媒体上传/下载限制(默认:30 MB)

流式输出

Feishu/Lark 支持通过交互式卡片进行流式回复(Card Kit streaming API)。启用后,机器人在生成文本时会实时更新卡片。
streaming.mode: "off" 设为在一条消息中发送完整回复;renderMode: "raw"(纯文本而非卡片)也会禁用流式卡片。streaming.block.enabled 默认关闭;仅在需要将已完成的助手块在最终回复前刷新时启用它。旧的布尔值 streaming 以及扁平的 blockStreamingblockStreamingCoalescechunkMode 键会通过 openclaw doctor --fix 迁移为这种嵌套结构。

配额优化

通过两个可选标志减少飞书/Lark API 调用次数:
  • typingIndicator(默认 true):设为 false 可跳过输入中反应调用
  • resolveSenderNames(默认 true):设为 false 可跳过发送者资料查询

群组会话范围和话题线程

channels.feishu.groupSessionScope(顶层、按账户或按群组)控制群消息如何映射到代理会话: 对于话题范围,原生飞书/Lark 话题群会使用事件 thread_idomt_*)作为规范的话题会话键。如果原生话题起始事件省略了 thread_id,OpenClaw 会在路由轮次之前从飞书补全它。OpenClaw 将普通群回复转换为线程时,会继续使用回复根消息 ID(om_*),因此首次轮次和后续轮次会保留在同一个会话中。 replyInThread: "enabled"(顶层或按群组)设为启用,可让机器人回复创建或继续一个飞书话题线程,而不是在原处回复。topicSessionModegroupSessionScope 的已弃用前身;请优先使用 groupSessionScope

飞书工作区工具

该插件为飞书文档、聊天、知识库、云存储、权限和 Bitable 提供智能体工具,并附带对应技能(feishu-docfeishu-drivefeishu-permfeishu-wiki)。工具家族由 channels.feishu.tools 控制: 按账户设置的开关位于 accounts.<id>.tools 下。 feishu_doc 只创建包含标题的文档。要添加 Markdown,请在单独的 write 操作中将返回的 document_id 作为 doc_token 传入。包含 contentcreate 请求会失败,且不会创建空文档。 如果要在根目录之外直接通过 feishu_drive info 查询,请授予 drive:drive.metadata:readonly; 除非应用已经拥有完整的 drive:drive 权限范围。若两个权限范围都没有,info 仍可通过 drive:drive:readonly 保留旧版的根目录查询功能。

ACP 会话

Feishu/Lark 支持用于私信和群组线程消息的 ACP。Feishu/Lark ACP 采用文本命令驱动——没有原生斜杠菜单,因此请直接在对话中使用 /acp ... 消息。

持久化 ACP 绑定

从聊天中启动 ACP

在飞书/Lark 私信或线程中:
--thread here 适用于私信和飞书/Lark 线程消息。绑定会话中的后续消息会直接路由到该 ACP 会话。

多智能体路由

使用 bindings 将飞书/Lark 私信或群组路由到不同的智能体。
路由字段:
  • match.channel"feishu"
  • match.peer.kind"direct"(私信)或 "group"(群聊)
  • match.peer.id:用户 Open ID(ou_xxx)或群组 ID(oc_xxx
查找提示请参见 获取群组/用户 ID

按用户隔离智能体(动态智能体创建)

启用 dynamicAgentCreation 可为每个私信用户自动创建隔离的智能体实例。每个用户都会拥有自己的:
  • 独立工作区目录
  • 单独的 USER.md / SOUL.md / MEMORY.md
  • 私有对话历史
  • 隔离的技能和状态
对于希望每个用户都拥有自己私有 AI 助手体验的公共机器人来说,这一点至关重要。
动态绑定包含规范化后的飞书 accountId,因此默认账户和命名账户会将每个发送者路由到正确的动态智能体。如果某个命名账户在旧版本中创建了一个未限定范围的动态智能体,该旧智能体仍会计入 maxAgents。在删除它之前,请确认默认账户不会使用它,或者临时提高 maxAgents;OpenClaw 无法安全地推断哪个账户拥有这种歧义的旧状态。

快速设置

工作原理

当新用户发送第一条私信时:
  1. 该频道会生成一个唯一的 agentId:默认账户为 feishu-{user_open_id},命名账户则为带有账户前缀的受限身份摘要
  2. workspaceTemplate 路径下创建新的工作区
  3. 注册该智能体并为此用户创建绑定
  4. 工作区辅助程序会在首次访问时确保引导文件(AGENTS.mdSOUL.mdUSER.md 等)存在
  5. 将该用户未来的所有消息路由到其专属智能体

配置选项

模板变量:
  • {agentId} - 生成的智能体 ID(例如:feishu-ou_xxxxxxfeishu-support-<identity_digest>
  • {userId} - 发送者的飞书 open_id(例如:ou_xxxxxx

会话范围

session.dmScope 控制私信如何映射到智能体会话。这是一个全局设置,会影响所有频道。 权衡:使用 "main" 可以启用引导文件的自动加载(USER.mdSOUL.mdMEMORY.md),但这意味着所有频道的所有私信都会共享相同的会话键模式。对于更看重隔离而不是引导自动加载的公共多用户机器人,建议使用 "per-channel-peer" 并手动管理引导文件。
当命名的飞书账户需要为同一发送者保持独立会话时,请使用 "per-account-channel-peer"。动态绑定会保留账户范围。

典型多用户部署

验证

检查网关日志,确认动态创建是否正常工作:
列出所有已创建的工作区:

说明

  • 工作区隔离:每个用户都会获得自己的工作区目录和智能体实例。在正常消息交互流程中,用户无法看到彼此的对话历史或文件。
  • 安全边界:这是一种消息上下文隔离机制,不是恶意共租户的安全边界。智能体进程和宿主环境是共享的。
  • 必须保持配置写入开启:动态智能体创建会将智能体和绑定写入配置;当 channels.feishu.configWritesfalse 时会跳过(默认:开启)。
  • bindings 应为空:动态智能体会自动注册自己的绑定
  • 升级路径:现有的手动绑定可以与动态智能体并存
  • session.dmScope 是全局的:这会影响所有频道,而不仅仅是飞书。

配置参考

完整配置:网关配置 在 webhook 模式下,channels.feishu.webhookPathchannels.feishu.accounts.<id>.webhookPath 都必须是以 / 开头的规范 HTTP 请求路径, 例如 /feishu/events。支持可选查询字符串,且必须完全匹配。不接受完整 URL、相对路径、 URL 片段、点号路径段以及未编码的空格或 Unicode 字符。如果现有配置包含非规范路径, 请运行 openclaw doctor --fix 进行修复,然后再启动网关。

支持的消息类型

接收

  • ✅ 文本
  • ✅ 富文本(帖子)
  • ✅ 图片
  • ✅ 文件
  • ✅ 音频
  • ✅ 视频/媒体
  • ✅ 表情贴纸
进入的飞书/Lark 音频消息会被规范化为媒体占位符,而不是原始 file_key JSON。当配置了 tools.media.audio 时,OpenClaw 会下载语音笔记资源,并在代理轮次之前运行共享的音频转写,因此代理会收到口语转录文本。如果飞书在音频载荷中直接包含了转录文本,则会直接使用该文本,而不会再进行一次 ASR 调用。若没有音频转写提供方,代理仍会收到一个 <media:audio> 占位符以及已保存的附件,而不是原始的飞书资源载荷。

发送

  • ✅ 文本
  • ✅ 图片
  • ✅ 文件
  • ✅ 音频
  • ✅ 视频/媒体
  • ✅ 交互式卡片(包括流式更新)
  • ⚠️ 富文本(帖子样式格式;不支持完整的飞书/Lark 创作能力)
原生飞书/Lark 音频气泡使用飞书 audio 消息类型,并且需要 Ogg/Opus 上传媒体(file_type: "opus")。现有的 .opus.ogg 媒体会直接作为原生音频发送。MP3/WAV/M4A 以及其他可能的音频格式只有在回复请求语音投递(audioAsVoice / 消息工具 asVoice,包括 TTS 语音笔记回复)时,才会借助 ffmpeg 转码为 48kHz Ogg/Opus。普通的 MP3 附件会保持为常规文件。如果缺少 ffmpeg 或转换失败,OpenClaw 会回退为文件附件,并记录原因。

线程和回复

  • ✅ 行内回复
  • ✅ 线程回复
  • ✅ 回复媒体在回复线程消息时仍保持线程感知
主题群组会话路由在 组会话范围和主题线程 中有所说明。

相关内容