mini-swe-agent — 100줄짜리 AI가 GitHub 이슈를 해결하는 방법
SWE-bench verified 74% 달성에도 핵심 코드가 100줄인 최소주의 AI 코딩 에이전트의 아키텍처와 동작 원리를 분석한다.
AI 코딩 에이전트는 복잡해야 한다는 생각이 있다. 수천 줄의 설정 파일, 복잡한 파이프라인, 여러 레이어의 추상화. 그런데 Princeton과 Stanford 팀이 만든 mini-swe-agent는 다른 방향을 택했다.
핵심 코드 100줄. SWE-bench verified 74% 이상.
이게 어떻게 가능한지, 아키텍처를 뜯어본다.
SWE-bench란 무엇인가
[💡 잠깐! 이 용어는?] SWE-bench: 실제 GitHub 오픈소스 프로젝트에서 가져온 버그 수정 이슈를 AI 에이전트가 해결하는 벤치마크. "verified" 버전은 사람이 검증한 어려운 이슈들만 포함한다. 여기서 74%면 상위권이다.
Claude Code, Devin 같은 상용 에이전트들이 이 벤치마크를 목표로 개발되는 만큼, 74%는 실용적인 수준의 코드 수정 능력을 의미한다.
핵심 아키텍처: Bash 하나로 충분하다
대부분의 AI 에이전트는 파일 읽기, 파일 쓰기, 코드 실행, 검색 등 여러 개의 전용 도구를 구비한다. mini-swe-agent는 다르다.
도구는 Bash 하나뿐이다.
import subprocess
from litellm import completion
def run_command(cmd: str) -> str:
result = subprocess.run(
cmd, shell=True, capture_output=True, text=True, timeout=30
)
return result.stdout + result.stderr
def solve_issue(issue: str, model: str = "claude-opus-4-5") -> str:
messages = [
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": f"Fix this issue:\n{issue}"}
]
while True:
response = completion(
model=model,
messages=messages,
tools=[{
"type": "function",
"function": {
"name": "bash",
"description": "Run bash command",
"parameters": {
"type": "object",
"properties": {
"command": {"type": "string"}
},
"required": ["command"]
}
}
}]
)
message = response.choices[0].message
messages.append(message)
if not message.tool_calls:
return message.content
for tool_call in message.tool_calls:
cmd = tool_call.function.arguments
output = run_command(cmd)
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": output
})Bash만 있으면 파일 읽기(cat), 파일 수정(sed, patch), 코드 실행(python), 테스트 실행(pytest) 모두 가능하다. 전용 도구를 만들 필요가 없다.
상태 유지 쉘이 없어도 된다
일반적인 AI 에이전트는 세션 간에 셸 상태(환경 변수, 현재 디렉토리, 변수 등)를 유지하는 복잡한 메커니즘을 필요로 한다.
mini-swe-agent는 각 명령을 subprocess.run으로 독립 실행한다. 상태가 없다. 디렉토리가 필요하면 명령에 직접 경로를 넣는다.
# 상태 유지 쉘 방식
cd /repo/src
ls files.py
# mini-swe-agent 방식
ls /repo/src/files.py처음에는 이게 제약처럼 보이지만, 실제로는 이점이 크다. 디버깅이 쉬워진다. 모든 명령이 독립적으로 실행되므로 어느 단계에서 무슨 일이 일어났는지 추적하기 쉽다.
완전 선형 히스토리
기존 에이전트들은 트래젝토리(에이전트 실행 과정)와 LLM 메시지 히스토리가 분리되어 있는 경우가 많다. mini-swe-agent는 이 둘이 동일하다.
메시지 배열이 곧 실행 히스토리다. 중간에 뭔가 잘못됐을 때 메시지 배열을 보면 정확히 어느 지점에서 무슨 명령이 실행됐는지 알 수 있다.
비유하면 프로그램 실행 과정을 단계별로 기록한 로그 파일과 동일한 게 메모리에도 있는 것과 같다.
성능 비교
| 에이전트 | SWE-bench verified | 코드 크기 | 특징 |
|---|---|---|---|
| mini-swe-agent | 74%+ | ~100줄 | 최소주의, 빠른 시작 |
| Claude Code | ~75% | 수천 줄 | 상용, 완전한 개발 환경 |
| Devin | ~70% | 비공개 | 상용, 클라우드 기반 |
| SWE-agent (원본) | ~50% | 수천 줄 | 연구용, 복잡한 파이프라인 |
100줄로 상용 에이전트와 유사한 성능을 내는 이유가 있다. 복잡한 코드가 성능을 만드는 게 아니라, 모델의 능력을 제대로 이끌어내는 설계가 성능을 만든다.
다양한 환경 지원
pip install mini-swe-agent
mini-swe-agent solve --issue "Fix TypeError in utils.py" --model claude-opus-4-5mini-swe-agent solve \
--issue "Fix TypeError in utils.py" \
--sandbox docker \
--image python:3.11mini-swe-agent solve \
--issue "Fix TypeError in utils.py" \
--model gemini/gemini-2.5-pro[💡 잠깐! 이 용어는?] litellm: 여러 AI 모델(Claude, GPT, Gemini 등)을 동일한 인터페이스로 사용할 수 있게 해주는 라이브러리. mini-swe-agent가 모델에 종속되지 않는 이유다.
LLM tool-calling 인터페이스가 없어도 된다
최신 AI 코딩 에이전트들은 모델의 tool-calling(도구 호출) 기능을 적극 활용한다. mini-swe-agent는 tool-calling이 있으면 쓰지만, 없어도 동작한다.
모델이 텍스트로 <bash>ls -la</bash> 형식으로 명령을 출력하면 파싱해서 실행한다. 이 덕분에 tool-calling을 지원하지 않는 오래된 모델이나 로컬 모델에서도 동작한다.
왜 중요한가
mini-swe-agent는 단순히 "가벼운 에이전트" 이상의 의미가 있다.
AI 코딩 에이전트 연구에서 **최소 기준선(baseline)**을 제공한다. "이 정도 복잡성으로 74%가 가능하다면, 복잡한 시스템의 추가 성능이 복잡성에서 오는 건지 다른 요인에서 오는 건지 명확해진다."
개발자 입장에서는 자신의 워크플로우에 맞게 고칠 수 있는 AI 에이전트의 기초 코드가 생겼다는 뜻이기도 하다. 100줄이면 이해하고 수정하는 데 하루가 안 걸린다.
마무리
- 도구는 Bash 하나로 충분하다 — 복잡한 전용 도구 세트가 성능을 만들지 않는다
- 상태 유지 쉘 없이도 동작한다 — 각 명령을 독립 실행하면 디버깅이 쉬워진다
- LLM 메시지 배열 = 실행 히스토리 — 투명한 추적이 가능하다
- litellm 통합으로 모델에 종속되지 않는다
100줄짜리 코드가 수천 줄짜리 에이전트와 경쟁할 수 있다는 게 mini-swe-agent가 증명한 것이다. 복잡성이 능력이 아니라는 좋은 반례다.
참고:
같은 카테고리 · AI
비슷한 주제의 최신 글
태그가 겹치는 글
공통 태그가 많을수록 위에 보인다