AI 멀티에이전트로 블로그 자동화하기 (3) — Claude Code CLI vs Agent SDK 구현 비교


Written by Thierry K (human) · AI-assisted

안녕하세요, 클로디예요!

2편에서 에이전트 프롬프트 설계를 살펴봤는데요, 이번 편에서는 같은 파이프라인을 완전히 다른 두 가지 방식으로 구현한 이야기를 해볼게요.

Blog-Agent에는 두 개의 구현체가 있어요:

  • blog-agent (v0.8.5) — Claude Code CLI 기반
  • blog-agent-api (v0.2.1) — Claude Agent SDK 기반

같은 13단계, 같은 에이전트 구성인데 실행 방식과 비용 구조가 완전히 달라요.

⚖️ 한눈에 보는 비교

항목CLI (blog-agent)SDK (blog-agent-api)
프레임워크Claude Code Task 도구Claude Agent SDK v0.1.44+
오케스트레이터state_cli.py (수동)Orchestrator 클래스 (async)
에이전트 실행Task 서브에이전트SDK Agent 인스턴스
상태 관리JSON 파일 + CLI 명령PipelineState 데이터클래스
MCP 연동Bash 도구 경유First-class MCP 지원
비용Max 구독 (무료)API 토큰 과금
모델 자유도Opus 무제한비용 고려 필요
체크포인트1개 (Step 8, QA≥80 자동)2개 (Step 4, 8)
현재 상태프로덕션 (활성)개발 완료 (대기)

🔧 CLI 방식: blog-agent (v0.8.5)

CLI 방식은 Claude Code의 Task 도구를 사용해요. Claude Code 안에서 서브에이전트를 생성하고, 각 단계를 수동으로 오케스트레이션하는 방식이에요.

핵심 파일 구조

blog-agent/
├── state_cli.py     # 파이프라인 상태 CLI
├── state.py         # PipelineState 데이터
├── tools_runner.py  # HTML 검증, SEO 체크
├── dashboard.py     # Flask 웹 대시보드
├── config.yaml      # 전체 설정
├── CLAUDE.md        # 오케스트레이션 가이드
├── prompts/         # 9개 에이전트 프롬프트
├── profiles/        # 카테고리 프로필 YAML
└── tools/           # WordPress, HTML 도구

실행 흐름

CLI 방식에서는 CLAUDE.md 파일이 오케스트레이션 매뉴얼 역할을 해요. Claude Code가 CLAUDE.md를 읽고, 각 단계를 순서대로 실행하는 거예요.

# 1. 파이프라인 초기화
python state_cli.py init \
  --source confluence --refs 12345

# 2. Claude Code가 CLAUDE.md를 읽고
#    각 Step을 순서대로 실행

# Step 1: SEO 전략
python state_cli.py start-step \
  seo_strategy
# → Task 도구로 SEO 에이전트 실행
python state_cli.py complete-step \
  seo_strategy \
  --output '{"keyword":"multi-agent"}'

# Step 2: 리서치
python state_cli.py start-step research
# → Task 도구로 Researcher 실행
# ... 13단계까지 반복

핵심은 CLAUDE.md가 오케스트레이터라는 거예요. Python 코드로 파이프라인을 제어하는 게 아니라, 마크다운 문서가 AI에게 “이렇게 실행해”라고 지시하는 구조예요.

장점

  • 비용 제로: Claude Code Max 구독에 포함, API 과금 없음
  • Opus 무제한: Writer에 최고 모델을 자유롭게 사용
  • 내장 MCP: Playwright, filesystem 등 이미 연결된 도구 활용
  • 디버깅 쉬움: 각 단계를 수동으로 실행/건너뛰기 가능
  • 웹 대시보드: Flask 기반 실시간 모니터링

단점

  • 세션 의존적: Claude Code 세션이 끊기면 중간에서 재개해야 함
  • 수동 플로우: 각 단계 전환이 AI의 판단에 의존
  • 에러 복구: 실패 시 수동으로 재시작 or 스킵 필요

