mini-swe-agent — 100줄짜리 AI가 GitHub 이슈를 해결하는 방법

8 min read
AI 에이전트SWE-bench오픈소스코딩 에이전트
mini-swe-agent — 100줄짜리 AI가 GitHub 이슈를 해결하는 방법

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 하나뿐이다.

agent.py (핵심 루프)
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-agent74%+~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-5
Docker 환경
mini-swe-agent solve \
  --issue "Fix TypeError in utils.py" \
  --sandbox docker \
  --image python:3.11
다른 모델 사용 (litellm 통해)
mini-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가 증명한 것이다. 복잡성이 능력이 아니라는 좋은 반례다.


참고:

관심 있을 만한 포스트

Anthropic Managed Agents — AI 에이전트 인프라를 플랫폼에 넘기다

오케스트레이션, 세션 상태, 샌드박스를 직접 구축하지 않아도 되는 Anthropic 관리형 에이전트 플랫폼의 구조와 트레이드오프를 분석한다.

AnthropicAI 에이전트

Claude Code 프롬프트 재현성 — 암묵지를 제거하는 자동 튜닝 워크플로우

작성자와 평가자를 분리하고 서브에이전트로 반복 실행해 프롬프트 품질을 객관적으로 끌어올리는 실전 방법론을 정리한다.

Claude Code프롬프트 엔지니어링

AWS DevOps Agent — MTTR 75% 감소를 만든 자율 인시던트 대응 에이전트

Amazon Bedrock AgentCore 기반의 AWS DevOps Agent가 인시던트를 자율 조사하는 방식과 MCP 확장, 94% 루트 코즈 정확도를 분석한다.

AWSDevOps

Frontend Dogma RSS 유료화 — 개발자 뉴스레터 지속 가능성의 딜레마

Frontend Dogma의 전체 RSS 피드가 연 12달러 유료 기능으로 전환됐다. 독립 기술 미디어의 생존 문제를 들여다본다.

RSS오픈소스

Node.js 인기 레포 6개의 미문서 환경변수 — 스캔 결과 공개

Express, NestJS, Supabase 등 6개 Node.js 프로젝트를 스캔해 실제 env 사용량과 문서화 수준의 격차를 분석한다.

Node.js환경변수

npm 패키지 2주 다운로드 추적 — 데이터로 보는 배포 채널 효과

텍스트 분석 라이브러리를 배포하고 2주간 모든 다운로드와 트래픽 소스를 추적한 실제 데이터를 공개한다.

npm오픈소스

webpage-mcp — 기존 브라우저를 AI 에이전트 MCP 서버로 바꾸는 도구

Chrome 확장으로 브라우저를 MCP 서버로 변환해 AI 에이전트가 기존 로그인 세션을 활용한 웹 자동화를 가능하게 하는 도구를 살펴본다.

MCP브라우저 자동화

Claude Code + Figma MCP — UX 라이팅 리소스 50% 절감 실전기

수치화된 톤 스펙트럼과 Figma MCP 자동화로 반복 작업을 AI에게 넘기고 팀이 맥락과 사용자 경험에 집중하게 만든 과정을 정리한다.

Claude CodeFigma MCP