
SWE-agent 环境配置实战从 Docker 镜像构建到自定义运行环境【免费下载链接】SWE-agentSWE-agent takes a GitHub issue and tries to automatically fix it, using your LM of choice. It can also be employed for offensive cybersecurity or competitive coding challenges. [NeurIPS 2024]项目地址: https://gitcode.com/GitHub_Trending/sw/SWE-agentSWE-agent 的任务求解能力完全建立在运行环境之上——每个问题实例都在一个隔离的容器中执行代码、修改文件并验证补丁。本指南以 docs/config/environments.md 为骨架系统讲解 SWE-agent 的 Docker 环境体系默认镜像、SWE-Bench 专用镜像、自定义 Dockerfile 的编写与接入方式并结合源码与真实配置说明底层实现。读完本文你将能够为自己的任务构建专属镜像并通过命令行参数或 YAML 配置自由切换运行环境。运行环境的基本模型一切都在 Docker 容器中SWE-agent 的核心设计是Agent 的每一次命令执行、文件读写都发生在一个独立的 Docker 容器中而不是你的宿主机上。这一设计保证了安全性Agent 的破坏性操作被限制在容器内、可复现性每个实例的环境完全一致与并发性批量任务可以在多个容器中并行推进。默认情况下SWE-agent 使用python:3.11作为基础镜像。这一默认值来自 sweagent/environment/swe_env.py 中EnvironmentConfig的定义class EnvironmentConfig(BaseModel): deployment: DeploymentConfig Field( default_factorylambda: DockerDeploymentConfig(imagepython:3.11, python_standalone_dir/root), descriptionDeployment options., )这里有两个值得注意的字段image容器基础镜像默认python:3.11python_standalone_dirSWE-ReX执行后端的独立 Python 环境安装目录默认/root。在批量场景中如果该字段为None会被自动补齐为/root见 sweagent/run/batch_instances.py而显式设置为空字符串则可禁用该行为。编写第一个自定义 Dockerfile当你需要为任务预装依赖如flake8、node、数据库驱动等时官方推荐的方式是构建一个包含全部依赖的自定义镜像而不是让 Agent 每次运行时现场安装。下面是原文档给出的最小可用示例FROM python:3.11.10-bullseye # (1)! ARG DEBIAN_FRONTENDnoninteractive # (2)! ENV TZEtc/UTC WORKDIR / # Install swe-rex for faster startup RUN pip install pipx RUN pipx install swe-rex RUN pipx ensurepath ENV PATH$PATH:/root/.local/bin/ # Install any extra dependencies RUN pip install flake8 SHELL [/bin/bash, -c]逐行解读如下基础镜像python:3.11.10-bullseye即我们从这里开始叠加内容。也可以替换成python:3.12等其他官方镜像或任意自建镜像。关闭交互式提示ARG DEBIAN_FRONTENDnoninteractive与ENV TZEtc/UTC非常重要——安装软件包时若触发交互式对话框如时区选择会导致构建或容器启动卡死。预装 SWE-ReXSWE-ReX 是 SWE-agent 的执行后端它会在容器内启动一个小型服务端接收并执行 Agent 下发的命令。每次启动容器时 SWE-ReX 都会尝试自行安装它的服务端这需要数秒时间如果在镜像里预先装好通过pipx install swe-rex并pipx ensurepath容器启动会明显更快。补充 PATHENV PATH$PATH:/root/.local/bin/是为了确保pipx安装的可执行文件包括 SWE-ReX 服务端能被找到——有时ensurepath并不能完全保证 PATH 正确。额外依赖RUN pip install flake8演示了如何预装 Agent 可能用到的工具。例如 SWE-agent 的tools/windowed_edit_linting等编辑工具会依赖flake8做语法检查。默认 ShellSHELL [/bin/bash, -c]明确将容器内默认 shell 设为 bash保证后续命令的语义一致。构建镜像并接入 Agent构建命令在 Dockerfile 所在目录执行docker build -f tiny.Dockerfile -t swe-agent-tiny .构建成功后即可在运行 Agent 时通过--env.deployment.image指定该镜像sweagent run --env.deployment.image swe-agent-tiny ...这是最直接的接入方式。与之等价的 YAML 配置写法如下参考 config/demo/default.yamlenv: deployment: image: tiny python_standalone_dir: 注意 demo 配置中image: tiny指本地构建名为tiny的镜像同时将python_standalone_dir置空。而 config/human/human.yaml 则显式使用官方镜像env: deployment: image: python:3.11启动前的附加命令post_startup_commands除了把依赖烧进镜像SWE-agent 还允许在 Agent 启动前、其他初始化步骤完成之后执行一组附加命令对应的配置项是EnvironmentConfig.post_startup_commands源码见 sweagent/environment/swe_env.py这些命令与 Agent 处于同一个 shell中执行每个命令以字符串而非参数列表传入默认超时post_startup_command_timeout 500秒该超时对列表中的每一条命令分别生效。命令行用法注意列表语法需要用单引号包裹尤其在zsh下[、]有特殊含义sweagent run \ --agent.model.nameclaude-3-7-sonnet-latest \ --env.post_startup_commands[pip install flake8] \ ...在start()方法中sweagent/environment/swe_env.py这些命令会在部署初始化与仓库复制完成之后逐条执行任一命令失败checkraise都会中断环境启动def start(self) - None: self._init_deployment() self.reset() for command in self._post_startup_commands: self.communicate(command, checkraise, timeoutself.post_startup_command_timeout)这为镜像内容 启动命令双通道定制环境提供了灵活性基础设施放镜像临时性或实例相关的初始化放post_startup_commands。部署Deployment底层SWE-ReX 与部署类型环境镜像最终通过SWE-ReX的部署模块落地。在 sweagent/environment/swe_env.py 中EnvironmentConfig.deployment的类型是 SWE-ReX 的DeploymentConfig并通过get_deployment()工厂函数创建具体的部署实例SWEEnv.from_config()同文件 第 84-98 行是官方推荐的环境构建入口。从仓库源码与文档可以看到部署类型并不只有 Docker 一种docker默认在 Docker 容器中运行如DockerDeploymentConfiglocal直接在本机执行不支持image_name见 sweagent/run/batch_instances.pydummy测试用的空实现modal通过--env.deployment.typemodal可切换到 Modal 云上执行见 docs/usage/cl_tutorial.md。除此之外还可以通过docker_args向容器传递额外参数例如在基准测试配置 config/benchmarks/250522_anthropic_filemap_simple_review.yaml 中限制容器内存instances: deployment: type: docker docker_args: - --memory10gSWE-Bench 实例每个问题一个专用镜像如果你在 SWE-Bench 基准上运行情况略有不同每个 SWE-Bench 实例都有自己专属的 Docker 镜像SWE-agent 会从 Docker Hub 拉取对应的镜像。这个逻辑实现在SimpleBatchInstance.from_swe_bench()sweagent/run/batch_instances.py中classmethod def from_swe_bench(cls, instance: dict[str, Any]) - Self: iid instance[instance_id] image_name instance.get(image_name, None) if image_name is None: # Docker doesnt allow double underscore, so we replace them with a magic token id_docker_compatible iid.replace(__, _1776_) image_name fdocker.io/swebench/sweb.eval.x86_64.{id_docker_compatible}:latest.lower() ... return cls( image_nameimage_name, problem_statementinstance[problem_statement], instance_idiid, repo_nametestbed, base_commitinstance[base_commit], ... )几点值得注意的细节镜像命名规则SWE-bench 镜像名为docker.io/swebench/sweb.eval.x86_64.实例ID:latest。由于 Docker 不允许镜像名中出现双下划线实例 ID 中的__会被替换为_1776_这一魔数 token仓库即testbedSWE-bench 的镜像内已预置好代码仓库因此repo_name固定为testbed表示直接使用容器根目录下已存在的仓库无需再从外部拷贝对应PreExistingRepoConfig的用法见 docs/usage/cl_tutorial.md镜像覆盖部署配置在to_full_batch_instance()sweagent/run/batch_instances.py中每个实例的image_name会覆盖批量任务中配置的deployment.image——也就是说批量跑 SWE-Bench 时环境镜像由实例决定而不是由你的--env.deployment.image决定。同时代码会model_copy(deepTrue)深拷贝部署配置避免多个实例共享同一配置对象导致状态污染。常见问题与调试建议容器启动慢优先把 SWE-ReX 预装进镜像pipx install swe-rex避免每次启动时现装这是原文档示例特意保留RUN pip install pipx、RUN pipx install swe-rex等步骤的原因。安装软件包卡住检查是否遗漏ARG DEBIAN_FRONTENDnoninteractive与ENV TZEtc/UTC交互式提示会阻塞安装流程。PATH 找不到命令在 Dockerfile 末尾显式ENV PATH$PATH:/root/.local/bin/覆盖pipx ensurepath可能遗漏的情况。想让实例共享同一个自定义镜像非 SWE-Bench 场景直接sweagent run --env.deployment.image your-image ...SWE-Bench 场景则通过instances.deployment.docker_args如--memory10g调整容器资源镜像本身由实例指定。需要一次性初始化用--env.post_startup_commands[...]注意列表用单引号包裹并留意post_startup_command_timeout默认 500 秒的按条超时限制。小结SWE-agent 的环境体系围绕镜像 部署 启动命令三层展开用自定义 Dockerfile 预装依赖与 SWE-ReX 以获得最佳启动速度通过--env.deployment.image或 YAML 中的env.deployment指定镜像借助post_startup_commands做启动前初始化而在 SWE-Bench 批量场景中每个实例的专用镜像会自动覆盖默认配置。掌握了这三层你就能为任意任务搭建稳定、可复现、可并行的求解环境。【免费下载链接】SWE-agentSWE-agent takes a GitHub issue and tries to automatically fix it, using your LM of choice. It can also be employed for offensive cybersecurity or competitive coding challenges. [NeurIPS 2024]项目地址: https://gitcode.com/GitHub_Trending/sw/SWE-agent创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考