告别玩具级 Agent:OpenClaw + Hermes 把 800 行"上帝类"重构到 189 行的真实复盘
在 AI 编程时代,如果你还在用对话框让 AI “帮我重构一下这个文件”,那你还没走出新手村。面对 800 行以上、耦合了业务逻辑、WebSocket、限流器和全局状态的“屎山”,普通的对话式 AI 会瞬间产生幻觉,甚至删库跑路。
真正能深入骨髓动刀的,是“脑机分离 + 人类统筹”架构。
1. 物理四肢:隔离沙箱(sandbox_api.py)
核心逻辑:AI 必须活在笼子里。我们通过 Docker 容器提供一个物理隔离的 API,让 AI 通过指令操作文件,而不是直接给它宿主机权限。
sandbox_api.py - 运行在 Docker 隔离环境from flask import Flask, request, jsonifyimport subprocessimport osapp = Flask(name)WORKSPACE = "/workspace" # 容器内工作目录@app.route('/tools/bash', methods=['POST'])def execute(): # 限制 AI 的活动范围,只能在 /workspace 下折腾 cmd = request.json.get("command") try: # 设置超时保护,防止 AI 写出死循环 res = subprocess.run(cmd, shell=True, capture_output=True, text=True, cwd=WORKSPACE, timeout=30) return jsonify({"status": "success", "out": res.stdout, "err": res.stderr}) except Exception as e: return jsonify({"status": "error", "msg": str(e)})if name == "main": app.run(host='0.0.0.0', port=5001)
2. 推理大脑:Hermes 协议(hermes_brain.py)
核心逻辑:大脑只负责“想”,不负责“做”。它通过Function Calling将思考转化为对沙箱的 API 调用。
hermes_brain.py - 负责 ReAct 循环import requestsfrom openai import OpenAI# 定义大脑可见的“手”TOOLS = [{ "type": "function", "function": { "name": "bash", "description": "执行 Bash 命令修改文件", "parameters": { "type": "object", "properties": {"command": {"type": "string"}}, "required": ["command"] } }}]def run_task(prompt): # 典型的 ReAct 循环:思考 -> 动作 -> 观察 -> 再思考 messages = [{"role": "user", "content": prompt}] for _ in range(20): resp = client.chat.completions.create(model="gemini-3.1-pro", messages=messages, tools=TOOLS) # 如果大脑要动“手” if resp.choices[0].message.tool_calls: # 转发指令给沙箱 (5001 端口) # ... 执行并获取返回结果 ... else: if "TASK_COMPLETED" in resp.choices[0].message.content: break
3. 人类统筹:最后的防线(fix_main.py)
核心逻辑:重构中,AI 极易因为“代码平移”导致导入顺序错误。此时不需要再跟 AI 废话,人类直接接管,用一段极其精准的AST 或正则脚本进行微创修复。
fix_main.py - 人类主刀医师的紧急补丁import redef fix_imports(): with open("enterprise_api_server.py", "r") as f: code = f.read() # 修复常见 Bug:app.include_router 必须在 app = FastAPI() 之后 app_init = re.search(r"app = FastAPI(.?)", code).group() routers = re.findall(r"app.include_router(.?)", code) # 清理掉错误的乱序位置 new_code = re.sub(r"app.include_router(.*?)\n", "", code) # 在正确的位置缝合 new_code = new_code.replace(app_init, app_init + "\n" + "\n".join(routers)) with open("enterprise_api_server.py", "w") as f: f.write(new_code)
4. 重构战果:星型放射架构
重构后的项目彻底告别了“单文件上帝类”,形成了单向依赖的闭环:
| 模块 | 职责 | 变化 |
| dependencies.py | 全局血库:存放 limiter、ws_manager | 🆕 打破循环依赖的关键 |
| routes/*.py | 各级分遣队:Auth、Metrics、Alerts | 🟢 高内聚,各管各的 |
| server.py | 中央指挥部:只负责配置与挂载 | 📉 830行 -> 189行 |
5. 架构师的复盘手记
关于 Lobster (网关):当你的模型额度 (Quota) 耗尽时,千万别在 Agent 里死磕,应该在网关层做Round-Robin (轮询)。
关于 OpenClaw (沙箱):它不仅是安全的边界,更是“上下文”的实体。AI 不需要记住所有代码,它只需要学会使用grep去沙箱里查。
关于人类:AI 负责体力劳动(搬运、改名、写样板代码),人类负责拓扑设计(决定谁依赖谁)。
结语:工程重构的终极范式

夜雨聆风