Prhub

#2161 feat(coding_agent_rl): env-selectable grading protocol + sandbox RPC robustness

原始 PR 作者 jingshenghang 合并时间 2026-07-02 11:05 文件变更 13 提交数 3 评论 0 代码增减 +704 / -252

执行摘要

SWE 评分协议可配置 + Sandbox RPC 稳健性增强

为了支持 SWE-bench Verified 等不同数据集格式的评分需求,并使训练和评估路径能独立选择评分器;同时解决 E2B sandbox 在长时间命令执行时因 HTTP/2 流中断导致退出码丢失、非幂等操作被错误重试等问题,提升 agent 训练的稳定性和数据一致性。

值得精读,尤其是 exec_and_wait 的设计模式和 E2BSandbox._rpc_retry 的幂等性策略;评分协议的策略模式也很清晰。建议关注截断逻辑的正确性和重试异常覆盖。

讨论亮点

无 review 讨论,该 PR 为内部代码同步,直接合并。

实现拆解

  1. 评分协议分派层(swe.py):将原 get_metadata(sample) 扩展为 get_metadata(sample, protocol),由 protocol 参数路由到 _metadata_scaleswe_metadata_swebench;新增 EvalResult 类型、evaluability_checkrun_evaluation 函数,在生成前先校验实例是否可评,将评分逻辑与 generate.py 解耦。
  2. Sandbox RPC 稳健性(sandbox.py):引入 _await_done_markerexec_and_wait,通过写出启动器脚本 + setsid 完全分离子进程,然后轮询退出码标记文件,使长时间命令不依赖单一 RPC 流;E2BSandbox 类增加 _is_transient_rpc_error_rpc_retry_reset_conn_pool,对等幂操作(读文件等)实施带抖动指数退避的重试,非幂等操作不再重试。
  3. Harness 适配(harness/common.py):将原有的 run_command 替换为 run_agent,内部直接调用 exec_and_wait,简化本地 detach + poll 逻辑;install_npm_cli 增加 npm 安装失败时的重试机制。
  4. 轨迹截断(trajectory.py、adapters/common.py)_SampleBuilder.to_sample 新增 max_sample_tokens 参数,对 tokens、loss_mask、rollout_log_probs 统一截断;该参数通过 get_trajectory 从 session 的 max_context_tokens 传入,默认 0 表示不截断。
  5. 生成器入口(generate.py)SweConfig 新增 eval_protocoltrain_protocol 字段,generate() 新增 evaluation 参数选择对应协议;在正式 rollout 前先调用 evaluability_check 快速返回不可评实例。
文件 模块 状态 重要度
examples/coding_agent_rl/swe.py 评分协议 modified 8.94
slime/agent/sandbox.py 沙箱层 modified 8.7
slime/agent/harness/common.py Harness modified 8.2

关键符号

get_metadata EvalResult _metadata_scaleswe _metadata_swebench evaluability_check run_evaluation evaluate _await_done_marker exec_and_wait _is_transient_rpc_error _rpc_retry _reset_conn_pool run_agent install_npm_cli generate _eval_result to_sample _drain

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

  1. 幂等性假设风险(sandbox.py):_is_transient_rpc_error 的判断逻辑可能遗漏某些异常类型,导致非幂等命令被错误重试。
  2. 协议兼容性风险(swe.py):_metadata_swebench 依赖外部包 swebench,若未安装或版本变更可能影响导入。
  3. 轨迹截断风险(trajectory.py):当 max_sample_tokens 生效时,被截断的样本 loss_mask 和 logprobs 与 tokens 对齐,但若 leading_prompt_len 计算不当可能导致训练标签偏移。
  4. 并发风险exec_and_wait 使用文件锁(mkdir lock_dir)防止重复启动,但若多个协程竞争同一 tag 可能存在竞争。

对用户/系统:SWE coding-agent RL 训练人员可通过环境变量灵活切换评分协议,无需修改代码;长期运行的 agent 任务不再因连接中断而失败;轨迹截断防止了因上下文窗口溢出导致的训练崩溃。对团队:统一了 scaleswe 和 swebench 的评分接口,降低了后续添加新协议的成本;Sandbox 层的 RPC 稳健性设计可作为 agent 后端的最佳实践。影响范围限于 coding_agent_rl 示例和 slime/agent 模块,不影响其他功能。

核心路径变更 重试策略变化 环境变量新增 外部依赖引入

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论