【OpenHands】AI驱动软件开发代理:核心架构与设计原理深度解析

引子

当 AI 能够自主阅读代码库、编写修复方案、执行命令行操作、提交 Pull Request —— 软件开发会变成什么样子?OpenHands 正在将这个愿景变为现实。

作为目前最活跃的 AI 软件工程代理之一,OpenHands 在 SWEBench 基准测试中达到了 77.6% 的通过率,被 TikTok、Amazon、Netflix、NVIDIA 等知名企业工程师采用。本文将深度剖析其核心架构、设计原理与工程实践。

项目概述

OpenHandsgithub.com/OpenHands/OpenHands)是一个 AI 驱动的软件开发代理,目标是让 AI 能够像人类工程师一样独立完成代码阅读、调试、修复、测试等完整开发流程。

核心定位

维度描述
问题域自动化软件工程任务:Bug修复、功能开发、代码重构、测试编写
核心价值将大语言模型的推理能力与真实代码执行环境结合,实现端到端的自动化开发
技术特色事件驱动的 Agent 架构、强大的代码执行 Runtime、支持多 Agent 委托
性能指标SWEBench 77.6%(SOTA 级别)、支持 Claude/GPT/任何兼容 LLM

产品形态

OpenHands 提供四种使用方式:


核心架构

OpenHands 采用事件驱动(Event-Driven)架构,将 Agent 决策、代码执行、多轮对话全部抽象为事件流。这种设计使得系统状态可追溯、可回放、易调试。

整体架构图

graph TB
    subgraph User_Interface
        CLI[CLI]
        GUI[Local GUI]
        SDK[SDK API]
        Cloud[OpenHands Cloud]
    end

    subgraph App_Server
        Router[v1_router]
        Conv[app_conversation]
        Settings[settings]
    end

    subgraph Agent_Core
        Controller[AgentController]
        Agent[Agent]
        Loop[run_agent_until_done]
    end

    subgraph Event_System
        EventStream[EventStream]
        Actions[Actions]
        Observations[Observations]
    end

    subgraph Memory
        Memory[Memory]
        Condenser[condenser]
        View[View]
    end

    subgraph LLM
        LLM[LLM]
        Router[llm_router]
        ToolConverter[fn_call_converter]
    end

    subgraph Runtime
        Runtime[Runtime]
        Sandbox[Sandbox]
        FileEdit[FileEdit]
        CmdRun[CmdRun]
        Browse[BrowseURL]
        IPython[IPythonRunCell]
    end

    User_Interface --> App_Server
    App_Server --> Agent_Core
    Agent_Core --> Event_System
    Event_System --> Memory
    Agent_Core --> LLM
    Event_System --> Runtime
    LLM --> ToolConverter
    ToolConverter --> Event_System

各层职责

层级模块职责
接口层CLI / GUI / SDK用户交互入口
应用层app_server会话管理、配置、生命周期
Agent层AgentController / Agent决策循环、状态管理、错误恢复
事件层EventStream / Actions / Observations统一事件抽象、状态流转
记忆层Memory / condenser对话记忆压缩、摘要生成
LLM层LLM / router / fn_call_converter模型调用、工具 schema 转换
运行时Runtime / Sandbox代码执行、环境隔离

事件驱动机制:核心设计哲学

OpenHands 最核心的设计思想是将一切交互都抽象为事件

事件类型体系

graph LR
    subgraph Actions
        FA[FileEditAction]
        FR[FileReadAction]
        CR[CmdRunAction]
        BR[BrowseURLAction]
        IP[IPythonRunCell]
        DA[AgentDelegateAction]
        MA[MessageAction]
    end

    subgraph Observations
        EO[ErrorObservation]
        NO[NullObservation]
        LO[LoopDetectionObservation]
        DO[AgentDelegateObservation]
    end

    Actions --> Events --> Observations

事件流循环

