AI++
工程实践··9 分钟阅读·AI++ 编辑部

OpenHands 的 CodeAct:为什么让 Agent 用可执行代码当动作空间,比 JSON 工具调用更像真工程师

OpenHands(前身 OpenDevin)能把软件工程任务委托给一个在 Docker 沙箱里真正跑命令的 Agent,其核心方法是 CodeAct——让模型把每一步动作写成可执行的 Python/bash 代码,而不是从一组预先定义的 JSON 工具 schema 里挑函数。本文拆开它为什么比 JSON 工具调用更贴近真实工程、为了落地付出了哪些工程代价,以及它该被用在哪类工作、不该被当成什么。

OpenHands 现在在 GitHub 上有 7 万到 8.5 万颗星(不同镜像站统计口径不一,2026 年下半年大致落在这个区间),是开源自主软件工程 Agent 里关注度最高的一支。它前身叫 OpenDevin,2024 年作为 Cognition 的 Devin demo 之后的社区答案起步,两年后早已不是 demo 克隆:SWE-bench Verified 在开源 scaffold 加 Claude Opus 4.6 下被第三方评测报到约 68%,架构重做成可组合的 Agent SDK,并多出一个自托管的 Agent Canvas 控制台。但真正让它和 Claude Code、Codex 这类闭源方案拉开底色的,是一个被写进论文的方法论:CodeAct。

动作空间从「菜单」变成「代码」

传统 Agent 的工具调用长这样:开发者先给模型定义一组函数 schema(名字、参数类型、描述),模型推理时只能从这张菜单里挑一个,并填好结构化参数。CodeAct(Executable Code Actions,出自 2024 年论文 arXiv 2402.01030,Wang 等人)换了一个思路:模型每一步不直接选工具,而是写出一段可执行的 Python 或 bash 代码,运行时把它跑起来,再把执行结果(stdout、报错、文件改动)作为观察喂回下一轮。动作空间因此从「有限个函数」统一成「一门通用编程语言」。对模型来说,写代码比在固定 schema 里填槽位自由得多;对系统来说,一次工具执行的边界被彻底打开。

为什么代码比 JSON 工具调用更能打真实工程

JSON 工具调用的天花板很明显:真实工程里的动作很少是孤立的「调用一个函数」。你经常要 grep 出一批文件、对每行 sed 改写、把结果 curl 给某个内部接口、再按返回值决定下一步;或者写个循环批量修 200 个测试、用条件判断跳过已知 broken 用例。这些组合一旦超出预先定义的 schema,模型就只能退化成多次往返的「选函数—填参数」,既慢又容易漏。CodeAct 下,一行 bash 就能把 grep→sed→curl 串成管道,一个 for 循环就能批量处理,一条 import 就能调任意 Python 库。表达力上,它接近人写脚本,而不是人填表单。这也是 OpenHands 在真实调试类任务上 SWE-bench 数字能站住的底气之一——工程动作天然是程序化的,用代码当动作空间比用 schema 更贴本体。

沙箱与自修复:CodeAct 能落地的前提

把动作空间放开成代码,副作用风险也同步放大:模型写出的命令可能删文件、改配置、把密钥打进日志。OpenHands 的解法是每次任务起一个独立的 Docker 容器(per-session sandbox),Agent 在容器里跑,碰不到宿主机。2026 年的架构里还有三块关键拼图:其一是 plan-then-execute,Agent 先写计划再动手,降低跑偏概率;其二是 self-heal loop,测试失败时读错误、改代码、重跑,直到通过或主动放弃,让它像「自主」而非「代码生成器」;其三是 Agent Canvas,一个自托管的浏览器控制台,既能看 Agent 实时改文件、跑命令,也能按项目统计 token 成本,还能挂 GitHub Action——当 issue 被提时自动拆任务、开 PR。Canvas 本身还是 agent-agnostic 的:通过 ACP 协议它能同时驱动 OpenHands Agent、Claude Code、Codex 或 Gemini,等于把「控制面」也开源了出来。

对照:Claude Code / Codex 与 OpenHands 的分野

把三者放一起看边界更清楚。Claude Code 闭源、绑定 Anthropic API,IDE 集成深、推理强,但模型和账单被锁死;Codex / Devin 走托管式自主软件工程,能力强但代码与运行环境都在别人云上;OpenHands 是 MIT 许可、可自托管、模型无关——Claude、GPT、Gemini、本地 Ollama 都能接,把「让哪个模型干」和「在哪干」都交回给团队。SWE-bench Verified 那约 68% 的数字,前提是开源 scaffold 加 Claude Opus 4.6,属于第三方评测口径,不是官方承诺值,会随模型与 scaffold 版本漂移,引用时别当成固定 benchmark。它真正稀缺的不是某个分数,而是「开源 + 自托管 + 模型无关」这三件同时成立。

代价与边界:它不是 set and forget

放开了动作空间,代价也实打实。第一是 token 燃烧:难任务上 autonomous loop 会反复试错,账单可能飙升,必须给云端模型设严格预算上限。第二是规划循环:社区反馈模型有时会卡在同一种错误修复上反复横跳(agent loops),需要人介入打断。第三是本地搭建门槛:Docker + 模型 key 对初级开发者比装个 IDE 插件重得多。所以它最合适的落点是 issue 解决、依赖升级、补单测、可合并前人工 review 的 refactor——它是技术债清理的倍增器;它不适合创造性架构设计,也不该被当成不需要人把关的「全自动工程师」。

作者判断:CodeAct 的真正意义是「可执行动作」成了通用接口

把动作空间统一成代码,等于给所有 LLM 配了一只共同的「手」:模型无关、工具可组合、行为可审计(代码就是记录)。OpenHands 把这层开源且能自托管,意味着企业不把源码交给第三方云,也能用上自主软件工程 Agent。值得长期关注,但别神化——它放大的是「能被明确描述的重复性工程」,不是判断本身。把它当 junior engineer 用、合并前自己 review,是当前最稳的姿势;当黑盒全自动用,迟早在账单和循环里栽跟头。

OpenHandsCodeAct自主软件工程AgentSWE-benchDocker沙箱