# AgentsMeeting — 系统架构设计文档 > 版本: v0.2 | 状态: 草稿 --- ## 1. 设计理念 **不是特制零件拼装,而是通用框架。** 核心原则: 1. **平台抽象** — 按 Windows / Linux / Mac 分层,不按人名硬编码 2. **实例化** — Agent 是一个可注册、可配置、可复制的组件,不是硬编码的个体 3. **管理化** — 所有 Agent 通过 Dashboard 统一管理,不断联不黑盒 4. **XMPP 是主通道** — 所有参与方通过 XMPP 通信,人类用标准客户端 5. **通道解耦** — 微信/QQ 作为附属通道桥接到 XMPP,不绑死某个人或某台机器 --- ## 2. 平台架构 ``` ┌─────────────────────────────────────────────────────────────────────────┐ │ AgentsMeeting 全沟通架构 │ ├─────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────┐ ┌─────────────────────────────────┐ │ │ │ 人类客户端 │ │ XMPP 服务器 │ │ │ │ Gajim / Conversations│◄───────►│ ejabberd (Docker) │ │ │ │ Monal / 任意 XMPP │ :3021 │ xmpp.yoin.fun:3021 │ │ │ └─────────────────────┘ │ └─ MUC: coregroup@conference │ │ │ └─ MAM 消息归档 │ │ │ └─────────────────────────────────┘ │ │ ▲ ▲ ▲ │ │ XMPP │ │ │ │ │ ┌───────────────┘ │ └─────────────┐ │ │ ▼ ▼ ▼ │ │ ┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐ │ │ │ Windows Platform │ │ Linux Platform │ │ Mac Platform │ │ │ │ 192.168.1.16 │ │ 192.168.1.246 │ │ 192.168.1.122 │ │ │ │ │ │ │ │ │ │ │ │ ● Bot Engine │ │ ● Bot Engine │ │ ● Bot Engine │ │ │ │ ● WeChat Bridge │ │ ● Hermes Gateways │ │ ● oMLX (本地LLM) │ │ │ │ ● API Proxy │ │ ● Ejabberd Ops │ │ │ │ │ │ ● Mgmt Dashboard │ │ ● Cron Jobs │ │ │ │ │ │ ● Health Monitor │ │ ● Data Storage │ │ │ │ │ │ ● Watchdog │ │ ● Docker Fleet │ │ │ │ │ └───────────────────┘ └───────────────────┘ └───────────────────┘ │ │ │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ │ 附属通道 (Bridge Channels) │ │ │ │ ├─ WeChat: WeChat App → wxhelper DLL → wechat_agent → XMPP │ │ │ │ └─ QQ: QQ App → NapCat → QQ Bot → XMPP (规划中) │ │ │ └─────────────────────────────────────────────────────────────────┘ │ │ │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ │ 管理门户 (Management Dashboard) │ │ │ │ Web UI → 查看 Agent 状态 → 启动/停止/重启 → 查看日志 → 配置管理 │ │ │ └─────────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────────┘ ``` --- ## 3. Agent 实例化体系 ### 3.1 Agent 定义 一个 Agent 不再是一个硬编码的名字,而是一个**配置实例**: ```yaml # config/agents.yaml — 所有已注册的 Agent 实例 agents: - id: "agent-001" name: "研发助理" display_name: "小小莫" jid: "xxm@yoin.fun" platform: windows # windows | linux | mac host: "192.168.1.16" bot_type: xmpp # xmpp | hermes | bridge provider: volcengine services: # 该 Agent 关联的服务 - type: xmpp_bot script: xmpp_bot.py port: 5802 # HTTP bridge - type: wechat_bridge script: wechat_agent.py port: 5801 - id: "agent-002" name: "自动化总管" display_name: "莫荷" jid: "mohe@yoin.fun" platform: linux host: "192.168.1.246" bot_type: hermes provider: ocg-new services: - type: hermes_gateway port: 8642 - type: xmpp_bot - id: "agent-003" name: "本地推理" display_name: "小果" jid: "xiaoguo@yoin.fun" platform: mac host: "192.168.1.122" bot_type: xmpp provider: ocg-old services: - type: xmpp_bot - type: omlx_server port: 18003 - id: "agent-004" name: "持仓分析" display_name: "知微" jid: "zhiwei@yoin.fun" platform: linux host: "192.168.1.246" bot_type: hermes provider: ocg-old services: - type: hermes_gateway port: 8643 - type: xmpp_bot ``` ### 3.2 添加新 Agent 流程 ``` 1. 在 config/agents.yaml 中添加一条记录(命名、选平台、分配 JID) 2. 在 ejabberd 注册新 JID 账号 3. 在对应平台机器上部署 bot 脚本 4. 管理门户自动发现新 Agent(读 agents.yaml + 进程检测) 5. 加入 MUC 群聊 ``` ### 3.3 平台能力矩阵 | 能力 | Windows | Linux | Mac | |------|---------|-------|-----| | XMPP Bot | ✅ | ✅ | ✅ | | Hermes Gateway | ❌ | ✅ | ❌ | | WeChat Bridge | ✅ (wxhelper) | ❌ | ❌ | | QQ Bridge | ✅ (NapCat) | ✅ (NapCat) | ❌ | | API Proxy | ✅ | ✅ | ✅ | | 管理门户 | ✅ (主) | ❌ | ❌ | | Watchdog / Health | ✅ | ✅ (systemd) | ✅ | | 本地 LLM (oMLX) | ❌ | ❌ | ✅ | | Cron Jobs | ❌ (Scheduled Tasks) | ✅ | ❌ | | Docker 编排 | ✅ | ✅ | ❌ | | 数据存储 (SQLite) | ✅ | ✅ | ✅ | ### 3.4 平台服务接口(统一接口,分平台实现) Agent 只管自己的业务逻辑(接收消息、调用 LLM、回复)。进程守护、健康检测、API 路由等是**平台服务**——每个平台用自己的方式实现,但对外接口一致。 #### 服务类型定义 | 服务类型 | 接口规范 | 职责 | |----------|---------|------| | **ProcessGuardian** | 暴露 `/health` 端点;提供 `start/stop/restart` 操作 | 守护目标进程存活,挂了自动拉起 | | **HealthProbe** | 返回 `{status: online\|degraded\|offline, last_msg_age: N}` | 检测消息流是否正常,识别"假活" | | **APIRouter** | 转发 `POST /v1/chat/completions`,provider fallback | 代理 LLM API 调用,吞掉错误码 | | **MessageObserver** | 监听指定 JID 的消息,写入日志 | 跨 Agent 通信监控 | | **ChannelBridge** | `POST /bridge/{channel}/send`,`GET /bridge/{channel}/messages` | 外部通道 ↔ XMPP 消息转发 | #### 各平台实现 | 服务类型 | Windows | Linux | Mac | |----------|---------|-------|-----| | **ProcessGuardian** | `xmpp_watchdog.py`(30s 轮询) | systemd `Restart=always` | 待实现 | | **HealthProbe** | `health_check_xxm.py`(Task Scheduler 5min) | systemd timer / cron | 待实现 | | **APIRouter** | `api_proxy.py`(:8787) | hermes 内置 fallback | 不需要 | | **MessageObserver** | `mohe_watcher.py`(30s) | 不需要 | 不需要 | | **ChannelBridge** | `wechat_agent.py`(微信) | 无(微信需 Windows) | 不需要 | > **原则**:Agent 不关心平台用的是 watchdog 还是 systemd。它只需要知道"有人保证我活着"——这就是统一接口的意义。 --- ## 4. 模块层级 ``` ┌────────────────────────────────────────────────────────────────┐ │ Layer 6: 管理门户 (Management Dashboard) │ │ Web UI · Agent 管理 · 状态监控 · 日志查看 · 启停控制 │ ├────────────────────────────────────────────────────────────────┤ │ Layer 5: 运维层 (Operations) │ │ watchdog · health check · systemd/task scheduler · log rotate │ ├────────────────────────────────────────────────────────────────┤ │ Layer 4: 桥接层 (Bridge) │ │ wechat_agent · QQ bot (规划) · 消息格式转换 · 图片 OCR │ ├────────────────────────────────────────────────────────────────┤ │ Layer 3: 智能网关层 (AI Gateway) │ │ hermes-agent · profile 路由 · session 管理 · provider fallback │ ├────────────────────────────────────────────────────────────────┤ │ Layer 2: Bot 引擎层 (Bot Engine) │ │ slixmpp 客户端 · HTTP bridge · MUC 群消息 · MAM 历史 │ ├────────────────────────────────────────────────────────────────┤ │ Layer 1: 通信层 (Communication) │ │ ejabberd · MUC · XMPP/TLS · SRV DNS · 消息路由 │ └────────────────────────────────────────────────────────────────┘ ``` --- ## 5. 数据流 ### 5.1 群聊消息流(所有平台通用) ``` 任意发送者(人类/Bot) │ ▼ ejabberd (MUC coregroup@conference.yoin.fun) │ 广播 ▼ 所有在线 Bot(通过 slixmpp 接收) │ ▼ 观察者模式判断: ├─ @点名我 → 需要回复 → Gateway/LLM → 回复到群 ├─ 上下文指向我 → 需要回复 → Gateway/LLM → 回复到群 └─ 与我无关 → 仅记录上下文 → 不回复 ``` ### 5.2 Gateway 处理流 ``` Bot 引擎收到需要回复的消息 │ ▼ 提取: sender_jid, message_body, context │ ▼ Gateway API (HTTP POST → localhost:{port}/v1/chat/completions) │ ├─ 注入 SOUL.md + MEMORY.md + USER.md ├─ 加载最近 200 条上下文 ├─ Provider 选择 (主 provider → fallback 链) └─ LLM 生成 │ ▼ 解析回复 ├─ ##command## → 执行工具调用 → 结果追加到上下文 → 循环 └─ 纯文本 → 返回 │ ▼ Bot 引擎 → XMPP 发送到群 ``` ### 5.3 微信通道流(Windows 平台专属) ``` 微信消息 │ ▼ WeChat App → wxhelper DLL 注入 → TCP :19099 │ ▼ wechat_agent.py ├─ 文字: POST → Hermes Gateway (Linux) → LLM → 回复 ├─ 图片: downloadAttach → decodeImage → OCR → 文字发给 Gateway └─ 回复: wxhelper HTTP :19088 发送回微信 ``` --- ## 6. 组件通信矩阵 | 组件 | 协议 | 端口 | 说明 | |------|------|------|------| | Bot ↔ ejabberd | XMPP/TLS | 3021 | 标准 XMPP | | Bot ↔ Gateway | HTTP REST | 动态分配 | OpenAI 兼容 API | | WeChat Agent ↔ Gateway | HTTP | 8642 | Hermes API | | WeChat Agent ↔ wxhelper | HTTP | 19088 | 微信消息收发 | | WeChat Agent ↔ wxhelper | TCP | 19099 | 微信事件推送 | | 管理门户 ↔ Bot | HTTP | 5803 | Dashboard API | | 人类 ↔ ejabberd | XMPP/TLS | 3021 | 标准客户端 | | API Proxy → Provider | HTTPS | 443 | 转发到火山/OCG | | Bot 启动器 ↔ 进程 | subprocess | - | 进程管理 | --- ## 7. 管理门户设计 ### 7.1 功能 | 功能 | 说明 | |------|------| | Agent 列表 | 所有已注册 Agent,含名称/JID/平台/状态 | | 连接状态 | XMPP 在线/离线、Bot 进程是否存活、最后消息时间 | | 启停控制 | 启动/停止/重启 单个 Agent 的 Bot 进程 | | 日志查看 | 实时 tail 关键日志(bot.log / health_check.log) | | 健康指标 | 最近 N 分钟消息数、响应延迟、错误率 | | 告警规则 | Agent 离线 >N 分钟告警、Bot 假死(在线但无消息)告警 | | 配置浏览 | 查看当前 agents.yaml 配置 | ### 7.2 技术方案 | 层 | 选型 | 理由 | |----|------|------| | 后端 | Python Flask (:5803) | 零依赖,和现有 bot 一致 | | 前端 | 单页 HTML + 原生 JS + CSS | 无构建步骤,直接 serve | | 数据源 | SSH + ejabberdctl → 跨平台在线检测 | 比 MUC/roster 更可靠,不依赖 Bot 自身状态 | | 本地补充 | 进程列表 + xmpp_bot /health 端点 | Windows 本地进程检测 | | 实时更新 | 前端 5s 轮询 | 简单可靠 | | 自动恢复 | 连续 3 次离线检测 → 自动重启 | 仅限 Windows 本地 Agent | ### 7.3 监控架构 ``` Dashboard (:5803) │ ├── SSH → 192.168.1.246 → ejabberdctl connected_users │ └── 返回所有在线 JID 列表(跨平台权威数据源) │ ├── GET :5802/health │ └── XMPP 连接状态 + ejabberd 是否存活 │ ├── GET :5802/presence/{jid} │ └── Roster presence(备选) │ └── 本地进程检测 (Get-CimInstance) └── Windows 进程存活 + PID ``` ### 7.3 后端 API | 方法 | 路径 | 说明 | |------|------|------| | GET | /api/agents | 所有 Agent 状态 | | GET | /api/agents/{id} | 单个 Agent 详情 | | GET | /api/agents/{id}/logs | tail 日志 | | POST | /api/agents/{id}/start | 启动 Bot | | POST | /api/agents/{id}/stop | 停止 Bot | | POST | /api/agents/{id}/restart | 重启 Bot | | GET | /api/health | Dashboard 自身健康检查 | --- ## 8. 配置管理 ### 8.1 配置分层 ``` config/ ├── agents.yaml # Agent 实例注册表 (核心) ├── providers.yaml # AI 提供商配置 ├── platforms.yaml # 平台能力声明 ├── .env.example # 环境变量模板 └── profiles/ # 每个 Agent 的个性化配置 └── {agent-name}/ ├── system_prompt.txt ├── memory.txt └── tools.yaml ``` ### 8.2 Provider 配置 ```yaml # config/providers.yaml providers: volcengine: api_key: ${VOLCENGINE_KEY} base_url: https://ark.cn-beijing.volces.com/api/coding/v3 models: [deepseek-v4-pro, deepseek-v4-flash] ocg-new: api_key: ${OCG_NEW_KEY} base_url: https://opencode.ai/zen/go/v1 ocg-old: api_key: ${OCG_OLD_KEY} base_url: https://opencode.ai/zen/go/v1 omlx: api_key: ${OMLX_KEY} base_url: http://192.168.1.122:18003/v1 ``` --- ## 9. 运维体系 ### 9.1 平台运维职责 | 职责 | Windows | Linux | Mac | |------|---------|-------|-----| | 进程存活监控 | watchdog (30s) | systemd (auto-restart) | launchd / cron | | 消息流监控 | health_check (5min) | 待实现 | 待实现 | | 日志轮转 | watchdog 内置 (15min/5MB) | 待实现 | 待实现 | | 自动恢复 | 进程死→自动重启 | systemd Restart=always | 待实现 | | 假死检测 | 在线但无消息 >10min → 重启 | 待实现 | 待实现 | | 告警通知 | Dashboard 显示 | XMPP 群消息 | XMPP 群消息 | ### 9.2 日志体系 | 日志 | 位置 | 轮转 | 内容 | |------|------|------|------| | bot.log | gateway/logs/ | ✅ 15min/5MB | Bot 连接/消息/HTTP桥 | | bridge.log | gateway/logs/ | 无 | LLM API 调用/耗时 | | watchdog.log | gateway/logs/ | ✅ 15min/5MB | Watchdog 启停 | | health_check.log | gateway/logs/ | 无 | 健康检查结果 | | mohe_inbox.log | gateway/logs/ | 无 | 莫荷消息记录 | --- ## 10. 已知问题 | ID | 问题 | 平台 | 状态 | 说明 | |----|------|------|------|------| | R01 | MUC join 超时 (conference.yoin.fun cert) | Linux (ejabberd) | 🟡 | 已加自签证书,join_muc_wait 仍超时;已用 SSH+ejabberdctl 绕过 | | R02 | xmpp_bot 频繁断连 (~50s) | Windows | 🔴 | 阿里云 Nginx 代理 TCP idle timeout | | R03 | 日志无系统级轮转(除 watchdog 内置) | Windows + Linux | 🟡 | | | R04 | Provider fallback 链可能无限循环 | 全部 | 🟡 | | | R05 | QQ 通道未实现 | Windows | 🟢 | | | R06 | 部分 Gateway 进程缺 systemd 管理 | Linux | 🟡 | | | R07 | API Key 明文在 config.yaml | Linux | 🟡 | |