From e9e1dcfa664aaba060b4f01c565f1e576f175144 Mon Sep 17 00:00:00 2001 From: Jiajun Li Date: Tue, 7 Apr 2026 20:00:38 +0000 Subject: [PATCH 1/2] feat: auto-detect SWE-bench instances in harbor task preparation Add `_is_swebench_instance()` to detect SWE-bench metadata and `_swebench_docker_image()` to derive the pre-built Docker image name from instance_id (xingyaoww registry convention). When no explicit `docker_image` is set and the metadata matches SWE-bench fields, the correct image is auto-selected. Also add `WORKDIR /testbed` and `RUN mkdir -p /logs` to the generated Dockerfile for SWE-bench compatibility. Made-with: Cursor --- .../swe-agent-v2/prepare_harbor_tasks.py | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/examples/experimental/swe-agent-v2/prepare_harbor_tasks.py b/examples/experimental/swe-agent-v2/prepare_harbor_tasks.py index ec452d980..31623fbce 100644 --- a/examples/experimental/swe-agent-v2/prepare_harbor_tasks.py +++ b/examples/experimental/swe-agent-v2/prepare_harbor_tasks.py @@ -41,6 +41,25 @@ logger = logging.getLogger(__name__) +# ── SWE-bench auto-detection ──────────────────────────────────────────── +def _is_swebench_instance(metadata: dict) -> bool: + """Return True if metadata looks like a SWE-bench instance.""" + return all(metadata.get(k) for k in ("repo", "version", "base_commit", "test_patch")) + + +def _swebench_docker_image(instance_id: str) -> str: + """Derive the pre-built SWE-bench Docker image from instance_id. + + Image naming convention (xingyaoww registry): + instance_id: getmoto__moto-7365 + image: xingyaoww/sweb.eval.x86_64.getmoto_s_moto-7365:latest + + The ``__`` in the instance_id maps to ``_s_`` in the image name. + """ + slug = instance_id.replace("__", "_s_") + return f"xingyaoww/sweb.eval.x86_64.{slug}:latest" + + def _get_instruction(metadata: dict) -> str: for key in ("problem_statement", "instruction", "prompt"): val = metadata.get(key, "") @@ -83,13 +102,18 @@ def _create_task_dir( env_dir = task_dir / "environment" env_dir.mkdir(exist_ok=True) - docker_image = metadata.get("docker_image", "ubuntu:24.04") + # Auto-detect SWE-bench instances and derive the correct Docker image + if not metadata.get("docker_image") and _is_swebench_instance(metadata): + docker_image = _swebench_docker_image(instance_id) + logger.debug(f"SWE-bench auto-detected: {instance_id} -> {docker_image}") + else: + docker_image = metadata.get("docker_image", "ubuntu:24.04") setup_cmds = metadata.get("setup_commands", "") if isinstance(setup_cmds, list): setup_cmds = " && ".join(setup_cmds) setup_block = f"RUN {setup_cmds}\n" if setup_cmds else "" - (env_dir / "Dockerfile").write_text(f"FROM {docker_image}\n{setup_block}") + (env_dir / "Dockerfile").write_text(f"FROM {docker_image}\nWORKDIR /testbed\nRUN mkdir -p /logs\n{setup_block}") if docker_network: compose_yaml = textwrap.dedent( From d6dcc065ae49937b72234ffc23bdc8309360054b Mon Sep 17 00:00:00 2001 From: Jiajun Li Date: Fri, 10 Apr 2026 07:31:49 +0000 Subject: [PATCH 2/2] fix: only add WORKDIR/logs lines for SWE-bench instances Non-SWE-bench tasks should not have /testbed workdir and /logs directory forced in the Dockerfile. Addresses PR #951 review feedback. Co-Authored-By: Claude Opus 4.6 (1M context) --- examples/experimental/swe-agent-v2/prepare_harbor_tasks.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/examples/experimental/swe-agent-v2/prepare_harbor_tasks.py b/examples/experimental/swe-agent-v2/prepare_harbor_tasks.py index 31623fbce..9a91a9f0a 100644 --- a/examples/experimental/swe-agent-v2/prepare_harbor_tasks.py +++ b/examples/experimental/swe-agent-v2/prepare_harbor_tasks.py @@ -103,17 +103,20 @@ def _create_task_dir( env_dir.mkdir(exist_ok=True) # Auto-detect SWE-bench instances and derive the correct Docker image - if not metadata.get("docker_image") and _is_swebench_instance(metadata): + is_swebench = not metadata.get("docker_image") and _is_swebench_instance(metadata) + if is_swebench: docker_image = _swebench_docker_image(instance_id) logger.debug(f"SWE-bench auto-detected: {instance_id} -> {docker_image}") + extra_lines = "WORKDIR /testbed\nRUN mkdir -p /logs\n" else: docker_image = metadata.get("docker_image", "ubuntu:24.04") + extra_lines = "" setup_cmds = metadata.get("setup_commands", "") if isinstance(setup_cmds, list): setup_cmds = " && ".join(setup_cmds) setup_block = f"RUN {setup_cmds}\n" if setup_cmds else "" - (env_dir / "Dockerfile").write_text(f"FROM {docker_image}\nWORKDIR /testbed\nRUN mkdir -p /logs\n{setup_block}") + (env_dir / "Dockerfile").write_text(f"FROM {docker_image}\n{extra_lines}{setup_block}") if docker_network: compose_yaml = textwrap.dedent(