🌱入门OpenHands接入OpenHands

OpenHands 1.0 搭建指南:开源自主编程 Agent 从安装到实战

手把手教你搭建 OpenHands 1.0 开源自主编程 Agent,通过双路径(Docker 快速启动+源码手动配置)实现 AI 自主编程,含 SWE-bench 68% 的实战能力展示

教程团队
2026-09-10
1 个步骤

前置条件

  • 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 无法执行任何文件操作和命令。

bash
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

各平台安装指引:

平台安装方式备注
macOSDocker DesktopM 系列芯片选 Apple Silicon 版本
Linux (Ubuntu)curl -fsSL https://get.docker.com | sh安装后将当前用户加入 docker 组
WindowsDocker Desktop + WSL2 后端必须启用 WSL2,不能用 Hyper-V 后端

警告

⚠️ 重要警告:Linux 用户安装完 Docker 后必须执行 sudo usermod -aG docker $USER,重新登录才能让当前用户免 sudo 使用 docker。否则 OpenHands 启动时会因权限不足报错。

bash
1# Linux:将当前用户加入 docker 组(需重新登录生效)
2sudo usermod -aG docker $USER
3
4# 验证免 sudo
5docker ps

2. LLM API Key

OpenHands 是模型无关架构,只要能提供 OpenAI 兼容 API 的 LLM 都能驱动。下表是常用供应商:

供应商推荐模型获取 Key
Anthropic(官方推荐)Claude Sonnet 4.5 / Opus 4console.anthropic.com
OpenAIGPT-5 / o4-miniplatform.openai.com
GoogleGemini 2.5 Proai.google.dev
DeepSeekDeepSeek V3.2platform.deepseek.com
本地(无需 Key)Qwen3 / Llama 4通过 Ollama / vLLM 提供

提示

💡 小白提示:第一次跑建议先用 Anthropic Claude Sonnet 4.5——OpenHands 官方在 SWE-bench 68% 的成绩就是用这个模型跑的,兼容性最好。本地模型适合离线场景,但解决率会下降 20%+。

3. 系统资源要求

资源最低推荐
CPU2 核4 核+
内存4 GB8 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 镜像会在首次会话时自动拉取,你只需启动主镜像:

bash
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_KEYLLM 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:3000Web UI 端口
--add-host host.docker.internal:host-gateway让 runtime 容器能回连宿主机上的主进程(DinD 网络关键)

警告

⚠️ 重要警告:挂载 /var/run/docker.sock 等于让容器拥有宿主机 Docker 的完全控制权。只在你信任 OpenHands 镜像来源的前提下这么做。生产环境建议用 Sysbox runtime 隔离,详见「高级配置」一节。

步骤 2:用 .env 文件管理多个环境变量(推荐做法)

直接在命令行写环境变量容易泄露 Key,生产环境强烈推荐用 .env 文件:

bash
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 启动:

bash
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:

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

启动:

bash
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:

  1. Settings → LLM 进入模型配置页
  2. Provider 选 anthropic
  3. Model 选 claude-sonnet-4-5
  4. API Key 默认会从环境变量读入,也可在 UI 里覆盖
  5. Base URL 留空用默认,或填代理地址
  6. 点 Save,回到主页发条消息验证:
你好,请介绍一下你自己,并列出当前工作目录的文件

Agent 应该会:

  • 创建一个 runtime 容器(首次会拉镜像,约 30 秒)
  • 在沙箱内执行 ls
  • 把结果返回到 Web UI 右侧的「文件浏览器」面板

提示

💡 小白提示:第一次会话会比较慢,因为要拉取 openhands-runtime:1.0 镜像(约 800MB)。后续会话复用容器,秒级响应。

步骤 5:升级到新版本

Docker 方式的升级特别简单:

bash
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:克隆仓库

bash
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 源码运行需要这些工具:

依赖版本用途
Python3.12+主进程
Poetry1.8+Python 依赖管理
Node.js20+编译前端 Web UI
pnpm9+前端包管理
Docker20+沙箱运行时

macOS(用 Homebrew):

bash
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.x

Linux(Ubuntu 22.04+):

