两个bot通过轻量router机制实现稳定消息传递:javis bot运行于openclaw session,claude code bot监听本地端口,进程隔离;router依据intent字段路由、open_id映射和ip白名单决策转发,并通过飞书at或前缀标识构造消息体,以task_id为锚点完成双向响应闭环。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

让两个扣子Bot在不同进程、不同上下文里稳定传递消息并触发响应,不是靠群聊@或手动转发,而是依赖一套轻量但精准的Router机制——它得能识别谁该接收、谁该转发、什么时候该阻塞、什么时候该重试。
确认两个Bot的独立运行状态
先验证Javis Bot和Claude Code Bot是否真正处于隔离进程:Javis运行在OpenClaw Session中,Claude Code则以本地CLI进程监听127.0.0.1:3000/chat;二者不共享内存、不共用会话ID、也不在同一个飞书群内。【若两者在同一进程或共享session,后续Router将无法区分来源,直接导致消息混淆】
执行命令 curl http://127.0.0.1:3000/health ——返回 {“status”:“ok”} 即表示Claude Code已就绪;同时在OpenClaw控制台看到Javis Bot状态为“active”,说明双端基础通路已建立。
设计Router的消息路由规则
Router不是中转站,而是决策点。它不存储内容,只做三件事:解析消息意图、匹配目标Bot身份、构造合法飞书消息体。
第一步:定义路由键(routing key)规则。所有发往Claude Code的消息必须携带字段 "intent": "verify" 或 "intent": "review";发往Javis的消息则需含 "intent": "ack" 或 "intent": "retry"。其他intent一律拒收。
第二步:绑定open_id映射表。从飞书开放平台后台分别获取两个Bot的open_id(注意:不是user_id,也不是union_id),填入Router配置文件:
“javis_bot”: “on_abc123xyz”,
“claude_bot”: “on_def456uvw”
第三步:启用HTTP回调白名单。Router仅接受来自Javis Bot所在OpenClaw Session的IP段(如192.168.100.0/24)及Claude Code本机(127.0.0.1)的POST请求,其余来源全部403拦截。
构造飞书兼容的消息体
方法一:使用富文本at语法直连
消息content字段必须为JSON格式,且at对象嵌套在text元素内:
{“msg_type”:“post”,“content”:{“post”:{“zh_cn”:{“title”:“验证请求”,“content”:[[{“tag”:“text”,“text”:“请审核以下任务:”},{“tag”:“at”,“user_id”:“on_def456uvw”}]]}}}}
【user_id字段必须填Claude Bot的open_id,填错会导致@失效,飞书客户端完全不渲染为可点击元素】
方法二:退化为纯文本+签名标识
当富文本构造失败时,改用纯文本+约定前缀:“[CLAUDEREQ] task_id=7a8b9c”。Claude Code启动后自动扫描所有收到消息的开头15字符,命中即触发解析流程。此方式绕过飞书at限制,但需双方提前约定前缀且不可变更。
实现双向响应闭环
① Javis Bot调用Router发送验证请求 → Router校验intent并转发至http://127.0.0.1:3000/chat
② Claude Code处理完成后,调用Router的/cb接口,附带原始task_id与response字段
③ Router查表还原Javis Bot的open_id,构造反向at消息,通过飞书IM API(使用Javis App凭证)发出
④ Javis Bot监听自身open_id被at的事件,提取message_id与task_id,更新Task Card状态
这一步操作起来很简单,直接把response.payload塞进/cb接口的body就行,但必须确保task_id在全流程中保持不变——它是唯一能串起双向链路的锚点。










