news 2026/7/6 3:24:57

深入解析 mini-swe-agent:极简架构下的强大AI软件工程代理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深入解析 mini-swe-agent:极简架构下的强大AI软件工程代理

mini-swe-agent

这个项目是 SWE-agent 团队推出的一个极简但功能强大的 AI 软件工程代理(Agent)。它旨在用极简的代码实现核心的智能体循环,同时保持强大的代码修复能力。

一、核心实现架构与技术细节

mini-swe-agent的实现非常精炼,核心就是一个 while 循环和一套基于异常的信号传递机制

异常信号处理

Submitted

成功提交

LimitsExceeded

达到资源限制

FormatError

模型输出格式错误

开始: 接收问题
(如GitHub Issue)

初始化环境与提示

LLM推理
(思考+行动)

执行工具
(Bash/编辑器)

捕获观察结果
与异常信号

循环终止判断?

输出最终补丁
或结果

1.1 控制流:异常驱动的循环

  • 主循环:用一个 while 不断调用 LLM 获取下一个动作,然后执行该动作并获取观察结果。
  • 终止信号:循环的终止不是通过复杂的条件判断,而是通过抛出和捕获特定的异常来实现。定义了InterruptAgentFlow异常层级,包含:
    • submitted成功提交
    • LimitsExceeded达到操作次数或时间限制
    • FormatError模型输出格式无法解析
  • 消息传递:这些异常不仅用于控制流,还能携带消息有效载荷。run()方法会捕获这些异常,将消息注入对话历史,然后根据异常类型决定是继续循环(如格式错误是可以重试的)还是终止循环(如成功提交就可以正常终止)。这种设计将控制逻辑和业务逻辑清晰分离。

1.2 工具系统:YAML+BASH

  • 工具定义:工具签名、文档字符串和参数说明(通过一个 YAML 配置文件定义)。这使其能渲染为函数调用的JSON Schema 或系统提示词中的工具文档
  • 工具实现:每个工具就是一个独立的 BASH 脚本(bin/目录)。这样有三大好处:
    • 通用可移植性:Bash 脚本可以在 Linux 容器中运行
    • 安装简单:只需将工具目录复制到沙箱环境并运行一个install.sh脚本
    • 文档自动生成:工具的文档直接源自 YAML 定义,无需手动维护
  • 状态共享:工具之间不共享 Python 对象状态,而是通过环境变量、文件系统和_state命令的 JSON 输出进行通信

一个工具包的最小规范示例

根据其设计协议,一个自定义工具包至少需要包含一下文件

tools/my_bundle/ ├── config.yaml # 工具定义 ├── bin/ │ └── my_command # 工具实现(Bash脚本) └── install.sh # 依赖安装脚本(可选)

config.yaml

tools:my_command:signature:"my_command <arg1> [<arg2>]"docstring:"这个工具的功能描述,给 LLM 看"arguments:-{name:arg1,type:string,required:true,description:"第一个参数的说明"}-{name:arg2,type:integer,required:false,description:"第二个参数的说明(可选)"}state_command:"_my_state"# 可选,每次动作后运行的命令,用于输出状态 JSONenv_variables:# 可选,注入到运行时的环境变量MY_VAR:"default_value"

bin/my_command

#!/usr/bin/env_basharg1="$1"arg2="${2:-}"# 这里实现工具的具体逻辑echo"执行 my_command,参数1:$arg1, 参数2:$arg2"

1.3 提示词工程:结构化与过程化引导

精心设计的提示词模板

  • 极简系统提示词:“You are a helpful assistant that can interact with a computer to solve tasks.”。所有与具体任务相关的上下文(如问题描述、仓库路径)都放在实例提示词中。这样能让系统提示词被 LLM KV 缓存。
  • 过程化指令:明确引导 LLM 遵循一个类似人类工程师的五步工作流:
    1. 阅读与理解:首先阅读和代码库中与问题描述相关的代码
    2. 复现问题:创建一个脚本来复现错误,并用python <filename.py>执行它
    3. 编辑修复:编辑仓库的源代码来解决问题
    4. 验证修复:重新运行复现的脚本,并确认错误已被修复
    5. 考虑边缘情况:思考边缘情况,确保你的修复也能处理他们
  • 无演示(Zero-shot)

二、项目拆解分析

初始化

调用

返回结果/环境信息

支撑模型与环境层

LLM 模型抽象
models/

执行环境抽象
environments/

核心智能体循环

DefaultAgent
agents/default.py

Agent Loop
while True

提示构建与模板渲染

LLM 推理调用

动作解析与执行

观察结果与异常处理

入口与配置层

CLI / Python API
run/mini.py

配置加载与合并
config/

2.1 生命周期

  1. 初始化:系统首先从配置文件和命令行参数中加载和合并配置,随后,根据配置实例化模型、环境和智能体本身
  2. 运行:Agent 的run()方法被调用,启动核心的智能体循环。循环内部不断进行"思考-行动-观察"(ReAct) 的迭代,直到完成或达到某个限制
  3. 终止:循环通过异常机制优雅推出,整个执行轨迹(消息、动作、成本等)序列化为一个 JSON 文件,保存下来,便于分析和回放。

2.2 Agent Loop

# 伪代码,源于default.py的run方法defrun(self,task):# 初始化消息历史self.messages=[system_message,instance_message]whileTrue:try:# 1. 调用LLM获取下一步动作response=self.model.query(self.messages)# 2. 解析动作并执行action,observation=self.env.execute(response)# 3. 将结果添加到历史self.messages.append({"role":"assistant","content":response})self.messages.append({"role":"user","content":observation})exceptInterruptAgentFlowase:# 4. 捕获特定异常来控制流程ifisinstance(e,Submitted):break# 成功完成,退出循环elifisinstance(e,(LimitsExceeded,TimeExceeded)):break# 达到限制,退出循环elifisinstance(e,FormatError):# 处理格式错误,可能重试self.n_consecutive_format_errors+=1ifself.n_consecutive_format_errors>self.config.max_consecutive_format_errors:break

