Open SWE-01
大家好,
LangChain 官方开源了一个叫 Open SWE 的项目(SWE 是 Software Engineer 的缩写),定位一句话:软件工厂。
啥意思?就是你把活儿丢给它——"把这个 bug 修了"、"给这个 issue 提个 PR"——它自己开一个隔离环境,读代码、改代码、跑测试、提交 PR,全套流程走完,跟雇了个不下班的工程师一样。
它不光写代码,还会审 PR、盯 CI(测试挂了它能自己诊断,是 flaky 就帮你重跑)、从你们仓库的历史评审里学你们的代码风格。
而且完全开源(MIT 协议),可以部署在你自己的服务器上,代码不用出内网。
今天这篇文章,我就把这个项目的源码结构给大家盘一遍。不用你装它,看完你就知道这类 agent 系统是怎么搭起来的。
先看它是怎么工作的:一条流水线
官方的核心概念就一张图:
任务进来(Dashboard / GitHub / Slack / Linear / 定时)
↓
规划和调研
↓
在隔离沙箱里改代码
↓
验证 + 提 PR
↓
评审、CI、反馈 →(有问题?回到第一步继续干)
这里有个设计我觉得很值得学:thread(会话)→ invocation(单次执行)→ sandbox(沙箱) 这个概念链。
给你翻译成人话:
- thread = 一个活儿。你在 GitHub issue 里说"修这个 bug",它开一个 thread,专属配一个沙箱
- invocation = 干的一轮。你后来又补一句"顺便把日志也加上",这是第二轮 invocation,但它接着上一轮的现场干,不用重新理解代码库
- sandbox = 它的工位。一个隔离的 Linux 环境,跟 thread 同生共死
最让我点头的一个细节:沙箱如果失联了,它宁可整个任务失败,也不会偷偷换个新沙箱——因为新沙箱里没有你改了一半没提交的代码。
说白了:宁可罢工,不能丢活。 这个"安全失败"的思路,做 agent 系统的人应该都刻在脑子里。
技术底座:三层楼,它只盖了顶层
很多人一听到 agent 项目就上来造轮子,Open SWE 没有。它的架构是三层:
┌─────────────────────────────────────┐
│ Open SWE(它自己) │
│ 工具、提示词、中间件、集成、鉴权、界面 │
├─────────────────────────────────────┤
│ Deep Agents(LangChain 的 harness) │
│ 规划、文件操作、shell、子代理原语 │
├─────────────────────────────────────┤
│ LangGraph(运行时) │
│ 持久化执行 + 状态管理 │
└─────────────────────────────────────┘
官方说法是:底下两层是 LangChain 自家产品,Open SWE 只在顶层做软件工程的事,不 fork、不魔改。
好处很实际:底层的 bug 修复和能力升级,它白嫖。
它一共注册了 5 个"角色"(对应代码里的 5 个 graph 入口):
| 角色 | 干啥的 |
|---|---|
| Agent | 主力工程师:规划、实现、验证、交付 |
| Reviewer | 只读评审员:审 PR,一个字都不许改 |
| Analyzer | 评审风格研究员:从历史 review 意见里学你们团队的口味 |
| Chat | 客服:回答关于 PR 的问题,不改代码(连沙箱都不用开) |
| Scheduler | 调度员:定时任务 + CI 监控 |
注意看,能写代码的只有 Agent 一个,其余全是只读的。这个权限切分我们后面聊。
扒源码:目录长这样
我把整个仓库扫了一遍,核心就两大坨:
open-swe/
├── agent/ Python 后端(458 个文件)← 大脑在这
│ ├── graphs/ 5 个角色,每个一个 py 文件
│ ├── middleware/ 30+ 个中间件 ← 精华在这
│ ├── api/ FastAPI 接口
│ ├── github/ linear/ 外部集成
│ ├── mcp/ MCP 工具注入
│ ├── bundled_skills/ 内置技能(baby-sit、workspace 管理)
│ └── database/ 持久化
├── ui/ Web 面板(TypeScript,445 个文件)
├── desktop/ 桌面客户端(实验性,先把本地仓库接进去)
├── tests/ 362 个测试,跟 agent/ 一一对应
└── langgraph.json 部署清单:5 个角色在哪注册
前端 445 个文件、后端 458 个,测试 362 个——测试文件数占后端 80%,这个比例在开源项目里算很健康了。
全文最值得学的地方:middleware 目录
如果你只记住文章里的一个点,我希望是这一个。
打开 agent/middleware/,30 多个文件,每个名字都像一个"踩坑记录":
model_fallback.py—— 模型挂了自动降级timeout_wrapup.py—— 快超时时逼着 agent 赶紧收尾,别让它话说一半repair_orphaned_tool_calls.py—— 修复"孤儿工具调用"(LLM 说了要调工具但没收尾的情况)sandbox_circuit_breaker.py—— 沙箱熔断器pr_creation_guard.py—— PR 创建护栏stable_tool_order.py—— 工具列表排序稳定化(防止顺序抖动影响缓存)
看出来了吗?
LLM 本身的能力是"够用",但离"能干活"之间,全是这些补丁的距离。 一个 agent 系统成熟不成熟,你不用看它的 prompt 多花哨,直接看 middleware 目录,里面每一行都是一次线上事故的学费。
权限这块它做得挺克制
给 agent 开沙箱 + 网络 + shell,等于放虎归山。它加了几道锁:
- GitHub 凭据不直接塞给沙箱,而是走代理注入,而且只能访问你指定的那几个仓库——查不到凭据时,绝不回退到全量权限
- 想改 CI workflow 文件?行,先弹出来让人类批准
- 组织级 + 仓库级双重白名单
- 评审角色物理只读
自主性和边界,这俩就是这类产品的核心矛盾,它的选择是:默认保守,逐项放开。
最后
Open SWE 现在还标着"active development",API 随时会变,但它的整体架构——thread/invocation/sandbox 三件套 + 只读角色隔离 + middleware 补丁堆——我认为就是当下生产级 coding agent 的标准答案,值得每个做 AI 工程的人源码级看一遍。
本地跑起来也不难:
git clone https://github.com/langchain-ai/open-swe.git && cd open-swe
uv venv && source .venv/bin/activate
uv sync --all-extras
make build-dashboard # 构建前端
make dev # http://localhost:2024 直接开跑
(要接 GitHub/Slack webhook 的话本地得挂个 ngrok,make tunnel 一条命令的事。)