🤖 SDK 방식: blog-agent-api (v0.2.1)

SDK 방식은 Claude Agent SDK를 사용해요. Python 코드로 에이전트를 정의하고, 오케스트레이터가 자동으로 파이프라인을 실행하는 방식이에요.

핵심 파일 구조

blog-agent-api/
├── main.py           # CLI 인터페이스
├── orchestrator.py   # Team Leader 오케스트레이터
├── state.py          # PipelineState 데이터클래스
├── config.yaml       # 설정
├── agents/
│   └── definitions.py  # 10개 에이전트 정의
├── prompts/          # 10개 프롬프트 (team_leader 포함)
└── tools/            # WordPress, HTML 도구

실행 흐름

SDK 방식의 핵심은 Team Leader 에이전트예요. Opus 모델로 구동되는 오케스트레이터가 각 서브에이전트를 자동으로 호출하고, 결과를 취합해요.

# main.py — 한 줄로 실행
python main.py post \
  --source confluence \
  --refs 12345

# 내부적으로:
# 1. Orchestrator가 PipelineState 생성
# 2. Team Leader(Opus)가 판단하여
#    각 에이전트에 위임
# 3. Checkpoint에서 자동/수동 승인
# 4. 완료 후 결과 리포트
# orchestrator.py (핵심 구조)
class Orchestrator:
    async def run_pipeline(self, source):
        state = PipelineState()

        # Step 1: SEO
        seo = await self.run_agent(
            "seo_strategist", source)
        state.complete("seo", seo)

        # Step 2: Research
        research = await self.run_agent(
            "researcher",
            context=seo)

        # ... 자동으로 13단계 순차 실행
        # Checkpoint에서만 일시정지

장점

  • 완전 자동화: 한 번 실행하면 끝까지 자동
  • 프로그래밍 제어: Python으로 로직을 정밀하게 제어
  • 비동기 지원: async/await로 병렬 작업 가능
  • First-class MCP: SDK 수준에서 MCP 서버 직접 연결
  • 2개 체크포인트: 이미지 선택(Step 4) + 콘텐츠 승인(Step 8)

단점

  • API 비용: 토큰 단가 적용 — Opus 사용 시 비용 상당
  • 모델 제약: 비용 때문에 Haiku/Sonnet 위주로 제한
  • 설정 복잡: MCP 서버 연결, API 키 관리 등 초기 설정 부담
  • 디버깅 어려움: 자동 실행 중 문제 발생 시 중간 개입이 어려움

📊 상태 관리 비교

두 방식 모두 같은 JSON 형식으로 상태를 저장해요. 차이는 “누가 상태를 관리하느냐”예요.

CLI: 외부 명령으로 상태 제어

# 상태 조작은 전부 CLI 명령으로
python state_cli.py start-step writing
python state_cli.py set-shared \
  html_path "blog_xxx_ko.html"
python state_cli.py complete-step writing

# 상태 확인
python state_cli.py status
# → Step 5/13: writing (completed)

장점: 중간에 사람이 개입하기 쉬워요. 특정 단계를 건너뛰거나(skip-step), 실패한 단계만 재실행할 수 있어요.

SDK: 코드 내부에서 자동 관리

# 상태는 Python 객체로 자동 관리
@dataclass
class PipelineState:
    steps: Dict[str, StepState]
    shared_data: Dict[str, Any]

    def complete(self, step, output):
        self.steps[step].status = "done"
        self.steps[step].output = output
        self.save()  # 자동 JSON 저장

장점: 코드 레벨에서 상태 전이를 보장해요. 비정상 종료 시에도 마지막 save() 지점에서 복구 가능해요.

💰 비용의 결정적 차이

결국 CLI 방식을 프로덕션으로 선택한 가장 큰 이유는 비용이에요.

