# PR #2748 完整报告

- 仓库：`radixark/miles`
- 标题： fix(swe-agent): flush all session-server instances on abort
- 合并时间：2026-08-28 05:05
- 原文链接：http://prhub.com.cn/radixark/miles/pull/2748

---

# 执行摘要

- 一句话：修复 swe-agent 中止时未刷新多个 session-server 实例的问题
- 推荐动作：此 PR 值得精读，因为它修复了一个性能关键路径上的 bug，并展示了如何正确读取 driver 参数中的复数映射。建议补充针对 abort 行为的单元测试，以覆盖多实例和单实例场景。

# 功能与动机

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

# 实现拆解

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；类别 infra；类型 infrastructure）: 核心修改文件，修复 abort 函数未能刷新所有 session-server 实例的问题。

关键符号：abort

## 关键源码片段

### `examples/swe-agent-harbor-docker/swe_agent_function.py`

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

```python
# 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}")

```

# 评论区精华

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

- 暂无高价值评论线程

# 风险与影响

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

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

- 风险标记：缺少测试覆盖 , 核心路径变更

# 关联脉络

- 暂无明显关联 PR