一套开源的 AI 软件开发智能体框架 —— 从一行命令的终端体验,到可编排上千个智能体的云端基础设施。
OpenHands(前身为 OpenDevin)是一个聚焦于「AI 驱动开发」的开源社区与软件框架。它的核心目标,是让一个 AI 智能体能够像人类工程师一样实际操作开发环境——执行 bash 命令、读写与编辑文件、浏览网页、调用工具,从而自主完成编程任务,而不只是停留在「聊天给建议」的层面。
与单纯的代码补全工具不同,OpenHands 提供的是一整套从研究原型到生产部署的连续光谱:你既可以在终端里像使用 Claude Code、Codex 那样直接对话编程,也可以用它的 Python SDK 在代码里定义智能体、扩展到云端并行运行成千上万个 agent。
所有核心代码都在 MIT 许可证下开放,仅 enterprise/ 目录采用商业许可。核心 openhands 与 agent-server 镜像同样完全 MIT 授权。
OpenHands 把「智能体能力」沉淀成了一个可组合的工程框架。SDK 是引擎,CLI / GUI / Cloud 都只是消费 SDK API 的不同界面——这意味着无论你从哪种形态入门,底层的智能体语义都是一致的。
OpenHands 不是单一产品,而是同一引擎的五层封装。理解这张图,就理解了整个项目的版图:
可组合的 Python 库,封装了全部智能体技术。是驱动下面一切的「引擎」。在代码里定义 agent,本地运行或扩展到云端千级并发。
最简单的上手方式。体验类似 Claude Code / Codex,可由 Claude、GPT 或任意 LLM 驱动。
在笔记本上跑智能体的本地图形界面,自带 REST API 与单页 React 应用。体验类似 Devin、Jules。
GUI 的托管商业部署。用 GitHub 账号登录即可免费试用,深度集成 GitHub/GitLab/Bitbucket 与 Slack/Jira/Linear。
在企业自有 VPC 内通过 Kubernetes 自托管 Cloud,source-available,超过一个月需购买许可,含扩展支持与研究团队访问。
想零配置最快体验 → OpenHands Cloud(限时免费 MiniMax M2.5)。想本地自动化 / 脚本化 → CLI。想完全掌控环境 → Local GUI(自带 LLM 与密钥)。想在代码里编排智能体 → SDK。
在动手之前,先建立四个基础概念的心智模型。它们贯穿 CLI、SDK 与整个架构:
| 概念 | 定义 | 类比 |
|---|---|---|
| Agent 智能体 | 能进行推理、规划,并通过工具执行行动的 AI 实体。 | 负责做决策的「大脑」 |
| Tools 工具 | 执行 bash 命令、编辑文件、浏览网页等具体能力。 | 大脑能调用的「双手」 |
| Workspace 工作区 | 智能体实际运行的执行环境(本地 / Docker / 远程)。 | 工作的「车间」 |
| Conversation 会话 | 管理你与智能体之间交互生命周期的容器。 | 整场「对话记录」 |
无论用哪种形态,一次完整的智能体运行都遵循这条主线:
CLI 是门槛最低的入口。它需要 Python 3.12+,官方推荐用 uv 包管理器安装。
CLI 需要在 WSL(Ubuntu)终端中运行,原生 Windows 不受官方支持。在 PowerShell 里用 wsl -d Ubuntu,或在开始菜单搜索 "Ubuntu" 进入终端。
# 安装 uv tool install openhands --python 3.12 # 运行 openhands # 升级 uv tool upgrade openhands --python 3.12
curl -fsSL https://install.openhands.dev/install.sh | sh openhands
macOS 首次运行若提示「无法验证开发者」,到「系统设置 → 隐私与安全性 → 安全性」点击「仍要打开」即可。
docker run -it --pull=always \
-e AGENT_SERVER_IMAGE_REPOSITORY=ghcr.io/openhands/agent-server \
-e AGENT_SERVER_IMAGE_TAG=1.19.1-python \
-e SANDBOX_USER_ID=$(id -u) \
-e SANDBOX_VOLUMES=$SANDBOX_VOLUMES \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ~/.openhands:/root/.openhands \
--add-host host.docker.internal:host-gateway \
python:3.12-slim \
bash -c "pip install uv && uv tool install openhands --python 3.12 && openhands"
其中 SANDBOX_USER_ID=$(id -u) 让沙箱用户与宿主机权限对齐,避免智能体在挂载目录里创建 root 属主的文件。
首次运行时,CLI 会引导你配置 LLM。配置会保存在 ~/.openhands/settings.json,会话历史保存在 ~/.openhands/conversations。
# 选项 A:登录 OpenHands Cloud(推荐,自动拉取设置) openhands login # 选项 B:手动配置 —— 首次运行时按提示填写 LLM 提供商与 API Key openhands
进入交互界面后,输入一个任务即可,例如:
Create a Python script that prints "Hello, World!"
智能体会理解需求、探索项目、创建文件并展示结果。
| 快捷键 | 作用 |
|---|---|
Ctrl+P | 打开命令面板(进入设置、查看 MCP 状态) |
Esc | 暂停正在运行的智能体 |
Ctrl+Q / /exit | 退出 CLI |
# 直接带任务启动 openhands -t "Fix the bug in auth.py" openhands -f task.txt # 从文件读取任务 # 恢复历史会话 openhands --resume # 列出最近会话并选择 openhands --resume --last # 恢复最近一次 openhands --resume abc123def # 按 ID 恢复
同一个 openhands 命令通过不同子命令,可以化身为五种截然不同的工具:
| 模式 | 命令 | 最适合 |
|---|---|---|
| Terminal(交互式) | openhands | 日常交互开发 |
| Headless(无界面) | openhands --headless | 脚本与自动化、CI/CD |
| Web Interface | openhands web | 浏览器内的终端式 UI |
| GUI Server | openhands serve | 完整的 Web 图形界面 |
| IDE Integration | openhands acp | Zed、VS Code、JetBrains |
IDE 集成通过 ACP(Agent Client Protocol)实现,意味着你可以在自己喜欢的编辑器里直接调用 OpenHands 智能体,而 Headless 模式则让它能无缝嵌入流水线脚本。
如果你想在代码里完全掌控智能体,SDK 才是核心。它是一个模块化、类型安全的框架,让 agent 能够操作代码、文件与系统命令。
# 1. 安装 uv 包管理器(0.8.13+) curl -LsSf https://astral.sh/uv/install.sh | sh # 2. 安装 SDK + 内置工具(务必同一条命令,保证版本对齐) pip install -U openhands-sdk openhands-tools # 可选:沙箱工作区(Docker / 远程服务器) pip install -U openhands-sdk openhands-tools openhands-workspace openhands-agent-server
openhands-sdk 与 openhands-tools 是配套发布的——它们在同一版本号下构建测试,且 tools 直接引用 sdk 内部实现。必须在同一条 pip 命令里安装/升级,否则可能出现新版 tools 配旧版 sdk,导入时报 ModuleNotFoundError。需固定版本时两者用同一号:pip install "openhands-sdk==1.22.1" "openhands-tools==1.22.1"。
SDK 通过 LiteLLM 支持数十家提供商。三种取得 Key 的途径:
anthropic/claude-sonnet-4-5-20250929openhands/ 前缀,无加价LLM.subscription_login() 以 ChatGPT Plus/Pro 账号访问 Codex 模型,不消耗 API 额度export LLM_API_KEY="your-api-key-here"
export LLM_MODEL="openhands/claude-sonnet-4-5-20250929" # 若用云端
import os from openhands.sdk import LLM, Agent, Conversation, Tool from openhands.tools.file_editor import FileEditorTool from openhands.tools.task_tracker import TaskTrackerTool from openhands.tools.terminal import TerminalTool # 1) 配置 LLM llm = LLM( model=os.getenv("LLM_MODEL", "anthropic/claude-sonnet-4-5-20250929"), api_key=os.getenv("LLM_API_KEY"), base_url=os.getenv("LLM_BASE_URL", None), ) # 2) 创建 Agent,并挂载三个工具 agent = Agent( llm=llm, tools=[ Tool(name=TerminalTool.name), Tool(name=FileEditorTool.name), Tool(name=TaskTrackerTool.name), ], ) # 3) 建立会话,工作区设为当前目录 cwd = os.getcwd() conversation = Conversation(agent=agent, workspace=cwd) # 4) 发送任务并运行 conversation.send_message("Write 3 facts about the current project into FACTS.txt.") conversation.run() print("All done!")
# 运行
uv run python examples/01_standalone_sdk/01_hello_world.py
你会看到智能体理解请求、探索项目、并创建出包含项目事实的文件。官方仓库还附带 24+ 个示例(自定义工具、激活技能、异步会话等),位于 examples/01_standalone_sdk/。
设计哲学:无状态(statelessness)、可组合(composability)、研究与部署之间边界清晰。
SDK 是 OpenHands 中「智能体的唯一真理来源」。GUI、CLI、Cloud 都只是消费 SDK API 的界面——它们从持久化的设置中「水合」出 SDK 组件,再通过 SDK 接口编排执行。这保证了所有形态下配置与默认值的一致性。
agent-sdk 被拆分为四个独立的 Python 包:
| 包 | 职责 | 何时需要 |
|---|---|---|
openhands.sdk | 核心智能体框架 + 基础工作区类 | 始终需要 |
openhands.tools | 预置工具(bash、文件编辑……) | 可选,提供常用工具 |
openhands.workspace | 扩展工作区实现(Docker、远程) | 可选,扩展 SDK 基础类 |
openhands.agent_server | 多用户 API 服务器 | 可选,被 workspace 实现使用 |
| 组件 | 作用 |
|---|---|
| Agent | 实现推理-行动循环 |
| Conversation | 管理会话状态与生命周期 |
| LLM | 提供商无关的语言模型接口,内置重试与遥测 |
| Tool System | Action / Observation / Tool / Executor 的类型化基类,含 MCP 集成 |
| Events | 类型化事件框架(action、observation、用户消息、状态更新等) |
| Workspace | 基础类:Workspace / LocalWorkspace / RemoteWorkspace |
| Skill | 可复用的用户自定义提示,支持触发式激活 |
| Condenser | 压缩会话历史以管理 token |
| Security | 执行前对行动进行风险评估与校验 |
所有组件均为无状态、不可变,基于类型安全的 Pydantic 模型。
Agent 的灵魂是 reasoning-action loop(推理-行动循环)。它采用单步执行模型:每次 step() 调用只处理一个推理周期,每一步都是原子的、可暂停可恢复的。
这个循环的三个关键特征:
所有工具都遵循严格的 Action → Observation 模式。LLM 生成 tool_call,被转换为 ActionEvent;根据是否处于确认模式,要么立即执行、要么暂存为 pending;执行成功产生带结果的 ObservationEvent,失败则产生带错误的 ObservationEvent。
| 执行模式 | 行为 | 适用场景 |
|---|---|---|
| Direct 直接 | 立即执行 | 开发、可信环境 |
| Confirmation 确认 | 暂存为 pending,等待用户批准 | 高风险行动、生产环境 |
执行前,Security Analyzer 会评估每个行动的风险等级:
Agent 会应用 AgentContext 来塑造 LLM 行为,其中包含两类技能:
| 技能类型 | 激活方式 | 用途 |
|---|---|---|
| repo | 始终包含 | 项目特定上下文、代码约定 |
| knowledge | 触发词 / 模式匹配 | 领域知识、特殊行为 |
沙箱(Sandbox)是 OpenHands 运行命令、编辑文件、启动服务的环境。在 V1 中,这一概念统一称为 sandbox(旧版 V0 称 runtime)。
| 沙箱类型 | 说明 | 权衡 |
|---|---|---|
| Docker 推荐 | 在 Docker 容器内运行 agent server | 与宿主机良好隔离 |
| Process | 作为宿主机普通进程运行 | 不安全但快,无容器隔离 |
| Remote | 在远程环境运行 | 用于托管部署与部分云端方案 |
在某些部署中,沙箱选择仍由历史遗留的 RUNTIME 环境变量控制:
RUNTIME=docker # 默认 RUNTIME=process # 旧称 RUNTIME=local RUNTIME=remote
V1 的用户层术语是 sandbox,但配置开关在迁移过程中可能仍叫 RUNTIME。看到旧文档里的 "runtime" 时,把它理解为 sandbox 即可。
SDK 最优雅的设计之一:同一份智能体代码,只需替换 workspace 类型,就能在三种环境间切换——LocalWorkspace → DockerWorkspace → RemoteAPIWorkspace。
只装 openhands-sdk + openhands-tools。LocalWorkspace 已内置无需额外安装,一切在单进程内运行。适合原型与简单用例,无需 Docker,启动飞快。
安装全部 4 个包。RemoteWorkspace 会在容器中自动拉起 agent-server,提供沙箱化执行、多用户部署与分布式(如 Kubernetes)支持。
Agent Server 是基于 FastAPI + WebSocket 的 HTTP 服务器,提供会话、bash、文件、事件、桌面、VSCode 等 REST/WS 端点,带按用户隔离的会话管理与 API Key 认证。它既可在容器内运行(DockerWorkspace),也可作为独立进程被 RemoteWorkspace 连接。
工具运行在 workspace 所配置的环境里(本地/容器/远程),它们与 agent 并肩运行,而非「穿过」workspace API——这是理解隔离边界的要点。
OpenHands 的可扩展性主要通过三条路径展开:
技能是特化的提示词,为智能体注入领域知识、专家指导与自动化任务处理能力。分层体系包括:
github.com/OpenHands/extensions也可用 File-Based Agents——以带 YAML frontmatter 的 Markdown 文件定义子智能体,无需写 Python。
工具定义了智能体「能做什么」。SDK 内置常用工具,也支持为特化需求创建自定义工具。所有工具遵循统一的 Action / Observation / Executor 模式,内建校验、错误处理与安全机制。
MCP 让智能体能动态集成来自外部服务器的工具——agent 可自动发现并使用 MCP 提供的工具。在 CLI 里可用命令面板查看 MCP 状态并管理 MCP 服务器;在 SDK 里通过配置接入。这是把 OpenHands 接入 Asana、Gmail、Salesforce 等外部生态的标准方式。
通过把工作委派给多个独立运行的子智能体来实现并行任务执行,再汇总结果返回父智能体。配合 Task Tool Set,可把复杂工作分解给同步运行的特化子智能体。这对多智能体编排尤为关键。
OpenHands 官方梳理了一批适合智能体接管的工程任务类型:
用智能体生成有意义的 Pull Request 评审意见,自动分配 reviewer。
自动化依赖更新与版本升级,处理破坏性变更。
识别并修复代码库中的安全漏洞。
调查与解决生产环境事故。
将遗留 COBOL 系统迁移现代化。
迁移 Apache Spark 应用。
此外还可通过 GitHub Action 把 OpenHands 嵌入 CI,或用 Automations 创建定时 / 事件触发(GitHub 事件或自定义 webhook)的自动化任务。
它最擅长定义清晰、可验证、范围可控的工程任务——修 bug、写测试、重构、升级依赖。对于高度模糊、需要大量产品判断或跨团队沟通的工作,仍需人类主导,把它当作放大器而非替代品。
智能体的产出质量,极大程度取决于你给出的指令质量。官方「好指令 vs 坏指令」的核心原则可以浓缩为:
| 维度 | ❌ 坏指令 | ✅ 好指令 |
|---|---|---|
| 具体性 | "修一下登录" | "修复 auth.py 中 token 过期后未刷新导致 401 的问题" |
| 可验证 | "让它更快" | "为 parse() 添加单测,并确保 pytest 全绿" |
| 范围 | "重构整个项目" | "仅重构 utils/ 目录,保持公共 API 不变" |
| 上下文 | (无背景) | "项目用 FastAPI + SQLAlchemy,遵循现有目录约定" |
.openhands 目录定制仓库行为——在仓库根放置约定、技能与上下文把这篇教程压缩成一句话:OpenHands 是一个以无状态、事件驱动的推理-行动循环为核心的开源智能体框架,SDK 是唯一真理来源,CLI / GUI / Cloud / Enterprise 是它的不同消费界面,沙箱决定代码在哪里安全执行。