Prhub

#2233 examples: rename swe-agent to swe-agent-harbor-docker

原始 PR 作者 Shi-Dong 合并时间 2026-08-07 06:00 文件变更 13 提交数 10 评论 0 代码增减 +21 / -21

执行摘要

重命名 swe-agent 示例为 swe-agent-harbor-docker,明确沙箱后端

examples 下同时存在 swe-agent 与 swe-agent-harbor-daytona 两个 Harbor 配方,唯一区别是任务沙箱运行在本地 Docker 还是 Daytona 云沙箱,但目录名只体现了一个后端。PR body 原话:Someone scanning the directory listing cannot tell that the first is the Docker-backed sibling of the second rather than an unrelated pipeline,导致 Daytona README 需要专门在开头解释两者关系。重命名让“沙箱后端”成为两个目录的共同命名轴。对于 URL slug 疑虑,作者核查 docs/docs.json 无 swe-agent 页面,Mintlify 导航不受目录移动影响,仅需更新 github 链接。

值得快速阅读,作为“目录重命名如何安全落地”的样板:git 重命名保留历史、受限替换代替全局 find-replace、静态路径审计作为无 CI 覆盖时的验证手段。不建议作为核心逻辑精读,因为不含任何行为级变更。

讨论亮点

本 PR 内 0 条 review 评论,nblintao 直接 APPROVED(空 body)。实质讨论发生在被堆叠的 #1919 / #2228:nblintao 在 #1919 中提问是否应把 swe-agent 重命名为 swe-agent-harbor-docker 或保留 url slug;#2228 的 review 推动去掉 ../swe-agent 相对引用、统一从仓库根路径引用 sibling 文件;由于 #2228 在 examples/swe-agent/ 内修改了两个文件,本 PR 特意先合并 #2228 再重命名目录以避免冲突。PR 内没有未解决的 open concerns。

实现拆解

  1. 目录迁移与重命名:将 examples/swe-agent 下 6 个文件整体 mv 至 examples/swe-agent-harbor-docker。其中 download_and_process_data.py、generate.py、run-glm47-flash-agentic-async.py、run.py、swe_agent_function.py 为字节级零改动,git 识别 100% 相似;README.md 改动 4 行(标题加入 Docker sandboxes,命令路径同步)。这样目录对与 swe-agent-harbor-daytona 对称,README 不再需要在开头解释兄弟关系。
  2. 受限路径替换(guarded sweep):在 examples/README.md、examples/experimental/swe-agent-harbor-daytona/README.md、launch_agent_server.sh、docs/user-guide/rollout-endpoints.md、docs/user-guide/harbor.md、docs/user-guide/agentic-chat-template.md、examples/experimental/openenv/openenv_generate.py 等处更新 examples/swe-agent -> examples/swe-agent-harbor-docker 的路径引用。刻意不做全局 find-replace,因为 mini-swe-agent / mini_swe_agent_2 harness 与目录名共享 sub-string,批量替换会误伤使用它们的 9 个文件。
  3. 文档路由核验:检查 docs/docs.json 无 swe-agent 页面,确认 Mintlify 路由不受目录移动影响;受影响的外部公开 URL 仅为 docs/user-guide 内的 github tree/blob 链接,已逐一更新。
  4. 静态审计(替代 CI 测试):examples 位于 pytest 的 norecursedirs 中,CI 无法 import 示例代码,因此采用四项静态核验:所有 tracked files 中的 examples/ token 均可解析,14 个失败 token 与父 commit 完全一致(零新增回归);无 dotted examples.swe 引用;无 from examples.swe import;mini-swe-agent / mini_swe_agent_2 全部保持原样;同时 black/isort/py_compile 通过。
  5. 配套与验证边界:未启动任何训练端到端验证,变更被声明为路径级、运行时无 launcher 解析该示例目录;无新增 CI 测试。
文件 模块 状态 重要度
examples/swe-agent-harbor-docker/README.md 示例代码 renamed 2.91
examples/experimental/openenv/openenv_generate.py 沙箱编排 modified 3.92
examples/experimental/swe-agent-harbor-daytona/README.md 实验示例 modified 2.85
examples/swe-agent-harbor-docker/run.py 示例代码 renamed 2.81
examples/swe-agent-harbor-docker/download_and_process_data.py 示例代码 renamed 2.81
examples/swe-agent-harbor-docker/generate.py 示例代码 renamed 2.81
examples/swe-agent-harbor-docker/run-glm47-flash-agentic-async.py 示例代码 renamed 2.81
examples/swe-agent-harbor-docker/swe_agent_function.py 示例代码 renamed 2.81
examples/experimental/swe-agent-harbor-daytona/launch_agent_server.sh 实验示例 modified 2.14
docs/user-guide/rollout-endpoints.md 用户文档 modified 2.02
docs/user-guide/harbor.md 用户文档 modified 1.9
examples/README.md 示例代码 modified 1.9
docs/user-guide/agentic-chat-template.md 用户文档 modified 1.32