2.3 Tool

  • 执行逻辑:在环境中通过命令行调用实现。环境负责接收 LLM 的工具调用指令,并将其映射为具体的系统命令执行,然后捕获输出返回给 Agent

2.4 Environment

  • 核心类:local.py实现了在本地文件系统上执行命令的LocalEnvironment,这是最常用的环境。此外,singularity.py等提供了在容器(如 Singularity)中执行的环境,用于隔离和安全性。
  • 职责:环境的职责时执行动作并返回观察结果,它接收来自 Agent 的字符串执行(如 Bash 命令或一个编辑指令),在目标工作目录中执行,并将命令的输出、执行状态等信息格式化后返回给 Agent,作为下一轮循环的输入。

2.5 Prompt

通过模板+变量的方式,分离了结构和内容

  • 模板定义:提示词的骨架模板定义在配置文件(如config/mini.yaml)中。
    • system_template:系统提示,定义 Agent 的角色、能力和行为规范。
    • instance_template:示例提示,包含具体的任务描述。
  • 变量填充与渲染:在运行时,Agent 的get_template_vars()方法会收集来自配置、环境、模型以及当前状态的所有变量,合并成一个dict,用Jinja2模板引擎进行渲染,生成最终发送给 LLM 的完整提示词。
  • 动态上下文:模板可以引用动态变量,例如{{working_dir}}当前工作目录{{problem_statement}}问题描述

2.6 Memory

非常直接,用完整的消息历史列表

  • 存储位置:记忆保存在DefualtAgent实例的self.messages属性中,这是一个list,按顺序存储完整的对话历史
  • 内容:遵循 OpenAI 的消息格式[{"role":"system", "content":"系统提示"}]
  • 持久化:运行结束后,这个完整的 messages 列表会被序列化为 JSON。

2.7 LLM 调用

models模块中

  • 模型抽象:该目录定义了模型接口,调用各种 LLM API (基于 LiteLLM)
  • 调用点:在 Agent Loop 的每一次迭代中,self.model.query(self.messages)会被调用,query 方法接收完整历史消息,返回模型响应。
  • 配置:模型名称、API 密钥、参数(如温度,Top-p),并在模型初始化时传入

2.8 各个模块之间如何通信

模块间通信遵循“依赖注入”和“显式方法调用”的原则,清晰且低耦合

  1. Agent 初始化时,接收实例化的ModelEnvironment对象。
  2. Agent 调用 Model:通过self.model.query()
  3. Agent 调用 Environment:Agent 将 LLM 的响应传递给self.env.execute()。Environment 执行命令后,将观察结果字符串返回给 Agent。
  4. 配置作为 “胶水”,YMAL 配置指定了要使用的模型类、环境类及其初始化参数。get_modelget_enviroment等工厂函数,根据配置动态创建相应实例
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 3:23:17

XSS-Labs通关秘籍:7种花式绕过技巧与实战解析

1. 项目概述&#xff1a;为什么XSS-Labs是Web安全进阶的必修课如果你在安全圈待过一阵子&#xff0c;或者刚入门Web安全&#xff0c;大概率听说过“XSS-Labs”这个靶场。它不像DVWA那样面面俱到&#xff0c;也不像WebGoat那样有完整的课程体系&#xff0c;但它在XSS&#xff08…

作者头像 李华
网站建设 2026/7/6 3:22:45

数据科学必备的11个核心数学概念精讲

1. 项目概述&#xff1a;为什么“数学不硬核&#xff0c;模型就飘”是数据科学最真实的生存法则 我带过三十多个从零起步转行的数据科学学员&#xff0c;也给十几家中小企业的算法团队做过技术复盘。每次聊到模型效果瓶颈、训练不稳定、调参像玄学&#xff0c;最后八成问题都卡…

作者头像 李华
网站建设 2026/7/6 3:22:33

Python爬虫经典案例第63篇:即时通讯平台爬取:Slack数据采集实战

1. 引言 Slack是全球领先的企业即时通讯和团队协作平台,拥有超过1200万每日活跃用户和150万+付费客户。作为一款功能丰富的团队协作工具,Slack提供了消息发送、文件共享、频道管理、集成应用等核心功能。对于数据分析师和爬虫开发者而言,Slack数据蕴含着丰富的信息价值: 团…

作者头像 李华
网站建设 2026/7/6 3:20:50

Java异常处理深度实战教程:异常管理策略

总结与最佳实践优秀的异常处理不是简单地捕获和处理异常&#xff0c;而是构建一套完整的异常管理策略。以下是一些关键的最佳实践&#xff1a;区分业务与系统异常&#xff1a;业务异常表示业务逻辑问题&#xff0c;系统异常表示技术问题。在业务层抛出业务异常&#xff0c;在系…

作者头像 李华
网站建设 2026/7/6 3:19:40

PWM+MOS管驱动LED振铃干扰

进行一个高频大功率LED驱动电路的简单测试实验&#xff0c;STM32输出一个PWM给到MOS管&#xff0c;然后LED正极接板子的5V&#xff0c;负极接MOS管的D极&#xff0c;S极接地&#xff0c;在反复拉动亮度条时(调整PWM占空比&#xff09;&#xff0c;使用板子上面5V的一个模块会莫…

作者头像 李华