bash
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 --version

Windows(WSL2 内执行):

powershell
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 依赖

bash
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 镜像加速:

bash
1poetry source add -p default tuna https://pypi.tuna.tsinghua.edu.cn/simple
2poetry install

步骤 4:编译前端 Web UI

OpenHands 1.0 前端在 frontend/ 子目录,用 React + Vite 构建:

bash
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 默认查找路径:

  1. ./config.toml(项目根,最高优先级)
  2. ~/.openhands/config.toml(用户级)
  3. /etc/openhands/config.toml(系统级)

在项目根创建 config.toml:

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。
toml
1[llm]
2api_key = "${ANTHROPIC_API_KEY}"   # 启动时由 OpenHands 替换

步骤 6:手动启动 OpenHands

OpenHands 1.0 提供两个启动入口:

bash
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

生产模式(用编译后的静态文件,不开热重载):

bash
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 集成场景:

bash
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 可访问

bash
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 都说明没起来,回去查日志:

bash
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 配置错了:

bash
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 方式也可在宿主机工作区目录验证:

bash
1cat ~/openhands/workspace/hello.txt
2# 期望:Hello from OpenHands 1.0

自检 4:Docker 沙箱生效

这是最关键的一项——验证 Agent 真的在隔离容器里跑命令。

bash
1# 在 Agent 会话里发消息:
2请在终端执行 hostname && cat /etc/os-release | head -5

Agent 返回的 hostname 应该是一串随机字符串(容器 ID),且 os-release 显示的是 runtime 镜像的 Linux 发行版(默认 Ubuntu 22.04),不应该和你宿主机一致。

再用 docker ps 在宿主机上验证确实起了一个 runtime 容器:

bash
1docker ps --filter "name=openhands-runtime"
2# 期望看到一个名为 openhands-runtime-xxxxx 的容器在运行

警告

⚠️ 重要警告:如果 Agent 返回的 hostname 和你宿主机一致,说明沙箱没生效——Agent 在直接操作你的系统!立即停止使用并检查 Docker socket 挂载和 SANDBOX 配置。

自检 5:插件系统正常

OpenHands 1.0 新增了插件系统,检查是否能正常加载:

bash
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 修复:

