Day 01 / 共 20 天 · 第 1 周 核心概念

项目全景与 V1 架构

第一天先建立全局认知:OpenHands 是什么、和聊天机器人的本质区别、V1 拆包后的架构、本仓库的定位。不写一行难代码,只建直觉。这条"能行动+能观察"的闭环会贯穿全部 20 天——今天先把地图刻进脑子。

📍 第 1 周 核心概念 · 你在这里(这条链每天开头都会点亮你所在的格子)
Day1 全景 Day2 Action/Obs Day3 事件流 Day4 运行 Day5 完整旅程
L01

它到底是什么

🤔 痛点:让 AI 帮你写代码,为什么"给段代码"还不够? 你让 ChatGPT 写个功能,它给你一段代码——但你还得自己复制、自己跑、报错了再回来贴给它、它再改……你成了 AI 的"手脚",来回搬运几十趟才能真正把活干完。要是它能自己跑、自己看报错、自己改,多好?
💡 本质:把"只会说"的 AI 装上"手和眼" OpenHands 的本质,就是给大模型接上一双(能敲终端、改文件)和一双(能看到命令输出),让它自己跑"做→看结果→再做"的循环,直到任务完成。OpenHands 就像生活中你雇的一位"AI 实习生程序员":你只说需求,TA 自己动手、边干边汇报——这套"实习生"类比会贯穿今天全篇。这就是 Agent(智能体)和聊天机器人的分水岭。

OpenHands(原名 OpenDevin)是一个开源的 自主 AI 软件工程师平台,口号是 "Code Less, Make More"。你给它一个自然语言任务,它能像真人程序员一样自主地把任务完成。

用最白的话说 想象你雇了个远程程序员:你在聊天框里说"帮我把这个项目的登录 bug 修了",然后 TA 自己去看代码、在终端跑命令、改文件、跑测试、查文档,边做边跟你汇报进度,最后告诉你"修好了,是这里的空指针"。OpenHands 就是把这个"远程程序员"换成了 AI。它不只是聊天——它真的能动手操作一台(沙箱里的)电脑。
为什么它很重要:普通的 AI 助手只能"告诉你怎么做",OpenHands 能"替你做"。它在 SWE-bench(衡量 AI 解决真实 GitHub issue 能力的权威榜单)上一直是开源方案的领先者。学它,你能理解"AI Agent 如何真正地在真实环境里干活"——这是当下最前沿的方向之一。
L02

和 ChatGPT 那种聊天机器人有啥本质不同

对比普通聊天 AIOpenHands
能做什么生成文字/代码给你看真的去执行:跑命令、改文件
交互方式一问一答自主多步循环,直到任务完成
能否看到结果看不到,只能靠你反馈能看到命令输出,自我纠错
运行环境隔离沙箱(终端+文件+浏览器)
核心差异一句话 聊天 AI 是"嘴"——只会说;OpenHands 是"嘴 + 手 + 眼"——会说、会操作、还能看到操作结果再调整。这个"能行动 + 能观察反馈"的闭环,就是"Agent(智能体)"区别于"聊天机器人"的本质。
L03

一个真实任务示例(脑补一遍流程)

你说:"给这个 Python 项目加一个 /health 健康检查接口。" OpenHands 内部大致这样跑:

# 第1步 Agent 想:先看看项目结构 → 产出一个"跑命令"动作
$ ls && cat app.py                      # ← Action:执行命令
# 沙箱返回文件内容                         # ← Observation:结果回给 Agent

# 第2步 Agent 想:这是个 Flask 应用,我在 app.py 加个路由 → 产出"编辑文件"动作
edit app.py: 加上 @app.route('/health')...  # ← Action:改文件
# 沙箱返回"编辑成功"                        # ← Observation

# 第3步 Agent 想:验证一下 → 产出"跑命令"动作
$ python -m pytest                       # ← Action
# 测试通过                                # ← Observation

# 第4步 Agent 想:完成了 → 产出"finish"动作,告诉你搞定了

把上面的过程做成一张单步走查表(像调试器单步执行一样跟一遍):