关键源码片段

examples/swe-agent-harbor-docker/README.md rename-or-move

重命名后唯一有内容调整的文档:标题点明 Docker 沙箱后端,命令路径同步到新目录,是全 PR 对读者最直接的入口。

# 标题:SWE-Agent training with Harbor on Docker sandboxes
# 标题加入 Docker sandboxes,与 examples/experimental/swe-agent-harbor-daytona 形成对称命名;
# 下方命令路径全部从 examples/swe-agent 迁移到 examples/swe-agent-harbor-docker。
python examples/swe-agent-harbor-docker/run.py ... --extra-env-vars 'AGENT_TRIAL_TIMEOUT=10800'
python examples/swe-agent-harbor-docker/download_and_process_data.py \
  --input /path/to/terminal-bench.jsonl \
  --output /path/to/tb2_train.jsonl \
  --agent-name mini-swe-agent
examples/experimental/openenv/openenv_generate.py reference-update

源码文件中唯一被修改的入口:虽然只改 docstring 引用,但它是 openenv/tbench2 与 swe-agent 示例 reward 函数镜像关系的记录点。

"""Reward function for the OpenEnv Terminal-Bench-2 (tbench2) run.Task-agnostic: the agent function (``openenv_agent_function.run``) stores the
env-computed binary pytest reward in ``sample.metadata["reward"]``; this just
reads it back. Wired via ``--custom-rm-path openenv_generate.reward_func`` and
mirrors ``swe-agent-harbor-docker/generate.py:reward_func`` so it works for both the
single-sample (``async_rm``) and batched (``--custom-rm-path``) call paths.
"""from miles.utils.types import Sample
​
​
async def reward_func(args, samples: Sample | list[Sample], **kwargs) -> float | list[float]:
    # 本 PR 唯一改动:docstring 中的路径从 swe-agent/generate.py 更新为
    # swe-agent-harbor-docker/generate.py,使两个示例入口的镜像关系在新目录布局下
    # 仍然可追溯;函数体本身未做任何变更。
    if isinstance(samples, list):
        return [s.metadata.get("reward", 0.0) for s in samples]
    return samples.metadata.get("reward", 0.0)

评论区精华

是否重命名 swe-agent 为 swe-agent-harbor-docker 设计

nblintao 在 #1919 中提问是否应将 swe-agent 重命名,或保留 url slug 不变;PR body 引用该提问并给出决策。作者核查 docs/docs.json 无 swe-agent 页面,Mintlify 路由不受影响,仅 github 链接需要更新。

结论:重命名目录为 swe-agent-harbor-docker,旧路径不再保留,所有内部链接已同步更新。 · 已解决

防止误改 mini-swe-agent / mini_swe_agent_2 子串 正确性

共享 mini-swe-agent 子串的 upstream harness 在 9 个文件中被使用,目录重命名不能采用全局 find-replace,否则会误伤这些与 Docker/Daytona 配方无关的 harness 文件。

结论:采用受限替换(guarded sweep),并静态核验所有 mini-swe-agent / mini_swe_agent_2 出现均保持原样。 · 已解决

静态路径审计代替 CI 测试 测试

examples 位于 pytest 的 norecursedirs 中,CI 无法 import 示例代码;作者用静态审计验证所有 tracked 路径 token 可解析,确认 14 个失败 token 与父 commit 相同、零回归,并明确未做端到端训练。

结论:路径审计通过,PR 合并时无需新增 CI 用例;回归防护依赖后续 review 与手工核验。 · 已解决

风险与影响

主要风险集中在引用断裂与覆盖度。

  • 外部引用断裂:docs/user-guide 和 examples/README 中指向 github.com/.../examples/swe-agent 的链接若不更新会 404,本 PR 已全部更新,但仓库外的个人脚本、博客与 fork 若继续使用旧路径将失效。
  • 静态路径审计未固化进 CI:后续新增对旧路径的引用不会自动失败,只能靠 review 复查;且 14 个既存失败 token 依旧存在(与父 commit 相同),本 PR 未修复也未新增。
  • 无端到端测试:训练未实际运行,若存在运行时解析示例目录的 launcher(作者判断没有),可能漏检。
  • mini-swe-agent 子串守卫:若后续有人做全局 renaming,会误伤 mini-swe-agent / mini_swe_agent_2 harness,属于需要持续留意的维护约定。
  • 对核心训练代码零影响:miles/ 下无任何改动。

影响面限于示例目录与文档:用户运行 swe-agent Docker 配方必须改用 examples/swe-agent-harbor-docker 路径;文档中的 github 链接已更新;examples 目录现在两个 Harbor 配方命名对称。对系统、训练管线、CI 均无运行影响;examples 不在 CI import 范围,docs/docs.json 无路由变化。团队后续新增 sandbox 后端时命名约定更清晰;短中期对外文档和草稿可能残留旧路径。

旧路径外部引用断裂风险 静态路径审计未纳入 CI 无端到端训练验证 mini-swe-agent 子串需持续守卫

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论