text
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 会自主完成:

  1. 用 find + cat 探索项目结构
  2. 读 app/routes/users.py,找到 create_user 函数
  3. 在 tests/test_users.py 加一个测试用例:
    python
    1def 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']}")
  4. 跑 pytest tests/test_users.py::test_create_user_returns_location_header,确认失败
  5. 修改 create_user 加 Location header:
    python
    1from 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
  6. 重跑测试,绿了
  7. `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 不只会改代码,从零搭项目也是强项。

text
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 会自主完成:

  1. mkdir -p todo-api && cd todo-api && npm init -y
  2. 装依赖:npm i express prisma @prisma/client zod && npm i -D typescript tsx vitest @types/express
  3. npx tsc --init,配置 tsconfig.json
  4. npx prisma init --datasource-provider sqlite
  5. 写 prisma/schema.prisma:
    prisma
    1model 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}
  6. npx prisma migrate dev --name init
  7. 写 src/index.ts 入口、src/routes/tasks.ts 路由、src/validators.ts Zod schemas
  8. 写 tests/tasks.test.ts 覆盖 5 个端点
  9. 写 README.md
  10. npm test 直到全绿

预期产物:约 8–12 个文件,500–800 行代码,整个流程 3–5 分钟。

警告

⚠️ 重要警告:从零搭项目时 Agent 可能尝试 npm install 拉很多包。如果你的沙箱 network_isolated=true,需要先把常用 npm 镜像预热到本地 npm cache,否则 install 会失败。

场景 3:让 OpenHands 做一次代码审查和重构

OpenHands 不仅会写代码,做代码审查也很在行。给它一段烂代码让它重构:

text
1任务:审查并重构 /workspace/legacy/app.py
2
3要求:
41. 阅读 app.py 全文,找出代码坏味道
52. 列出 3-5 个最严重的问题(用 markdown 列表)
63. 按问题严重度从高到低重构,每改一处就跑一次测试
74. 重构后跑 flake8 和 mypy,确保 0 错误 0 警告
85. 写一个 REFACTORING.md 说明每处改动的 before/after

OpenHands 会自主完成:

  1. 读 app.py,识别坏味道:长函数、上帝对象、魔法数字、重复代码
  2. 在 Web UI 输出审查报告:
    • 问题 1:process_order 函数 200+ 行,违反 SRP → 拆分为 validate_order / calculate_total / dispatch_order
    • 问题 2:硬编码的税率 0.085 → 提取为 TaxRate 配置类
    • 问题 3:User 类同时管持久化和业务逻辑 → 拆分 User 和 UserRepository
    • 问题 4:缺少类型注解 → 全量加 type hints
  3. 按序重构,每步跑 pytest,确保不破坏行为
  4. 跑 flake8 app.py && mypy app.py,0 错误
  5. 写 REFACTORING.md,含每处 before/after diff

预期效果:代码行数可能从 500 → 700,但圈复杂度下降 60%+,可测性大幅提升。

场景 4:让 OpenHands 编写并运行测试套件

这是 CI/CD 集成的常见场景——让 Agent 补测试。

text
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.md

OpenHands 会自主完成:

  1. pytest --cov=my_service --cov-report=term 摸清现状
  2. 分析三个目标模块的源码,识别公共函数和分支
  3. 写测试:
    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 过期时间
  4. 跑测试,看覆盖率,不够再补
  5. 达标后写 TEST_REPORT.md:总覆盖率、各模块覆盖率、未覆盖行说明

预期产物:15–20 个测试用例,覆盖率从 ~40% → 80%+,全程 4–6 分钟。


高级配置

跑通了基础玩法,下面这些进阶配置让 OpenHands 更安全、更高效、更省钱。

模型选择决策表

不同任务选不同模型,成本和效果差异巨大:

任务类型推荐模型单次任务成本SWE-bench 解决率
复杂重构 / SWE-benchClaude 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)

toml
1[sandbox]
2network_isolated = true
3# Agent 无法访问外网,只能操作沙箱内文件
4# 适合处理含敏感数据的私有代码库

警告

⚠️ 重要警告:开启网络隔离后,Agent 跑不了 npm install / pip install / git clone。需要预先在 runtime 镜像里烤好依赖,或挂载本地缓存目录。

2. 资源限制(防 Agent 跑飞吃光宿主机)

toml
1[sandbox]
2memory_limit_mb = 2048   # 单会话内存上限 2GB
3cpu_limit = 1.0          # 单会话最多用 1 核
4timeout_seconds = 60      # 单条命令最长执行 60 秒

3. 命令白名单(最小权限原则)

toml
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 是更安全的替代:

bash
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/ 目录下自动加载。

插件目录结构:

text
1plugins/
2  browser-automation/
3    __init__.py
4    plugin.py          # 插件主入口
5    manifest.toml      # 元信息
6    tools/
7      __init__.py
8      browser.py

插件主入口示例(plugin.py):

python
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:

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"]

启用插件:

toml
1[plugins]
2enabled = true
3search_paths = ["./plugins", "~/.openhands/plugins"]
4auto_load = ["filesystem-tools", "git-helper", "browser-automation"]

Agent 会话里直接调用:

请用 browser-automation 工具打开 https://example.com,截个图给我

资源限制与会话级隔离

生产环境多用户共用 OpenHands 时,必须做资源隔离:

toml
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 协作:

toml
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 }

会话中用特殊指令切换:

text
1@planner 请把这个需求拆成 3 个子任务
2@coder 实现第二个子任务
3@reviewer 审查刚才的改动

自定义 Agent 行为

通过 system_prompt 完全掌控 Agent 的行为风格:

toml
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」白名单没加 npmconfig.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 引入了上下文压缩:

toml
1[agent.context]
2# 启用自动压缩历史
3compress_enabled = true
4# 超过 50% 上下文窗口时触发压缩
5compress_threshold_ratio = 0.5
6# 压缩后保留最近 20 轮对话原文
7keep_recent_turns = 20

2. 缓存 LLM 响应

开发期反复跑同一任务时,缓存能省大量 token:

toml
1[llm.cache]
2enabled = true
3backend = "redis"   # redis | sqlite | memory
4redis_url = "redis://localhost:6379/0"
5ttl_seconds = 86400

3. 异步并发迭代

OpenHands 1.0 支持 Agent 内部并行调用工具(如同时跑多个测试文件):

toml
1[agent]
2parallel_tool_calls = true
3max_parallel_tools = 4

4. 模型路由

按任务复杂度自动路由到不同模型,省钱利器:

toml
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 指标:

bash
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 抓取:

yaml
1services:
2  prometheus:
3    image: prom/prometheus:latest
4    ports:
5      - "9090:9090"
6    volumes:
7      - ./prometheus.yml:/etc/prometheus/prometheus.yml
yaml
1# prometheus.yml
2scrape_configs:
3  - job_name: "openhands"
4    static_configs:
5      - targets: ["openhands:3000"]
6    metrics_path: /metrics

2. 日志聚合

OpenHands 用结构化 JSON 日志,方便接 ELK / Loki:

toml
1[logging]
2level = "INFO"
3format = "json"
4output = ["stdout", "file"]
5file_path = "/var/log/openhands/openhands.log"
6max_file_size_mb = 100
7max_files = 7

3. 审计日志

合规场景开审计日志,记录 Agent 每一次工具调用:

toml
1[audit]
2enabled = true
3log_path = "/var/log/openhands/audit.log"
4# 记录每一次文件操作、命令执行、网络请求
5log_tool_calls = true
6log_llm_calls = true

安全最佳实践

OpenHands 能跑任意代码,安全配置绝不能省。

1. 最小权限原则

toml
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/:

toml
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 | ask

3. 网络出口控制

即使 network_isolated=false,也可限制只能访问特定域名:

toml
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 身份认证

生产环境必须开认证:

toml
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 提交时自动审查代码:

yaml
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.md

2. 接入 IDE(VS Code 扩展)

OpenHands 1.0 提供 VS Code 扩展,能在编辑器里直接和 Agent 交互:

  1. 在 VS Code 扩展市场搜索 OpenHands
  2. 安装后命令面板执行 OpenHands: Connect to Server
  3. 填入 http://localhost:3000
  4. 在侧边栏看到 Agent 面板,直接发起任务

3. 接入 MCP 服务器

OpenHands 1.0 原生支持 MCP(Model Context Protocol),可挂任意 MCP server 扩展工具:

toml
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 / 飞书:

toml
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"]

扩展与进阶

官方资源

进阶玩法

  • 自定义 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:

dockerfile
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:

bash
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 真的替你干活吧!


相关教程

常见问题

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 还新增了资源限制和安全策略配置。

阿里云推广

读完想动手?新用户首单 8 折上云

服务器 + 大模型 API + 对象存储,新用户首购享 20% 补贴

首单 8 折云服务器大模型 API对象存储

新用户首购享 20% 补贴(8 折)· 本次推广支持本站持续运营

腾讯云推广

腾讯智能体开发平台 ADP

新客首月专属价,最高直降 880 元,构建/分发/治理企业级 Agent

智能体Agent首月直降 880一站式

腾讯云新用户专享 · 本次推广支持本站持续运营

订阅每日 AI 日报

每天早上 8:00(GMT+8)把当天 AI 行业要闻投递到你的邮箱,随时一键退订。

每天早上 8:00(GMT+8)投递当天日报;若当天日报未生成则不发送,也不会补发往期。

更多订阅方式(RSS / 微信推送)仅发送日报,不做任何其他用途

相关推荐

查看更多 →
教程编辑器接入

通义千问 Qwen3 接入 VS Code 指南:双插件分工与选型

Qwen3 是阿里云百炼上当前最值得接进编辑器的国产模型系列:中文需求转代码、中文注释生成、既有风格代码改写三项能力都在第一梯队,价格只有同级海外模型的零头。本篇解决三个 VS Code 场景下的真实问题:一是 VS Code 官方 Copilot 的补全通道绑定 GitHub 账号,换不了模型,所以接入 Qwen3 必须靠 Continue(对话 + 行内编辑)和 Cline(Agent)两个插件分工,本篇给出两边的准确填法;二是百炼 OpenAI 兼容端点的 Base URL 必须带 /v1 这一层,90% 的配不通都栽在这里;三是模型档位怎么选——qwen3-max、qwen-plus、qwen3-coder-plus 各管什么任务,选错档位要么贵一倍要么答非所问。全文给出双插件配置步骤、四档模型选型矩阵、成本估算对照表、18 行故障排查表,以及三条避坑结论。

2026-10-21
#通义千问#Qwen3
教程AI 助手接入

DeepSeek V4.1 Flash 接入 WorkBuddy 完整指南与降本实测

DeepSeek V4.1 Flash 是 552B 总参数的非对称 MoE 模型:输入激活 8B、输出激活 16B,单Token KV 缓存从 3514 字节压到 890 字节(SSD 占用降 88%),且已被官方选为 WorkBuddy / CodeBuddy 的推理底座。本文给出把它接进腾讯桌面端 AI 助手 WorkBuddy 的完整两条路径:零代码的「模型配置」面板交互接入(5 分钟,含自定义供应商完整 6 项填写说明)与「配置文件手动接入」(JSON + 环境变量 + 多档位模型定义)。含 V4.1 Flash 在长文档摘要 / 批量信息抽取 / 日常问答三个场景的实测数据、峰谷定价下的成本对比(闲时比高峰省 50%)、与 Qwen3-Max / Kimi K3 / Claude Opus 5.5 的横向选型表、thinking 模式 reasoning_content 字段的兼容处理、WorkBuddy Agent 模式下的 KV 缓存命中率优化七条,以及 18 行故障排查表(覆盖 401 / 404 / 429 / reasoning_content 解析失败 / 模型名不存在等真实报错)。

2026-10-13
#DeepSeek#V4.1 Flash
教程编辑器接入

通义千问 Qwen3-Max 接入 Cursor 完整指南

Qwen3-Max 是阿里云百炼平台上通义千问系列的旗舰文本模型,中文代码注释理解、中文需求转代码、长上下文仓库问答三项在国产模型里属于第一梯队,价格只有同级海外模型的零头。本篇解决一个绝大多数教程都没讲清楚的问题:Cursor 里的「模型」根本不是一个开关,而是三套彼此独立的通道——Chat/Agent 走 Custom API、Cmd+K 走同一个 Custom API 但行为不同、Tab 补全(Copilot++)完全不走 Custom API。很多人填完 Base URL 发现「补全还是英文、还是 Cursor 自己的模型」,就是因为没搞清这三者的边界。全文给出百炼 OpenAI 兼容端点的准确填法、四个模型档位的选型矩阵、Cursor Rules 针对国产模型的写法、Context 与成本实测数据、四场景 token 对照表,以及 17 行故障排查表。

2026-10-12
#通义千问#Qwen3-Max
教程IDE工具接入

DeepSeek V4.1 Flash 接入 Cursor 指南:BYOK 与 Rules 配置

Cursor 的 Pro 订阅每月只给固定配额的高速请求,超出后要么排队要么降速,而绝大多数日常编码请求并不需要最强的那档模型。本教程给出把 DeepSeek V4.1 Flash 接进 Cursor 的完整两条路径:成本最低的「BYOK 自定义 OpenAI 兼容模型」(5 分钟完成,覆盖 Tab 补全、Cmd-K 内联编辑、Agent 三种能力)与最稳的「自建 OpenAI 兼容代理 + Docker 一键部署 + 源码手动配置」(解决鉴权头不一致、Function Calling 降级、429 限流重试三个硬伤)。含 V4.1 Flash 在 Cursor Agent 多文件重构场景下的实测数据(62 个文件重命名 8 分 41 秒、单文件成本约 ¥0.011)、与 Claude Opus 5.5 / GPT-6 的横向对比、Cursor Rules 八条约束模板、键位映射表,以及 21 行故障排查表。

2026-10-10
#DeepSeek#V4.1 Flash

好物推荐 · 广告合作