Feishu/Lark (飞书) channel plugin for OpenClaw.
中文社区资料 - 配置教程、常见问题、使用技巧:Wiki
Contributing / 贡献指南: CONTRIBUTING.md
Issue Reporting / 问题反馈: Please check Discussions first for common solutions, then open a structured Issue Form if needed.
问题反馈前请先查看 Discussions 是否已有常见解答;如仍未解决,再提交结构化 Issue 模板。Questions / 使用咨询: Use
Questionissue for troubleshooting; use Discussions for open-ended Q&A.
排查型咨询请提交QuestionIssue;开放式交流请使用 Discussions。
openclaw plugins install @m1heng-clawd/feishu
IMPORTANT
Windows Troubleshooting (spawn npm ENOENT)
If openclaw plugins install fails, install manually with the latest tarball:
# Option A (recommended): download latest package tarball
npm pack @m1heng-clawd/feishu
openclaw plugins install ./m1heng-clawd-feishu-<version>.tgz
# Option B (keep curl flow): resolve latest tarball URL, then download/install
TARBALL_URL="$(npm view @m1heng-clawd/feishu dist.tarball)"
curl -L -o feishu-latest.tgz "$TARBALL_URL"
openclaw plugins install ./feishu-latest.tgz
# Windows PowerShell (Option B) $tarball = npm view @m1heng-clawd/feishu dist.tarball curl.exe -L $tarball -o feishu-latest.tgz openclaw plugins install .\feishu-latest.tgz
# Option C (no npm command): use URL template with latest version from npm Versions tab
# https://www.npmjs.com/package/@m1heng-clawd/feishu?activeTab=versions
curl -L -o feishu-latest.tgz https://registry.npmjs.org/@m1heng-clawd/feishu/-/feishu-<version>.tgz
openclaw plugins install ./feishu-latest.tgz
openclaw plugins update feishu
Check installed version:
openclaw plugins list | rg -i feishu
| Permission | Scope | Description |
|---|---|---|
im:message | Messaging | Send and receive messages |
im:message.p2p_msg:readonly | DM | Read direct messages to bot |
im:message.group_at_msg:readonly | Group | Receive @mention messages in groups |
im:message:send_as_bot | Send | Send messages as the bot |
im:resource | Media | Upload and download images/files |
| Permission | Scope | Description |
|---|---|---|
contact:user.base:readonly | User info | Get basic user info (required to resolve sender display names for speaker attribution) |
im:message.group_msg | Group | Read all group messages (sensitive). Required when you want requireMention: false to work for non-@ group messages |
im:message:readonly | Read | Get message history |
im:message:update | Edit | Update/edit sent messages |
im:message:recall | Recall | Recall sent messages |
im:message.reactions:read | Reactions | View message reactions |
Read-only (minimum required):
| Permission | Tool | Description |
|---|---|---|
docx:document:readonly | feishu_doc | Read documents |
drive:drive:readonly | feishu_drive | List folders, get file info |
wiki:wiki:readonly | feishu_wiki | List spaces, list nodes, get node info, search |
bitable:app:readonly | feishu_bitable | Read bitable records and fields |
task:task:read | feishu_task_get | Get task details |
task:tasklist:read | feishu_tasklist_get, feishu_tasklist_list | Get/list tasklists |
task:comment:read | feishu_task_comment_list, feishu_task_comment_get | List/get task comments |
task:attachment:read | feishu_task_attachment_list, feishu_task_attachment_get | List/get task attachments |
Read-write (optional, for create/edit/delete operations):
| Permission | Tool | Description |
|---|---|---|
docx:document | feishu_doc | Create/edit documents |
docx:document.block:convert | feishu_doc | Markdown to blocks conversion (required for write/append/create_and_write; also used by feishu_drive.import_document) |
drive:drive | feishu_doc, feishu_drive | Upload images to documents, create folders, move/delete files |
wiki:wiki | feishu_wiki | Create/move/rename wiki nodes |
bitable:app | feishu_bitable | Create/update/delete bitable records and manage fields |
task:task:write | feishu_task_create, feishu_task_subtask_create, feishu_task_update, feishu_task_delete | Create/update/delete tasks |
task:tasklist:write | feishu_tasklist_create, feishu_tasklist_update, feishu_tasklist_delete, feishu_tasklist_add_members, feishu_tasklist_remove_members, feishu_task_add_tasklist, feishu_task_remove_tasklist | Create/update/delete tasklists and manage membership |
task:comment:write | feishu_task_comment_create, feishu_task_comment_update, feishu_task_comment_delete | Create/update/delete task comments |
task:attachment:write | feishu_task_attachment_upload, feishu_task_attachment_delete | Upload/delete task attachments |
Task scope names may vary slightly in Feishu console UI. If needed, search for Task / Tasklist / Comment / Attachment-related permissions and grant read/write accordingly.
Task comments require dedicated scopes:
task:comment:read.task:comment:write.If these scopes are missing, comment APIs will return permission-denied errors.
Task attachments support upload/get/list/delete. Upload sources:
file_path)file_url, public or presigned)For file_url, OpenClaw runtime media loader is used with safety checks and size limit (mediaMaxMb), then the downloaded file is uploaded via a temporary local file.
Important: Keep tasklist owner as the bot. Add users as members instead.
Tasklist access is granted based on owner + member roles. If you change the owner to a user and the bot is not a member, the bot may lose permission to read/edit/manage that tasklist (and subsequent operations will fail).
Important: A user can only view a task when they are included as an assignee.
Limitation: The bot can currently only create subtasks for tasks created by itself.
To avoid “task created but not visible” issues:
Important: Bots don't have their own "My Space" (root folder). Bots can only access files/folders that have been shared with them.
To let the bot manage files:
Without this step, feishu_drive operations like create_folder will fail because the bot has no root folder to create in.
Important: API permissions alone are not enough for wiki access. You must also add the bot to each wiki space.
Without this step, feishu_wiki will return empty results even with correct API permissions.
Reference: Wiki FAQ - How to add app to wiki
Important: Like other resources, the bot can only access bitables that have been shared with it.
To let the bot access a bitable:
The feishu_bitable tools support both URL formats:
/base/XXX?table=YYY - Standard bitable URL/wiki/XXX?table=YYY - Bitable embedded in wiki (auto-converts to app_token)This is the most commonly missed configuration! If the bot can send messages but cannot receive them, check this section.
In the Feishu Open Platform console, go to Events & Callbacks:
connectionMode:
connectionMode: "websocket" (recommended, no public URL needed)connectionMode: "webhook" (requires a publicly accessible URL)| Event | Description |
|---|---|
im.message.receive_v1 | Receive messages (required) |
im.message.message_read_v1 | Message read receipts |
im.chat.member.bot.added_v1 | Bot added to group |
im.chat.member.bot.deleted_v1 | Bot removed from group |
openclaw config set channels.feishu.appId "cli_xxxxx"
openclaw config set channels.feishu.appSecret "your_app_secret"
openclaw config set channels.feishu.enabled true
channels:
feishu:
enabled: true
appId: "cli_xxxxx"
appSecret: "secret"
# Domain: "feishu" (China), "lark" (International), or custom URL
domain: "feishu" # or "https://open.xxx.cn" for private deployment
# Connection mode: "websocket" (recommended) or "webhook"
connectionMode: "websocket"
# DM policy: "pairing" | "open" | "allowlist"
dmPolicy: "pairing"
# DM allowlist (open_id/user_id). Include "*" when dmPolicy="open"
allowFrom: []
# Group policy: "open" | "allowlist" | "disabled"
groupPolicy: "allowlist"
# Require @mention in groups
requireMention: true
# Safety default for mention-free mode (`requireMention: false`):
# only allow non-@ messages in groups with <= 1 bot.
# Set true to also allow mention-free messages in multi-bot groups.
allowMentionlessInMultiBotGroup: false
# Group command mention bypass: "never" | "single_bot" | "always"
# Default "single_bot": allow authorized command-only messages without @
# only when the group has a single bot.
groupCommandMentionBypass: "single_bot"
# Max media size in MB (default: 30)
mediaMaxMb: 30
# Render mode for bot replies: "auto" | "raw" | "card"
renderMode: "auto"
dmPolicy controls who can interact with the bot in direct messages (DM).
In multi-account mode, this is resolved per account (channels.feishu.accounts.<accountId>).
dmPolicy | Who can send DM | How to grant access to a user |
|---|---|---|
pairing | Users in allowFrom, or users approved through pairing | User sends a DM and gets a pairing code; bot owner runs openclaw pairing approve feishu <code>. |
open | Everyone | Set allowFrom: ["*"] so all users are treated as allowed. |
allowlist | Only users in allowFrom | Add the user's open_id/user_id to allowFrom, then reload config. |
Notes:
allowFrom accepts Feishu user IDs (open_id recommended, user_id also supported).dmPolicy: "open", use allowFrom: ["*"]. This is required by top-level schema validation and keeps access behavior explicit.pairing and allowlist can both pre-authorize users with allowFrom.Pairing flow (owner approval):
H9ZEHY8R).openclaw pairing approve feishu H9ZEHY8R
Example: open to everyone
channels:
feishu:
dmPolicy: "open"
allowFrom: ["*"]
Example: controlled rollout (pairing + pre-approved users)
channels:
feishu:
dmPolicy: "pairing"
allowFrom:
- "ou_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Example: strict allowlist
channels:
feishu:
dmPolicy: "allowlist"
allowFrom:
- "ou_alice"
- "ou_bob"
Example: account-level isolation
channels:
feishu:
accounts:
lobster-1:
dmPolicy: "open"
allowFrom: ["*"]
lobster-5:
dmPolicy: "pairing"
Top-level channels.feishu.dmPolicy / channels.feishu.allowFrom are fallback defaults for accounts that do not override them.
dmPolicyonly controls who can trigger the bot.
To actually read/write docs or files, you still need: (1) correct Feishu app scopes, and (2) sharing the target resources (Drive/Wiki/Bitable) with the bot.
When requireMention: true, Feishu can still allow authorized control commands (such as /new) without @bot.
groupCommandMentionBypass | Behavior |
|---|---|
never | Never bypass @ requirement for group commands. |
single_bot | Bypass only when the group contains at most one bot (default). |
always | Always allow authorized control commands to bypass mention gating. |
Notes:
@-mentioned in the same message, bypass is disabled.When requireMention: false, non-@ group messages are handled with a safety default:
allowMentionlessInMultiBotGroup | Behavior for non-@ group messages |
|---|---|
false (default) | Only accepted when the group has at most one bot. In multi-bot groups, explicit @bot is still required. |
true | Accepted even in multi-bot groups (use only if you accept duplicate-trigger risk). |
Important:
im:message.group_msg is required for receiving non-@ group messages and this is a sensitive permission in Feishu.@bot group messages (im:message.group_at_msg:readonly).Two connection modes are available for receiving events from Feishu:
| Mode | Description |
|---|---|
websocket | (Default, recommended) Long-polling WebSocket connection. No public URL required, works behind NAT/firewall. Best for local development and most deployments. |
webhook | HTTP server that receives event callbacks. Requires a publicly accessible URL. Suitable for server deployments behind a reverse proxy (e.g. Nginx). |
WebSocket mode (default, no extra config needed):
channels:
feishu:
connectionMode: "websocket" # or just omit this line
In Feishu console: Events & Callbacks → select Long connection.
Webhook mode:
channels:
feishu:
connectionMode: "webhook"
webhookPort: 3000 # HTTP server port (default: 3000)
webhookPath: "/feishu/events" # Event callback path (default: "/feishu/events")
encryptKey: "your_encrypt_key" # From Feishu console → Events & Callbacks → Encrypt Key
verificationToken: "your_verify_token" # From Feishu console → Events & Callbacks → Verification Token
In Feishu console: Events & Callbacks → select Request URL → set the URL to:
https://your-domain.com/feishu/events
Note: The Request URL must be HTTPS and publicly accessible. For local development, you can use tools like ngrok to create a tunnel:
ngrok http 3000, then use the generated URL.
| Mode | Description |
|---|---|
auto | (Default) Automatically detect: use card for messages with code blocks or tables, plain text otherwise. |
raw | Always send replies as plain text. Markdown tables are converted to ASCII. |
card | Always send replies as interactive cards with full markdown rendering (syntax highlighting, tables, clickable links). |
When enabled, each DM user automatically gets their own isolated agent instance with a dedicated workspace. This provides complete isolation including separate conversation history, memory (MEMORY.md), and workspace files.
channels:
feishu:
dmPolicy: "open"
allowFrom: ["*"]
dynamicAgentCreation:
enabled: true
# Template for workspace directory ({userId} = OpenID, {agentId} = generated agent ID)
workspaceTemplate: "~/workspaces/feishu-{agentId}"
# Template for agent config directory
agentDirTemplate: "~/.openclaw/agents/{agentId}/agent"
# Optional: limit total number of dynamic agents
maxAgents: 100
session:
# Also set dmScope for session isolation (conversation history)
dmScope: "per-peer"
| Option | Description |
|---|---|
enabled | Enable dynamic agent creation for DM users |
workspaceTemplate | Template for workspace path. Supports {userId} (OpenID) and {agentId} (= feishu-{openId}) |
agentDirTemplate | Template for agent directory path |
maxAgents | Optional limit on number of dynamic agents |
How it works:
openclaw.jsonDifference from dmScope: "per-peer":
dmScope: "per-peer" only isolates conversation historydynamicAgentCreation provides full isolation (workspace, memory, identity, tools)create_and_write / import_document flows for reliable create+content write/base/ and /wiki/ URLsWhen you want the bot to @mention someone in its reply, simply @mention them in your message:
@张三 say hello → Bot replies with @张三 Hello!@bot @张三 say hello → Bot replies with @张三 Hello!The bot automatically detects @mentions in your message and includes them in its reply. No extra permissions required beyond the standard messaging permissions.
Check the following:
connectionMode?
websocket → Long connection in Feishu consolewebhook → Request URL in Feishu console (URL must be reachable)im.message.receive_v1 event?Check the following:
im:message.group_msg approved? (sensitive permission, required for non-@ group messages)allowMentionlessInMultiBotGroup: true?requireMention: false configured on the effective account/group?Ensure im:message:send_as_bot permission is approved.
Send /new command in the chat.
Feishu API has rate limits. Streaming updates can easily trigger throttling. We use complete-then-send approach for stability.
openclaw plugins install @m1heng-clawd/feishu
IMPORTANT
Windows 排错(spawn npm ENOENT)
如果 openclaw plugins install 失败,可通过最新 tarball 手动安装:
# 方案 A(推荐):下载最新插件 tarball
npm pack @m1heng-clawd/feishu
openclaw plugins install ./m1heng-clawd-feishu-<version>.tgz
# 方案 B(保留 curl 路径):先解析最新 tarball 地址,再下载安装
TARBALL_URL="$(npm view @m1heng-clawd/feishu dist.tarball)"
curl -L -o feishu-latest.tgz "$TARBALL_URL"
openclaw plugins install ./feishu-latest.tgz
# Windows PowerShell(方案 B) $tarball = npm view @m1heng-clawd/feishu dist.tarball curl.exe -L $tarball -o feishu-latest.tgz openclaw plugins install .\feishu-latest.tgz
# 方案 C(无 npm 命令):先在 npm Versions 页查到最新版本号,再套用 URL 模板
# https://www.npmjs.com/package/@m1heng-clawd/feishu?activeTab=versions
curl -L -o feishu-latest.tgz https://registry.npmjs.org/@m1heng-clawd/feishu/-/feishu-<version>.tgz
openclaw plugins install ./feishu-latest.tgz
openclaw plugins update feishu
查看已安装版本:
openclaw plugins list | rg -i feishu
| 权限 | 范围 | 说明 |
|---|---|---|
im:message | 消息 | 发送和接收消息 |
im:message.p2p_msg:readonly | 私聊 | 读取发给机器人的私聊消息 |
im:message.group_at_msg:readonly | 群聊 | 接收群内 @机器人 的消息 |
im:message:send_as_bot | 发送 | 以机器人身份发送消息 |
im:resource | 媒体 | 上传和下载图片/文件 |
| 权限 | 范围 | 说明 |
|---|---|---|
contact:user.base:readonly | 用户信息 | 获取用户基本信息(用于解析发送者姓名,避免群聊/私聊把不同人当成同一说话者) |
im:message.group_msg | 群聊 | 读取所有群消息(敏感权限)。当你希望 requireMention: false 对“未 @ 的群消息”生效时必需 |
im:message:readonly | 读取 | 获取历史消息 |
im:message:update | 编辑 | 更新/编辑已发送消息 |
im:message:recall | 撤回 | 撤回已发送消息 |
im:message.reactions:read | 表情 | 查看消息表情回复 |
只读权限(最低要求):
| 权限 | 工具 | 说明 |
|---|---|---|
docx:document:readonly | feishu_doc | 读取文档 |
drive:drive:readonly | feishu_drive | 列出文件夹、获取文件信息 |
wiki:wiki:readonly | feishu_wiki | 列出空间、列出节点、获取节点详情、搜索 |
bitable:app:readonly | feishu_bitable | 读取多维表格记录和字段 |
task:task:read | feishu_task_get | 获取任务详情 |
task:tasklist:read | feishu_tasklist_get, feishu_tasklist_list | 获取/列出任务清单(tasklists) |
task:comment:read | feishu_task_comment_list, feishu_task_comment_get | 列出/获取任务评论 |
task:attachment:read | feishu_task_attachment_list, feishu_task_attachment_get | 列出/获取任务附件 |
读写权限(可选,用于创建/编辑/删除操作):
| 权限 | 工具 | 说明 |
|---|---|---|
docx:document | feishu_doc | 创建/编辑文档 |
docx:document.block:convert | feishu_doc | Markdown 转 blocks(write/append/create_and_write 必需,feishu_drive.import_document 也会用到) |
drive:drive | feishu_doc, feishu_drive | 上传图片到文档、创建文件夹、移动/删除文件 |
wiki:wiki | feishu_wiki | 创建/移动/重命名知识库节点 |
bitable:app | feishu_bitable | 创建/更新/删除多维表格记录并管理字段 |
task:task:write | feishu_task_create, feishu_task_subtask_create, feishu_task_update, feishu_task_delete | 创建/更新/删除任务 |
task:tasklist:write | feishu_tasklist_create, feishu_tasklist_update, feishu_tasklist_delete, feishu_tasklist_add_members, feishu_tasklist_remove_members, feishu_task_add_tasklist, feishu_task_remove_tasklist | 创建/更新/删除任务清单并管理成员/关联任务 |
task:comment:write | feishu_task_comment_create, feishu_task_comment_update, feishu_task_comment_delete | 创建/更新/删除任务评论 |
task:attachment:write | feishu_task_attachment_upload, feishu_task_attachment_delete | 上传/删除任务附件 |
飞书控制台中任务权限的显示名称可能略有差异,必要时可按关键字
task/tasklist/comment/attachment搜索并授予对应读写权限。
任务评论需要单独授权:
task:comment:read。task:comment:write。缺少上述权限时,评论相关接口会返回权限不足错误。
任务附件支持上传/获取/列表/删除。上传来源:
file_path)file_url,公开/预签名 URL)file_url 上传路径会使用 OpenClaw 运行时的媒体下载安全校验与大小限制(mediaMaxMb),随后经临时本地文件上传到任务附件。
重要: 创建/修改任务清单时,请保持清单所有者为机器人本身,只把用户作为协作人添加。
任务清单权限基于“所有者 + 协作成员角色”授予。如果把清单所有者改成用户、且机器人不在协作成员中,机器人可能会失去对该清单的读取/编辑/管理权限,导致后续对清单的操作失败。
重要: 只有当任务责任人包含用户时,用户才能查看到该任务。
限制: 机器人目前只能给自己创建出来的任务创建子任务。
为避免“任务创建了但用户看不到”的问题:
assignee)。重要: 机器人没有自己的"我的空间"(根目录)。机器人只能访问被分享给它的文件/文件夹。
要让机器人管理文件:
如果不做这一步,feishu_drive 的 create_folder 等操作会失败,因为机器人没有根目录可以创建文件夹。
重要: 仅有 API 权限不够,还需要将机器人添加到知识库空间。
如果不做这一步,即使 API 权限正确,feishu_wiki 也会返回空结果。
重要: 与其他资源一样,机器人只能访问被分享给它的多维表格。
要让机器人访问多维表格:
feishu_bitable 工具支持两种 URL 格式:
/base/XXX?table=YYY - 标准多维表格链接/wiki/XXX?table=YYY - 嵌入在知识库中的多维表格(自动转换为 app_token)这是最容易遗漏的配置! 如果机器人能发消息但收不到消息,请检查此项。
在飞书开放平台的应用后台,进入 事件与回调 页面:
connectionMode 选择对应的订阅方式:
connectionMode: "websocket"(推荐,无需公网地址)connectionMode: "webhook"(需要公网可访问的 URL)| 事件 | 说明 |
|---|---|
im.message.receive_v1 | 接收消息(必需) |
im.message.message_read_v1 | 消息已读回执 |
im.chat.member.bot.added_v1 | 机器人进群 |
im.chat.member.bot.deleted_v1 | 机器人被移出群 |
openclaw config set channels.feishu.appId "cli_xxxxx"
openclaw config set channels.feishu.appSecret "your_app_secret"
openclaw config set channels.feishu.enabled true
channels:
feishu:
enabled: true
appId: "cli_xxxxx"
appSecret: "secret"
# 域名: "feishu" (国内)、"lark" (国际) 或自定义 URL
domain: "feishu" # 私有化部署可用 "https://open.xxx.cn"
# 连接模式: "websocket" (推荐) 或 "webhook"
connectionMode: "websocket"
# 私聊策略: "pairing" | "open" | "allowlist"
dmPolicy: "pairing"
# 私聊白名单(open_id/user_id);当 dmPolicy="open" 时请包含 "*"
allowFrom: []
# 群聊策略: "open" | "allowlist" | "disabled"
groupPolicy: "allowlist"
# 群聊是否需要 @机器人
requireMention: true
# 免 @ 安全默认策略(requireMention=false 时):
# 仅在群内机器人数量 <= 1 时处理未 @ 的群消息。
# 设为 true 可在多 bot 群也放开免 @(需自行承担重复触发风险)。
allowMentionlessInMultiBotGroup: false
# 群聊命令绕过 @ 策略: "never" | "single_bot" | "always"
# 默认 "single_bot":仅当群内机器人数量 <= 1 时,允许已授权命令免 @
groupCommandMentionBypass: "single_bot"
# 媒体文件最大大小 (MB, 默认 30)
mediaMaxMb: 30
# 回复渲染模式: "auto" | "raw" | "card"
renderMode: "auto"
dmPolicy 控制的是“谁可以在私聊里触发机器人”。
在多账号模式下,它按账号生效(channels.feishu.accounts.<accountId>)。
dmPolicy | 谁能私聊触发机器人 | 如何给用户开通 |
|---|---|---|
pairing | allowFrom 中的用户,或已通过配对审批的用户 | 用户先私聊机器人拿到配对码;管理员执行 openclaw pairing approve feishu <code>。 |
open | 所有人 | 配置 allowFrom: ["*"],表示全部放开。 |
allowlist | 仅 allowFrom 中的用户 | 将用户 open_id/user_id 加入 allowFrom,然后重载配置。 |
说明:
allowFrom 支持飞书用户 ID(推荐 open_id,也支持 user_id)。dmPolicy: "open" 时,建议固定写 allowFrom: ["*"],语义最清晰,也满足顶层配置校验要求。pairing 和 allowlist 都可以先通过 allowFrom 预授权部分用户。配对审批流程(pairing):
H9ZEHY8R)。openclaw pairing approve feishu H9ZEHY8R
示例:全部放开
channels:
feishu:
dmPolicy: "open"
allowFrom: ["*"]
示例:灰度放开(pairing + 预授权)
channels:
feishu:
dmPolicy: "pairing"
allowFrom:
- "ou_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
示例:严格白名单
channels:
feishu:
dmPolicy: "allowlist"
allowFrom:
- "ou_alice"
- "ou_bob"
示例:按账号隔离配置
channels:
feishu:
accounts:
lobster-1:
dmPolicy: "open"
allowFrom: ["*"]
lobster-5:
dmPolicy: "pairing"
channels.feishu.dmPolicy / channels.feishu.allowFrom 是“默认值”;账号下未覆盖时才会继承。
dmPolicy只控制“是否允许触发机器人”。
真正执行文档/云盘/知识库/多维表格操作,还需要两层权限:1)应用 API 权限(scopes);2)把目标资源分享给机器人。
当 requireMention: true 时,Feishu 仍可让“已授权控制命令(如 /new)”在不 @bot 的情况下通过。
groupCommandMentionBypass | 行为 |
|---|---|
never | 群聊命令永不绕过 @ 校验。 |
single_bot | 仅当群内机器人数量不超过 1 个时才允许绕过(默认)。 |
always | 已授权控制命令始终可绕过 @ 校验。 |
说明:
@ 了任意用户,则不会触发命令免 @。当 requireMention: false 时,插件对“未 @ 的群消息”采用安全默认策略:
allowMentionlessInMultiBotGroup | 未 @ 群消息行为 |
|---|---|
false(默认) | 仅当群里机器人数量不超过 1 个时处理;多 bot 群仍要求显式 @bot。 |
true | 即使在多 bot 群也处理未 @ 消息(仅建议在可接受重复触发风险时启用)。 |
重要说明:
im:message.group_msg,且该权限是飞书敏感权限。@bot 群消息(im:message.group_at_msg:readonly)。支持两种从飞书接收事件的连接模式:
| 模式 | 说明 |
|---|---|
websocket | (默认,推荐)长连接 WebSocket 模式。无需公网地址,可在 NAT/防火墙后使用。适合本地开发和大部分部署场景。 |
webhook | HTTP 服务器接收事件回调。需要公网可访问的 URL。适合通过反向代理(如 Nginx)部署的服务器环境。 |
WebSocket 模式(默认,无需额外配置):
channels:
feishu:
connectionMode: "websocket" # 或直接省略此行
飞书控制台:事件与回调 → 选择 使用长连接接收事件。
Webhook 模式:
channels:
feishu:
connectionMode: "webhook"
webhookPort: 3000 # HTTP 服务端口(默认: 3000)
webhookPath: "/feishu/events" # 事件回调路径(默认: "/feishu/events")
encryptKey: "your_encrypt_key" # 飞书控制台 → 事件与回调 → Encrypt Key
verificationToken: "your_verify_token" # 飞书控制台 → 事件与回调 → Verification Token
飞书控制台:事件与回调 → 选择 使用请求地址接收事件 → 填入请求地址:
https://your-domain.com/feishu/events
提示: 请求地址必须是 HTTPS 且公网可访问。本地开发时,可使用 ngrok 等工具创建隧道:
ngrok http 3000,然后使用生成的地址。
| 模式 | 说明 |
|---|---|
auto | (默认)自动检测:有代码块或表格时用卡片,否则纯文本 |
raw | 始终纯文本,表格转为 ASCII |
card | 始终使用卡片,支持语法高亮、表格、链接等 |
启用后,每个私聊用户会自动获得独立的 agent 实例和专属 workspace。这提供完整的隔离,包括独立的对话历史、记忆(MEMORY.md)和工作区文件。
channels:
feishu:
dmPolicy: "open"
allowFrom: ["*"]
dynamicAgentCreation:
enabled: true
# workspace 目录模板 ({userId} = OpenID, {agentId} = 生成的 agent ID)
workspaceTemplate: "~/workspaces/feishu-{agentId}"
# agent 配置目录模板
agentDirTemplate: "~/.openclaw/agents/{agentId}/agent"
# 可选:限制动态 agent 总数
maxAgents: 100
session:
# 同时设置 dmScope 以隔离对话历史
dmScope: "per-peer"
| 选项 | 说明 |
|---|---|
enabled | 是否为私聊用户启用动态 agent 创建 |
workspaceTemplate | workspace 路径模板,支持 {userId}(OpenID)和 {agentId}(= feishu-{openId}) |
agentDirTemplate | agent 目录路径模板 |
maxAgents | 可选,限制动态 agent 的最大数量 |
工作原理:
openclaw.json 中创建新的 agent 条目与 dmScope: "per-peer" 的区别:
dmScope: "per-peer" 仅隔离对话历史dynamicAgentCreation 提供完整隔离(workspace、记忆、身份、工具)/base/ 和 /wiki/ 两种链接格式如果你希望机器人的回复中 @ 某人,只需在你的消息中 @ 他们:
@张三 跟他问好 → 机器人回复 @张三 你好!@机器人 @张三 跟他问好 → 机器人回复 @张三 你好!机器人会自动检测消息中的 @ 并在回复时带上。无需额外权限。
检查以下配置:
connectionMode 匹配?
websocket → 飞书控制台选择 使用长连接接收事件webhook → 飞书控制台选择 使用请求地址接收事件(URL 必须可访问)im.message.receive_v1 事件?请重点检查:
im:message.group_msg(敏感权限,接收未 @ 群消息必需)allowMentionlessInMultiBotGroup: truerequireMention: false 是否配置在当前生效的账号/群配置上确保已申请 im:message:send_as_bot 权限,并且权限已审核通过。
在聊天中发送 /new 命令即可开启新对话。
飞书 API 有请求频率限制,流式更新消息很容易触发限流。当前采用完整回复后一次性发送的方式,以保证稳定性。
MIT