mini-swe-agent:最小循环的停止契约
固定官方仓库
SWE-agent/mini-swe-agent@04d809ceab9df28f9adaed044884180159172930。本篇聚焦DefaultAgent与LocalEnvironment的一条基类路径;只做静态源码核对,未启动模型或执行命令。
核心设计
DefaultAgent.run() 先向 self.messages 加入 system 与 user 任务消息,再不断调用 step()。step() 几乎就是 execute_actions(query()):query() 把当前消息列表送给模型并追加 assistant 消息;execute_actions() 取 message.extra.actions 交给环境执行,再追加格式化的观察消息。每轮 finally 都调用 save();若最后一条消息的 role 是 exit,循环停止并返回它的 extra。run · query / execute
因此,这个实现的停止契约是消息尾部的 exit 角色,并非模型直接返回一个布尔值。LocalEnvironment 执行命令后,仅在首行输出恰为 COMPLETE_TASK_AND_SUBMIT_FINAL_OUTPUT 且返回码为 0 时抛出 Submitted,它携带的 exit 消息会被 run() 捕获并加入消息列表。提交哨兵 · 异常变消息
停止不只一种
query()在模型请求前检查 step、成本、墙钟限制;超限抛出携带exit消息的异常。限制- 模型输出格式错误并非立即结束:
run()把反馈消息加入列表、增加连续错误次数;达到配置阈值时写入RepeatedFormatError的exit消息。格式错误分支 · 工具调用解析错误 - 一般未捕获异常也会加入
exit消息,但随后重新抛出,不能把它说成正常返回。异常分支
范围边界
本图只画 DefaultAgent 的最小核心。mini CLI 在此提交上默认选择 InteractiveAgent,它覆盖 query()、execute_actions() 等以支持 human / confirm / yolo 和完成确认;不能把基类图当作默认 CLI 的全部行为。CLI 选择 · 交互子类 · 覆盖方法
save() 只有 output_path 非空才写轨迹文件;异常/中断的实际环境恢复、模型重试和命令安全边界均未实测。保存条件
图的文字说明 · mini-swe-loop
图从左侧消息账本读到中间的调用循环,再沿底部的“是 / 否”箭头判断去向。messages 是不断追加的账本,而非泛化的“模型—工具—观察”流水线。开头写入 system 和 user 任务。循环中,query() 读取当前账本,检查限制,向模型取得 assistant 消息并追加;execute_actions() 将动作交给环境,追加观察消息。格式错误可添加反馈并继续;提交或限额等中断异常携带消息。每轮调用 save(),然后检查最后消息:只有 role="exit" 才跳出循环并返回该消息的 extra。一般未捕获异常会重新抛出,不能算正常的 exit 返回。
右侧列表说明不同的 exit 来源:本地环境命令输出首行的提交哨兵、查询前限制、达到阈值的连续格式错误。这些是可能的分支,不是必经顺序;图也不是运行轨迹。mini CLI 默认使用交互子类,这张图仅解释其基类循环,不覆盖确认模式。源码与边界
固定官方源码版本:SWE-agent/mini-swe-agent@04d809ceab9df28f9adaed044884180159172930。
在线预览稿:书稿仍在校稿,系统篇以文内固定源码版本为准;静态阅读不等于运行验收。