sequenceDiagram
    participant User
    participant Controller as AgentController
    participant LLM
    participant EventStream
    participant Runtime
    participant Memory

    User->>Controller: 初始化任务
    Controller->>EventStream: 注册事件监听
    Controller->>LLM: 发送当前状态 + 可用Action
    LLM-->>Controller: 返回 Action(函数调用)
    Controller->>EventStream: 提交 Action 事件
    EventStream->>Runtime: 路由并执行 Action
    Runtime-->>EventStream: 返回 Observation 事件
    EventStream->>Memory: 追加事件到记忆
    EventStream->>Controller: 通知新事件
    Controller->>LLM: 发送更新后的完整上下文
    LLM-->>Controller: 决策:继续/完成/委托

关键事件类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 动作事件(Agent → 执行器)
FileReadAction # 读取文件内容
FileWriteAction # 写入/创建文件
FileEditAction # 编辑文件(diff 格式)
CmdRunAction # 执行 Shell 命令
IPythonRunCellAction # 执行 Python 代码
BrowseURLAction # 浏览网页
AgentDelegateAction # 委托给子 Agent
MessageAction # 发送消息/评论

# 观察事件(执行器 → Agent)
ErrorObservation # 执行出错
NullObservation # 执行成功(无输出)
LoopDetectionObservation # 检测到循环
AgentDelegateObservation # 子 Agent 完成
AgentStateChangedObservation # Agent 状态变更

Agent 决策机制

AgentController:状态机驱动

AgentController 是 Agent 的大脑,负责管理 Agent 的生命周期和决策循环。

1
2
3
4
5
6
7
8
9
class AgentController:
id: str
agent: Agent
max_iterations: int
event_stream: EventStream
state: State
confirmation_mode: bool # 是否需要用户确认危险操作

TRAFFIC_CONTROL_REMINDER = "Please click resume to continue"

决策循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
async def run_agent_until_done(
controller: AgentController,
runtime: Runtime,
memory: Memory,
end_states: list[AgentState], # 终止状态列表
):
# 1. 挂载回调(错误/状态通知)
runtime.status_callback = status_callback
controller.status_callback = status_callback
memory.status_callback = status_callback

# 2. 事件驱动循环
while controller.state.agent_state not in end_states:
await asyncio.sleep(1)
# 每次 EventStream 有新事件时,Controller 会被唤醒
# 重新收集上下文 → 调用 LLM → 生成下一步 Action

状态机

stateDiagram-v2
    [*] --> Loading
    Loading --> Running: 任务开始
    Running --> Running: 正常执行
    Running --> WaitingForConfirmation: 危险操作需确认
    WaitingForConfirmation --> Running: 用户批准
    WaitingForConfirmation --> Stopped: 用户拒绝
    Running --> AgentDelegate: 委托子Agent
    AgentDelegate --> Running: 子Agent完成
    Running --> Error: 错误发生
    Error --> Running: 自动恢复
    Running --> Finished: 任务完成
    Error --> [*]
    Finished --> [*]

记忆系统:Condenser 模式

OpenHands 的记忆系统采用**压缩(Condensation)**机制,而非简单的滑动窗口。

记忆结构

1
2
3
4
5
6
7
8
class Memory:
event_store: EventStore
condenser: Condenser # 记忆压缩器
status_callback: Callable

def build_conversation_view(self) -> View:
"""构建供 LLM 使用的对话视图"""
return self.event_store.get_view()

压缩策略

OpenHands 维护一个** condensation 循环**:

  1. 最近消息(Last N 条):原样保留
  2. 中间历史:经过 Condenser 压缩为摘要
  3. 关键决策点:保留原始格式(如 AgentFinishAction)
graph TD
    subgraph EventStore
        Recent["最近事件 (Raw)"]
        Middle["中间历史 (Condensed)"]
        Key["关键事件 (Kept)"]
    end

    subgraph Condenser
        Summarize["LLM 摘要生成"]
        Filter["重要性过滤"]
    end

    Recent --> Condenser
    Middle --> Condenser
    Condenser --> Summarized["压缩后的摘要"]
    Summarized --> LLM
    Key --> LLM

