前置条件
- 1已安装 Docker 20+ 和 Docker Compose
- 2已获取至少一个 LLM API Key(OpenAI/Anthropic/本地模型)
- 3了解基本的终端和 Docker 命令操作
腾讯智能体开发平台 ADP
新客首月专属价,最高直降 880 元,构建/分发/治理企业级 Agent
OpenHands 1.0 搭建指南:开源自主编程 Agent 从安装到实战
OpenHands 是一个 MIT 许可的开源自主编程 Agent,前身是 OpenDevin,2026 年 9 月 8 日正式发布 1.0 稳定版本。截至目前已收获 70K+ GitHub stars,是开源社区最活跃的自主编程 Agent 项目之一。
OpenHands 的核心理念是**「自主」——你给它一个任务(比如「修复这个 GitHub Issue」「从零搭一个 Web 应用」),它会独立完成:分析需求 → 编写代码 → 运行测试 → 修复错误 → 提交结果,整个过程不需要人类逐步指导**。在 SWE-bench Verified 基准测试上,OpenHands 1.0 达到 ~68% 的解决率,已接近闭源顶级 Agent 水平。
本教程采用「双路径接入模式」,无论你是想 5 分钟快速上手,还是深度定制每个细节,都能找到适合自己的搭建方式。
OpenHands 1.0 核心特性
| 特性 | 说明 |
|---|---|
| 自主编程 | 独立分析、编码、测试、修复,无需人类逐步指导 |
| Docker 沙箱 | 每个会话运行在独立容器,Agent 操作不影响宿主机 |
| 模型无关 | 支持 OpenAI / Anthropic / Gemini / DeepSeek / Ollama 等任意 LLM |
| 插件系统 | 1.0 新增插件机制,可扩展 Agent 能力(MCP、自定义工具) |
| 安全策略 | 资源限制、白名单命令、网络隔离配置 |
| Web UI | 内置可视化界面,支持多会话管理与实时预览 |
| 开源 MIT | 完全开源,可商用、可二次开发 |
双路径对比:选哪种搭建方式?
OpenHands 1.0 提供两种搭建方式,先看对比表,再决定走哪条路:
| 维度 | 方式 A:Docker 快速启动 | 方式 B:源码手动配置 |
|---|---|---|
| 难度 | ⭐ 入门 | ⭐⭐⭐ 进阶 |
| 耗时 | 5–10 分钟 | 20–40 分钟 |
| 环境 | 仅需 Docker | 需 Python 3.12 + Poetry + Node.js |
| 定制性 | 通过环境变量配置 | 可改源码、自定义 Agent 行为 |
| 升级 | docker pull 即可 | git pull && poetry install |
| 适用人群 | 新手、生产部署、快速试用 | 开发者、贡献者、深度定制 |
| 沙箱 | 内置(运行时自动起容器) | 需手动配置 Docker socket |
| 插件开发 | 仅使用现有插件 | 可本地开发并热加载插件 |
| 推荐场景 | 90% 用户的默认选择 | 贡献代码 / 二次开发 |
提示
💡 小白建议:第一次接触 OpenHands 强烈推荐走方式 A(Docker 快速启动),跑通了再回头看方式 B 做深度定制。两种方式产出的 Agent 能力完全一致,区别只在「可控性」和「上手成本」。
前置准备
无论走哪条路径,下面这些东西都得先备齐。
1. Docker 与 Docker Compose
OpenHands 的核心安全机制依赖 Docker 沙箱,Docker 是硬性依赖,没有它 Agent 无法执行任何文件操作和命令。
1# 验证 Docker 是否安装且版本 ≥ 20.10
2docker --version
3# 期望输出:Docker version 24.0.x 或更高
4
5# 验证 Docker Compose(v2 已内置在 Docker Desktop 中)
6docker compose version
7# 期望输出:Docker Compose version v2.20+
8
9# 验证 Docker 守护进程运行正常
10docker info各平台安装指引:
| 平台 | 安装方式 | 备注 |
|---|---|---|
| macOS | Docker Desktop | M 系列芯片选 Apple Silicon 版本 |
| Linux (Ubuntu) | curl -fsSL https://get.docker.com | sh | 安装后将当前用户加入 docker 组 |
| Windows | Docker Desktop + WSL2 后端 | 必须启用 WSL2,不能用 Hyper-V 后端 |
警告
⚠️ 重要警告:Linux 用户安装完 Docker 后必须执行 sudo usermod -aG docker $USER,重新登录才能让当前用户免 sudo 使用 docker。否则 OpenHands 启动时会因权限不足报错。
1# Linux:将当前用户加入 docker 组(需重新登录生效)
2sudo usermod -aG docker $USER
3
4# 验证免 sudo
5docker ps2. LLM API Key
OpenHands 是模型无关架构,只要能提供 OpenAI 兼容 API 的 LLM 都能驱动。下表是常用供应商:
| 供应商 | 推荐模型 | 获取 Key |
|---|---|---|
| Anthropic(官方推荐) | Claude Sonnet 4.5 / Opus 4 | console.anthropic.com |
| OpenAI | GPT-5 / o4-mini | platform.openai.com |
| Gemini 2.5 Pro | ai.google.dev | |
| DeepSeek | DeepSeek V3.2 | platform.deepseek.com |
| 本地(无需 Key) | Qwen3 / Llama 4 | 通过 Ollama / vLLM 提供 |
提示
💡 小白提示:第一次跑建议先用 Anthropic Claude Sonnet 4.5——OpenHands 官方在 SWE-bench 68% 的成绩就是用这个模型跑的,兼容性最好。本地模型适合离线场景,但解决率会下降 20%+。
3. 系统资源要求
| 资源 | 最低 | 推荐 |
|---|---|---|
| CPU | 2 核 | 4 核+ |
| 内存 | 4 GB | 8 GB+ |
| 磁盘 | 10 GB(含镜像) | 20 GB+(多会话并发) |
| 网络 | 能访问 LLM API | 同左 |
方式 A:Docker 快速启动(推荐 90% 用户)
这条路径全部用 Docker,宿主机不需要装 Python、Poetry、Node,5 分钟内拿到一个完整的 OpenHands 实例。
步骤 1:拉取官方镜像并一键启动
OpenHands 官方提供两个镜像:openhands(主进程,含 Web UI)和 openhands-runtime(Agent 沙箱运行时)。1.0 版本起,runtime 镜像会在首次会话时自动拉取,你只需启动主镜像:
1# 一键启动(Docker run 方式,最简形式)
2docker run -it \
3 --pull=always \
4 -e OPENHANDS_API_KEY="sk-your-anthropic-key" \
5 -e OPENHANDS_MODEL="anthropic/claude-sonnet-4-5" \
6 -v /var/run/docker.sock:/var/run/docker.sock \
7 -v /path/to/workspace:/workspace \
8 -p 3000:3000 \
9 --add-host host.docker.internal:host-gateway \
10 --name openhands-app \
11 ghcr.io/opendevin/openhands:1.0参数逐行解读:
| 参数 | 作用 |
|---|---|
--pull=always | 启动前自动拉取最新 1.0.x 镜像 |
-e OPENHANDS_API_KEY | LLM API Key(必填) |
-e OPENHANDS_MODEL | 默认模型,格式 <provider>/<model> |
-v /var/run/docker.sock:/var/run/docker.sock | 把宿主机 Docker socket 挂进容器,让主进程能起 runtime 容器 |
-v /path/to/workspace:/workspace | 工作目录,Agent 写代码会写到这里 |
-p 3000:3000 | Web UI 端口 |
--add-host host.docker.internal:host-gateway | 让 runtime 容器能回连宿主机上的主进程(DinD 网络关键) |
警告
⚠️ 重要警告:挂载 /var/run/docker.sock 等于让容器拥有宿主机 Docker 的完全控制权。只在你信任 OpenHands 镜像来源的前提下这么做。生产环境建议用 Sysbox runtime 隔离,详见「高级配置」一节。
步骤 2:用 .env 文件管理多个环境变量(推荐做法)
直接在命令行写环境变量容易泄露 Key,生产环境强烈推荐用 .env 文件:
1# 创建工作目录
2mkdir -p ~/openhands && cd ~/openhands
3
4# 写入 .env(注意权限 600)
5cat > .env <<EOF
6# ============ LLM 配置 ============
7OPENHANDS_API_KEY=sk-your-anthropic-key
8OPENHANDS_MODEL=anthropic/claude-sonnet-4-5
9OPENHANDS_BASE_URL=https://api.anthropic.com
10OPENHANDS_MAX_TOKENS=8192
11
12# ============ Agent 行为 ============
13OPENHANDS_MAX_ITERATIONS=500
14OPENHANDS_TIMEOUT=1200
15
16# ============ 沙箱安全 ============
17SANDBOX_TIMEOUT=60
18SANDBOX_MEMORY_LIMIT_MB=2048
19SANDBAX_CPU_LIMIT=1.0
20SANDBOX_NETWORK_ISOLATED=false
21
22# ============ Web UI ============
23OPENHANDS_HOST=0.0.0.0
24OPENHANDS_PORT=3000
25EOF
26
27chmod 600 .env然后用 --env-file 启动:
1docker run -d \
2 --pull=always \
3 --env-file ~/openhands/.env \
4 -v /var/run/docker.sock:/var/run/docker.sock \
5 -v ~/openhands/workspace:/workspace \
6 -v ~/openhands/.openhands:/app/.openhands \
7 -p 3000:3000 \
8 --add-host host.docker.internal:host-gateway \
9 --name openhands-app \
10 --restart unless-stopped \
11 ghcr.io/opendevin/openhands:1.0新增几个关键挂载:
| 挂载 | 作用 |
|---|---|
-v ~/openhands/.openhands:/app/.openhands | 持久化配置、对话历史、Agent 状态 |
--restart unless-stopped | 容器异常退出自动重启 |
步骤 3:用 Docker Compose 一键编排(多容器推荐)
如果你后续要接多个 LLM 供应商、加监控、加反向代理,Compose 比 docker run 更易维护。在 ~/openhands/ 下放一个 compose.yaml:
1# ~/openhands/compose.yaml
2services:
3 openhands:
4 image: ghcr.io/opendevin/openhands:1.0
5 pull_policy: always
6 container_name: openhands-app
7 restart: unless-stopped
8 environment:
9 - OPENHANDS_API_KEY=${OPENHANDS_API_KEY}
10 - OPENHANDS_MODEL=${OPENHANDS_MODEL}
11 - OPENHANDS_BASE_URL=${OPENHANDS_BASE_URL:-https://api.anthropic.com}
12 - OPENHANDS_MAX_ITERATIONS=500
13 - SANDBOX_TIMEOUT=60
14 - SANDBOX_MEMORY_LIMIT_MB=2048
15 - SANDBOX_CPU_LIMIT=1.0
16 - SANDBOX_NETWORK_ISOLATED=false
17 volumes:
18 - /var/run/docker.sock:/var/run/docker.sock
19 - ./workspace:/workspace
20 - ./.openhands:/app/.openhands
21 ports:
22 - "3000:3000"
23 extra_hosts:
24 - "host.docker.internal:host-gateway"
25 healthcheck:
26 test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
27 interval: 30s
28 timeout: 10s
29 retries: 3启动:
1cd ~/openhands
2docker compose up -d
3
4# 查看启动日志
5docker compose logs -f openhands
6# 看到 "Uvicorn running on http://0.0.0.0:3000" 表示启动成功
7
8# 健康检查
9curl http://localhost:3000/health
10# 期望:{"status":"ok"}步骤 4:通过 Web UI 完成首次配置
浏览器打开 **http://localhost:3000**,第一次访问会让你配置 LLM:
- Settings → LLM 进入模型配置页
- Provider 选
anthropic - Model 选
claude-sonnet-4-5 - API Key 默认会从环境变量读入,也可在 UI 里覆盖
- Base URL 留空用默认,或填代理地址
- 点 Save,回到主页发条消息验证:
你好,请介绍一下你自己,并列出当前工作目录的文件
Agent 应该会:
- 创建一个 runtime 容器(首次会拉镜像,约 30 秒)
- 在沙箱内执行
ls - 把结果返回到 Web UI 右侧的「文件浏览器」面板
提示
💡 小白提示:第一次会话会比较慢,因为要拉取 openhands-runtime:1.0 镜像(约 800MB)。后续会话复用容器,秒级响应。
步骤 5:升级到新版本
Docker 方式的升级特别简单:
1# Compose 方式
2cd ~/openhands
3docker compose pull
4docker compose up -d
5
6# docker run 方式
7docker stop openhands-app && docker rm openhands-app
8docker pull ghcr.io/opendevin/openhands:1.0
9# 重新执行之前的 docker run 命令配置和工作区都在挂载卷里,升级不会丢数据。
方式 B:源码手动配置(深度定制)
适合想二次开发、写自定义 Agent、给项目贡献代码的开发者。
步骤 1:克隆仓库
1git clone https://github.com/All-Hands-AI/OpenHands.git
2cd OpenHands
3git checkout v1.0.0 # 切到 1.0 稳定 tag
4
5# 查看当前版本
6cat VERSION
7# 期望输出:1.0.0提示
💡 小白提示:用 git checkout v1.0.0 切到稳定 tag,不要直接在 main 分支上跑——main 分支可能有未测试的破坏性变更。生产环境一定要锁 tag。
步骤 2:安装系统依赖
OpenHands 源码运行需要这些工具:
| 依赖 | 版本 | 用途 |
|---|---|---|
| Python | 3.12+ | 主进程 |
| Poetry | 1.8+ | Python 依赖管理 |
| Node.js | 20+ | 编译前端 Web UI |
| pnpm | 9+ | 前端包管理 |
| Docker | 20+ | 沙箱运行时 |
macOS(用 Homebrew):
1brew install python@3.12 node@20 pnpm
2curl -sSL https://install.python-poetry.org | python3 -
3echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
4source ~/.zshrc
5
6# 验证
7python3 --version # Python 3.12.x
8poetry --version # Poetry (version 1.8.x)
9node --version # v20.x
10pnpm --version # 9.xLinux(Ubuntu 22.04+):
1# Python 3.12
2sudo add-apt-repository ppa:deadsnakes/ppa -y
3sudo apt update && sudo apt install -y python3.12 python3.12-venv python3.12-dev
4
5# Poetry
6curl -sSL https://install.python-poetry.org | python3.12 -
7
8# Node.js 20
9curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
10sudo apt install -y nodejs
11sudo npm install -g pnpm
12
13# 验证
14python3.12 --version && poetry --version && node --version && pnpm --versionWindows(WSL2 内执行):
1# 在 WSL2 Ubuntu 中
2sudo apt update && sudo apt install -y python3.12 python3-pip
3curl -sSL https://install.python-poetry.org | python3 -
4curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
5sudo apt install -y nodejs
6sudo npm install -g pnpm警告
⚠️ 重要警告:Windows 用户不要在原生 PowerShell/CMD 里跑 OpenHands 源码,Docker socket 和路径处理有大量坑。务必在 WSL2 Ubuntu 中操作。
步骤 3:用 Poetry 安装 Python 依赖
1cd OpenHands
2
3# 配置 Poetry 用 Python 3.12
4poetry env use python3.12
5
6# 安装依赖(含开发依赖,方便后续跑测试和构建插件)
7poetry install
8
9# 验证安装
10poetry run python -c "import openhands; print(openhands.__version__)"
11# 期望输出:1.0.0如果在中国大陆,可配置 Poetry 用国内 PyPI 镜像加速:
1poetry source add -p default tuna https://pypi.tuna.tsinghua.edu.cn/simple
2poetry install步骤 4:编译前端 Web UI
OpenHands 1.0 前端在 frontend/ 子目录,用 React + Vite 构建:
1cd frontend
2pnpm install
3pnpm run build:fe
4# 产物输出到 frontend/dist/
5
6cd ..提示
💡 小白提示:如果你只跑后端不需要 UI 改动,可以跳过这一步直接用预编译产物。但只要动了任何前端文件,必须重新 pnpm run build:fe 才会生效。
步骤 5:写 config.toml 配置文件
源码运行不读 .env 文件,所有配置走 config.toml。OpenHands 默认查找路径:
./config.toml(项目根,最高优先级)~/.openhands/config.toml(用户级)/etc/openhands/config.toml(系统级)
在项目根创建 config.toml:
1# ========================================
2# OpenHands 1.0 配置文件
3# ========================================
4
5# ---------- LLM 配置 ----------
6[llm]
7model = "anthropic/claude-sonnet-4-5"
8api_key = "sk-your-anthropic-key"
9base_url = "https://api.anthropic.com"
10max_tokens = 8192
11temperature = 0.0
12timeout = 600
13
14# 多供应商配置(按需启用)
15[llm.openai]
16model = "gpt-5"
17api_key = "sk-your-openai-key"
18base_url = "https://api.openai.com/v1"
19
20[llm.deepseek]
21model = "deepseek/deepseek-chat"
22api_key = "sk-your-deepseek-key"
23base_url = "https://api.deepseek.com/v1"
24
25[llm.ollama]
26model = "ollama/qwen3-32b"
27api_base = "http://localhost:11434/v1"
28api_key = "ollama-no-key-needed"
29
30# ---------- Agent 行为 ----------
31[agent]
32max_iterations = 500
33max_steps_per_iter = 50
34timeout_seconds = 1200
35retry_delay_seconds = 5
36
37# 自定义系统提示词
38system_prompt = """
39You are OpenHands, an autonomous coding agent.
40When solving tasks:
411. Always explore the repo structure before making changes.
422. Write tests for new features.
433. Run tests after every change to verify.
444. Prefer minimal, surgical edits over large rewrites.
45"""
46
47# ---------- 沙箱安全策略 ----------
48[sandbox]
49timeout_seconds = 60
50memory_limit_mb = 2048
51cpu_limit = 1.0
52network_isolated = false # true 时禁用容器外网
53use_sysbox = false # true 时用 Sysbox runtime,更安全
54
55# 命令白名单(仅允许列表内的 shell 命令执行)
56# 留空 = 全部允许
57allowed_commands = [
58 "ls", "cat", "grep", "find", "pwd", "echo", "head", "tail", "wc",
59 "git", "npm", "pnpm", "yarn", "python", "python3", "pip", "poetry",
60 "go", "cargo", "make", "cmake", "gcc", "g++", "rustc",
61 "node", "tsc", "eslint", "prettier", "jest", "pytest", "ruff",
62 "curl", "wget", "ssh-keygen"
63]
64
65# 禁止执行的命令(黑名单优先级高于白名单)
66blocked_commands = [
67 "rm -rf /", "mkfs", "dd if=", ":(){:|:&};:",
68 "shutdown", "reboot", "halt", "poweroff"
69]
70
71# ---------- Web UI ----------
72[web]
73host = "0.0.0.0"
74port = 3000
75# 启用身份认证(生产环境强烈建议开启)
76enable_auth = true
77auth_type = "token" # token | oidc | basic
78jwt_secret = "your-random-32-byte-secret-here"
79
80# ---------- 文件存储 ----------
81[storage]
82# 对话历史、Agent 状态持久化目录
83base_dir = "~/.openhands/storage"
84# 单个会话最大保留天数
85max_session_age_days = 30
86
87# ---------- 插件系统 ----------
88[plugins]
89enabled = true
90search_paths = [
91 "./plugins",
92 "~/.openhands/plugins"
93]
94# 默认启用的插件
95auto_load = [
96 "filesystem-tools",
97 "git-helper",
98 "browser-automation"
99]警告
⚠️ 重要警告:config.toml 里硬编码 API Key 是反模式,生产环境务必:
- 用
${ENV_VAR}占位符 + 启动时注入; - 或者用 Vault / AWS Secrets Manager 等密钥管理服务;
- 永远不要把带真实 Key 的 config.toml 提交到 Git。
1[llm]
2api_key = "${ANTHROPIC_API_KEY}" # 启动时由 OpenHands 替换步骤 6:手动启动 OpenHands
OpenHands 1.0 提供两个启动入口:
1# 1) 启动后端 API + WebSocket 服务
2poetry run openhands serve \
3 --config ./config.toml \
4 --port 3000 \
5 --host 0.0.0.0
6
7# 2) 另起一个终端,启动前端开发服务器(开发模式,热重载)
8cd frontend
9pnpm run dev
10# 开发服务器跑在 http://localhost:3001,会代理到后端 3000生产模式(用编译后的静态文件,不开热重载):
1# 一条命令同时起后端 + 提供前端静态文件
2poetry run openhands serve \
3 --config ./config.toml \
4 --port 3000 \
5 --host 0.0.0.0 \
6 --static-frontend ./frontend/dist启动后浏览器访问 **http://localhost:3000**(或开发模式 :3001),看到登录页或设置 LLM 的引导页说明成功了。
步骤 7:用 CLI 直接驱动 Agent(不开 UI)
源码方式有个额外好处——可以不开 Web UI,直接用 CLI 驱动 Agent 跑单次任务,适合脚本化、CI 集成场景:
1# 单次任务:让 Agent 修复一个 issue
2poetry run openhands run \
3 --task "Fix the failing test in tests/test_auth.py::test_login_invalid_password. The test expects a 401 but the endpoint returns 200." \
4 --workspace ./my-project \
5 --max-iterations 100 \
6 --model "anthropic/claude-sonnet-4-5" \
7 --no-interactive
8
9# 头对头模式(Human + Agent 交互,适合人工接管)
10poetry run openhands run \
11 --task "Refactor the user service to use dependency injection" \
12 --workspace ./my-project \
13 --interactive提示
💡 小白提示:CLI 的 --no-interactive 模式特别适合集成到 CI/CD——比如让 Agent 在每次 PR 提交时自动跑一遍 lint 修复。详细玩法见后文「实战使用」一节。
验证配置:5 项自检清单
无论你走 A 还是 B,安装完都得做这 5 项自检,确保每个核心能力都正常。
自检 1:Web UI 可访问
1# Docker 方式
2curl -fsS http://localhost:3000/health
3# 期望:{"status":"ok"}
4
5# 源码方式
6curl -fsS http://localhost:3000/api/health
7# 期望:{"status":"healthy","version":"1.0.0"}浏览器打开 http://localhost:3000,应看到登录页或主界面。404 或 502 都说明没起来,回去查日志:
1# Docker
2docker logs openhands-app --tail 100
3
4# 源码
5poetry run openhands logs --tail 100自检 2:Agent 可对话
在 Web UI 新建一个会话,发条简单消息:
你好,请回复"OpenHands 1.0 已就绪"
期望 1–3 秒内看到回复。如果超时或报错,看是不是 LLM Key 配置错了:
1# 测试 LLM 连通性(源码方式提供,Docker 方式进容器执行)
2poetry run openhands doctor
3# 会输出 LLM ping、Docker ping、磁盘空间、内存等检查结果自检 3:可操作文件
让 Agent 创建一个文件验证沙箱文件系统能用:
请在工作目录创建一个文件 hello.txt,内容为 "Hello from OpenHands 1.0"
完成后在 Web UI 右侧文件浏览器应该能看到 hello.txt。Docker 方式也可在宿主机工作区目录验证:
1cat ~/openhands/workspace/hello.txt
2# 期望:Hello from OpenHands 1.0自检 4:Docker 沙箱生效
这是最关键的一项——验证 Agent 真的在隔离容器里跑命令。
1# 在 Agent 会话里发消息:
2请在终端执行 hostname && cat /etc/os-release | head -5Agent 返回的 hostname 应该是一串随机字符串(容器 ID),且 os-release 显示的是 runtime 镜像的 Linux 发行版(默认 Ubuntu 22.04),不应该和你宿主机一致。
再用 docker ps 在宿主机上验证确实起了一个 runtime 容器:
1docker ps --filter "name=openhands-runtime"
2# 期望看到一个名为 openhands-runtime-xxxxx 的容器在运行警告
⚠️ 重要警告:如果 Agent 返回的 hostname 和你宿主机一致,说明沙箱没生效——Agent 在直接操作你的系统!立即停止使用并检查 Docker socket 挂载和 SANDBOX 配置。
自检 5:插件系统正常
OpenHands 1.0 新增了插件系统,检查是否能正常加载:
1# Docker 方式:进容器执行
2docker exec -it openhands-app openhands plugins list
3
4# 源码方式
5poetry run openhands plugins list
6
7# 期望输出:
8# Loaded plugins:
9# - filesystem-tools (v1.0.0) [loaded from /app/plugins/filesystem-tools]
10# - git-helper (v1.0.0) [loaded from /app/plugins/git-helper]
11# - browser-automation (v1.0.0) [loaded from /app/plugins/browser-automation]5 项全过,OpenHands 1.0 就搭建完成了,下面进入实战。
实战使用:让 OpenHands 真的替你干活
OpenHands 的杀手锏是「自主」——下面 4 个场景展示它的真实能力,每个都附完整 prompt 和预期结果。
场景 1:让 OpenHands 自主修复一个 GitHub Issue
这是 OpenHands 在 SWE-bench 上发力的主战场。下面用一个真实场景演示。
准备工作:本地有一个 Python 项目,issue 描述如下:
信息
Issue #142:POST /api/users 返回 201 但响应体里缺少 Location header,导致前端拿不到新创建资源的 URI。期望行为:响应带 Location: /api/users/<id>。
让 Agent 修复:
1任务:修复 issue #142
2
3仓库根目录 /workspace/my-flask-app,下面是 issue 描述:
4
5"POST /api/users 返回 201 但响应体里缺少 Location header,
6导致前端拿不到新创建资源的 URI。期望行为:响应带 Location: /api/users/<id>。"
7
8要求:
91. 先阅读 app/routes/users.py 和 tests/test_users.py,理解现状
102. 复现问题:写一个失败测试
113. 修复代码
124. 跑 pytest 验证测试通过
135. 用 git 提交(commit message 用 conventional commits 格式)OpenHands 会自主完成:
- 用
find+cat探索项目结构 - 读
app/routes/users.py,找到create_user函数 - 在
tests/test_users.py加一个测试用例:python1def test_create_user_returns_location_header(client): 2 resp = client.post('/api/users', json={'name': 'Alice', 'email': 'a@x.com'}) 3 assert resp.status_code == 201 4 assert resp.headers['Location'].endswith(f"/api/users/{resp.json['id']}") - 跑
pytest tests/test_users.py::test_create_user_returns_location_header,确认失败 - 修改
create_user加Locationheader:python1from flask import request, jsonify, url_for, Response 2 3@app.route('/api/users', methods=['POST']) 4def create_user(): 5 user = UserService.create(request.get_json()) 6 response = jsonify(user.to_dict()) 7 response.status_code = 201 8 response.headers['Location'] = url_for('get_user', user_id=user.id, _external=False) 9 return response - 重跑测试,绿了
- `git add -A && git commit -m "fix(users): add Location header to POST /api/users 201 response
Closes #142"`
预期耗时:Claude Sonnet 4.5 约 60–90 秒,5–8 个 Agent iteration。
提示
💡 小白提示:第一次让 Agent 操作仓库时一定要让它先在新分支上干活,prompt 里加一句「请先创建并切换到 fix-issue-142 分支」,避免直接污染 main。
场景 2:让 OpenHands 从零搭建一个 Web 应用
OpenHands 不只会改代码,从零搭项目也是强项。
1任务:从零搭建一个 Express + TypeScript 的待办事项 REST API
2
3要求:
41. 工作目录 /workspace/todo-api,目前为空
52. 技术栈:Express 5 + TypeScript 5 + Prisma + SQLite + Zod
63. 实现 5 个端点:GET /tasks, POST /tasks, GET /tasks/:id, PATCH /tasks/:id, DELETE /tasks/:id
74. 用 Zod 做请求体校验
85. 用 Prisma 做 ORM,SQLite 文件存储
96. 写 Vitest 单元测试覆盖所有端点
107. 在 README.md 写启动说明
118. 最后跑 npm test 验证全部通过OpenHands 会自主完成:
mkdir -p todo-api && cd todo-api && npm init -y- 装依赖:
npm i express prisma @prisma/client zod && npm i -D typescript tsx vitest @types/express npx tsc --init,配置tsconfig.jsonnpx prisma init --datasource-provider sqlite- 写
prisma/schema.prisma:prisma1model Task { 2 id Int @id @default(autoincrement()) 3 title String 4 done Boolean @default(false) 5 createdAt DateTime @default(now()) 6 updatedAt DateTime @updatedAt 7} npx prisma migrate dev --name init- 写
src/index.ts入口、src/routes/tasks.ts路由、src/validators.tsZod schemas - 写
tests/tasks.test.ts覆盖 5 个端点 - 写
README.md npm test直到全绿
预期产物:约 8–12 个文件,500–800 行代码,整个流程 3–5 分钟。
警告
⚠️ 重要警告:从零搭项目时 Agent 可能尝试 npm install 拉很多包。如果你的沙箱 network_isolated=true,需要先把常用 npm 镜像预热到本地 npm cache,否则 install 会失败。
场景 3:让 OpenHands 做一次代码审查和重构
OpenHands 不仅会写代码,做代码审查也很在行。给它一段烂代码让它重构:
1任务:审查并重构 /workspace/legacy/app.py
2
3要求:
41. 阅读 app.py 全文,找出代码坏味道
52. 列出 3-5 个最严重的问题(用 markdown 列表)
63. 按问题严重度从高到低重构,每改一处就跑一次测试
74. 重构后跑 flake8 和 mypy,确保 0 错误 0 警告
85. 写一个 REFACTORING.md 说明每处改动的 before/afterOpenHands 会自主完成:
- 读
app.py,识别坏味道:长函数、上帝对象、魔法数字、重复代码 - 在 Web UI 输出审查报告:
- 问题 1:
process_order函数 200+ 行,违反 SRP → 拆分为validate_order/calculate_total/dispatch_order - 问题 2:硬编码的税率
0.085→ 提取为TaxRate配置类 - 问题 3:
User类同时管持久化和业务逻辑 → 拆分User和UserRepository - 问题 4:缺少类型注解 → 全量加 type hints
- 问题 1:
- 按序重构,每步跑
pytest,确保不破坏行为 - 跑
flake8 app.py && mypy app.py,0 错误 - 写
REFACTORING.md,含每处 before/after diff
预期效果:代码行数可能从 500 → 700,但圈复杂度下降 60%+,可测性大幅提升。
场景 4:让 OpenHands 编写并运行测试套件
这是 CI/CD 集成的常见场景——让 Agent 补测试。
1任务:为 /workspace/my-service 补充单元测试,目标行覆盖率 80%
2
3要求:
41. 跑 coverage 报告,找出当前覆盖率低于 60% 的模块
52. 优先补 3 个最关键模块的测试:auth、payment、notification
63. 每个模块写 5+ 测试用例,覆盖正常路径 + 边界 + 异常
74. 用 pytest + pytest-mock,避免依赖外部服务
85. 跑 pytest --cov=my_service,确认总覆盖率 ≥ 80%
96. 把测试结果写到 TEST_REPORT.mdOpenHands 会自主完成:
pytest --cov=my_service --cov-report=term摸清现状- 分析三个目标模块的源码,识别公共函数和分支
- 写测试:
python
1# tests/test_auth.py 2import pytest 3from unittest.mock import MagicMock, patch 4from my_service.auth import AuthService, TokenExpiredError 5 6class TestAuthService: 7 def test_login_with_valid_credentials(self): 8 # ... 测试正常登录 9 10 def test_login_with_wrong_password(self): 11 # ... 测试密码错误 12 13 def test_token_expired_raises_error(self): 14 # ... 测试 token 过期 15 16 @patch('my_service.auth.time') 17 def test_token_issued_with_correct_expiry(self, mock_time): 18 # ... 测试 token 过期时间 - 跑测试,看覆盖率,不够再补
- 达标后写
TEST_REPORT.md:总覆盖率、各模块覆盖率、未覆盖行说明
预期产物:15–20 个测试用例,覆盖率从 ~40% → 80%+,全程 4–6 分钟。
高级配置
跑通了基础玩法,下面这些进阶配置让 OpenHands 更安全、更高效、更省钱。
模型选择决策表
不同任务选不同模型,成本和效果差异巨大:
| 任务类型 | 推荐模型 | 单次任务成本 | SWE-bench 解决率 |
|---|---|---|---|
| 复杂重构 / SWE-bench | Claude Sonnet 4.5 / Opus 4 | $0.5–2 | ~68% |
| 常规 Bug 修复 | Claude Haiku 4 / GPT-5 mini | $0.05–0.2 | ~45% |
| 文档生成 | DeepSeek V3.2 / Qwen3 | $0.01–0.05 | – |
| 代码审查 | Claude Sonnet 4.5 | $0.1–0.5 | – |
| 离线/隐私 | Ollama Qwen3-32B / Llama 4 70B | $0(电费) | ~30% |
| CI 自动化(高频) | DeepSeek V3.2 | $0.02/次 | ~40% |
提示
💡 省钱技巧:用 OPENHANDS_MODEL 设默认便宜模型,复杂任务在 prompt 里手动切到强模型。OpenHands 1.0 支持会话中切换模型。
Docker 沙箱安全策略
OpenHands 1.0 的沙箱是生产级安全设计,下面这些配置让你能放心让 Agent 跑高敏感任务。
1. 网络隔离(默认 false,敏感场景开 true)
1[sandbox]
2network_isolated = true
3# Agent 无法访问外网,只能操作沙箱内文件
4# 适合处理含敏感数据的私有代码库警告
⚠️ 重要警告:开启网络隔离后,Agent 跑不了 npm install / pip install / git clone。需要预先在 runtime 镜像里烤好依赖,或挂载本地缓存目录。
2. 资源限制(防 Agent 跑飞吃光宿主机)
1[sandbox]
2memory_limit_mb = 2048 # 单会话内存上限 2GB
3cpu_limit = 1.0 # 单会话最多用 1 核
4timeout_seconds = 60 # 单条命令最长执行 60 秒3. 命令白名单(最小权限原则)
1[sandbox]
2# 只允许 Agent 执行这些命令,其他一律拒绝
3allowed_commands = [
4 "ls", "cat", "grep", "find", "pwd",
5 "git", "python", "pytest", "ruff",
6 "npm", "node", "tsc", "jest"
7]
8blocked_commands = [
9 "rm -rf /", "mkfs", "dd",
10 "curl", "wget", # 禁止外发请求
11 "shutdown", "reboot"
12]4. 用 Sysbox runtime 替代裸 Docker socket(最强隔离)
裸挂 /var/run/docker.sock 有逃逸风险,Sysbox 是更安全的替代:
1# 安装 Sysbox
2wget https://downloads.nestybox.com/sysbox/releases/v0.6.x/sysbox-ce-v0.6.x-linux.tar.gz
3tar -xzf sysbox-ce-v0.6.x-linux.tar.gz
4cd sysbox-ce-v0.6.x && sudo ./install.sh
5
6# 注册 sysbox runtime
7docker info | grep -i runtime
8# 应能看到 sysbox-runc
9
10# 启动 OpenHands 时用 sysbox runtime
11docker run -d \
12 --runtime=sysbox \
13 --env-file ~/openhands/.env \
14 -v ~/openhands/workspace:/workspace \
15 -p 3000:3000 \
16 --name openhands-app \
17 ghcr.io/opendevin/openhands:1.0提示
💡 小白提示:Sysbox 让 OpenHands 容器内部能再起容器(runtime),但不需要挂载宿主机 docker.sock,从根本上杜绝了 Docker socket 逃逸。生产部署强烈推荐。
插件系统
1.0 新增的插件机制是最大的功能升级之一。插件用 Python 写,放在 plugins/ 目录下自动加载。
插件目录结构:
1plugins/
2 browser-automation/
3 __init__.py
4 plugin.py # 插件主入口
5 manifest.toml # 元信息
6 tools/
7 __init__.py
8 browser.py插件主入口示例(plugin.py):
1from openhands.plugins import Plugin, tool
2
3class BrowserAutomationPlugin(Plugin):
4 """浏览器自动化插件,让 Agent 能驱动 headless Chrome"""
5
6 name = "browser-automation"
7 version = "1.0.0"
8
9 @tool(description="Open a URL in headless Chrome and return the page HTML")
10 def open_url(self, url: str, wait: int = 5) -> str:
11 """
12 :param url: The URL to navigate to
13 :param wait: Seconds to wait for page to load
14 :return: Page HTML content
15 """
16 from selenium import webdriver
17 from selenium.webdriver.chrome.options import Options
18
19 options = Options()
20 options.add_argument("--headless")
21 options.add_argument("--no-sandbox")
22 driver = webdriver.Chrome(options=options)
23 driver.get(url)
24 driver.implicitly_wait(wait)
25 html = driver.page_source
26 driver.quit()
27 return html
28
29 @tool(description="Take a screenshot of a URL")
30 def screenshot(self, url: str, output_path: str) -> str:
31 """Save a screenshot of the URL to output_path"""
32 # ... 实现
33 return f"Screenshot saved to {output_path}"manifest.toml:
1[plugin]
2name = "browser-automation"
3version = "1.0.0"
4description = "Browser automation tools for OpenHands agents"
5author = "AIToolSchool"
6license = "MIT"
7
8[dependencies]
9python = ["selenium>=4.0", "webdriver-manager>=4.0"]启用插件:
1[plugins]
2enabled = true
3search_paths = ["./plugins", "~/.openhands/plugins"]
4auto_load = ["filesystem-tools", "git-helper", "browser-automation"]Agent 会话里直接调用:
请用 browser-automation 工具打开 https://example.com,截个图给我
资源限制与会话级隔离
生产环境多用户共用 OpenHands 时,必须做资源隔离:
1[resource_management]
2# 单会话上限
3max_sessions_per_user = 3
4max_concurrent_sessions = 10
5session_timeout_minutes = 60
6
7# 单会话配额
8session_token_budget = 500_000 # 单会话最多消耗 50 万 token
9session_token_budget_action = "stop" # 超额后停止 Agent启动时加 -O resource_management.enabled=true 开启限制。
多 Agent 并发
OpenHands 1.0 支持一个会话内多 Agent 协作:
1[agent]
2# 主 Agent 负责任务分解和调度
3default_agent = "codeact"
4
5[agent.subagents]
6# 子 Agent 配置
7planner = { model = "anthropic/claude-opus-4", max_iterations = 50 }
8coder = { model = "anthropic/claude-sonnet-4-5", max_iterations = 200 }
9reviewer = { model = "openai/gpt-5", max_iterations = 100 }会话中用特殊指令切换:
1@planner 请把这个需求拆成 3 个子任务
2@coder 实现第二个子任务
3@reviewer 审查刚才的改动自定义 Agent 行为
通过 system_prompt 完全掌控 Agent 的行为风格:
1[agent]
2system_prompt = """
3You are OpenHands, an autonomous coding agent working in a sandboxed Docker container.
4
5# 行为准则
6- 始终先探索代码库结构再动手
7- 写代码必须配测试
8- 每次改动后立即跑测试验证
9- 优先用最小改动解决问题,避免大规模重构
10- 不确定时主动提问,不要瞎猜
11
12# 安全边界
13- 绝不删除未在 git 中的文件
14- 不修改 .env / secrets / credentials 类文件
15- 不执行 rm -rf 或类似危险命令
16- 不向外部 API 发送项目源码
17
18# 输出规范
19- 每个改动说明 before/after
20- 用 conventional commits 格式
21- 测试失败必须修复,不能跳过
22"""故障排查
下面这张表覆盖了搭建和实战中 90% 会遇到的坑。按「现象 → 原因 → 解决方案」三段式组织。
| 现象 | 原因 | 解决方案 |
|---|---|---|
| Web UI 打不开,浏览器转圈 | 后端未启动或端口冲突 | docker logs openhands-app 看启动日志;lsof -i:3000 看端口占用,换 -p 3001:3000 |
| Web UI 能开但显示「No LLM configured」 | 环境变量没注入容器 | 检查 .env 文件是否被 --env-file 正确引用;进容器 env | grep OPENHANDS 验证 |
| Agent 回复「Invalid API key」 | Key 错误 / 过期 / 含空格 | 重新从供应商后台复制 Key,去掉首尾空格,确认账户有余额 |
| Agent 回复但超时频繁 | 模型 max_tokens 太大或网络慢 | 把 OPENHANDS_MAX_TOKENS 降到 4096 测试,再逐步加大 |
| 首次会话卡住 30 秒以上 | runtime 镜像首次拉取慢 | 手动预拉:docker pull ghcr.io/opendevin/openhands-runtime:1.0 |
docker: permission denied | 当前用户不在 docker 组 | sudo usermod -aG docker $USER 后重新登录(Linux) |
| Agent 报「Cannot connect to Docker daemon」 | 容器内访问不到宿主机 docker.sock | 启动命令加 --add-host host.docker.internal:host-gateway,确认 -v /var/run/docker.sock:/var/run/docker.sock |
| Agent 报「Sandbox timeout」 | 单条命令超 60 秒 | 调大 SANDBOX_TIMEOUT;或拆分长任务为多个短命令 |
| Agent 报「Command not allowed: npm」 | 白名单没加 npm | config.toml 的 allowed_commands 加上 npm、pnpm、node 等 |
| Agent 写的代码不在工作目录里 | workspace 挂载路径不对 | 检查 -v 挂载,确认 Agent 看到的 /workspace 对应宿主机正确目录 |
network_isolated=true 后 npm install 失败 | 容器无外网 | 预先在 runtime 镜像里烤依赖,或挂载本地 npm cache:-v ~/.npm:/root/.npm |
| Chinese LLM 报「Context length exceeded」 | OpenHands 默认带很长系统 prompt | 调小 max_iterations,或在 prompt 里要求 Agent 简化上下文 |
| Compose 启动报「Bind address already in use」 | 3000 端口被占 | lsof -i:3000 找占用进程,或改 compose.yaml 的端口映射 |
| 升级后配置不生效 | 挂载卷里的旧配置覆盖了新镜像默认值 | 进容器删掉 /app/.openhands/config_cache.json,重启 |
| 插件加载失败「ModuleNotFoundError」 | 插件依赖没装 | 进插件目录 poetry install 或 pip install -r requirements.txt,确认 search_paths 配置正确 |
| 多 Agent 并发时报「rate limit」 | LLM 供应商限流 | 降并发数 max_concurrent_sessions,或换用多个 Key 轮询 |
| CI 集成中 Agent 一直「waiting for user input」 | 用了 --interactive 模式 | CI 用 --no-interactive,或加 --auto-approve 让 Agent 自动决策 |
| Sysbox 模式下 runtime 容器起不来 | Sysbox 版本与内核不兼容 | 检查 uname -r 是否 ≥ 5.4;升级 Sysbox 到最新;或退回 docker socket 模式 |
poetry install 报 Python 版本不匹配 | Poetry 配置的 Python 版本和实际不符 | poetry env use python3.12 显式指定 |
前端 pnpm run dev 报「Cannot find module」 | node_modules 没装全 | cd frontend && rm -rf node_modules && pnpm install |
| Windows 原生跑源码各种奇怪错误 | Docker socket 路径 / 行尾符 / 权限问题 | 改用 WSL2,在 WSL2 Ubuntu 里跑源码方式 |
| Agent 把代码写到容器里宿主机看不到 | runtime 容器和主进程 workspace 没共享 | 确认 runtime 启动时也挂了 workspace 卷;或用 --runtime-workdir /workspace 显式指定 |
提示
💡 小白提示:90% 的「Agent 报错」其实是 LLM Key 或网络问题,不是 OpenHands 本身的 bug。出问题第一时间跑 openhands doctor 自检命令,它会逐项 ping LLM、Docker、磁盘、网络,告诉你具体哪一环挂了。
性能调优
跑通之后想再榨一点性能和省钱,看这一节。
1. 上下文管理
OpenHands 默认会把整个会话历史塞回 LLM,长会话很快撑爆 context window。1.0 引入了上下文压缩:
1[agent.context]
2# 启用自动压缩历史
3compress_enabled = true
4# 超过 50% 上下文窗口时触发压缩
5compress_threshold_ratio = 0.5
6# 压缩后保留最近 20 轮对话原文
7keep_recent_turns = 202. 缓存 LLM 响应
开发期反复跑同一任务时,缓存能省大量 token:
1[llm.cache]
2enabled = true
3backend = "redis" # redis | sqlite | memory
4redis_url = "redis://localhost:6379/0"
5ttl_seconds = 864003. 异步并发迭代
OpenHands 1.0 支持 Agent 内部并行调用工具(如同时跑多个测试文件):
1[agent]
2parallel_tool_calls = true
3max_parallel_tools = 44. 模型路由
按任务复杂度自动路由到不同模型,省钱利器:
1[router]
2enabled = true
3rules = [
4 { if = "complexity == 'high'", model = "anthropic/claude-opus-4" },
5 { if = "complexity == 'medium'", model = "anthropic/claude-sonnet-4-5" },
6 { if = "complexity == 'low'", model = "deepseek/deepseek-chat" }
7]监控与可观测性
生产部署不能裸跑,下面这些监控让你知道 Agent 在干什么。
1. 内置指标端点
OpenHands 1.0 暴露 Prometheus 指标:
1curl http://localhost:3000/metrics
2# openhands_sessions_total{status="active"} 3
3# openhands_llm_tokens_total{provider="anthropic",type="input"} 124532
4# openhands_llm_cost_usd_total{provider="anthropic"} 1.87
5# openhands_sandbox_memory_usage_bytes{session="abc123"} 536870912在 compose.yaml 加 Prometheus 抓取:
1services:
2 prometheus:
3 image: prom/prometheus:latest
4 ports:
5 - "9090:9090"
6 volumes:
7 - ./prometheus.yml:/etc/prometheus/prometheus.yml1# prometheus.yml
2scrape_configs:
3 - job_name: "openhands"
4 static_configs:
5 - targets: ["openhands:3000"]
6 metrics_path: /metrics2. 日志聚合
OpenHands 用结构化 JSON 日志,方便接 ELK / Loki:
1[logging]
2level = "INFO"
3format = "json"
4output = ["stdout", "file"]
5file_path = "/var/log/openhands/openhands.log"
6max_file_size_mb = 100
7max_files = 73. 审计日志
合规场景开审计日志,记录 Agent 每一次工具调用:
1[audit]
2enabled = true
3log_path = "/var/log/openhands/audit.log"
4# 记录每一次文件操作、命令执行、网络请求
5log_tool_calls = true
6log_llm_calls = true安全最佳实践
OpenHands 能跑任意代码,安全配置绝不能省。
1. 最小权限原则
1[sandbox]
2# 网络默认隔离
3network_isolated = true
4
5# 命令白名单(生产环境强约束)
6allowed_commands = ["ls", "cat", "grep", "find", "git", "python", "pytest"]
7
8# 资源上限
9memory_limit_mb = 1024
10cpu_limit = 0.5
11timeout_seconds = 30
12
13[agent]
14# 限制单会话最多执行 100 步,防止失控
15max_iterations = 100
16# 单会话最多花 $5
17cost_budget_usd = 5.0
18cost_budget_action = "stop"2. 敏感文件保护
让 Agent 不碰 .env / secrets/:
1[agent.file_guard]
2protected_paths = [
3 ".env",
4 ".env.*",
5 "secrets/**",
6 "**/*.pem",
7 "**/*.key",
8 "credentials.json",
9 "**/id_rsa"
10]
11action = "deny" # deny | ask3. 网络出口控制
即使 network_isolated=false,也可限制只能访问特定域名:
1[sandbox.network]
2allowed_domains = [
3 "api.anthropic.com",
4 "api.openai.com",
5 "pypi.org",
6 "registry.npmjs.org",
7 "github.com"
8]4. Web UI 身份认证
生产环境必须开认证:
1[web]
2enable_auth = true
3auth_type = "oidc" # 接企业 SSO
4oidc_client_id = "openhands"
5oidc_client_secret = "${OIDC_CLIENT_SECRET}"
6oidc_discovery_url = "https://sso.example.com/.well-known/openid-configuration"与其他工具集成
1. 接入 GitHub Actions(CI 自动化)
让 OpenHands 在 PR 提交时自动审查代码:
1# .github/workflows/openhands-review.yml
2name: OpenHands Code Review
3
4on:
5 pull_request:
6 types: [opened, synchronize]
7
8jobs:
9 review:
10 runs-on: ubuntu-latest
11 steps:
12 - uses: actions/checkout@v4
13 with:
14 fetch-depth: 0
15
16 - name: Run OpenHands review
17 env:
18 OPENHANDS_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
19 run: |
20 docker run --rm \
21 -e OPENHANDS_API_KEY \
22 -e OPENHANDS_MODEL="anthropic/claude-sonnet-4-5" \
23 -v ${{ github.workspace }}:/workspace \
24 -v /var/run/docker.sock:/var/run/docker.sock \
25 ghcr.io/opendevin/openhands:1.0 \
26 openhands run \
27 --task "Review the changes in this PR. Check for: bugs, security issues, performance, style. Output a markdown review comment." \
28 --workspace /workspace \
29 --no-interactive \
30 --max-iterations 50 \
31 --output-format markdown > review.md
32
33 - name: Post review as PR comment
34 uses: marocchino/sticky-pull-request-comment@v2
35 with:
36 path: review.md2. 接入 IDE(VS Code 扩展)
OpenHands 1.0 提供 VS Code 扩展,能在编辑器里直接和 Agent 交互:
- 在 VS Code 扩展市场搜索
OpenHands - 安装后命令面板执行
OpenHands: Connect to Server - 填入
http://localhost:3000 - 在侧边栏看到 Agent 面板,直接发起任务
3. 接入 MCP 服务器
OpenHands 1.0 原生支持 MCP(Model Context Protocol),可挂任意 MCP server 扩展工具:
1[mcp.servers.filesystem]
2command = "npx"
3args = ["-y", "@modelcontextprotocol/server-filesystem", "/workspace"]
4
5[mcp.servers.github]
6command = "npx"
7args = ["-y", "@modelcontextprotocol/server-github"]
8env = { GITHUB_TOKEN = "${GITHUB_TOKEN}" }重启后 Agent 会话中即可调用 MCP 工具:
请用 github MCP 工具列出我仓库里的所有 PR
4. 接入 Slack / 飞书通知
OpenHands 1.0 支持把 Agent 完成事件推送到 Slack / 飞书:
1[notifications.slack]
2enabled = true
3webhook_url = "${SLACK_WEBHOOK_URL}"
4events = ["task_completed", "task_failed", "cost_threshold_reached"]
5
6[notifications.feishu]
7enabled = true
8webhook_url = "${FEISHU_WEBHOOK_URL}"
9events = ["task_completed"]扩展与进阶
官方资源
- 🌐 官网:openhands.ai
- 📖 官方文档:docs.openhands.ai
- 💻 GitHub 仓库:github.com/All-Hands-AI/OpenHands(70K+ stars)
- 🐳 Docker 镜像:
ghcr.io/opendevin/openhands:1.0 - 💬 Discord 社区:discord.gg/All-Hands-AI
- 📊 SWE-bench 排行榜:www.swebench.com
进阶玩法
- 自定义 Agent 类型:1.0 支持用
--agent-type切换不同 Agent 实现(codeact / manager / delegate) - Runtime 自定义镜像:基于
openhands-runtime:1.0烤入项目依赖,避免每次会话装包 - 多模态输入:1.0 支持给 Agent 发图片(截图、设计稿),让 Agent 按图实现 UI
- Agent 评估:用
openhands eval --benchmark swebench跑 SWE-bench 评测自家模型 - 插件开发 SDK:用
poetry add openhands-plugin-sdk开发可分发的插件 - REST API:所有功能都暴露为 REST API,方便集成到任意系统
自定义 Runtime 镜像
如果你的项目依赖一堆系统包,每次会话临时装太慢,可以烤一个定制 runtime:
1# Dockerfile.runtime
2FROM ghcr.io/opendevin/openhands-runtime:1.0
3
4# 烤入项目常用依赖
5RUN apt-get update && apt-get install -y \
6 libpq-dev gdal-bin \
7 && rm -rf /var/lib/apt/lists/*
8
9# 预装 Python 包
10COPY requirements.txt /tmp/
11RUN pip install --no-cache-dir -r /tmp/requirements.txt
12
13# 预装 npm 全局包
14RUN npm install -g typescript tsx vitest @types/node构建并指定用这个镜像做 runtime:
1docker build -t my-openhands-runtime:1.0 -f Dockerfile.runtime .
2
3# 启动 OpenHands 时指定
4docker run -d \
5 -e OPENHANDS_RUNTIME_IMAGE=my-openhands-runtime:1.0 \
6 ...其他参数总结
OpenHands 1.0 是开源自主编程 Agent 的里程碑版本——70K+ GitHub stars、MIT 许可、SWE-bench 68% 解决率,让「自主编程 Agent」从概念走进了生产可用阶段。
本教程用「双路径接入模式」带你完整走过两种搭建方式:
- 方式 A(Docker 快速启动):5 分钟拿到可用 Agent,靠
docker run+.env起一个生产级实例,适合 90% 用户。 - 方式 B(源码手动配置):
git clone+poetry install+config.toml,可改源码、写插件、做二次开发,适合贡献者和深度定制。
加上 5 项自检、4 个实战场景(修复 Issue / 从零搭项目 / 代码审查 / 补测试)、Docker 沙箱安全策略、插件系统、监控、CI 集成、MCP 服务器,你已经具备了把 OpenHands 落地到真实工程的所有能力。
OpenHands 的最大价值不在于「替代人写代码」,而在于把重复的、机械的、有明确目标的编程任务交给 Agent 自动完成——你给目标,它给结果。把它接进你的工作流,让它替你处理那 80% 不值得你亲自做的事,把精力留给真正需要创造力的 20%。
立即启动你的 OpenHands 1.0 实例,让自主编程 Agent 真的替你干活吧!
相关教程
- OpenCode 终端 AI 编程工具使用指南 — 对比 OpenHands 的终端 Agent 形态
- Aider 终端 AI 结对编程指南 — 另一款开源 AI 编程工具
- MCP 文件系统服务器接入 — 用 MCP 扩展 Agent 的文件操作能力
常见问题
QOpenHands 和 OpenDevin 是什么关系?
OpenDevin 是项目的原始名称,2026年更名为 OpenHands。1.0 版本是更名后的第一个稳定版本,继承了 OpenDevin 的核心架构但做了大量改进,包括生产级 Docker 沙箱、插件系统和安全策略。
QOpenHands 和 Claude Code / Cursor 有什么区别?
OpenHands 是完全开源(MIT)的自主编程 Agent,强调'自主'——它能独立分析任务、编写代码、运行测试、修复错误,不需要人类逐步指导。Claude Code 和 Cursor 更偏向'辅助编程',需要人类持续交互。OpenHands 模型无关,支持任何 LLM。
QOpenHands 1.0 的 Docker 沙箱有什么用?
每个 Agent 会话都在独立的 Docker 容器中运行,Agent 的所有文件操作、命令执行都被限制在容器内,不会影响宿主机。这保证了安全性——即使 Agent 执行了危险命令也不会损坏你的系统。1.0 还新增了资源限制和安全策略配置。