openclaw多实例协同及育虾经验分享

前言

我是个内驱不是很强的家伙,在20年的时候有设想过一个给自己用的项目,当时设定的项目名称是custom my life,当时的场景是每天过的浑浑噩噩,没有规划,我想要一个个人生活规划的app。

我想设定一下我想要的生活日常,比如定时提醒我一下家人的生日,隔段时间来提醒我给家人打个电话;定期维护我的友情,比如和老同学聊聊日常;定期的去健身,比如去跑步、去骑车;定期的完成自己的想法,写点自己的代码,整理学习一下最新的技术;

可惜当时只是做了个简单的web版本,由于还要登陆web端,自己动手编辑任务,自己编辑执行情况,自己去编码做统计,之后就尘归尘土归土,又恢复到原来颓废的状态了。

直到年前刷论坛发现了大家都在玩龙虾,我简单了解了一下,发现这正是我之前想要的东西,去年的时候刚好买了macmini,我就在上面开始养龙虾了,从安装到现在,也玩了一个月了,我简单的分享一下育虾经验。

育虾日常

我的虾呱呱坠地后,我给她起了凤梨的名字,对于im的选择,开始用的telegram,由于需要多终端科学上网,最终还是选择了飞书;作为ai助手,我让他帮我做了下面的几件事。

定时提醒

家人的生日提醒,结婚纪念日提醒、重要事件节点提醒、每日github热点项目总结、每天天气提醒等定时任务

总结归纳

让凤梨,每日23.50把当日的主要聊天及工作内容总结精炼成日总结,每月月底将日总结汇总成月总结,年底汇总提炼成年总结

制定计划

我有在备孕和健身,安装了锻炼记录的skill,帮我记录日常的锻炼活动,比如无氧运动什么动作,多少组,有氧运动多久等等,自然语言描述,她会按照skil需要的格式记录,每周她会总结给我建议,还有在凤梨的建议下,我买了备孕的叶酸等等

总结经验

安装了obsidian skill,在日常编码及和凤梨讨论解决问题后,后总结成经验笔记,记录到我的icloud挂载目录上,这样多终端都可以读到

vibe coding

由于脱离组织时间有点久,我这边的ai视角还停留在一年前的deepseek、dify、n8n的阶段,接触龙虾之后,才了解claudecode、codex、opencode等新的玩具,由于暂时没有这些订阅,就选择opencode;当前的方案是openclaw制定需求,拆解任务,调用opencode进行编码

育虾进阶

在我折腾了大半个月之后,才让我的凤梨慢慢的开始干活,主要要对的起我的coding plan,赛博员工不能吃闲饭,哈哈哈哈哈;于是我折腾了下面这些事情

多飞书机器人多角色协作配置

我的龙虾部署在家里的macmini上,之前的frp部署在阿里云的vps也到期了,我起初的想法是用im聊天工具调用我的opencode远程编码。在逛论坛的时候,发现有的佬友有配置多agent,多chatbot的方案,但是记忆可能会串,而且实现起来也比较麻烦;

我在想那可不可以我配置多个龙虾实例,把他们拉到一个飞书群里面,让凤梨当作pm,在配置苹果前端、橘子后端、榴莲测试,这样一个编程水果军团是不是可以自我驱动了,说干就干,折腾了一下午,四个龙虾实例配置好了,群拉好了,但结果是:群消息针对于@识别效果不好,经常@多次才能识别成功一次,这个方案pass;

但是想要赛博水果军团的想法还是没有熄灭,于是我在凤梨沟通,在交流n次之后,我决定让凤梨当协调者,在和凤梨的聊天页面,输入@苹果、#苹果、让苹果等关键词时,通过cli的方式通知对应的其他openclaw助手,将这个通知的脚本封装成skill,记录到soul文件中;

┌─────────────────────────────────────────────────────────┐
│                     飞书群聊                             │
├─────────────────────────────────────────────────────────┤
│  @凤梨(PM/协调者)                                     │
│      │                                                  │
│      ▼                                                  │
│  feishu-multi-agent.py 协调脚本                         │
│      ├── @苹果 (端口 28789) ── 前端开发                  │
│      ├── @橘子 (端口 38789) ── 后端开发                  │
│      └── @榴莲 (端口 48789) ── 测试工程师                │
└─────────────────────────────────────────────────────────┘