步骤实习生(Agent)在想产出的 Action拿到的 Observation
1先摸清项目结构ls && cat app.py文件内容(发现是 Flask)
2在 app.py 加路由编辑 app.py"编辑成功" + 改动 diff
3验证没改坏python -m pytestexit_code=0,测试通过
4活干完了,交差finish(附总结)——(任务结束)
📝 举个例子:一步"跑命令"在系统里长什么样 Agent 决定 → Action: ExecuteBash(command="pytest")(想做的事)
沙箱执行完 → Observation: 输出 "1 failed"、exit_code=1(真实结果)
Agent 读到"failed" → 产出下一个 Action 去改 bug。输入是意图、输出是事实,中间隔着一个真实沙箱。
读法:每一步都是"Agent 产出一个动作(Action)→ 沙箱执行 → 返回结果(Observation)→ Agent 看结果决定下一步"。这个循环就是 OpenHands 的心脏,明天(Day 02)我们正式拆解 Action 和 Observation。
注意"自我纠错":如果第 3 步测试失败,Agent 会看到失败的 Observation,然后产出新的 Action 去改 bug、再测——不用你插手。这种"看到结果再调整"的能力,正是它能完成复杂任务的关键。
L04

V1 拆包架构(重要,先说清楚)

🤔 对话体 Q&A:拆包是怎么回事? 👶 小白:我打开本仓库想找"Agent 思考循环"的代码,怎么翻遍了也找不到?
👨‍🏫 老师:因为 V1 重构把"大脑"拆出去了——本仓只是"公司前台+调度室",大脑在外部包 openhands-sdk 里。
👶 小白:那我学本仓还有意义吗?
👨‍🏫 老师:非常有!"怎么管理会话、沙箱、事件流"这套编排层工程恰恰是生产系统最值钱的部分,而且概念(Action/Observation)在本仓前端类型里有完整镜像。

OpenHands 发展到 V1 版本时做了一次重要重构:把"Agent 的大脑逻辑"从主仓库拆成了几个独立的 Python 包。看 pyproject.toml 就能证实:

# pyproject.toml —— 本仓(openhands-ai)依赖这几个外部包
dependencies = [
    "openhands-agent-server==1.34.0",   # Agent 运行服务
    "openhands-sdk==1.34.0",            # Agent 核心 SDK(大脑)
    "openhands-tools==1.34.0",          # 工具集(bash/文件/浏览)
    # ...
]

openhands-sdk

Agent 大脑

感知-决策循环、LLM 抽象、Action/Observation 定义。

openhands-tools

工具集

bash 执行、文件编辑、浏览器等工具的实现。

openhands-agent-server

Agent 服务

把 Agent 跑成一个可调用的服务。

openhands-ai(本仓)

编排/服务层

管理会话、沙箱、事件流、Web 服务、企业版。

为什么要拆?对我们学习有什么影响? 拆包是为了让"Agent 核心"能被别的项目复用(比如你想只用 SDK 自己搭 Agent),也让各部分独立发版。对我们的影响:本仓库里看不到 Agent 循环的源码(它在 openhands-sdk 那个包里)。所以这份教程会:第 2 周深读本仓真实存在的编排层代码(会话/事件/沙箱);第 3 周讲 SDK 的设计与概念(结合公开设计和本仓的调用方式)。我们全程会标注"这段在本仓 / 这段在外部包",绝不含糊。
L05

本仓库目录导览

OpenHands/
├── openhands/
│   ├── app_server/     # ★ 本仓核心:会话/事件/沙箱编排层(第2周主战场)
│   │   ├── app_conversation/   # 会话生命周期
│   │   ├── event/              # 事件系统
│   │   ├── sandbox/            # 沙箱管理
│   │   └── config_api/         # 配置接口
│   ├── server/         # FastAPI Web 服务入口(app.py/listen.py)
│   ├── db/             # 数据库
│   └── analytics/      # 埋点
├── frontend/           # React 前端(第4周看事件如何渲染成 UI)
│   └── src/types/v1/core/events/   # ★ V1 事件类型定义(第1周读它理解概念)
├── enterprise/         # 企业版:多租户/鉴权/集成(第4周)
├── config.template.toml   # 配置模板(第1周 Day04)
└── pyproject.toml      # 依赖(能看到拆出去的外部包)
读法:记住两个重点目录——openhands/app_server/(后端编排层,第2周逐行读)和 frontend/src/types/v1/core/events/(前端里的事件类型定义,第1周用它来理解 Action/Observation 长什么样)。Agent 大脑不在这,在外部包。
L06

四层架构(心智模型)

