现在的 AI Coding 工具,已经多到有点管不过来了。
Codex 放在一个终端里,Claude Code 跑在另一个窗口,DeepSeek Harness 又有自己的 Web UI。只开一个任务还好,一旦几个项目同时跑起来,人就得在不同窗口之间来回切换:这个改到哪了,那个为什么停了,还有哪个正在等确认。
如果想让 Agent 定时检查 GitHub 仓库、自动审查 PR,或者收到 Slack 消息后自己开始干活,事情会更麻烦。光有一个会写代码的 Agent 不够,你还得给它补后台服务、事件触发、任务记录和远程访问。
最近我在 GitHub 上发现了 OpenHands,刚好能够解决这个问题。
它把 OpenHands、Codex、Claude Code、Gemini CLI 这些 Coding Agent 收进同一个控制台。DeepSeek Harness 这类提供 stdio ACP Server 的 Agent,也能通过 Custom 模式接入。你可以在本地运行,也可以把后端放到 Docker、远程服务器或云端,再通过浏览器统一管理。

截至发稿,OpenHands 在 GitHub 上已经有约 84.5K Star、11K Fork,MIT 协议。
OpenHands 是什么?
早期关注过 OpenHands 的同学,可能还把它理解成"开源版 Devin":给它一个开发任务,它会读取代码、修改文件、执行命令,然后尝试把任务做完。
这部分能力还在,但项目现在的重点已经变了。
打开最新的仓库首页,会发现 README 的标题已经变成了 Agent Canvas。官方对它的定位是:一个可以自托管的 Coding Agent 控制中心。

你可以把 Agent Canvas 理解成 Coding Agent 的统一工作台。左侧是不同任务的会话列表,中间可以新建任务、选择模型、打开工作区,底部还能切换当前连接的后端。
OpenHands 当前这套体系涉及几类组件:
- Agent Canvas:负责会话、任务和自动化的浏览器控制台。
- Software Agent SDK:用来构建代码 Agent 的 Python 框架。
- Agent Server:负责运行 Agent,并对外提供 REST 和 WebSocket 接口。
- Automation Server:负责定时任务和外部事件触发。
- Workspace / Sandbox:决定 Agent 可以访问哪些文件、进程、凭据和网络。
另外,OpenHands 还有一个社区驱动的独立 Sandbox Server,可以按需作为沙箱 API 和控制平面使用。它不属于 agent-canvas 默认启动的本地服务。
日常使用时,我们接触最多的就是 Agent Canvas。它可以连接一个或多个 Agent Server,后端可以放在本地电脑、Docker、办公室里的 Mac mini 或云服务器上。
OpenHands 解决了什么问题?
OpenHands 现在把重点放到了 Agent 的运行和管理上。
Coding Agent 一多,每个 Agent 独立的入口、会话和运行环境就成了新的麻烦。开发者自己反而成了那个不停切窗口、查进度、重新分配工作的调度员。
你可以在同一个界面里创建多个任务,每个任务保存自己的会话历史,并绑定到所选后端中的工作区。一个 Agent 在重构认证模块,另一个可以同时补接口测试,不需要等前面的任务结束。需要彼此隔离时,可以为它们分配不同的 worktree、容器或云端沙箱。
任务也不一定非得跑在当前电脑上。Canvas 可以连接不同的后端,一个后端在本地,另一个放在远程服务器,切换时不用跟着换一套操作界面。
Agent 还可以由外部事件主动触发,不用一直坐在聊天框里等你发消息。
接入 GitHub、Slack 等服务后,它可以在 PR 创建、仓库出现新事件或频道里有人提到 OpenHands 时启动任务。也可以按计划运行,例如每天早上汇总待处理的 PR,或者晚上检查一次依赖和安全告警。
从 GitHub 事件到计划任务,OpenHands 管理的是一组能够持续运行的开发工作,几段散落的 AI 对话也被串到了一起。
OpenHands 有什么亮点?
一个控制台,可以换不同的 Coding Agent
Agent Canvas 自带 OpenHands Agent,也支持通过 ACP(Agent Client Protocol) 接入其他 Coding Agent。
官方目前直接列出的包括:
- Claude Code
- Codex
- Gemini CLI
这三项是内置预设,不是完整的兼容清单。Agent Canvas 可以连接任意基于 stdio 的 ACP Server。DeepSeek Harness 已经提供 @deepseek-ai/dsh-acp,在 Settings → Agent 中选择 Custom 并填写启动命令,就能把它接进来。
目前 DeepSeek Harness 仍处于 Developer Preview。它的 ACP 接口主要传输已经提交的回答,不会把实时推理、工具活动和计划完整展示在 Canvas 中,也暂不支持恢复或分叉已有会话。能接入,但交互完整度还不能和三个内置预设画等号。
ACP 是一套 Coding Agent 通信协议。Agent Server 会启动对应的 CLI 进程,把消息传给它,再由 Canvas 展示 ACP Server 返回的消息和事件。思考过程、工具调用和实时执行进度能否显示,取决于具体 Agent 的 ACP 实现。
模型和工具仍由各个外部 Agent 自己管理,Canvas 主要负责会话和调度。