工具系统:Runtime 执行层

多运行时支持

OpenHands 支持多种执行后端:

1
2
# 运行时配置
Runtime = LocalRuntime | DockerRuntime | RemoteRuntime

核心工具实现

工具执行方式特点
CmdRunAction在沙盒中执行 Shell完整的 Linux 环境
IPythonRunCellActionPython REPL支持数据分析、可视化
FileReadAction读取文件支持大文件截断
FileWriteAction写入文件自动创建目录
FileEditActionDiff 编辑精确的代码修改
BrowseURLAction浏览器自动化可与网页交互
AgentDelegateAction子 Agent 执行支持多 Agent 协作

安全机制

1
2
3
4
5
class SecurityAnalyzer:
"""执行前分析 Action 的安全风险"""
def analyze(action: Action) -> ActionSecurityRisk:
# 检测:rm -rf /、git push --force 等危险操作
# 返回:SAFE / CONFIRMATION_REQUIRED / UNSAFE

多 Agent 协作:委托模式

OpenHands 支持通过 AgentDelegateAction 启动子 Agent:

1
2
3
4
5
6
@dataclass
class AgentDelegateAction(Action):
agent_id: str
task: str
parent_agent_id: str
# 子Agent可以独立执行任务,完成后返回结果给父Agent
graph TB
    Parent[父 Agent]
    Child1[子 Agent 1]
    Child2[子 Agent 2]
    Runtime[Runtime]

    Parent -->|"AgentDelegateAction| 任务1"| Child1
    Parent -->|"AgentDelegateAction| 任务2"| Child2
    Child1 -->|AgentDelegateObservation| Parent
    Child2 -->|AgentDelegateObservation| Parent
    Child1 --> Runtime
    Child2 --> Runtime

典型场景

  • 主 Agent 分析任务,子 Agent 并行执行搜索/编写/测试
  • 复杂任务分解为「代码审查 Agent」+「代码修改 Agent」+「测试 Agent」

LLM 集成:灵活的模型支持

多模型路由

1
2
3
4
class LLMRegistry:
"""支持多模型动态切换"""
def get_llm(config: LLMConfig) -> LLM:
# 支持:Claude / GPT-4 / Gemini / 本地模型

函数调用转换

OpenHands 使用 fn_call_converter 将内部 Action schema 转换为各模型支持的函数调用格式:

1
2
3
4
5
6
7
# 内部统一格式
action = FileReadAction(file_path="src/main.py")

# 转换为目标模型格式
# Claude: anthropic-tools
# GPT: function-calling
# Gemini: function-declarations

深度对比

OpenHands vs LangChain Agent

维度OpenHandsLangChain Agent
设计哲学事件驱动,状态可回放Chain/Prompt 组合
执行模型Real Runtime(真实代码执行)多为 Tool 抽象
记忆系统内置 Condenser 压缩依赖外部 Memory 管理
多 Agent内置委托机制通过 LangGraph 实现
专注领域软件工程垂直通用 LLM 应用
BenchmarkSWEBench 77.6%无专项评测

OpenHands vs AutoGPT

维度OpenHandsAutoGPT
架构事件驱动 + 可视化调试目标驱动 + 树搜索
执行环境沙盒隔离,安全可靠本地执行,风险较高
产品化SDK/CLI/GUI/Cloud 完整生态主要 CLI
社区活跃度71k ⭐,企业采用184k ⭐,偏个人开发者

OpenHands vs CrewAI

维度OpenHandsCrewAI
交互模式事件驱动,可单步调试Role-Based Agent
执行能力深度代码执行任务分配为主
记忆管理内置压缩机制外部集成
场景软件开发全流程通用多Agent协作

优缺点分析

