ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

mini-swe-agent 本地环境 LocalEnvironment 实战指南:在本机直接执行 Agent 命令的实现、配置与任务提交流程

mini-swe-agent 本地环境 LocalEnvironment 实战指南:在本机直接执行 Agent 命令的实现、配置与任务提交流程 人工智能大模型AI Agent代码智能体【免费下载链接】mini-swe-agentThe 100 line AI agent that solves GitHub issues or helps you in your command line. Radically simple, no huge configs, no giant monorepo—but scores 74% on SWE-bench verified!项目地址https://gitcode.com/gh_mirrors/mi/mini-swe-agent点击查看免费下载LocalEnvironment是 mini-swe-agent 中负责在本机直接执行 bash 命令的执行环境实现也是mini命令行工具的默认环境。本文以 docs/reference/environments/local.md 为骨架结合 核心实现 与 测试用例完整讲解其配置参数、执行语义、超时与进程组清理、环境变量合并、任务提交机制以及如何在 CLI 与 YAML 配置中启用它。读完本文你将能独立配置和使用本地环境运行 agent并理解其隔离边界与适用场景。一、LocalEnvironment 在 mini-swe-agent 中的定位在 mini-swe-agent 的架构中环境Environment是实际执行 LM/agent 生成的代码的载体。项目通过 环境注册表 统一管理多种后端local直接在宿主机器上以subprocess执行命令无隔离docker通过docker exec在容器内执行singularity通过 Singularity/Apptainer 容器执行适合无 Docker 的 HPC 环境swerex_docker/swerex_modal通过 SWE-ReX 在 Docker 或 Modal 云端执行bubblewrapLinux only与contree轻量级沙箱。根据 环境类概述文档当你运行miniCLI 时默认就会使用local环境。这一点在 mini CLI 源码 中得到印证env get_environment(config.get(environment, {}), default_typelocal)也就是说只要配置中没有显式指定environment_classget_environment就会回退到LocalEnvironment。这也是为什么本地环境是所有用户接触到的第一个执行后端——它开箱即用直接工作在你当前的 Python 环境中。二、配置类 LocalEnvironmentConfig三个核心参数LocalEnvironmentConfig是一个基于 pydantic 的BaseModel位于 src/minisweagent/environments/local.py#L13-L16class LocalEnvironmentConfig(BaseModel): cwd: str env: dict[str, str] {} timeout: int 30参数类型默认值含义cwdstr空字符串命令执行的工作目录为空时回退到os.getcwd()即当前进程所在目录envdict[str, str]{}附加的环境变量会与进程现有环境变量合并timeoutint30秒单条命令的执行超时时间从 测试用例 可以看到默认值的严格约定cwd 、env {}、timeout 30。这三个参数都可以直接作为LocalEnvironment(...)的关键字参数传入例如from minisweagent.environments.local import LocalEnvironment env LocalEnvironment(cwd/path/to/repo, env{MY_VAR: value}, timeout60)在 YAML 配置文件中对应写法为可参考 default.yaml 中已有的environment.env段落environment: env: PAGER: cat MANPAGER: cat LESS: -R PIP_PROGRESS_BAR: off TQDM_DISABLE: 1 cwd: /path/to/working/dir timeout: 30配置的实际语义cwd决定了每条命令在哪个目录下运行env中声明的变量会覆盖同名的主机环境变量见下文环境变量合并一节timeout是防止 agent 执行失控命令的关键防线。三、execute 接口动作字典与结构化返回LocalEnvironment对外暴露的核心方法是execute(action, cwd, *, timeoutNone)见 local.py#L24-L43。它接收一个动作字典返回一个结构化的结果字典。3.1 输入动作字典result env.execute({command: ls -la})动作字典只需一个键command值为要在本地 shell 中执行的完整命令字符串。execute内部通过action.get(command, )取出命令。这与 agent 提示词中约定的 bash 动作格式完全对应——在 默认配置的 instance_template 中agent 被要求输出mswea_bash_command代码块其内容最终会被解析为该动作字典。3.2 输出结构化结果字典正常执行时返回{ output: result.stdout, # 合并了 stdout/stderr 的文本输出 returncode: result.returncode, # 进程退出码 exception_info: , # 空字符串表示无异常 }执行异常时如命令不存在、超时返回码固定为-1并额外携带诊断信息{ output: raw_output, returncode: -1, exception_info: An error occurred while executing the command: ..., extra: {exception_type: type(e).__name__, exception: str(e)}, }例如超时场景下exception_type会是TimeoutExpiredexception_info中会包含timed out字样——这一点由 test_local_environment_timeout 直接验证。3.3 执行目录的优先级execute方法还接受独立的cwd参数优先级从高到低为execute(action, cwd...)调用时显式传入的cwd配置中的self.config.cwdos.getcwd()。对应源码local.py#L27cwd cwd or self.config.cwd or os.getcwd()test_local_environment_cwd_parameter_override 验证了调用参数能覆盖配置值test_local_environment_default_cwd 则验证了完全未指定时回退到当前进程目录。四、底层执行器 _runshell 执行、超时与进程组清理LocalEnvironment.execute最终调用模块级函数_run(command, cwd, env, timeout)local.py#L72-L91。这个函数是理解本地环境行为的关键def _run(command: str, cwd: str, env: dict[str, str], timeout: int) - subprocess.CompletedProcess[str]: process subprocess.Popen( command, shellTrue, # 通过系统 shell 执行支持管道、重定向、命令替换 textTrue, cwdcwd, envenv, encodingutf-8, errorsreplace, # 无法解码的字节用替换符处理避免崩溃 stdoutsubprocess.PIPE, stderrsubprocess.STDOUT, # stderr 合并进 stdout start_new_sessionos.name posix, # POSIX 下开启新会话新进程组 ) try: stdout, _ process.communicate(timeouttimeout) except subprocess.TimeoutExpired: os.killpg(process.pid, signal.SIGKILL) if os.name posix else process.kill() stdout, _ process.communicate() raise subprocess.TimeoutExpired(command, timeout, outputstdout) return subprocess.CompletedProcess(command, process.returncode, stdoutstdout)值得注意的实现细节shellTrue命令由系统 shell 执行因此管道|、重定向、命令替换$(...)等 shell 特性全部可用。test_local_environment_shell_features 验证了echo hello world | grep world和echo $(echo nested)都能正确工作。stderr 并入 stdoutstderrsubprocess.STDOUT所以 agent 看到的是一个统一的输出流。test_local_environment_stderr_capture 验证了echo error message 2的内容出现在output中。UTF-8 容错encodingutf-8, errorsreplace保证非 UTF-8 字节不会让整个执行崩溃而是以替换符呈现。超时杀进程组这是最核心的工程细节。POSIX 下用start_new_sessionTrue让命令在新会话新进程组中运行一旦超时用os.killpg(process.pid, signal.SIGKILL)杀死整个进程组确保 shell 派生的子进程如后台任务不会被遗留下来成为孤儿进程。test_local_environment_timeout_kills_child_process 专门验证了这一点超时后由命令派生的 Python 子进程确实已退出。该测试在 Windows 上被跳过skipif(os.name nt)因为进程组是 POSIX 专属特性——Windows 上则退化为process.kill()。五、环境变量合并覆盖语义与可移植性execute在调用_run时构造的环境变量为os.environ | self.config.env # 见 local.py#L29这是 Python 3.9 的字典合并语法语义清晰以进程现有环境变量os.environ为基础用配置中的env覆盖同名键。测试从三个角度验证了这一行为注入新变量LocalEnvironment(env{TEST_VAR: test_value})后命令echo $TEST_VAR能读到该值test_local_environment_set_env_variables保留现有变量宿主已有的EXISTING_VAR依然可见与新变量共存test_local_environment_existing_env_variables配置值优先当宿主存在同名CONFLICT_VAR时配置值override_value胜出test_local_environment_env_variable_override。这是 mini-swe-agent 在 default.yaml 中设置PAGER: cat、TQDM_DISABLE: 1等变量的基础——通过覆盖环境变量可以让 agent 在本地执行时避免分页器挂起、关闭进度条噪音等干扰。六、任务提交机制COMPLETE_TASK_AND_SUBMIT_FINAL_OUTPUT本地环境内置了一个完成即提交的约定实现于_check_finishedlocal.py#L45-L56def _check_finished(self, output: dict): lines output.get(output, ).lstrip().splitlines(keependsTrue) if lines and lines[0].strip() COMPLETE_TASK_AND_SUBMIT_FINAL_OUTPUT and output[returncode] 0: submission .join(lines[1:]) raise Submitted({...})当命令输出首行恰为COMPLETE_TASK_AND_SUBMIT_FINAL_OUTPUT且退出码为 0 时LocalEnvironment会抛出Submitted异常定义于 exceptions.py继承自InterruptAgentFlow并把首行之后的全部内容作为最终提交结果。这正是 agent 提示词中用echo COMPLETE_TASK_AND_SUBMIT_FINAL_OUTPUT结束任务这一约定的底层实现——见 mini.yaml 和 default.yaml 中的提示词说明。该机制让 agent 可以自我了结一旦给出该命令运行框架捕获Submitted异常即结束本轮交互。七、模板变量与序列化get_template_vars 与 serialize除了执行命令LocalEnvironment还实现了环境协议要求的两个辅助方法def get_template_vars(self, **kwargs) - dict[str, Any]: return recursive_merge(self.config.model_dump(), platform.uname()._asdict(), os.environ, kwargs) def serialize(self) - dict: return { info: { config: { environment: self.config.model_dump(modejson), environment_type: f{self.__class__.__module__}.{self.__class__.__name__}, } } }get_template_varslocal.py#L58-L59把配置、平台信息platform.uname()提供 system/release/version/machine 等、宿主环境变量和调用方 kwargs 递归合并供提示词模板渲染。这就是为什么提示词中能出现system_information{{system}} {{release}} {{version}} {{machine}}/system_information见 mini.yaml——这些字段正是来自platform.uname()。合并逻辑由 serialize.py 的 recursive_merge 实现后面的字典优先嵌套字典递归合并。serializelocal.py#L61-L69把环境配置JSON 可序列化形式与完整类路径minisweagent.environments.local.LocalEnvironment写入轨迹信息用于保存运行记录。八、如何在 CLI 与 YAML 中启用本地环境8.1 通过 mini CLImini命令默认就是本地环境因此最简用法无需任何环境参数mini -t 请修复当前仓库中的某个 bug若想显式指定例如在多个环境间切换使用--environment-class选项见 mini.py#L59# 通过注册表别名指定 mini --environment-class local -t 任务描述 # 或通过完整类路径指定 mini --environment-class minisweagent.environments.local.LocalEnvironment -t 任务描述get_environment_classenvironments/init.py#L19-L27会先查注册表别名查不到则把字符串当作module.ClassName动态导入。8.2 通过 YAML 配置在 agent 配置文件可参考 yaml 配置文档中设置environment: environment_class: local cwd: /path/to/repo env: MY_FLAG: 1 timeout: 60运行时通过-c指定配置并叠加命令行参数覆盖默认配置mini -c mini.yaml -c environment.timeout120 -t 任务描述注意 mini.py 的提示一旦使用-c指定配置默认配置不再生效需要显式带上mini.yaml等基础配置。九、测试验证行为即契约本地环境测试 几乎逐条锁定了本文描述的行为可作为使用时的行为契约参考测试用例验证的行为test_local_environment_config_defaults三个配置参数的默认值test_local_environment_basic_executionecho命令正常执行、输出捕获test_local_environment_set_env_variables/existing_env_variables/override环境变量注入、保留、覆盖test_local_environment_custom_cwd/cwd_parameter_override/default_cwd目录优先级test_local_environment_command_failure/return_codes非零退出码被如实记录exit 1→1、exit 42→42test_local_environment_nonexistent_command命令不存在时输出中带诊断信息test_local_environment_stderr_capturestderr 并入 outputtest_local_environment_timeout/timeout_kills_child_process超时返回returncode-1且子进程被清理test_local_environment_multiline_output/file_operations/shell_features多行输出、文件操作、管道与命令替换十、适用场景与注意事项适用场景在开发者本机快速调试 agent 行为、交互式使用mini、在自有仓库上跑自定义任务、以及在 Python 代码中直接调用LocalEnvironment做轻量验证。它直接工作在当前 Python 环境无需 Docker 等基础设施。无隔离重要限制本地环境直接在宿主机执行命令没有隔离机制。agent 的任何命令都以你的用户权限运行可能修改真实文件、真实环境。文档 环境类概述 明确建议进行 SWE-bench 等评估时应使用隔离环境如 docker、singularity以保障宿主安全与结果可复现。状态不持久由于每条命令都在新的subprocess.Popen中执行目录切换和临时环境变量不会跨命令保留。为此 agent 提示词mini.yaml明确要求用MY_ENV_VARMY_VALUE cd /path ...前缀或把状态写入文件再加载。超时保护默认 30 秒超时是防失控的第一道闸门配合进程组 SIGKILL 确保不会遗留子进程但对需要长时间运行的命令应显式调高timeout。总而言之LocalEnvironment用不到百行代码实现了本机直连 shell的执行后端兼顾了 shell 特性、结构化输出、超时清理与任务提交约定是理解 mini-swe-agent 全部环境类docker、singularity、SWE-ReX 等的最佳起点——其余环境类都遵循同一套execute / get_template_vars / serialize协议只是把执行从宿主机搬到了各自的后端。赞分享人工智能大模型AI Agent代码智能体【免费下载链接】mini-swe-agentThe 100 line AI agent that solves GitHub issues or helps you in your command line. Radically simple, no huge configs, no giant monorepo—but scores 74% on SWE-bench verified!项目地址https://gitcode.com/gh_mirrors/mi/mini-swe-agent点击查看免费下载相关推荐LifeOS 中的 Remotion 技能用 React 代码驱动可复现的程序化视频创作LifeOS 中的 Remotion 技能用 React 代码驱动可复现的程序化视频创作 本指南以 LifeOS 开源仓库中的 Remotion 技能定义 h人工智能大模型AI Agent代码智能体3个关键策略让您的媒体处理效率提升300%Waifu2x-Extension-GUI批量处理全攻略3个关键策略让您的媒体处理效率提升300%Waifu2x Extension GUI批量处理全攻略 作为一名视频创作者或设计师您是否曾为处理数百张图片或数十人工智能大模型AI Agent代码智能体OpCore-Simplify 指南一条菜单走通的 OpenCore EFI 自动生成工具OpCore Simplify 指南一条菜单走通的 OpenCore EFI 自动生成工具 OpCore Simplify 是一个黑苹果的 OpenCore开发工具CLI上一篇anarlog 桌面端 SQLite 响应式 UI 实战useDrizzleLiveQuery 六大稳定模式与反模式清单下一篇Apache Hadoop分布式锁性能优化减少Zookeeper交互次数创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表