上图里,用户让 Agent 重构认证模块。Agent 先列出相关文件,给出准备修改的内容,再停下来等待确认。整个执行过程都保留在会话里,不用翻终端日志猜它刚刚做了什么。
如果已经在运行 Agent Server 的那台机器上登录过对应 CLI,Agent Server 通常可以直接复用已有登录信息。比如 Codex 会读取这台机器上的 ChatGPT 登录状态;后端运行在干净的云端环境时,则可以改用 API Key。
同一个控制台里,今天可以用 Codex,另一个任务也可以换成 Claude Code。Agent 变了,控制台和任务管理方式不用跟着换。
Agent 可以按时间和事件自动工作
Agent Canvas 里有一个单独的 Automate 页面,用来查看和管理自动化任务。

官方提供了多种预构建流程,例如:
- GitHub PR Review Assistant:监听新的 Pull Request,读取代码差异并给出审查意见。
- GitHub Repository Monitor:监听 Issue 和 PR 评论中的 OpenHands 提及,然后创建任务并回复结果。
- Slack Channel Monitor:监听指定频道,命中条件后带着消息上下文启动 Agent。
- Slack Standup Digest:汇总频道活动,生成异步站会记录。
以 PR 审查为例,平时需要人手动打开 GitHub、查看改动、寻找风险点,再把意见写回评论区。配置成自动化后,这条链路可以由事件触发:新 PR 出现,Agent 读取 diff,分析可能受影响的模块,然后生成审查结果。
每个自动化任务会保存自己的 Prompt、触发方式、LLM Profile 和运行记录。代码仓库、插件及通知方式,则根据具体流程配置。运行成功还是失败,也会留在活动记录里。

