babbc46801
- Merge bot_base.py, gateway/scripts/xmpp_bot.py, bots/*, xmpp_bot_rest.py into single xmpp_agent_core.py with --agent flag (xxm|mohe|zhiwei|xiaoguo) - Add xxm_bot.py wrapper (encoding=utf-8 for Windows exec) - Fix slixmpp connect() API: use host=/port= keyword args (was tuple) - Clean up orphans: bots/, scripts/, hermes_state.py, xmpp_bot.py, xmpp_bot_rest.py - Add docs/CLEANUP_PLAN.md documenting the migration - Update README.md project structure - Also: fix WeChat agent path resolution (relative paths)
9.3 KiB
9.3 KiB
AgentsMeeting 代码清理方案
目标:消除 XMPP Bot 代码碎片化,统一架构。所有 Agent 共享同一份核心代码。
1. 现状问题
1.1 四套独立 Bot 实现
| # | 位置 | 行数 | 状态 | 用途 | LLM 调用 |
|---|---|---|---|---|---|
| 1 | gateway/scripts/xmpp_bot.py |
943 | 活跃 | xxm bot | chat_bridge |
| 2 | xmpp_agent_core.py (root) |
348 | 活跃 | mohe/zhiwei/xiaoguo | Hermes API |
| 3 | bots/xmpp_bot.py + 姐妹文件 |
359 | 孤儿 | mohe/zhiwei/xiaoguo(旧版) | Hermes API |
| 4 | xmpp_bot_rest.py |
72 | 废弃 | ejabberd REST 实验 | Hermes API |
问题:同样的 XMPP 连接、MUC join、消息处理逻辑,在 4 套代码中重复实现。修复了其中一个,其他三个还是坏的。
1.2 基础设施碎片化
bot_base.py(263 行)已经提炼出完善的 XMPP 基类,但没有任何 bot 实际使用它:
bot_base.py 有:
✓ PID 锁(proc_guard)
✓ 自动重连 + MUC join 重试
✓ 消息去重(dedup)
✓ 消息合并(batching)
✓ silence/shutup 协议
✓ send_group / send_private
没有被任何 bot 使用 ✗
1.3 重复/孤儿文件
| 文件 | 问题 |
|---|---|
xmpp_bot.py(root) |
xmpp_agent_core.py 的较旧副本 |
xmpp_bot_rest.py |
废弃方案 |
bots/ 目录(3 文件) |
被 xmpp_agent_core.py 取代 |
hermes_state.py(root) |
孤儿,import 已断 |
scripts/(6 文件) |
一次性脚本 |
src/bots/{mohe,xiaoguo,xxm,zhiwei}/ |
空目录,重构未完成 |
src/channels/wechat/ |
空目录 |
2. 目标架构
AgentsMeeting/
├── xmpp_agent_core.py ← 唯一 Bot 核心(统一架构)
│ 支持 --agent xxm|mohe|zhiwei|xiaoguo
│ 包含:PID锁/重连/MUC/dedup/batching/
│ coordinator协议/HTTP桥
│
├── xxm_bot.py ← 兼容入口(python xxm_bot.py = python xmpp_agent_core.py --agent xxm)
├── mohe_bot.py ← 兼容入口
├── xiaoguo_bot.py ← 兼容入口
├── zhiwei_bot.py ← 兼容入口
│
└── gateway/
└── scripts/
├── chat_bridge.py ← xxm LLM 桥(不变)
├── session_router.py ← 消息路由(不变)
└── ...(其他脚本不变)
核心原则:
xmpp_agent_core.py= 唯一核心,所有 Agent 共享- 每个 Agent 只有 LLM 调用方式不同(在配置中定义)
- coordinator/GRANT/REVOKE 协议只有一个实现,所有 bot 统一遵守
bot_base.py的基础设施合并进xmpp_agent_core.py
3. 迁移步骤
Phase 0:确认基线(先保证现有 bot 正常工作)
- 确认
gateway/scripts/xmpp_bot.py当前运行正常,能收发群消息 - 确认
xmpp_agent_core.py(mohe)当前运行正常
Phase 1:合并基础设施到 xmpp_agent_core.py
将 bot_base.py 和 gateway/scripts/xmpp_bot.py 中的公共功能合并进 xmpp_agent_core.py:
| 功能 | 来源 | 说明 |
|---|---|---|
| PID 锁(proc_guard) | bot_base.py / gateway | 防重复启动 |
| 消息去重(dedup) | bot_base.py / gateway | 防重复处理同一条消息 |
| 消息合并(batching) | bot_base.py / gateway | 3s debounce,附近消息合并一次 LLM 调用 |
| 自动重连 | bot_base.py / gateway | slixmpp auto_reconnect + reconnect_max_delay |
| MUC join 双重保证 | gateway | join_muc() + send_raw(presence) |
| MAM 启动恢复 | gateway | 启动时拉取最近 50 条历史消息补上下文 |
| HTTP 桥丰富 API | gateway | /health, /presence, /messages, POST /send |
| sub-agent exec | gateway | ##exec:command## 用于工具调用 |
| delayed reply | gateway | ##delay:N## 延迟回复 |
Phase 2:统一 coordinator 协议
gateway/scripts/xmpp_bot.py 已经实现了 coordinator/GRANT/REVOKE 协议。将这套实现整合进 xmpp_agent_core.py,确保所有 Agent 使用同一份协议代码。
Phase 3:添加 xxm 作为支持 Agent
在 xmpp_agent_core.py 的 AGENTS 配置中添加 xxm:
AGENTS = {
"mohe": {..., "gateway": "http://localhost:8642/v1/chat/completions"},
"zhiwei": {..., "gateway": "http://localhost:8643/v1/chat/completions"},
"xiaoguo":{..., "gateway": "http://localhost:8645/v1/chat/completions"},
"xxm": {..., "bridge": "chat_bridge"}, # xxm 走本地 chat_bridge
}
xxm 的 LLM 调用方式不同(不走 HTTP Hermes API,走本地 chat_bridge.py),所以需要在核心中抽象 LLM 调用层:
def _call_llm(self, content: str) -> str:
if self.cfg.get("bridge") == "chat_bridge":
return _call_chat_bridge(content) # 本地调用
else:
return _call_hermes_api(content, self.cfg["gateway"]) # HTTP 调用
Phase 4:删除孤儿文件
| 文件 | 操作 |
|---|---|
xmpp_bot.py(root) |
移到 trashbox |
xmpp_bot_rest.py |
移到 trashbox |
bots/ 整个目录 |
移到 trashbox |
hermes_state.py(root) |
移到 trashbox |
scripts/gen_prd.py |
移到 trashbox |
scripts/write_prd.py |
移到 trashbox |
scripts/gen_prd_v02.py |
移到 trashbox |
scripts/write_prd_v02.py |
移到 trashbox |
scripts/build_prd.py |
移到 trashbox |
scripts/test_echo.py |
移到 trashbox |
scripts/gen_b64.py |
保留(可能是通用工具) |
Phase 5:清理空目录
| 目录 | 操作 |
|---|---|
src/bots/mohe/ |
删除 |
src/bots/xiaoguo/ |
删除 |
src/bots/xxm/ |
删除 |
src/bots/zhiwei/ |
删除 |
src/channels/wechat/ |
删除 |
gateway/assets/ |
删除 |
Phase 6:整理 gateway/temp/
保留:PID 文件、活跃缓存(.bridge_context.jsonl、.model_cache.json) 其余 >200 个临时文件:移到 temp/archive/ 或按需清理。
Phase 7:文档更新
- 更新
docs/ARCHITECTURE.md—— 反映统一架构 - 更新
README.md—— 更新项目结构描述 - 更新
config/agents.yaml—— 保持准确
4. 核心文件变更清单
修改:xmpp_agent_core.py
从 348 行扩展为 ~600 行,新增:
新增功能模块:
├── proc_guard PID 锁
├── 消息去重(_dedup_cache)
├── 消息合并(_batch_* 系统,3s debounce)
├── MAM 启动恢复(_fetch_mam_history)
├── HTTP 桥丰富版(/health, /presence, /messages, POST /send)
├── sub-agent exec(##exec:command##)
├── delayed reply(##delay:N##)
├── 抽象 LLM 调用层(支持 chat_bridge + Hermes API)
└── coordinator/GRANT/REVOKE 协议(从 gateway 版提升)
新增 AGENTS 配置条目:
"xxm": {
"jid": "xxm@yoin.fun",
"password": "hermes123",
"nick": "xxm",
"name_cn": "笑笑",
"bridge": "chat_bridge", # 使用本地 chat_bridge
"http_port": 5802, # HTTP 桥端口
"muc_rooms": [
"coregroup@conference.yoin.fun",
"jujidina@conference.yoin.fun",
],
"server": "192.168.1.246", # LAN 直连
"port": 5222,
"session_id": "ses_xxm_xmpp",
"mention": "@xxm/@笑笑",
}
创建:xxm_bot.py
#!/usr/bin/env python3
"""Wrapper for xmpp_agent_core.py --agent xxm"""
import sys, os
sys.argv = [sys.argv[0], '--agent', 'xxm']
exec(open(os.path.join(os.path.dirname(__file__), 'xmpp_agent_core.py')).read())
(与现有的 mohe_bot.py / zhiwei_bot.py / xiaoguo_bot.py 模式一致)
保留不变
| 文件 | 说明 |
|---|---|
gateway/scripts/chat_bridge.py |
xxm LLM 桥,不迁移 |
gateway/scripts/session_router.py |
消息路由,不迁移 |
gateway/scripts/wechat_agent.py |
微信桥接,独立组件 |
gateway/scripts/qq_bot.py |
QQ bot,独立组件 |
gateway/scripts/vc_webhook.py |
VoceChat webhook,独立组件 |
gateway/scripts/dashboard.py |
管理门户,独立组件 |
gateway/scripts/health_check_xxm.py |
健康检查,独立组件 |
gateway/scripts/xmpp_watchdog.py |
看门狗,独立组件 |
gateway/scripts/mohe_watcher.py |
莫荷消息监控,独立组件 |
gateway/scripts/api_proxy.py |
API 代理,独立组件 |
5. 测试计划
5.1 单元测试
python tests/test_core.py—— bot_base 测试保持通过- 新增测试:合并后的 xmpp_agent_core.py 的 LLM 抽象层
5.2 集成测试
python xmpp_agent_core.py --agent xxm能启动、连接、加入 MUCpython xmpp_agent_core.py --agent mohe能启动、连接、加入 MUC- 各 Agent 在 coregroup 中能正确响应 @mention
- coordinator/GRANT/REVOKE 协议各 Agent 一致
5.3 部署验证
python tests/verify_deploy.pypass- gateway/scripts/xmpp_bot.py → 改为调用 xmpp_agent_core.py --agent xxm
- Linux 端 update systemd service 指向新路径
6. 风险与回滚
| 风险 | 缓解 |
|---|---|
| 合并后 xxm bot 不工作 | Phase 0 先备份当前 gateway/scripts/xmpp_bot.py |
| 协议行为不一致 | coordinator 协议从 gateway 版提取,与 xmpp_agent_core 现有逻辑逐行对比 |
| 启动命令需要改 | 兼容入口(xxm_bot.py 等)保持 CLI 不变 |
回滚方案:Phase 1-4 每步完成后验证。出问题从 trashbox 恢复删除的文件。