1. 为什么企业 IM 机器人必须走 Stream 模式
OpenClaw 接入飞书和钉钉,最容易卡住新手的不是模型配置,而是消息通道。传统 Webhook 回调模式要求你的服务有一个公网可访问的 HTTPS 地址,本地开发机、内网服务器统统收不到平台推送。Stream 模式(WebSocket 长连接)把这件事反过来了:由你的 OpenClaw 进程主动连到飞书/钉钉的网关,平台有事件就顺着这条已建立的连接推下来,不需要公网 IP、不需要域名备案、不需要内网穿透工具。
这套机制对做企业 IM 机器人的开发者意味着什么?你可以在自己的笔记本上跑一个 OpenClaw,连上公司飞书租户,@ 一下机器人就能收到消息并回复,整个链路和线上部署完全一致。飞书和钉钉目前都官方开放了 Stream 模式,稳定性有保障,这也是本篇聚焦这两个平台的原因。
本文面向已经装好 OpenClaw、准备把机器人接进企业 IM 的开发者。我会给出可直接复制的config.toml骨架、TaoToken 统一 Key 的接入方式,以及飞书/钉钉后台事件订阅与本地联调的完整验证动作,目标是让你一次跑通消息收发链路。模型侧我用 TaoToken 做统一通道,一个 Key 同时覆盖 OpenAI 兼容和 Anthropic 兼容两种协议,省去在多个平台之间来回切换的麻烦。
2. 前置准备:OpenClaw 状态与 TaoToken 统一 Key
2.1 确认 OpenClaw 网关在跑
动手改配置之前,先确认基础服务是活的。打开终端执行:
openclaw gateway status正常输出里应该能看到running字样。如果显示 stopped,先执行openclaw gateway start。同时确认版本不低于 2026.2.2,飞书官方插件是从这个版本开始内置的:
openclaw --version版本偏低的话,升级后再继续,否则plugins enable feishu会提示找不到插件。
2.2 拿一个 TaoToken Key 打通模型侧
IM 通道解决的是"消息怎么进来、怎么出去",模型侧解决的是"进来之后谁来回答"。这两件事分开配置、分开排障,效率最高。模型侧我建议用 TaoToken 做统一入口,原因是它同时提供 OpenAI 兼容和 Anthropic 兼容两种协议格式,OpenClaw 里切换模型提供商时不用改代码,只改配置。
到 TaoToken 控制台创建一个 API Key,入口在这里:
https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite创建后把 Key 存到环境变量里,不要硬编码进配置文件:
export TAOTOKEN_API_KEY="sk-你的key"TaoToken 的 API 基地址是https://taotoken.net/api,这个地址在下面配置模型提供商时会用到。如果你对模型对话能力还不熟悉,可以先去模型对话页面体验一下:
https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite2.3 飞书/钉钉开发者权限
飞书个人版直接登录开放平台即可创建应用;企业版需要管理员给你开发者角色。钉钉同理,企业内部应用需要管理员在开发者后台授权。这一步卡权限的话,后面所有配置都做不了,建议先确认。
3. 可复制配置:config.toml 骨架与飞书/钉钉参数
3.1 完整 config.toml 骨架
OpenClaw 的配置集中在~/.openclaw/config.toml。下面这份骨架把模型提供商、飞书渠道、钉钉渠道三块都写全了,你可以直接复制后替换占位符:
# ---------- 模型提供商:TaoToken 统一通道 ---------- [providers.taotoken] type = "openai-compatible" base_url = "https://taotoken.net/api" api_key = "${TAOTOKEN_API_KEY}" default_model = "claude-sonnet-4-5" # 如需 Anthropic 原生协议,可另开一个 provider [providers.taotoken-anthropic] type = "anthropic" base_url = "https://taotoken.net/api" api_key = "${TAOTOKEN_API_KEY}" default_model = "claude-sonnet-4-5" # ---------- 飞书渠道:Stream 模式 ---------- [channels.feishu] enabled = true app_id = "cli_xxxxxxxxxxxx" app_secret = "your_feishu_app_secret" connection_mode = "websocket" streaming = true # ---------- 钉钉渠道:Stream 模式 ---------- [channels.dingtalk] enabled = true client_id = "your_dingtalk_client_id" client_secret = "your_dingtalk_client_secret" connection_mode = "stream" streaming = true几个关键点解释一下。connection_mode在飞书里写websocket,在钉钉里写stream,这是两个平台各自的叫法,别写混。streaming = true控制的是回复是否逐字输出,飞书需要额外申请卡片流式权限才能生效,钉钉需要卡片相关权限,后面会讲。
3.2 用命令行写入(不想手改文件的话)
OpenClaw 也支持用config set逐项写入,适合脚本化部署:
# 模型提供商 openclaw config set providers.taotoken.base_url "https://taotoken.net/api" openclaw config set providers.taotoken.api_key "\${TAOTOKEN_API_KEY}" # 飞书 openclaw config set channels.feishu.appId "cli_xxxxx" openclaw config set channels.feishu.appSecret "your_secret" openclaw config set channels.feishu.enabled true openclaw config set channels.feishu.connectionMode "websocket" openclaw config set channels.feishu.streaming true # 钉钉 openclaw config set channels.dingtalk.clientId "your_client_id" openclaw config set channels.dingtalk.clientSecret "your_client_secret" openclaw config set channels.dingtalk.enabled true openclaw config set channels.dingtalk.connectionMode "stream"3.3 飞书后台:权限批量导入
飞书开放平台进入「权限管理」→「批量导入/导出权限」,粘贴这段 JSON:
{ "scopes": { "tenant": [ "im:message", "im:message:send_as_bot", "im:message:readonly", "im:message.p2p_msg:readonly", "im:message.group_at_msg:readonly", "im:chat.members:bot_access", "im:resource", "contact:user.employee_id:readonly" ], "user": [ "im:chat.access_event.bot_p2p_chat:read" ] } }想要流式逐字输出,还要手动补一条im:message:update,它不在默认列表里。企业版需要管理员审批,个人版一般几分钟自动通过。
3.4 钉钉后台:三项必申请权限
钉钉开放平台创建企业内部应用后,在「权限管理」里申请这三项,缺一不可:
| 权限名称 | 作用 |
|---|---|
| 企业内机器人发送消息 | 基础收发能力 |
| Card.Instance.Write | 卡片消息支持 |
| Card.Streaming.Write | 流式逐字输出 |
事件订阅方式必须选Stream 模式(WebSocket),不要选回调模式。回调模式要求公网 HTTPS 地址,本地服务收不到推送,这是新手最常踩的坑。
4. 验证请求:本地联调与成功结果
4.1 重启并检查渠道状态
配置写完,重启网关让配置生效:
openclaw gateway restart openclaw channels status正常输出里飞书和钉钉两行都应该是connected。如果显示disconnected,先看下一节的排查清单。
4.2 飞书联调
飞书开放平台进入「版本管理与发布」→ 创建新版本 → 提交审核 → 发布。这一步最容易遗漏:未发布的应用在飞书客户端里根本搜不到。发布后,在飞书里建一个群,把机器人拉进去,@ 它发一条消息:
@团队AI助手 你好,帮我总结一下今天的待办如果配置正确,你会看到机器人先"正在输入",然后逐字吐出回复。这个逐字效果就是streaming = true加上im:message:update权限共同作用的结果。
4.3 钉钉联调
钉钉在「版本管理与发布」创建版本并设置可见范围,状态变为"已发布"后,员工才能在工作台搜到。进入应用私聊,发一条消息:
帮我查一下本周的会议安排收到 AI 回复即接入成功。钉钉的流式效果需要Card.Streaming.Write权限 + Stream 订阅 +streaming = true三者同时满足。
4.4 用 curl 单独验证模型通道
IM 链路出问题时,先确认模型侧是通的,避免把模型问题误判成通道问题:
curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-5", "messages": [{"role": "user", "content": "只回复两个字:通了"}] }'返回里能看到"content": "通了"就说明模型通道没问题,问题一定在 IM 渠道配置上。
5. 本篇常见错排查
5.1 钉钉配置全对,手机搜不到机器人
九成是没发布应用版本。进入「版本管理与发布」创建新版本,设置可见范围,状态变"已发布"后才会出现在工作台。配置正确但没发布,等于应用不存在。
5.2 飞书机器人只能发纯文本,没有逐字效果
检查两处:一是权限里有没有im:message:update,它不在默认批量导入 JSON 里;二是config.toml里streaming是不是true。两处都对了还不行,看管理员是否审批通过了这条权限。
5.3 渠道状态一直 disconnected
按这个顺序查:app_id/client_id有没有复制错(飞书是cli_开头);app_secret有没有多余空格;connection_mode拼写对不对(飞书websocket、钉钉stream);网络能不能出站访问平台网关。逐项排除,基本能定位。
5.4 消息进来了但机器人不回复
先跑 4.4 的 curl 确认模型通道。如果 curl 通、IM 不回,看 OpenClaw 日志:
openclaw gateway logs --follow日志里通常会直接告诉你哪一步失败了,比如权限不足、模型调用超时、或者消息格式解析错误。
5.5 想同时接飞书和钉钉,上下文会串吗
不会。OpenClaw 的统一消息网关对不同渠道做上下文隔离,飞书群里的对话和钉钉私聊的记忆互不干扰。同一个 AI 助手可以同时在两个平台响应,各自维护自己的会话状态。
6. 把模型通道和 IM 通道分开维护
跑通之后,日常维护的核心思路是:IM 通道(飞书/钉钉的 App ID、权限、发布状态)和模型通道(TaoToken Key、模型选择)分开管理。IM 通道出问题去平台后台看权限和发布状态,模型通道出问题用 curl 单独验证。这样排障时不用在两个系统之间来回猜。
模型侧如果要做长期编码或 Agent 类任务,可以了解下 Coding Plan,额度模型更适合高频调用场景:
https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite接入过程中遇到渠道配置或 Key 相关的问题,接入文档里有更细的参数说明:
https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite如果你用的是 Claude Code 这类 Anthropic 协议工具,TaoToken 也提供对应的接入方式:
https://taotoken.net/claude-code?utm_source=taotoken_aicg_blog_end&utm_content=claude_code&utm_campaign=rewrite把"飞书/钉钉渠道接入 + 模型 Key 配置"这两步写进团队的 Onboarding Runbook,新成员当天就能完成 AI 助手部署,不用等技术同事介入。这套配置我在几个项目里跑下来,最省时间的做法就是先把模型通道用 curl 验证通,再配 IM 渠道,出问题时能立刻判断是哪一侧的问题。