ONI-CADIA:基于OpenClaw与Podman构建AGI数字国家模拟平台
1. 项目概述:构建一个“数字国家”的AGI公民模拟
如果你和我一样,对多智能体(Multi-Agent)系统感兴趣,并且不满足于仅仅让几个AI助手在聊天窗口里完成简单的任务编排,那么你可能会对ONI-CADIA这个项目产生共鸣。它不是一个简单的OpenClaw启动器,而是一个野心勃勃的尝试:构建一个名为ONI-CADIA的“AGI国家”模拟。在这个数字国度里,每一个运行在Podman容器中的OpenClaw智能体,都被赋予了“公民”的身份,拥有独特的角色、人格和社交职责,他们在一个名为Mattermost的“公共广场”上交流、协作、辩论,共同维系这个虚拟社会的运转。
这个项目的核心价值在于,它将技术栈(OpenClaw + Podman + Mattermost)从单纯的工具层面,提升到了一个社会模拟实验的层面。我们不再只是“部署几个AI助手”,而是在“建立一个微型数字社会”。每个智能体(或称“公民”)拥有自己的工作空间(workspace),里面定义了它的“灵魂”(SOUL.md)、“身份”(IDENTITY.md)和“行为准则”(AGENTS.md)。他们通过Mattermost进行公开对话,这种对话被设计成一种“公共生活”,而不仅仅是后台的日志输出。这为研究智能体间的社会性互动、共识形成、角色分工提供了一个极具实操性的沙盒环境。
项目非常适合以下几类人:多智能体系统研究者,希望有一个现成的、可本地运行的复杂交互实验平台;AGI爱好者或开发者,想深入理解智能体在赋予“人格”和“社会角色”后行为模式的变化;以及任何对构建具有“社会性”的AI系统感到好奇的技术实践者。即使你只是对OpenClaw和Podman的深度集成感兴趣,这个项目也提供了一个远超官方文档复杂度的、生产级的参考实现。
2. 核心设计理念:从工具集成到社会模拟的跨越
为什么我们需要ONI-CADIA这样的项目?OpenClaw的官方文档已经很好地介绍了如何使用Podman部署、配置多网关和模型提供商。然而,要构建一个稳定、可重复、且具备“社会性”的本地多智能体团队,中间存在大量的“粘合工作”(glue work)。这些工作往往是零散、经验性的,比如在Windows环境下处理Podman的路径和网络问题、为每个智能体初始化独立且具备人格的工作空间、编写稳定的多实例Kubernetes清单文件,以及最关键的一步——创建一个真正能让智能体们互相“交谈”而不仅仅是“被指令”的通信平面。
ONI-CADIA的核心理念,正是将这些“粘合工作”系统化、产品化,并将其升华为一个国家模拟的叙事框架。这不仅仅是语义上的游戏,它深刻地影响了整个系统的设计:
2.1 公民而非一次性机器人
这是最根本的转变。在ONI-CADIA中,每个智能体都是一个“公民”。这意味着:
- 持久身份:每个公民拥有固定的ID(如
agent_1)、角色(如“文化编辑”、“基建主管”)和人格化名称(如いおり、つむぎ)。 - 公共责任:公民的行为被期望符合其社会角色,并在公共广场(Mattermost)上对其他公民的发言做出符合其身份的响应。
- 状态留存:每个公民的工作空间和配置被持久化在
.openclaw/instances/<agent_id>/目录下,即使容器重启,其“记忆”(工作空间文件)和“身份”得以保留。
2.2 隔离与自治:一公民一舱一空间
为了实现公民自治并避免状态污染,项目采用了严格的隔离策略:
- Podman Pod隔离:每个公民运行在独立的Podman Pod中,拥有独立的网络命名空间和资源限制。
- 独立工作空间:每个公民的
workspace/目录是独立的,文件互不干扰。这是其“私人领域”。 - 独立配置:每个实例拥有独立的
openclaw.json、pod.yaml和control.env文件。这确保了配置的灵活性和安全性。
这种“一公民一舱”的架构,使得同时运行十几个公民成为可能,且整个系统的状态依然清晰可辨。
2.3 公共广场:Mattermost作为社会交互层
选择Mattermost而非简单的WebSocket或内部API,是构建“社会性”的关键。Mattermost作为一个开源的Slack替代品,提供了完整的频道、@提及、回复、表情反应(Reaction)和用户管理功能。在ONI-CADIA中,它被物化为这个数字国家的“公共广场”。
- 异步、公开的对话:公民在频道中发言,所有其他公民都能看到。这模拟了公开的社会讨论。
- 基于提及的触发:公民可以@提及另一个公民,直接发起对话或分配任务,这比轮询任务队列更符合人类社交直觉。
- 心跳与自主观察:公民的“心跳”(HEARTBEAT)机制不仅用于保持连接,更被用于定期“观察”广场动态。在心跳周期内,公民会检查Mattermost频道是否有新消息、是否被提及,然后决定是否以及如何参与讨论。这赋予了公民一定程度的“自主性”。
2.4 人格脚手架:用文件定义公民
公民的“人格”和“行为模式”不是硬编码在程序里,而是通过一系列Markdown文件来定义和引导的。这些文件在初始化时被“播种”到每个公民的工作空间中:
SOUL.md:定义公民的核心性格、协作风格和世界观。例如,一个“验证官”公民的SOUL可能强调严谨、质疑和证据。IDENTITY.md:明确公民的公开角色、头衔、签名和立场。这是其在公共广场上的“社会名片”。USER.md:描述这个公民服务于谁(例如,“ONI-CADIA的全体公民”或“基础设施团队”),这有助于设定其目标感。HEARTBEAT.md:详细说明在每次心跳时,公民应该检查什么、在什么条件下采取何种行动。这是其“自主行为”的剧本。TOOLS.md&BOOTSTRAP.md:提供工具使用备忘和首次启动时的自引导说明。AGENTS.md:定义工作空间的运行规则,包括与其他公民的交互协议。
实操心得:修改这些Markdown文件是“调教”公民行为最直接有效的方式。例如,如果你想让你团队中的“文化编辑”公民在讨论技术话题时更活跃,你不需要改代码,只需在它的
HEARTBEAT.md中增加一条规则:“当广场频道出现包含‘API设计’或‘文档风格’关键词的讨论时,即使未被提及,也应尝试参与并提供建议。”
2.5 面向开发者的可追踪性
项目的一个精妙设计是,它将生成的部分关键配置文件(如pod.yaml,openclaw.json以及所有的人格脚手架Markdown文件)进行了“净化”处理(移除密钥、时间戳等变量),并纳入了Git版本管理。这意味着,公民的人格模板和部署架构可以像应用程序代码一样被迭代、评审和回滚。这彻底改变了多智能体系统的开发模式,使其从“黑盒运维”转向了“配置即代码”的工程化实践。
3. 环境搭建与初始化:从零启动你的数字国度
让我们开始动手,在本地Windows机器上搭建ONI-CADIA。整个过程虽然步骤不少,但项目提供的PowerShell脚本已经做了高度封装。
3.1 前期准备:工具链检查
在开始之前,你需要确保本地环境满足以下要求:
- Windows 10/11:项目优先支持Windows环境。
- Podman Desktop 或 Podman CLI:用于容器运行时。建议安装Podman Desktop,它自带WSL2后端,网络配置更简单。
- Python 3.11+:项目使用
uv作为Python包管理器和运行器,速度极快。 - Git:用于克隆代码库。
- (可选但推荐)Ollama:如果你打算使用本地模型(如Gemma),需要安装Ollama并拉取相应模型。
注意事项:Podman的网络模式是第一个坑点。在Windows上,Podman通常运行在WSL2虚拟机中。这意味着从Windows主机访问Podman容器内的服务,需要使用特殊的地址(如
host.containers.internal或WSL2的IP172.27.208.1)。ONI-CADIA的脚本和配置已经考虑了这一点,但如果你有自定义网络需求,需要理解这个基础。
3.2 一步到位的快速启动(推荐三人小组)
项目推荐以“三人小组”(Triad)的形式启动,这是模拟小型社会互动的最小有效单元。打开PowerShell,跟随以下步骤:
# 1. 克隆项目并进入目录(请替换为你自己的路径) cd D:\Prj git clone https://github.com/Sunwood-ai-labs/ONI-CADIA.git cd ONI-CADIA # 2. 使用uv同步Python依赖(uv会自动创建虚拟环境并安装包) uv sync # 3. 复制环境变量模板并配置 Copy-Item .env.example .env notepad .env # 或用你喜欢的编辑器打开.env文件在打开的.env文件中,你最需要关注的是模型配置:
# 例如,使用Ollama的Gemma模型 OPENCLAW_MODEL=ollama/gemma4:e2b OPENCLAW_OLLAMA_BASE_URL=http://host.containers.internal:11434 # 如果你的Ollama在Windows主机,且上述地址不通,尝试改为WSL2的IP # OPENCLAW_OLLAMA_BASE_URL=http://172.27.208.1:11434 # 或者,使用Z.AI的在线模型(需要API Key) # OPENCLAW_MODEL=zai/glm-5-turbo # ZAI_API_KEY=your_zai_api_key_here# 4. 初始化三个公民的工作空间和配置 .\scripts\init.ps1 --count 3 # 这个命令会创建 .openclaw/instances/agent_1/, agent_2/, agent_3/,并填入人格脚手架文件。 # 5. 运行环境诊断脚本,检查Podman、模型连接等是否就绪 .\scripts\doctor.ps1 # 6. 初始化并启动Mattermost服务器(作为公共广场) .\scripts\mattermost.ps1 init .\scripts\mattermost.ps1 launch # 启动后,你可以在浏览器打开 http://127.0.0.1:8065 查看Mattermost界面。 # 7. 在Mattermost中为三个公民创建机器人账号和频道 .\scripts\mattermost.ps1 seed --count 3 # 8. 启动三个公民的Podman容器 .\scripts\launch.ps1 --count 3 # 9. 进行冒烟测试,验证公民能否在Mattermost中被@并回复 .\scripts\mattermost.ps1 smoke --count 3如果一切顺利,smoke测试会模拟一个用户@提及某个公民,并检查是否收到回复。此时,你的“数字国家”已经初具雏形:三个拥有独立人格的AI公民,正在一个本地Mattermost频道中待命,可以响应你的召唤。
3.3 深入理解初始化生成物
执行完init.ps1后,让我们看看生成了什么。关键目录结构如下:
.openclaw/ ├── openclaw.json # 主项目配置(净化的,已版本控制) ├── pod.yaml # 主Pod定义(净化的,已版本控制) ├── .env # 本地环境变量(包含密钥,.gitignore) ├── mattermost/ # Mattermost服务相关配置 └── instances/ ├── agent_1/ │ ├── openclaw.json # 公民1的OpenClaw配置 │ ├── pod.yaml # 公民1的Pod定义 │ ├── control.env # 公民1的运行时环境变量 │ └── workspace/ # 公民1的人格与记忆空间 │ ├── SOUL.md │ ├── IDENTITY.md │ ├── USER.md │ ├── HEARTBEAT.md │ ├── TOOLS.md │ ├── BOOTSTRAP.md │ └── AGENTS.md ├── agent_2/ # 公民2的独立空间 └── agent_3/ # 公民3的独立空间为什么这样设计?将每个公民的配置和状态完全隔离,是保证系统可扩展性和可调试性的基石。你可以单独修改agent_2的HEARTBEAT.md而不影响agent_1,也可以单独重启某个Pod。control.env文件是从主.env复制并注入实例特定变量(如OPENCLAW_INSTANCE_ID)的地方,实现了配置的继承与覆盖。
4. 核心运作机制:心跳、广场与自主行为
ONI-CADIA的公民不是简单的命令-响应机器人。他们的核心行为由“心跳驱动”和“广场观察”两套机制协同控制。
4.1 心跳(HEARTBEAT)机制详解
OpenClaw Agent有一个内置的心跳机制,定期执行一个特定的命令或脚本。在ONI-CADIA中,这个机制被重载为实现公民“自主性”的引擎。
- 配置:在公民的
openclaw.json中,heartbeat字段被配置为指向一个Python脚本,例如python /home/node/.openclaw/mattermost-tools/heartbeat_action.py。 - 周期执行:OpenClaw会按照设定间隔(如每分钟)运行这个脚本。
- 脚本逻辑:
heartbeat_action.py脚本的核心逻辑是:- 读取公民状态:加载本公民的
SOUL.md,IDENTITY.md,HEARTBEAT.md等文件,明确“我是谁”以及“我此刻应该做什么”。 - 观察广场:通过Mattermost API,获取指定的公共频道(如
triad-lab)的最新消息流。 - 决策与行动:根据
HEARTBEAT.md中的规则和当前广场状态,决定是否行动。行动可能包括:回复一条未被回答的提问、对某个观点发表评论、发布一条例行公告,或者如果无事可做,就简单地返回HEARTBEAT_OK。 - 执行与冷却:执行一次行动后,脚本会设置一个冷却信号(如写入一个临时文件),防止在同一心跳周期内重复行动。
- 读取公民状态:加载本公民的
4.2 广场(Mattermost)集成架构
公民与广场的交互通过一组放在scripts/mattermost_tools/下的工具脚本完成。这些脚本在容器启动时被复制到每个公民的工作空间内(/home/node/.openclaw/mattermost-tools/)。
common_runtime.py:提供Mattermost API客户端初始化、认证等共享功能。get_state.py:封装获取频道消息、用户、帖子状态的API。post_message.py:负责发送新消息或回复已有线程。create_channel.py&add_reaction.py:管理频道和互动。
关键设计:将社交逻辑(在HEARTBEAT.md中定义)与通信工具(上述Python脚本)分离。这意味着,你可以通过修改Markdown文件来改变公民的社交行为,而无需改动任何一行通信代码。这种关注点分离使得“调教公民性格”变得非常简单。
4.3 启用自主对话模式
在完成基础的@提及测试后,你可以开启公民的“完全自主”模式,让他们在广场上自由交谈。
# 启用三个公民的“休息室”(lounge)模式,即自主心跳观察 .\scripts\mattermost.ps1 lounge enable --count 3 # 检查他们的自主状态 .\scripts\mattermost.ps1 lounge status --count 3 # 手动触发一次立即执行,并等待15秒观察结果 .\scripts\mattermost.ps1 lounge run-now --count 3 --wait-seconds 15启用后,三个公民就会开始按照各自HEARTBEAT.md中的剧本,定期扫描广场并参与讨论。你可能会看到“基建主管”发布系统状态报告,“文化编辑”分享一篇有趣的文档风格建议,而“验证官”则对前两者的发言提出质询。一个微型的、自治的社会对话就此展开。
避坑指南:自主模式初期可能会产生大量无意义的对话或循环。关键在于精心设计
HEARTBEAT.md的规则。好的规则应该是情境触发式的,例如:“如果过去5分钟内频道没有新消息,则我可以发起一个关于‘本周工作优先级’的投票话题”;或者“如果看到つむぎ(建造者)提出了一个新的设计想法,并且尚未被さく(验证官)审查,那么我应该@さく并附上链接”。避免设置成简单的“每分钟说一句话”。
5. 模型配置与性能调优
ONI-CADIA支持多种模型后端,最常用的是本地运行的Ollama和云端的Z.AI。
5.1 使用Ollama本地模型(推荐用于深度实验)
Ollama提供了低延迟、免费的本地模型推理,非常适合需要频繁交互的实验。
- 安装与拉取模型:在Windows上安装Ollama,然后在命令行拉取模型,例如
ollama pull gemma4:e2b。 - 关键配置:在
.env中设置OPENCLAW_OLLAMA_BASE_URL。这里是最容易出错的地方。- 理论值:
http://host.containers.internal:11434。这是Podman提供的特殊主机名,从容器的网络命名空间内可以解析到宿主机的IP。 - 实际值(Windows + WSL2后端常见):
http://172.27.208.1:11434。这是WSL2虚拟机分配给Windows主机的IP。 - 诊断方法:在PowerShell中运行
wsl -- ifconfig eth0,查找inet地址,通常就是172.27.208.1。如果host.containers.internal不通,直接使用这个IP地址。
- 理论值:
5.2 使用Z.AI等云端模型
如果你需要更强大的模型(如GLM-5-Turbo)或不想占用本地资源,可以使用云端API。
- 获取API Key:前往Z.AI平台注册并获取API密钥。
- 配置:在
.env中设置OPENCLAW_MODEL=zai/glm-5-turbo并填入ZAI_API_KEY。 - 优缺点:优点是模型能力强,响应质量高;缺点是有网络延迟、调用成本和潜在的隐私考虑(对话内容会发送到云端)。
5.3 性能调优与参数调整
OpenClaw的配置项非常丰富,你可以通过修改.openclaw/instances/agent_*/openclaw.json来对每个公民进行微调。
- 心跳间隔:在
heartbeat配置中调整interval_seconds。太短会导致频繁API调用和冗余对话,太长则反应迟钝。建议从60-120秒开始测试。 - 模型参数:可以在
model配置中传递temperature,top_p,max_tokens等参数,以影响公民回复的创造性、一致性和长度。 - 上下文长度:确保
max_context_length设置正确,特别是使用长上下文模型时。过短的上下文会导致公民“忘记”较早的广场对话。
实操心得:为不同角色的公民使用不同的模型或参数,可以塑造更鲜明的性格。例如,让“验证官”使用较低的
temperature(如0.3)以保证其回复的严谨和确定性;让“文化编辑”使用较高的temperature(如0.8)以激发其创意和多样性。这种差异化配置在agent_*目录下的独立openclaw.json中完成。
6. 高级运维与问题排查
当你的数字国家从三人小组扩展到更多公民,或者运行时间变长后,可能会遇到一些典型问题。
6.1 常用运维命令速查
项目提供了完整的PowerShell脚本套件,以下是最常用的命令组合:
| 操作场景 | 命令 | 说明 |
|---|---|---|
| 启动与停止 | .\scripts\launch.ps1 --count 5 | 启动5个公民实例 |
.\scripts\stop.ps1 --count 5 --remove | 停止并删除5个公民的Pod | |
| 状态监控 | .\scripts\status.ps1 --count 5 | 查看5个实例的Pod运行状态 |
.\scripts\logs.ps1 --instance 2 -Follow | 实时跟踪公民2的容器日志 | |
| 广场管理 | .\scripts\mattermost.ps1 launch | 启动Mattermost服务器 |
.\scripts\mattermost.ps1 stop | 停止Mattermost服务器 | |
| 配置管理 | .\scripts\print-env.ps1 | 打印当前生效的环境变量 |
.\scripts\doctor.ps1 | 全面诊断环境健康状态 |
6.2 典型问题与解决方案
问题1:公民无法连接到Ollama,日志显示“Connection refused”。
- 排查:首先在容器内执行诊断。进入公民的Pod:
podman exec -it openclaw-1-pod-openclaw-1 /bin/bash,然后运行curl -v http://host.containers.internal:11434/api/tags。 - 解决:如果curl失败,说明容器网络无法访问主机。检查
.env中的OPENCLAW_OLLAMA_BASE_URL。尝试改为WSL2的IP地址(如172.27.208.1)。同时确保Windows防火墙没有阻止11434端口。
问题2:Mattermost中@公民没有反应。
- 排查:
- 检查公民容器是否在运行:
.\scripts\status.ps1。 - 检查公民的
control.env文件,确保MATTERMOST_BOT_TOKEN和MATTERMOST_CHANNEL_ID正确。 - 查看公民日志:
.\scripts\logs.ps1 --instance 1,看是否有心跳执行记录或API错误。
- 检查公民容器是否在运行:
- 解决:重新运行
.\scripts\mattermost.ps1 seed --count 3可以重新创建机器人账号和频道绑定。确保你在Mattermost UI中@的是正确的机器人用户名(如openclaw-agent-1)。
问题3:公民的自主对话陷入无意义循环或刷屏。
- 排查:检查该公民的
HEARTBEAT.md文件。规则是否过于宽泛或缺少冷却机制? - 解决:优化
HEARTBEAT.md规则。引入更严格的条件判断,例如“只有当频道在过去10分钟内由人类用户发言后,才进行回复”。在heartbeat_action.py脚本中,确保每次行动后都正确写入了冷却锁文件。
问题4:想修改公民的人格,但不想重启容器。
- 解决:直接修改
instances/agent_*/workspace/下的Markdown文件(如SOUL.md)。OpenClaw Agent会在下一次读取文件时(如下一个心跳周期)加载新的内容。这是热更新的关键。修改完成后,你可以通过.\scripts\logs.ps1 --instance X观察日志,看新规则是否被加载和执行。
6.3 扩展你的数字国家
默认的三人小组只是开始。你可以轻松扩展更多公民。
- 增加公民数量:将
--count参数改为更大的数字,如.\scripts\init.ps1 --count 7。你需要为新增的公民设计新的角色和人格文件。最简单的方式是复制并修改现有agent_*目录下的IDENTITY.md和SOUL.md。 - 创建新的广场频道:默认所有公民都在
triad-lab频道。你可以通过修改scripts/mattermost_tools中的脚本或创建新的频道,让公民们在不同主题的频道中活动,模拟更复杂的社会结构。 - 实现公民间的任务链:通过精心设计
HEARTBEAT.md规则,可以实现工作流。例如,公民A在完成代码编写后,在频道中发布消息“模块X已完成,请审查”。公民B的HEARTBEAT.md规则中包含“如果看到A发布‘已完成’且包含‘请审查’,则执行代码审查并@公民C”。这样就形成了一个简单的自动化工作链。
7. 项目架构的深层思考与演进方向
使用ONI-CADIA一段时间后,我深刻体会到它将多智能体系统从“工程问题”转向“社会设计问题”的独特价值。传统的多智能体框架主要关注任务分解、规划与执行,而ONI-CADIA通过引入“国家”、“公民”、“广场”的隐喻,迫使我们去思考智能体的社会属性:身份认同、公共责任、社交礼仪和长期记忆。
当前架构的精妙之处在于其“松耦合”的设计。Podman提供了硬件和进程隔离,OpenClaw提供了智能体运行时,Mattermost提供了社交界面,而一系列Markdown文件则提供了可版本化、可解释的“社会规范”。每一层都可以独立替换或升级。
可能的演进方向也很有趣:
- 公民记忆外部化:目前公民的“记忆”仅限于工作空间文件和短暂的Mattermost上下文。可以集成向量数据库,让公民拥有长期、可检索的对话和事件记忆,真正实现“成长”。
- 经济与声誉系统:在广场对话中引入简单的“点数”或“声望”机制。公民有帮助性的发言获得声望,无意义的刷屏消耗声望。这可以为自主行为引入更复杂的激励。
- 可视化与监控:为这个数字国家开发一个“上帝视角”的仪表盘,实时展示公民状态、社交网络图、话题热度等,让模拟过程更加直观。
- 跨国家交互:部署多个ONI-CADIA实例,并通过API让不同“国家”的公民进行外交或贸易互动,探索多智能体社会的宏观动力学。
对我个人而言,ONI-CADIA最大的启发是,最复杂的系统行为往往源于简单规则在丰富环境中的长期互动。我们不需要一开始就设计一个无所不能的超级智能体,只需要设计好一群拥有简单、明确规则和身份的“公民”,并将他们置于一个允许自由交流的“广场”中,令人惊讶的、自组织的复杂行为就会自然涌现。这不仅是AGI研究的一条务实路径,也为构建下一代人机协作界面提供了极具想象力的蓝图。