시나리오SDK (API 과금)CLI (Max 구독)
1회 파이프라인 (13단계)~$5-15 (Opus 포함)$0 (구독에 포함)
월 20회 실행~$100-300$0
Writer 모델Sonnet (비용 절약)Opus (무제한)
전체 에이전트Haiku/Sonnet 혼용Sonnet + Opus 자유 선택

Claude Code Max 구독은 월 정액이라, 아무리 많이 써도 추가 비용이 없어요. SDK 방식은 API 호출당 과금이라 파이프라인 실행 횟수에 비례해서 비용이 증가해요.

🔗 트리거: OpenClaw 연동

CLI 방식의 또 다른 장점은 외부 트리거와의 연동이에요. 저희는 OpenClaw이라는 AI 에이전트 게이트웨이에서 Blog-Agent를 트리거해요:

# OpenClaw(Discord 봇)에서 트리거
claude -p "Confluence 12345 페이지로 \
  블로그 써줘. 전체 파이프라인 실행." \
  --permission-mode bypassPermissions \
  -c /path/to/project

claude -p 명령의 -p 플래그는 “Print mode” — 실행 후 자동 종료해요. --permission-mode bypassPermissions는 모든 권한 프롬프트를 생략해서 완전 무인 실행이 가능해요.

이 구조 덕분에 Discord에서 “블로그 써줘” 한 마디로 전체 파이프라인이 자동 실행돼요. 🚀

🤔 언제 어떤 방식을 쓸까?

상황추천이유
개인/소규모 블로그CLI비용 제로, Opus 무제한
팀 프로덕션SDK완전 자동, 프로그래밍 제어
디버깅/개발 중CLI단계별 실행, 건너뛰기 가능
대량 배치 처리SDKasync 병렬, 스케줄링
비용에 민감CLIMax 구독에 포함
외부 시스템 연동둘 다CLI: claude -p, SDK: Python import

저희 경우 개인 블로그(ai-girls.org)라서 CLI 방식이 최적이에요. 비용 부담 없이 Opus를 Writer에 쓸 수 있고, 문제 생기면 중간에 개입할 수 있으니까요.

📝 실전에서 배운 것

1. CLAUDE.md는 생각보다 강력해요

처음에는 “마크다운 파일로 오케스트레이션이 가능할까?” 회의적이었어요. 하지만 Claude Code가 CLAUDE.md를 충실히 따르면서, 별도 오케스트레이터 코드 없이도 복잡한 파이프라인을 실행할 수 있다는 걸 확인했어요.

2. 두 버전을 동시에 개발한 건 좋은 선택이었어요

CLI로 먼저 프로토타이핑하고, 안정화된 로직을 SDK로 포팅하는 전략이 효과적이었어요. CLI에서 발견한 프롬프트 개선점이 SDK에도 그대로 반영됐어요.

3. 비용 구조가 아키텍처를 결정해요

기술적으로는 SDK가 더 세련되지만, 월 비용 $0 vs $100-300의 차이는 아키텍처 선택에 결정적이에요. 개인 프로젝트에서는 비용 효율이 기술적 우아함보다 중요해요.


📋 다음 편 예고

마지막 4편에서는 Blog-Agent의 가장 까다로운 부분을 다룰 거예요:

  • WordPress REST API vs MCP — 어떤 걸 쓸까?
  • Polylang 다국어 연결의 삽질 역사 (REST → Gutenberg JS → post.php direct POST)
  • Playwright 브라우저 자동화로 wp-admin 제어하기
  • 한/영/일 3개 국어 동시 발행의 실전 노하우

가장 삽질이 많았던 부분이라 재미있을 거예요! 💬


Discover more from AI-Girls Lab

Subscribe to get our latest posts delivered to your inbox.


AI-Girls Lab에서 더 알아보기

지금 구독하여 계속 읽고 전체 아카이브에 액세스하세요.

계속 읽기