优点

  1. 事件驱动架构:状态可追溯、回放、重放,调试体验好
  2. 真实执行环境:不只是 LLM 调用,能真正修改文件、运行测试
  3. 强大的记忆系统:Condenser 机制避免上下文溢出
  4. Benchmark 驱动:SWEBench 77.6% 证明工程化能力
  5. 多 Agent 原生支持:委托机制简洁直观
  6. 企业级支持:有 Enterprise 版本和专业支持

缺点与挑战

  1. 学习曲线:事件模型对于新手不够直观
  2. V0 → V1 迁移:当前正处于架构升级期,部分文档可能有歧义
  3. 资源消耗:完整 Runtime(尤其 Docker)资源占用较高
  4. 调试复杂度:多轮交互后,事件流可能变得复杂
  5. 模型依赖:效果高度依赖底层 LLM 的函数调用能力

使用场景

最佳场景

  • Bug 自动修复:输入 Bug 描述,Agent 分析代码并提交修复
  • 代码重构:大型代码库的结构调整和迁移
  • 测试生成:为现有代码自动编写单元测试
  • PR 审查:自动化 Code Review 和问题标注
  • 文档生成:代码库文档自动生成

不适合场景

  • 简单的单一 LLM 调用(直接用 API 更轻量)
  • 需要实时交互的低延迟场景
  • 没有明确结束标准的开放式任务

总结

OpenHands 代表了 AI 软件开发代理的一种成熟架构范式:事件驱动 + 强执行环境 + 可压缩记忆。其在 SWEBench 上的出色表现证明了架构的有效性。

随着 AI 模型能力的持续提升,像 OpenHands 这样的代理将成为工程师的强大助手——不是替代,而是将人类从重复性编码中解放出来,专注于更具创造性的工作。

相关链接


对比分析

OpenHands 是”AI 软件开发代理”赛道的代表性项目,其事件驱动 + 强执行环境的设计与 Claude Code、Devin 等同类项目有显著差异。

维度对比表

维度OpenHandsClaude CodeSWE-Agent
执行环境Docker 沙箱 + 持久化文件 + Jupyter 内核本地 CLI + 终端 + 编辑器Docker 容器 + bash/python 工具
事件驱动是(EventStream + Runtime)否(线性 CLI 调用)部分(基于观察-行动循环)
记忆/上下文可压缩记忆 + 工作区状态会话级上下文 + 文件历史观察历史 + 重试上下文
SWE-Bench 表现出色(论文报道)强(Anthropic 内部评测)较早的 SWE-Agent 也达到 SOTA
开源程度完全开源(GitHub 6 万+ stars)闭源 CLI完全开源(学术项目)
主要定位通用 AI 软件开发代理,可自托管开发者辅助 CLI,强调本地工作流学术研究导向的 SWE-Bench 基准

优缺点

OpenHands

  • 优点:完整的事件驱动架构、强执行环境(Docker + Jupyter)、可压缩记忆、独立 Runtime、SDK 化设计;完全开源,自托管友好。
  • 缺点:部署复杂度较高(需要 Docker + LLM 代理栈);延迟较大(每步需要环境往返);不适合实时低延迟场景。

Claude Code

  • 优点:本地工作流集成深(编辑器、终端、Git),Anthropic 模型加持,UX 流畅。
  • 缺点:闭源,无法自托管深度定制;依赖 Claude API;不擅长长时多步骤任务。

SWE-Agent

  • 优点:学术上奠定了 Agent + 容器执行环境的范式,简单直接;完全开源。
  • 缺点:偏向研究而非生产,错误恢复、可观测性较弱;生态相对小。

何时选

  • 选 OpenHands:你需要完全开源、可自托管的 AI 软件开发代理,希望跑 SWE-Bench 类任务或长时编码任务。
  • 选 Claude Code:你已经在用 Anthropic 生态,希望 IDE/CLI 一体化、低延迟。
  • 选 SWE-Agent:你是研究者或想基于学术基线做实验。

参考资料