GenericAgent 架构解析:极简自进化 Agent 框架的设计哲学
GenericAgent: A Minimalist Self-Evolving Agent Framework
GenericAgent 是一个约 3K 行代码的极简自进化 Agent 框架,通过 9 个原子工具和 ~100 行 Agent Loop 赋予 LLM 系统级控制能力。其核心创新在于 L0-L4 分层记忆系统——每解决新任务自动固化为 Skill,形成越用越强的个人技能树。与 Hermes Agent 的 Skill Hub 和 OpenClaw 的 Gateway Workflow 形成三种截然不同的 Agent 演进路径。
一、项目概览
GenericAgent(GitHub: lsdefine/GenericAgent,Stars: 11.9k)是一个以"不预设技能,靠进化获得能力"为核心理念的极简自主 Agent 框架。核心代码仅约 3K 行,通过 9 个原子工具 + ~100 行 Agent Loop 赋予任意 LLM 对本地计算机的系统级控制能力——覆盖浏览器(保留登录态)、终端、文件系统、键鼠输入、屏幕视觉及移动设备 ADB。
1.1 核心哲学
传统 Agent 框架的思路是"预装一切"——预置大量专用工具、工作流模板和编排引擎,导致:
- 代码库庞大(OpenClaw 约 530K 行,Pi 虽精简但功能多元)
- Token 消耗高(上下文窗口动辄 200K-1M token)
- 新能力需要人工扩展代码
GenericAgent 的破局思路是**"最小可行工具集 + 自我进化"**:只提供 9 个足够强大的原子工具,让 Agent 自己通过 code_run 安装依赖、写脚本、调试验证,然后把成功路径固化为 Skill 下次复用。使用时间越长,技能树越丰富,最终变成一个完全属于用户的个人 Agent。
1.2 关键数据
| 指标 | 数值 |
|---|---|
| GitHub Stars | 11.9k |
| Forks | 1.4k |
| 核心代码量 | ~3K 行 |
| Agent Loop 行数 | ~100 行 |
| 原子工具数 | 9 个 |
| 上下文窗口 | <30K tokens(是其他框架的零头) |
| 支持模型 | Claude / Gemini / Kimi / MiniMax 等 |
| 编程语言 | Python 86.9% |
| Python 版本 | 3.10-3.12(明确排除 3.14) |
二、系统架构
2.1 整体架构
GenericAgent 采用经典的单进程模块化架构,所有组件围绕 GenericAgent 主类和 agent_runner_loop 引擎组织:
User Input
│
▼
┌─────────────────────────────────────────────────┐
│ Frontend Layer (agentmain.py) │
│ CLI / TUI / Qt / Streamlit / Telegram / 飞书 │
│ / QQ / Discord / 钉钉 / Tauri Desktop │
└──────────────────────┬──────────────────────────┘
│ /session /model /btw ...
▼
┌─────────────────────────────────────────────────┐
│ GenericAgent Main (agentmain.py) │
│ Task Queue | Multi-Model | Slash Commands │
│ Run Modes: CLI / --task / --reflect │
└──────────────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────────────┐
│ Agent Loop (agent_loop.py, ~100 lines) │
│ Generator-based, streaming output │
│ while turn < max_turns: │
│ 1. client.chat() → LLM stream │
│ 2. Parse tool_calls │
│ 3. BaseHandler.dispatch() → do_{tool}() │
│ 4. turn_end_callback() → summary + fold │
└──────┬───────────────────┬─────────────────────┘
│ │
▼ ▼
┌──────────────┐ ┌─────────────────────┐
│ LLM Core │ │ Tool Implementations │
│ (llmcore.py) │ │ (ga.py) │
│ ~800 lines │ │ 9 atomic tools │
│ Claude/OAI/ │ │ code_run │
│ Native/Mixin │ │ file_read/write/patch│
└──────────────┘ │ web_scan/execute_js │
│ ask_user │
│ memory tools │
└──────────┬───────────┘
│
┌────────────────────┼────────────────────┐
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ TMWebDriver │ │ simphtml.py │ │ Layered │
│ (CDP Browser)│ │ (HTML Engine)│ │ Memory L0-L4 │
└──────────────┘ └──────────────┘ └──────────────┘
│ │ │
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Reflect/ │ │ Skill Search │ │ Skill SOPs │
│ Scheduler │ │ (L1 Index) │ │ (L3 Storage) │
└──────────────┘ └──────────────┘ └──────────────┘2.2 核心包解析
2.2.1 agentmain.py — 主控类
GenericAgent 类是整个框架的中枢,职责:
| 职责 | 实现 |
|---|---|
| 多模型管理 | load_llm_sessions() 从 mykey.py 加载配置,支持 Claude/Gemini/Kimi/MiniMax,运行时 next_llm() 切换 |
| 任务队列 | 线程安全的 queue.Queue,put_task() 投递,run() 后台线程消费 |
| 三种运行模式 | CLI 交互、一次性任务(--task)、反射监控(--reflect) |
| Slash 命令 | /session.*=... 动态修改会话参数,/resume 恢复历史 |
| 子 Agent 编排 | conductor.py 派发并行子 Agent,/btw 旁路提问不中断主线 |
2.2.2 agent_loop.py — Agentic Loop(~100 行)
这是整个框架最核心的设计亮点。用 Python generator 实现流式 Agent 循环:
def agent_runner_loop(client, sys_prompt, user_input,
handler, tools, max_turns=80):
messages = [{"role": "system", "content": sys_prompt},
{"role": "user", "content": user_input}]
while turn < max_turns:
# 1. 流式 LLM 调用
response = yield from client.chat(messages, tools, stream=True)
# 2. 解析 tool_calls(Protocol 模式 <tool_use> 或 Native function_calling)
tool_calls = parse_tool_calls(response)
# 3. 分发工具调用
results = []
for tc in tool_calls:
outcome = yield from handler.dispatch(tc.name, tc.args)
results.append((tc.id, outcome.data))
# 4. 轮次结束回调:生成摘要 + 历史压缩
next_prompt = handler.turn_end_callback(messages, results)
messages.append({"role": "user", "content": next_prompt})
# 5. StepOutcome 控制循环走向
if outcome.should_exit or outcome.next_prompt is None:
break关键设计点:
yield from:每个步骤都是 generator,天然支持流式输出,前端实时显示中间结果StepOutcome:控制数据结构,next_prompt决定继续/退出,should_exit强制终止- 每 10 轮重置工具描述:
client.last_tools = ''节省 token - 工具串行执行:默认逐个执行,前一个失败则停止,保证操作顺序安全
2.2.3 llmcore.py — LLM 抽象层(~800 行)
精巧的多模型统一抽象层:
| 类 | 协议 | 特点 |
|---|---|---|
ClaudeSession | Anthropic Messages API (SSE) | 原生 Claude |
LLMSession | OpenAI Chat Completions | 兼容 DeepSeek/xAI 等 |
NativeClaudeSession | Claude Code CLI | 签名验证 + extended thinking |
NativeOAISession | Claude 后端 + OAI 格式 | 混合模式 |
MixinSession | 多模型轮询 | 按优先级 failover |
ToolClient vs NativeToolClient:
| ToolClient(Protocol) | NativeToolClient(Native) | |
|---|---|---|
| 机制 | 工具定义嵌入 prompt <tool_use> 标签 | 标准 tool_calls JSON 字段 |
| LLM 兼容 | 任何 LLM(不支持 function calling 也能用) | 需要 Provider 支持 |
| Prompt 长度 | 稍长 | 短 |
| 调试 | 可直接查看 prompt | 黑盒 |
这种双轨设计是 GenericAgent 的重要工程选择:优先 Protocol 模式保证最大兼容性,需要时切换 Native 模式提升效率。
2.2.4 ga.py — 工具实现层
GenericAgentHandler 继承 BaseHandler,通过方法名映射(do_{tool_name})实现工具分发:
| 工具 | 方法 | 关键实现 |
|---|---|---|
code_run | do_code_run | 写临时 .ai.py → 子进程执行;inline_eval 进程内运行;超时/中断安全 |
file_read | do_file_read | 关键词搜索 + 行号支持;自动解码 |
file_write | do_file_write | 琅嬛福地 标签;创建/追加/覆写三种模式 |
file_patch | do_file_patch | 精确文本块替换;防止误改 |
web_scan | do_web_scan | simphtml.py 简化 DOM → 精简文本 |
web_execute_js | do_web_execute_js | CDP 浏览器中执行 JS;结果保存 |
ask_user | do_ask_user | 人机协作;中断循环等待确认 |
update_working_checkpoint | do_update_working_checkpoint | 短期工作记事板(每轮自动注入) |
start_long_term_update | do_start_long_term_update | 触发长期记忆提炼 SOP |
2.2.5 TMWebDriver.py — 浏览器驱动
通过 CDP(Chrome DevTools Protocol) 控制真实浏览器:
- 双通道通信:WebSocket 实时双向 + HTTP Long Polling 兼容
- 保留登录态:不启动无头模式,已登录的网站直接操控(外卖下单、支付宝查账等真实场景)
- 多标签页管理
- 远程模式:端口检测支持远程浏览器
2.2.6 reflect/ — 反射与调度
| 模块 | 功能 |
|---|---|
scheduler.py | cron 式定时任务(once/daily/weekly/monthly/every_Nh) |
autonomous.py | 空闲 30 分钟后自动触发自主任务 |
goal_mode.py | 目标驱动模式 |
agent_team_worker.py | 子 Agent 工作者 + 派发监督 |
三、分层记忆系统:框架的灵魂
GenericAgent 区别于其他 Agent 框架的根本创新在于其 L0-L4 分层记忆系统。这不仅仅是一个"存储",而是一套精心设计的知识管理协议:
3.1 五层结构
| 层级 | 名称 | 存储形式 | 大小约束 | 作用 |
|---|---|---|---|---|
| L0 | 元规则 | memory_management_sop.md | 无 | 记忆更新的最高原则,Agent 不可违背 |
| L1 | 索引层 | global_mem_insight.txt | ≤30 行 | 快速路由,根据关键词定位到 L2/L3 |
| L2 | 事实库 | global_mem.txt | 无 | 验证过的环境事实、配置、凭证、踩坑记录 |
| L3 | 技能库 | memory/*.md, memory/*.py | 无 | 任务 SOP(.md)和可复用脚本(.py) |
| L4 | 会话归档 | L4_raw_sessions/ | 无 | 从已完成会话中提炼的原始记录 |
3.2 核心公理
这些公理是 L0 元规则的一部分,直接约束 Agent 的记忆行为:
- 行动验证原则(No Execution, No Memory):只有工具调用成功的结果才能写入记忆,防止幻觉污染长期知识库
- 神圣不可删改性:验证过的配置、踩坑记录在后续重构中绝不能丢失
- 禁止存储易变状态:时间戳、PID、临时文件路径等瞬态数据不写入记忆
- 最小充分指针:每层只保留能定位下一层的最短标识符
3.3 进化机制
[新任务到达]
│
├─ L1 索引查询:关键词 → 相关 SOP 路径
│ └─ 命中 → 直接加载 L3 SOP → 执行
│
└─ 未命中 → 自主探索
├─ code_run: 安装依赖
├─ 写脚本:构建解决方案
├─ 调试:验证结果
└─ 成功路径固化
│
▼
start_long_term_update()
│
▼
[遵循 L0 SOP] → 提炼 → 写入 L2/L3
│
▼
[下次同类任务: 一句话启动]这个机制让 GenericAgent 的能力随使用时间线性增长,而不是依赖开发者维护工具库。
四、与 Hermes Agent、OpenClaw 的对比

4.1 设计哲学对比
| 维度 | GenericAgent | Hermes Agent | OpenClaw |
|---|---|---|---|
| 核心理念 | 最小核心 + 自我进化 | 多入口 + Skill Hub | 多团队 + Gateway 安全审批 |
| 演进路径 | 能力从使用中生长 | 社区 Skill 共享 | 企业级工作流积累 |
| 上下文策略 | 极度节俭(<30K) | 依赖 Provider 上下文限制 | 依赖 Provider 上下文限制 |
| 代码哲学 | 极简主义 | 工程完整 | 企业级复杂 |
4.2 架构差异
GenericAgent — 单体极简流
- 核心约 3K 行,所有模块在一个进程内
- 通过文件系统(.txt/.md)管理记忆,无数据库依赖
- 前端通过进程导入加载(
import tuiapp_v2) code_run工具是万能能力放大器——可以安装任何包、执行任何操作
Hermes Agent — 多入口平台化
- 核心
AIAgent~9K 行,cli.py+gateway/+acp_adapter/均为入口 - SQLite + FTS5 会话存储,可插拔 Memory Provider
- 工具系统采用导入时自注册:每个
tools/*.py顶层调用registry.register(),自动发现 - 70+ 注册工具,28 个工具集,7 种终端后端
- ACP 协议:通过 stdio/JSON-RPC 将 Agent 能力嵌入 VS Code、Zed、JetBrains
- 20 个消息平台适配器(Gateway),是三大框架中平台覆盖最广的
OpenClaw — 微服务企业架构
- ~530K 行,多服务编排,完整的企业级基础设施
- Gateway 控制平面:消息通道路由、多团队管理、审批工作流
- FASA 安全架构:四层防御体系,28 个 Plugin Hook 点,双层安全检测
- MCP 集成:动态工具发现,通过 MCP 协议与外部服务连接
- ClawTrace:Agent 运行时追踪,行为树可视化,PDG 威胁检测
- AgentMonitor:OpenClaw 的侧通道监控插件,实时安全事件告警
4.3 记忆系统对比
| GenericAgent | Hermes Agent | OpenClaw | |
|---|---|---|---|
| 存储介质 | 文件系统(.txt/.md) | SQLite + FTS5 | SQLite + 内存 |
| 抽象层级 | L0-L4 分层 | Provider ABC 可插拔 | Hook 事件驱动 |
| 进化机制 | 自动提炼 SOP | 社区 Skill Hub | 人工工作流模板 |
| 索引方式 | L1 关键词路由 | FTS5 全文搜索 | 标签 + Hook 点 |
| Token 效率 | 极高(<30K) | 依赖压缩策略 | 依赖 Provider |
GenericAgent 的文件式记忆系统在信息密度上有独特优势:没有数据库 schema 约束、没有 ORM 开销,Agent 可以用完全自然语言的方式管理知识。这既是它的灵活性,也是它的潜在风险。
4.4 安全模型对比
| GenericAgent | Hermes Agent | OpenClaw | |
|---|---|---|---|
| 危险检测 | ask_user 确认 | approval.py 危险命令检测 | FASA 四层 + 28 Hook 点 |
| 浏览器安全 | 真实浏览器(无沙箱) | 5 种浏览器后端 | 沙箱/无头浏览器 |
| 执行隔离 | 子进程 + 超时控制 | 沙箱执行(Docker/Modal 等) | MCP 协议隔离 |
| 凭据管理 | mykey.py(本地) | auth.py PROVIDER_REGISTRY | Gateway 凭据存储 |
| 可观测性 | 可选 Langfuse 插件 | 回调系统 + CLI spinner | ClawTrace 追踪 + AgentMonitor |
| 运行时安全 | 轮数上限警告 | check_fn 门控 | 双层 PDG 检测 |
4.5 工具系统对比
| GenericAgent | Hermes Agent | OpenClaw | |
|---|---|---|---|
| 工具数量 | 9 个原子工具 | 70+ 注册工具 | 28 个 Plugin Hook |
| 工具设计 | 极简通用 | 功能专用 | Hook 抽象 |
| MCP 集成 | 无原生支持 | MCP 客户端(动态发现) | MCP 核心协议 |
| 浏览器控制 | CDP 真实浏览器 | 5 种后端 | 沙箱浏览器 |
| 代码执行 | 子进程 Python/PowerShell | 沙箱(Docker/Modal等) | MCP 隔离 |
| 工具扩展 | code_run 万能 | 导入时自注册 | MCP 插件 |
GenericAgent 的"9 个原子工具"策略与 Hermes Agent 的"70+ 专用工具"形成鲜明对比。前者认为通用工具 + LLM 推理能力可以覆盖大多数场景,后者认为专用工具的确定性更高、Token 消耗更低。两者都有各自的数据支撑。
4.6 多 Agent 编排对比
| GenericAgent | Hermes Agent | OpenClaw | |
|---|---|---|---|
| 编排方式 | Conductor + /btw | Delegate Tool | Gateway Workflow |
| 子 Agent 隔离 | Python 子进程 | 独立 LLM 调用 | 多团队 + 审批流 |
| 并行执行 | 多 worker 线程 | 工具级并行 | Gateway 任务分发 |
| 通信机制 | agent_team_worker.py | 共享 Prompt | API 消息传递 |
五、评测与数据支撑
GenericAgent 技术报告(arXiv:2604.17091)从五大维度进行了系统性评测:
| 维度 | 核心问题 | 结论 |
|---|---|---|
| 任务完成度与 Token 效率 | GA 能否以更低成本完成高难度任务? | Token、请求数、工具调用三轴全面领先 |
| 工具使用效率 | 最小原子工具集能否替代专用工具集? | 成本显著低于专用工具集,质量持平 |
| 记忆系统有效性 | 精简分层记忆能否超越 Embedding 检索? | 在 SOP-Bench、LoCoMo、20-skill 测试中均优于 Embedding 方案 |
| 自我进化能力 | Agent 能否无人干预下将经验固化为 SOP? | 9 轮纵向研究和 8 任务 Web 基准验证了进化路径 |
| 网页浏览能力 | 信息密度设计能否适应开放网页? | WebCanvas、BrowseComp-ZH 验证了simphtml.py的有效性 |
关键发现:GenericAgent 的第二轮和第三轮执行在 8 个 Web 任务上收敛至稳定的低成本区间——这直接验证了"进化后能力更强"的核心理论。
六、设计启示
6.1 "少即是多" 的工程哲学
GenericAgent 用 3K 行代码做到了许多框架数十万行才能实现的事。其关键洞察:LLM 的推理能力是对抗复杂性的最佳武器。与其在框架层设计大量专用工具,不如提供足够通用的原子操作,让 LLM 自己决定如何组合。
6.2 上下文窗口是最宝贵的资源
GenericAgent 的 <30K Token 上下文策略背后的逻辑:更小的上下文意味着更低的噪声、更低的幻觉概率和更低的成本。当其他框架在努力压缩 200K-1M Token 的上下文时,GenericAgent 从一开始就在构建一个信息密度最优的记忆系统。
6.3 文件系统作为知识库
将记忆存储在文件系统(.txt/.md)中,而非数据库中,是一个反直觉但有效的设计:
- 零依赖:不需要数据库服务器
- 自然语言友好:Agent 可以用完全自然语言读写记忆
- 版本控制友好:
.git天然追踪记忆演进 - 可调试:直接 cat 即可查看当前记忆状态
6.4 Generator-based 流式架构
Python generator 作为 Agent 循环的底层原语,比异步框架(asyncio)或状态机都更简洁:yield from 自动处理流式输出的挂起和恢复,前端通过 display_queue.get() 消费,不需要额外的流式抽象。
七、总结
GenericAgent 代表了 AI Agent 框架的一种独特演进路径:不从"功能完备"出发,而从"能力进化"出发。它的核心价值不是提供了多少工具,而是提供了一种让 Agent 在使用中生长的机制。
与 Hermes Agent(多入口平台化)和 OpenClaw(多团队企业安全)相比,GenericAgent 的定位更加个人化——它是你的个人 Agent,用得越久,它就越懂你、越能帮你。
三种框架的适用场景:
| 场景 | 推荐框架 |
|---|---|
| 个人开发助手,极简可控 | GenericAgent |
| 需要 IDE 集成,多平台消息 | Hermes Agent |
| 企业级多团队协作,安全审批 | OpenClaw |
参考链接
- GitHub:github.com/lsdefine/GenericAgent
- 技术报告:arXiv:2604.17091
- 评测数据集:JinyiHan99/GA-Technical-Report
- Hermes Agent 架构:hermes-agent.nousresearch.com
- OpenClaw:openclaw.ai