feishu-multi-agent.py 脚本源码如下,比较粗糙

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
飞书多机器人协调器 - 凤梨版
凤梨可以调用:苹果、橘子、榴莲
"""

import os
import subprocess
import sys

# 机器人配置
AGENTS = {
    "苹果": {"port": 28789, "role": "前端开发", "token": "pingguo-token-123456", "emoji": "🍎"},
    "橘子": {"port": 38789, "role": "后端开发", "token": "orange-token-123456", "emoji": "🍊"},
    "榴莲": {"port": 48789, "role": "测试工程师", "token": "durian-token-123456", "emoji": "🥭"},
}

def parse_mentions(text):
    """解析消息中的@提及"""
    mentions = []
    text_lower = text.lower()
    if "苹果" in text_lower:
        mentions.append("苹果")
    if "橘子" in text_lower:
        mentions.append("橘子")
    if "榴莲" in text_lower:
        mentions.append("榴莲")
    return list(set(mentions))

def send_to_agent(name, port, token, message):
    """发送消息到指定机器人"""
    env = os.environ.copy()
    env["OPENCLAW_GATEWAY_URL"] = f"http://127.0.0.1:{port}"
    env["OPENCLAW_GATEWAY_TOKEN"] = token
    
    # 添加记忆提醒
    enhanced_message = f"[请先查询本会话的历史记忆后再回答] {message}"
    
    try:
        result = subprocess.run(
            ["openclaw", "agent", "--message", enhanced_message, "--session-id", "main"],
            capture_output=True, text=True, timeout=120, env=env
        )
        return result.stdout + result.stderr
    except Exception as e:
        return f"错误: {str(e)}"

def main():
    if len(sys.argv) < 2:
        print("用法: feishu-multi-agent.py '<用户消息>'")
        sys.exit(1)
    
    user_message = " ".join(sys.argv[1:])
    targets = parse_mentions(user_message)
    
    if not targets:
        print("❌ 未识别到目标机器人")
        sys.exit(1)
    
    for name in targets:
        config = AGENTS[name]
        response = send_to_agent(name, config["port"], config["token"], user_message)
        print(f"{name}{config['emoji']} 回复:{response}")

if __name__ == "__main__":
    main()

soul文件内容如下

## 多机器人协调规则

**检测关键字**:
- `@苹果`、`@橘子`、`@榴莲`
- `#苹果`、`#橘子`、`#榴莲`
- `让苹果`、`让橘子`、`让榴莲`
- `苹果和`、`橘子一起`、`榴莲一起`

**调用方式**:
当检测到以上关键字时,调用 feishu-multi-agent.py 转发消息:

python3 ~/.openclaw/workspace/skills/feishu-multi-agent/feishu-multi-agent.py "@苹果 帮我写个登录页面"

**示例**:
- 用户: "@苹果 帮我写个登录页面"
- 凤梨: 调用 feishu-multi-agent.py → 苹果回复
- 用户: "@橘子 @榴莲 一起测试"
- 凤梨: 同时调用橘子和榴莲

使用的示例如下:

育虾tips

在育虾这近一个月的过程中,经历过和龙虾聊着聊着没有后文了;模型明明用的coding plan,却莫名的切成了我走量的key;还有经常失忆忘记了前几天的内容;还有问一个问题没有下文后莫名自己重启然后自己挂掉等等,我贴一下我这边的处理解决方案

龙虾自己重启问题

我对龙虾制定了重启前必须确认的准则,记录在momery中

🚨 重启规则
任何时候,如果需要重启凤梨或其他服务,都必须先询问用户,得到用户同意后才能执行!
❌ 禁止:未经同意直接重启
✅ 正确:先问用户"可以重启吗",得到同意后再执行

处理复杂任务单线程夯住问题

同样,在momery中记录准则

🚨 长任务守护线程机制
规则:每次接到任务时,先评估预计完成时间:
⏱️ < 1分钟:直接执行
⏱️ ≥ 1分钟:必须先询问用户是否需要 spawn 子代理
询问话术:
"这个任务预计需要 X 分钟,我可以:
直接执行,你在此期间无法做其他事
启动子代理后台执行,你可以随时追问进度
你想怎么安排?"

前面提的事项问题忘记

针对于重要事情,一般没有结果的时候,我会记录一个TODO list列表,然后让她把这个todo list路径记录到长期记忆中

健康检查定时任务

由于龙虾宝宝经常挂掉,我让龙虾自己写了个检查脚本,脚本就不贴了,就是检测四只龙虾,如果发现其中有一个挂了,就飞书提示我,防止openclaw都挂了,我是用的系统级别的定时任务,不依赖于openclaw进程

openclaw的医生

育虾的半个月经历过n次的龙虾自己把自己玩挂了,每次都是opencode救龙虾于水火,墙裂建议安装另一个工具,可以opencode,可以claudecode等,无论是接生还是诊治很有用,尤其是配置多个龙虾的前期,工作空间端口占用等问题都是它来解决的

总结

当前还是玩龙虾的初级阶段,还没有什么具体的产出,只是当作一个个人ai助手在使用,vibe coding还没玩通,摸着虾过河

32 个赞

感谢大佬~

感谢佬分享!

感谢分享(*ゝω・)

6 个赞

很有值得学习的内容哈哈哈,期待继续连载养虾攻略

@nameLi 可以参考参考,配个产品前端后端去完善你的app

1 个赞

我其实不懂,那我就不说了

其实很想这样搞,但是没懂怎么搞

1 个赞

我也做了这样的实践。我给他们配了个项目经理。然后就:

项目经理: 10:00前必须交付
开发: 收到
项目经理: 交付进展如何?
开发: 尚未完成。xxxx

然后就是11点、12点。这群龙虾的代码已经5天没更新过了。天天在那自嗨。然后开发完全不写代码,每天在那反思

可以多Agent,每个Agent一个workspace。多docker要多端口,挺恶心的,还是多Agent简单。

飞书的机器人相互 at 没有事件的。
你的虾是怎么聊的?开的不需要 at 接收信息?

记忆怎么设置的,这是重点
opencode不太懂呢,有免费的api吗?

我订阅的miniMax的code plan 总感觉笨笨的呀 但是OpenAI的有付不起 难绷:tired_face:

实践的很棒。
openclaw官方的多agent方案还在讨论中。也可以参考它们的思路。

1 个赞

感谢分享,学习了,有收获。(。_。):open_book:

佬,飞书群的@识别有bug,我放弃了,我选择的是自己编写了一个互相沟通的skill,由一个龙虾当协调者,后台通过cli转达聊天内容

1 个赞

互相沟通我是用来做项目的,我的做法是利用飞书的任务表来做记忆,几个bot共享查看一个任务清单,做了哪些内容,各自ai标记状态

不算是 bug, 刻意为之的 feature, 官方文档有写。

是我思路太僵硬,想硬走通这件事。。直接走 openclaw 自己的 message 才是正解

感谢大佬,学习力!

这个和一个机器人,开不同子代理,有什么优劣吗?我用的是一个机器人开不同的子代理