功能说明
FeishuChannelExtension 把飞书机器人的入站消息桥接到 VeADK Runner。
本页是把飞书作为入站消息渠道:飞书用户发来的消息会触发智能体运行。若需让智能体主动调用飞书能力,请参见飞书工具。
Runner 的用户标识,以消息所在的话题作为会话标识;话题不存在时,回退到当前群聊或单聊作为会话标识。1.0.5 支持提取文本消息、互动卡片与合并转发消息中的文本内容,并兼容同步 Channel SDK 生命周期。
收到话题消息或回复消息时,扩展会自动获取话题历史或被引用的父消息,并将这些上下文拼接到用户消息前再转发给智能体,使智能体能够参考完整对话上下文。详见话题历史与引用消息。
环境变量与前提
安装:TOOL_FEISHU_CHANNEL_APP_IDTOOL_FEISHU_CHANNEL_APP_SECRETTOOL_FEISHU_CHANNEL_TRANSPORT:默认wsTOOL_FEISHU_CHANNEL_STREAMING:是否开启流式输出,默认falseTOOL_FEISHU_CHANNEL_REACTIONS:是否在收到消息时回复“收到”表情,默认falseTOOL_FEISHU_CHANNEL_RECONNECT_INTERVAL:WebSocket 断开后重连的间隔秒数,默认3TOOL_FEISHU_CHANNEL_DRAIN_TIMEOUT:优雅关停时等待已接收消息处理完成的最大秒数,默认300
config.yaml 中配置:
config.yaml
使用方法
feishu_bot.py
优雅关停
FeishuChannelExtension 提供独立的生命周期方法,用于在 ASGI 应用(如 FastAPI、Starlette)的启动与关闭钩子中管理 WebSocket 连接,尽量完成滚动更新或退出时已接收的消息。
关停流程分两步:先关闭 WebSocket 以停止接收新消息(飞书会将新事件重新路由到仍持有连接的其他实例),再等待已接收的消息完成回复。消息回复通过飞书 OpenAPI HTTP 客户端发送,不依赖 WebSocket,因此关停期间已接收的消息仍能正常回复。
仅使用
connect() 直接运行的长连接场景不需要调用 start() / shutdown();适用于进程退出前无需排空消息的简单脚本。在 ASGI 服务中托管时,使用 start() 与 shutdown() 才能获得优雅关停能力。使用示例
在 ASGI 应用的启动与关闭钩子中调用start() 与 shutdown():
feishu_asgi.py
方法
环境变量
参数
话题历史与引用消息
当消息来自飞书话题(thread)或是一条回复消息时,扩展会在把消息转发给智能体之前,自动获取相关上下文并拼接到用户消息文本之前:- 话题历史:消息属于话题时,扩展获取该话题内按时间正序排列的历史消息(最多
thread_history_limit条,不包含当前消息),将其作为话题上下文拼接到用户消息前。 - 引用消息:消息是一条回复但未归属话题时,扩展获取被引用的父消息;若父消息无法获取,则回退获取该回复链的根消息,将其作为引用上下文拼接到用户消息前。
获取话题历史与引用消息需要通过飞书 OpenAPI 调用消息接口,因此必须配置
app_id 与 app_secret(构造参数,或 TOOL_FEISHU_CHANNEL_APP_ID / TOOL_FEISHU_CHANNEL_APP_SECRET 环境变量,回退到 TOOL_LARK_ENDPOINT / TOOL_LARK_API_KEY)。未配置凭证时该能力会被跳过,不会报错。使用示例
先保存并配置上方的feishu_bot.py,再在同一目录创建以下文件:
feishu_bot_thread.py
feishu_bot_plain.py
额外说明
- 默认使用飞书的 WebSocket 长连接模式,因此只要机器人已订阅消息事件,即可直接启动连接。
- 默认以回复原消息的形式发送,使 VeADK 的输出挂在当前飞书消息线程下。
- 可以通过
session_id_factory与user_id_factory覆盖默认的身份映射逻辑。 connect()与disconnect()同时兼容异步客户端和提供start()/stop()的同步 Channel SDK。- 开启流式输出时,回复内容按增量片段直接拼接发送,不再因去重启发式而丢失或截断字符。
启动与验证
将第一个示例保存为feishu_bot.py,运行 python feishu_bot.py 后保持进程运行。在测试会话中向机器人发送一条文本,确认收到回复。使用 ASGI 示例时,将 feishu_asgi.py 放在同一目录,安装 fastapi 和 uvicorn 后运行 uvicorn feishu_asgi:app --host 127.0.0.1 --port 8000;两种启动方式选择一种
后面的历史消息开关示例仅替换 channel 配置,仍需启动连接。机器人无响应时,依次检查应用发布范围、事件订阅、机器人是否在会话中、消息权限以及模型配置;只有当前消息可用而历史缺失时,再检查历史读取权限与两个上下文开关