把整个系统从上到下分四层理解:

L4 前端界面 frontend/你下任务、实时看每一步(第4周) L2 服务编排层 openhands/app_server/(本仓核心)建沙箱·驱动Agent·存事件·推前端(第2周逐行读) L3 Agent 大脑 openhands-sdk决定下一步、产出 Action(外部包·第3周) 隔离沙箱 RuntimeDocker 容器里真的跑命令 L1 通用货币:Action / Observation 事件贯穿所有层,Agent 的"动作"与执行"结果" ↑ 存下来并推回前端
四层心智模型:前端下任务→编排层(本仓)驱动Agent大脑→大脑产Action→沙箱执行得Observation→存下来推回前端。数据的"通用货币"是 Action/Observation。
  • L4 前端界面(frontend/):你下任务、实时看 Agent 每一步在干嘛。
  • L2 服务编排层(openhands/app_server/,本仓核心):管理"一次会话"的生命周期——建沙箱、驱动 Agent、把事件存下来并推给前端。
  • L3 Agent 大脑(openhands-sdk,外部包):决定"下一步做什么",产出 Action。
  • L1 事件对 Action/Observation:贯穿所有层的核心数据——Agent 的动作和执行结果。
数据怎么流:你在前端(L4)下任务 → 编排层(L2)创建会话和沙箱 → 驱动 Agent 大脑(L3) → 大脑产出 Action(L1) → 编排层把 Action 送进沙箱执行 → 得到 Observation(L1) → 存下来并推回前端(L4)显示,同时喂回大脑决定下一步。这条链路就是这 20 天的主线,今天先记住"分四层、核心是 Action/Observation 循环"即可。
L07

为什么反复强调"安全沙箱"

OpenHands 让 AI 真的执行命令——这既是它的威力,也是最大风险。想象 AI 理解错了任务,执行了 rm -rf /,或者把你的密钥上传到某处。所以 OpenHands 的所有执行都在隔离沙箱(通常是 Docker 容器)里进行。

沙箱 = 给 AI 的"隔离实验室" 沙箱是一个和你真实系统隔离的环境(独立容器):AI 在里面能自由敲命令、改文件,但碰不到你宿主机的真实文件和系统。就算它在里面把环境搞崩了,删掉容器重建一个就行,你的电脑毫发无伤。这就是为什么第 2 周有一整天(Day 09)专门讲沙箱管理——对"能自主行动的 AI"来说,隔离就是安全的地基。
⚠️ 常见误解:小白常误以为"OpenHands 直接在我电脑上跑命令,太危险了"。其实恰恰相反——它的一切命令默认都在隔离的 Docker 容器里执行,实习生只能在"实验室"里折腾,碰不到你家的东西。
除了沙箱隔离,OpenHands 还有 confirmation mode(人工确认模式):危险动作执行前暂停、等你点头(Day 17 细讲)。沙箱隔离 + 人工确认 = 双重安全带。
一句话复述今天所学 OpenHands = 一位关在"隔离实验室"里的 AI 实习生程序员:你派活(前端),调度室(本仓 app_server)给 TA 开工位(沙箱)、记工作日志(事件流),TA 的大脑(openhands-sdk)不断"想一步→动手(Action)→看结果(Observation)→再想",直到交差。
L08

今日小结 + 动手

🧠 今天你应该能回答

  • OpenHands 是什么?和聊天 AI 的本质区别?(能行动+能观察反馈的闭环)
  • 一个任务大致怎么被自主完成?(Action→执行→Observation→再决策 的循环)
  • V1 拆成了哪几个包?本仓库的定位是什么?(编排/服务层)
  • 本仓两个重点目录是?(app_server / frontend 的 events 类型)
  • 为什么必须用沙箱?

✋ 动手:确认架构现状

# 1. 看依赖,确认拆出去的外部包
grep -A6 'dependencies = \[' pyproject.toml | head

# 2. 看本仓核心目录
ls openhands/app_server/

# 3. 看前端里的 V1 事件类型(第1周会精读)
ls frontend/src/types/v1/core/events/
明天预告 · Day 02:正式拆解 OpenHands 的两个核心概念——Action(Agent 想做的事)Observation(执行后的结果)。我们对着 frontend/src/types/v1/core/events/ 里的真实类型定义,看它们长什么样、有哪些种类。
← 总目录 Day 02 · Action / Observation →