自动化任务既可以定时执行,也可以由 Webhook 等外部事件触发。你还可以随时点一下 Run now 手动运行。
在聊天框里,重复工作意味着重复输入同一段 Prompt。Automation 会把"让 Agent 做什么""什么时候开始""去哪里拿数据""结果发到哪里"一起固定下来。
本地、远程和云端后端可以混着用
Agent Canvas 和 Agent Server 是分开的。
你可以在笔记本上启动 Canvas,让它连接本机的 Agent Server;也可以在云服务器上运行后端,让 Agent 在你合上电脑后继续工作。
同一个 Canvas 还能连接多个后端。例如,本地后端负责个人项目,团队服务器负责 PR 审查和依赖更新,涉及内部代码的任务则放在公司自己的基础设施中。
切换后端时,Canvas 会显示对应后端的会话、模型、工作区和自动化,操作界面不用跟着换,也不需要为每个运行环境单独准备一套前端。
用 MCP 和 Skills 补充外部能力
只会读写代码还不够,很多开发任务都需要仓库以外的信息。
使用 OpenHands 内置 Agent 时,可以通过当前后端配置的 MCP Server 补充 GitHub、Slack、Linear、Jira 等外部工具。启动任务后,Agent 可以根据需要查询 Issue、读取 PR、获取频道消息,或者调用团队内部提供的 API。对于通过 ACP 接入的第三方 Agent,其工具和 MCP 能力仍取决于对应 Agent 及 ACP Server 的实现。
Skills 则更接近一份可复用的任务说明。你可以把项目约定、操作步骤和工具使用方法整理成 Skill,让 Agent 遇到对应任务时加载,而不是每次重新写一长串 Prompt。
MCP 解决"Agent 可以调用什么",Skills 解决"这类任务应该怎么做",Automation 负责触发。三者组合起来,一条开发流程就能重复运行。
OpenHands 怎么使用?
目前官方推荐使用 Agent Canvas。最短的启动方式是 npm,全局安装后直接运行:
bash
npm install -g @openhands/agent-canvas
agent-canvas
环境需要 Node.js 22.12.x 或更高版本 ,同时需要安装 uv。
启动完成后,在浏览器访问:
text
http://localhost:8000
agent-canvas 默认会启动完整的本地服务,包括前端、Agent Server 和 Automation Server。进入页面后,选择使用的 Agent,配置模型或登录信息,再打开一个本地工作区,就可以创建第一个开发任务。
如果想把执行环境放进 Docker,可以使用官方镜像。macOS 和 Linux 下的命令如下:
bash
export PROJECTS_PATH="$HOME/projects"
mkdir -p "$PROJECTS_PATH" "$HOME/.openhands"
docker run -it --rm \
-p 8000:8000 \
-v "$HOME/.openhands:/home/openhands/.openhands" \
-v "${PROJECTS_PATH}:/projects" \
ghcr.io/openhands/agent-canvas:1.14.0
PROJECTS_PATH 是存放项目的目录。挂载完成后,Agent 可以访问该目录下的项目,Canvas 则通过 http://localhost:8000/canvas 打开。
基础对话跑通后,可以再进入 Customize 页面添加 MCP Server,或者进入 Automate 页面选择 GitHub PR Review、Repository Monitor、Slack Channel Monitor 等模板。
整个上手顺序可以压缩成四步:启动 Canvas、连接后端、选择 Agent、打开工作区。自动化和外部服务等需要时再加,不必第一次启动就全部配齐。
总结
OpenHands 早期最吸引人的标签,是一个能够自己读取代码、运行命令和完成开发任务的开源 Agent。
现在再看这个项目,它已经开始处理另一个越来越明显的问题:Codex、Claude Code、Gemini CLI 都有自己的入口,DeepSeek Harness 等新 Agent 也在不断出现。它们分散在不同终端、Web UI、会话和机器上,很难形成一套持续运行的工作流。
Agent Canvas 给内置 Agent 和兼容 ACP 的第三方 Agent 提供了统一入口,Agent Server 负责把任务跑在本地或远程环境,Automation Server 再把 GitHub、Slack 和定时任务接进来。
一个控制台里管理多个 Agent、多个后端和多条自动化流程,这是 OpenHands 当前最明显的变化,也正好回到了开头那个问题:Coding Agent 越来越多之后,怎么少守几个终端窗口。
项目地址:OpenHands GitHub 仓库
⭐️推荐阅读:
- 后端开发学习 + 面试指南:覆盖 Java、计算机基础、数据库、框架、系统设计等后端开发核心知识与面试内容。
- AI 应用开发学习 + 面试指南:覆盖 LLM、RAG、Agent、MCP、Prompt、评测、系统设计等 AI 应用开发知识与面试内容。
- AI 编程实战指南:覆盖 Claude Code、Cursor、Codex、Trae 等工具的使用技巧与面试内容。