Prhub

#2748 fix(swe-agent): flush all session-server instances on abort

原始 PR 作者 sreerohi 合并时间 2026-08-28 05:05 文件变更 1 提交数 1 评论 0 代码增减 +18 / -12

执行摘要

修复 swe-agent 中止时未刷新多个 session-server 实例的问题

在 multi-turn agentic 流程中,模型评估和奖励评分在 CPU 侧进行,若 abort 信号未到达所有实例,rollout 会被长时间运行的 CPU 进程阻塞,使 oversampling 失去意义。PR 指出,会话服务器的 instance ID 被错误获取,导致 FLUSH 信号未到达 Harbor。

此 PR 值得精读,因为它修复了一个性能关键路径上的 bug,并展示了如何正确读取 driver 参数中的复数映射。建议补充针对 abort 行为的单元测试,以覆盖多实例和单实例场景。

讨论亮点

无针对代码的讨论评论。审核人 nblintao 表示 LGTM。

实现拆解

  1. 变更入口:修改 examples/swe-agent-harbor-docker/swe_agent_function.py 中的 abort(args) 函数。
  2. 核心逻辑:将原先仅读取单数属性 session_server_instance_id 的逻辑,改为优先读取复数属性 session_server_instance_ids(字典)的所有值,并加入单数属性作为回退,避免兼容性问题。
  3. 异步刷新:遍历所有实例 ID,逐个发送 /flush 请求,并保留异常处理逻辑。
  4. 测试配套:本 PR 无新增或修改测试,但性能数据在 PR 描述中提供,用于验证改进效果。
文件 模块 状态 重要度
examples/swe-agent-harbor-docker/swe_agent_function.py swe-agent modified 4.9

关键符号

abort

关键源码片段

examples/swe-agent-harbor-docker/swe_agent_function.py infrastructure

核心修改文件,修复 abort 函数未能刷新所有 session-server 实例的问题。

# swe_agent_function.py 中 abort 函数的关键修正片段
async def abort(args) -> None:
    # ...
    agent_server_url = os.getenv("AGENT_SERVER_URL", os.getenv("SWE_AGENT_URL"))
​
    # 从 driver 参数中读取复数实例 ID 映射(set 去重),并保留单数属性作为向后兼容回退
    instance_ids = set((getattr(args, "session_server_instance_ids", None) or {}).values())
    singular = getattr(args, "session_server_instance_id", None)
    if singular:
        instance_ids.add(singular)
​
    if not agent_server_url or not instance_ids:
        return
​
    headers = None
    admin_secret = os.getenv("HARBOR_ADMIN_SECRET")
    if admin_secret:
        headers = {"Authorization": f"Bearer {admin_secret}"}
​
    # 逐个实例发送 FLUSH 信号,确保所有会话服务器都被刷新
    for instance_id in instance_ids:
        try:
            result = await post(
                f"{agent_server_url.rstrip('/')}/flush",
                {"session_server_instance_id": instance_id},
                max_retries=3,
                headers=headers,
            )
            logger.info(f"Flushed agent server {agent_server_url}: {result}")
        except Exception as e:
            logger.warning(f"Failed to flush agent server {agent_server_url}: {e}")

评论区精华

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

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

风险与影响

回归风险:修改了 abort 逻辑,可能影响现有单实例或复数实例的清理流程。由于使用 set 去重,逻辑上安全,但缺少测试覆盖。
性能风险:逐个实例刷新可能增加网络请求次数,但预期影响较小。
兼容性风险:保留单数属性作为回退,确保旧代码兼容,但若 driver 参数结构中 session_server_instance_ids 不存在,仍能正常工作。

用户/系统影响:对于使用 swe-agent 多实例 oversampling 的 rollout 场景,此修复显著缩短等待时间,提升训练效率。
团队影响:无 API 变更,部署脚本不变,仅修复内部逻辑。影响范围限定在 swe-agent 相关功能。

缺少测试覆盖 核心路径变更

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论