@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)。
2
设置完成后,重启网关以应用更改
入站持久性
OpenClaw 会在智能体分发前,持久化排队经过身份验证的im.message.receive_v1 和 drive.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,因此无法携带提及的消息(例如图片)仍然可以到达代理。 - 显式设置为
true或false以覆盖默认值;按群组覆盖: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:readonly 和 im:message:readonly 作用域,然后设置 allowBots:
channels.defaults.botLoopProtection 保护。
获取群组/用户 ID
群组 ID(chat_id,格式:oc_xxx)
在飞书/Lark 中打开群组,点击右上角的菜单图标,然后进入设置。群组 ID(chat_id)会显示在设置页面中。

用户 ID(open_id,格式:ou_xxx)
启动网关,向机器人发送一条私信,然后查看日志:
open_id。你也可以查看待处理的配对请求:
常用命令
飞书/Lark 不支持原生斜杠命令菜单,因此请将这些内容作为纯文本消息发送。
故障排查
机器人在群聊中没有响应
- 确保机器人已加入群组
- 确保你 @提及了机器人(默认要求)
- 验证
groupPolicy不是"disabled" - 检查日志:
openclaw logs --follow
机器人收不到消息
- 确保机器人已在飞书开放平台 / Lark 开发者平台发布并通过审核
- 确保事件订阅包含
im.message.receive_v1 - 对于会议邀请自动加入,也要订阅
vc.bot.meeting_invited_v1 - 确保选择的是持久连接(WebSocket)
- 确保已授予所有必需的权限范围
- 确保网关正在运行:
openclaw gateway status - 检查日志:
openclaw logs --follow
vc.bot.meeting_invited_v1 只会投递该事件。自动加入默认是关闭的。
如需全局启用:
vc:meeting.bot.join:write 权限范围。例如,官方
lark-cli VC agent skill
提供了 vc +meeting-join。
二维码设置在飞书移动应用中没有反应
- 重新运行设置:
openclaw channels login --channel feishu - 选择手动设置
- 在飞书开放平台中创建自建应用并复制其 App ID 和 App Secret
- 将这些凭据粘贴到设置向导中
App Secret 泄露
- 在飞书开放平台 / Lark 开发者平台重置 App Secret
- 更新配置中的值
- 重启网关:
openclaw gateway restart
高级配置
多账户
defaultAccount 控制在出站 API 未指定 accountId 时使用哪个账户。账户条目会继承顶层设置;大多数顶层键都可以按账户覆盖。
accounts.<id>.tts 使用与 tts 相同的结构,并在全局 TTS 配置之上进行深度合并,因此多机器人飞书配置可以全局共享提供方凭据,同时只按账户覆盖 voice、model、persona 或 auto 模式。
消息限制
textChunkLimit- 出站文本分块大小(默认:4000字符)streaming.chunkMode-"length"(默认)在限制处拆分;"newline"优先按换行边界拆分mediaMaxMb- 媒体上传/下载限制(默认:30MB)
流式输出
Feishu/Lark 支持通过交互式卡片进行流式回复(Card Kit streaming API)。启用后,机器人在生成文本时会实时更新卡片。streaming.mode: "off" 设为在一条消息中发送完整回复;renderMode: "raw"(纯文本而非卡片)也会禁用流式卡片。streaming.block.enabled 默认关闭;仅在需要将已完成的助手块在最终回复前刷新时启用它。旧的布尔值 streaming 以及扁平的 blockStreaming/blockStreamingCoalesce/chunkMode 键会通过 openclaw doctor --fix 迁移为这种嵌套结构。
配额优化
通过两个可选标志减少飞书/Lark API 调用次数:typingIndicator(默认true):设为false可跳过输入中反应调用resolveSenderNames(默认true):设为false可跳过发送者资料查询
群组会话范围和话题线程
channels.feishu.groupSessionScope(顶层、按账户或按群组)控制群消息如何映射到代理会话:
对于话题范围,原生飞书/Lark 话题群会使用事件
thread_id(omt_*)作为规范的话题会话键。如果原生话题起始事件省略了 thread_id,OpenClaw 会在路由轮次之前从飞书补全它。OpenClaw 将普通群回复转换为线程时,会继续使用回复根消息 ID(om_*),因此首次轮次和后续轮次会保留在同一个会话中。
将 replyInThread: "enabled"(顶层或按群组)设为启用,可让机器人回复创建或继续一个飞书话题线程,而不是在原处回复。topicSessionMode 是 groupSessionScope 的已弃用前身;请优先使用 groupSessionScope。
飞书工作区工具
该插件为飞书文档、聊天、知识库、云存储、权限和 Bitable 提供智能体工具,并附带对应技能(feishu-doc、feishu-drive、feishu-perm、feishu-wiki)。工具家族由 channels.feishu.tools 控制:
按账户设置的开关位于
accounts.<id>.tools 下。
feishu_doc 只创建包含标题的文档。要添加 Markdown,请在单独的 write 操作中将返回的
document_id 作为 doc_token 传入。包含 content 的 create 请求会失败,且不会创建空文档。
如果要在根目录之外直接通过 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)
按用户隔离智能体(动态智能体创建)
启用dynamicAgentCreation 可为每个私信用户自动创建隔离的智能体实例。每个用户都会拥有自己的:
- 独立工作区目录
- 单独的
USER.md/SOUL.md/MEMORY.md - 私有对话历史
- 隔离的技能和状态
动态绑定包含规范化后的飞书
accountId,因此默认账户和命名账户会将每个发送者路由到正确的动态智能体。如果某个命名账户在旧版本中创建了一个未限定范围的动态智能体,该旧智能体仍会计入 maxAgents。在删除它之前,请确认默认账户不会使用它,或者临时提高 maxAgents;OpenClaw 无法安全地推断哪个账户拥有这种歧义的旧状态。快速设置
工作原理
当新用户发送第一条私信时:- 该频道会生成一个唯一的
agentId:默认账户为feishu-{user_open_id},命名账户则为带有账户前缀的受限身份摘要 - 在
workspaceTemplate路径下创建新的工作区 - 注册该智能体并为此用户创建绑定
- 工作区辅助程序会在首次访问时确保引导文件(
AGENTS.md、SOUL.md、USER.md等)存在 - 将该用户未来的所有消息路由到其专属智能体
配置选项
模板变量:
{agentId}- 生成的智能体 ID(例如:feishu-ou_xxxxxx或feishu-support-<identity_digest>){userId}- 发送者的飞书 open_id(例如:ou_xxxxxx)
会话范围
session.dmScope 控制私信如何映射到智能体会话。这是一个全局设置,会影响所有频道。
权衡:使用
"main" 可以启用引导文件的自动加载(USER.md、SOUL.md、MEMORY.md),但这意味着所有频道的所有私信都会共享相同的会话键模式。对于更看重隔离而不是引导自动加载的公共多用户机器人,建议使用 "per-channel-peer" 并手动管理引导文件。
当命名的飞书账户需要为同一发送者保持独立会话时,请使用
"per-account-channel-peer"。动态绑定会保留账户范围。典型多用户部署
验证
检查网关日志,确认动态创建是否正常工作:说明
- 工作区隔离:每个用户都会获得自己的工作区目录和智能体实例。在正常消息交互流程中,用户无法看到彼此的对话历史或文件。
- 安全边界:这是一种消息上下文隔离机制,不是恶意共租户的安全边界。智能体进程和宿主环境是共享的。
- 必须保持配置写入开启:动态智能体创建会将智能体和绑定写入配置;当
channels.feishu.configWrites为false时会跳过(默认:开启)。 bindings应为空:动态智能体会自动注册自己的绑定- 升级路径:现有的手动绑定可以与动态智能体并存
session.dmScope是全局的:这会影响所有频道,而不仅仅是飞书。
配置参考
完整配置:网关配置
在 webhook 模式下,
channels.feishu.webhookPath 和
channels.feishu.accounts.<id>.webhookPath 都必须是以 / 开头的规范 HTTP 请求路径,
例如 /feishu/events。支持可选查询字符串,且必须完全匹配。不接受完整 URL、相对路径、
URL 片段、点号路径段以及未编码的空格或 Unicode 字符。如果现有配置包含非规范路径,
请运行 openclaw doctor --fix 进行修复,然后再启动网关。
支持的消息类型
接收
- ✅ 文本
- ✅ 富文本(帖子)
- ✅ 图片
- ✅ 文件
- ✅ 音频
- ✅ 视频/媒体
- ✅ 表情贴纸
file_key JSON。当配置了 tools.media.audio 时,OpenClaw 会下载语音笔记资源,并在代理轮次之前运行共享的音频转写,因此代理会收到口语转录文本。如果飞书在音频载荷中直接包含了转录文本,则会直接使用该文本,而不会再进行一次 ASR 调用。若没有音频转写提供方,代理仍会收到一个 <media:audio> 占位符以及已保存的附件,而不是原始的飞书资源载荷。
发送
- ✅ 文本
- ✅ 图片
- ✅ 文件
- ✅ 音频
- ✅ 视频/媒体
- ✅ 交互式卡片(包括流式更新)
- ⚠️ 富文本(帖子样式格式;不支持完整的飞书/Lark 创作能力)
audio 消息类型,并且需要 Ogg/Opus 上传媒体(file_type: "opus")。现有的 .opus 和 .ogg 媒体会直接作为原生音频发送。MP3/WAV/M4A 以及其他可能的音频格式只有在回复请求语音投递(audioAsVoice / 消息工具 asVoice,包括 TTS 语音笔记回复)时,才会借助 ffmpeg 转码为 48kHz Ogg/Opus。普通的 MP3 附件会保持为常规文件。如果缺少 ffmpeg 或转换失败,OpenClaw 会回退为文件附件,并记录原因。
线程和回复
- ✅ 行内回复
- ✅ 线程回复
- ✅ 回复媒体在回复线程消息时仍保持线程感知