패턴 02. 내장 패턴 실행 플레이북 — 4가지 패턴 완전 가이드
학습 목표
이 튜토리얼을 마치면 다음을 할 수 있습니다.
- 4가지 내장 패턴(report.evidence, code.tdd, ops.triage, research.broad_to_narrow)을 직접 실행할 수 있다
- 각 패턴의 노드 흐름을 이해하고 HITL 승인 절차를 처리할 수 있다
- 실행 중 pause된 run을 resume할 수 있다
- 실행 결과 아티팩트 위치를 찾아 확인할 수 있다
사전 준비
01_concepts.md완료 (패턴 개념 이해)- euleragent 초기화 완료 (
euleragent init) - 에이전트 생성 완료 (
euleragent agent new my-agent) - 터미널 2개 준비 (실행용 + 승인용)
# 에이전트 확인
euleragent agent list
# 내장 패턴 목록 확인
euleragent pattern list
패턴 1: report.evidence — 증거 기반 보고서 작성
패턴 설명
웹 검색으로 증거를 수집하고, 초안을 작성하고, Judge로 품질을 평가하는 패턴입니다. 검색 단계에서 HITL 승인이 발생합니다.
노드 흐름도
┌─────────────────────────────────────────────────────────────────┐
│ report.evidence 패턴 흐름 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ [outline] │
│ │ 보고서 개요 작성 (llm/execute) │
│ │ when: true │
│ ▼ │
│ [gather] ◄── HITL PAUSE (web.search 승인 필요) │
│ │ 웹 검색 제안 생성 (llm/plan, force_tool=web.search) │
│ │ when: approvals_resolved │
│ ▼ │
│ [draft] │
│ │ 수집된 증거로 초안 작성 (llm/execute) │
│ │ when: true │
│ ▼ │
│ [evaluate] ──────────────── when: judge.route == finalize ─────┐
│ │ 품질 평가 (judge/evaluator_v1) │
│ │ when: judge.route == revise │
│ ▼ │
│ [revise] │
│ │ 초안 개선 (llm/execute) │
│ │ when: true │
│ └────────────────────────► [evaluate] (루프, max: 3회) │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ [FINALIZE] report.md 저장 │◄──┘
│ └──────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
단계 1: 패턴 검증
euleragent pattern validate report.evidence
예상 출력:
Validating pattern: report.evidence
Stage 1 (Schema) PASS
Stage 2 (Structural) PASS
Stage 3 (IR Analysis) PASS
Validation complete: 0 errors, 0 warnings
단계 2: 패턴 실행
euleragent pattern run report.evidence my-agent \
--task "LangChain, CrewAI, AutoGen 경쟁사 분석 보고서 작성" \
--project default
예상 출력 (gather 노드에서 pause):
[run:a3f2b1c0] Starting pattern: report.evidence
[run:a3f2b1c0] Agent: my-agent | Task: LangChain, CrewAI, AutoGen 경쟁사 분석...
✓ outline Completed — 보고서 개요 6개 섹션 생성
⏸ gather PAUSED — Waiting for HITL approval
Approval required. Run the following to review:
euleragent approve list --run-id a3f2b1c0
Resume after approval:
euleragent pattern resume a3f2b1c0 --execute
단계 3: 승인 항목 확인
euleragent approve list --run-id a3f2b1c0
예상 출력:
Pending Approvals for run: a3f2b1c0
─────────────────────────────────────────────────
Node: gather
#1 web.search "LangChain framework features 2024"
#2 web.search "CrewAI multi-agent framework overview"
#3 web.search "AutoGen Microsoft agent framework comparison"
#4 web.search "AI agent framework benchmark 2024"
#5 web.search "LangChain vs CrewAI vs AutoGen comparison"
5 tool calls pending approval.
단계 4: 일괄 승인 및 실행
euleragent approve accept-all --run-id a3f2b1c0 --execute
예상 출력:
Accepted 5 tool calls for run: a3f2b1c0
Executing approved tool calls...
web.search "LangChain framework features 2024" OK (12 results)
web.search "CrewAI multi-agent framework overview" OK (8 results)
web.search "AutoGen Microsoft agent framework comparison" OK (11 results)
web.search "AI agent framework benchmark 2024" OK (9 results)
web.search "LangChain vs CrewAI vs AutoGen comparison" OK (15 results)
All tool calls executed. Resuming pattern run...
단계 5: 패턴 재개
euleragent pattern resume a3f2b1c0 --execute
예상 출력:
[run:a3f2b1c0] Resuming from: gather → draft
✓ gather Completed — 5 web searches executed
✓ draft Completed — 2,847 words draft generated
✓ evaluate Completed — score: 0.78 → route: revise
✓ revise Completed — draft improved, added citations
✓ evaluate Completed — score: 0.91 → route: finalize
✓ finalize Completed — report.md saved
Run a3f2b1c0 completed successfully.
Artifact: .euleragent/runs/a3f2b1c0/artifacts/report.md
단계 6: 결과물 확인
# 아티팩트 경로
cat .euleragent/runs/a3f2b1c0/artifacts/report.md
# 실행 로그 확인
euleragent logs --run-id a3f2b1c0
# 이벤트 스트림 확인
cat .euleragent/runs/a3f2b1c0/pattern_events.jsonl | head -20
아티팩트 디렉토리 구조:
.euleragent/runs/a3f2b1c0/
├── input.json # 실행 입력 (task, agent, pattern)
├── messages.jsonl # 전체 LLM 메시지 이력
├── tool_calls.jsonl # 모든 도구 호출 기록
├── approvals.jsonl # HITL 승인 기록
├── pattern_events.jsonl # 패턴 상태 전환 이벤트
└── artifacts/
└── report.md # 최종 결과물
패턴 2: code.tdd — 테스트 주도 개발
패턴 설명
설계 → 테스트 작성(HITL) → 구현 → 테스트 실행(HITL) → 평가 → 수정/완료 흐름으로 TDD를 구현합니다. 파일 쓰기와 쉘 실행에 HITL이 발생합니다.
노드 흐름도
┌─────────────────────────────────────────────────────────────────┐
│ code.tdd 패턴 흐름 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ [design] │
│ │ API 설계 및 테스트 케이스 계획 (llm/execute) │
│ │ when: true │
│ ▼ │
│ [write_tests] ◄── HITL PAUSE (file.write 승인 필요) │
│ │ 테스트 파일 작성 제안 (llm/plan, force_tool=file.write) │
│ │ when: approvals_resolved │
│ ▼ │
│ [implement] │
│ │ 구현 코드 작성 (llm/execute) │
│ │ when: true │
│ ▼ │
│ [run_tests] ◄── HITL PAUSE (shell.exec 승인 필요) │
│ │ 테스트 실행 제안 (llm/plan, force_tool=shell.exec) │
│ │ when: approvals_resolved │
│ ▼ │
│ [evaluate] ─────────────── when: judge.route == finalize ──────┐
│ │ 코드 품질 평가 (judge/evaluator_v1) │
│ │ when: judge.route == fix │
│ ▼ │
│ [fix] │
│ │ 버그 수정 (llm/execute) │
│ └────────────────────────► [run_tests] (루프, max: 3회) │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ [FINALIZE] implementation.py + tests.py 저장 │◄──┘
│ └──────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
단계 1: 검증 및 실행
euleragent pattern validate code.tdd
euleragent pattern run code.tdd my-agent \
--task "Python으로 add(a, b) 함수 TDD로 구현. 엣지 케이스(None, 문자열, 오버플로우) 포함." \
--project default
예상 출력 (write_tests에서 첫 번째 pause):
[run:b7e4d2f1] Starting pattern: code.tdd
✓ design Completed — API spec and 8 test cases planned
⏸ write_tests PAUSED — Waiting for HITL approval (file.write)
Approval required:
euleragent approve list --run-id b7e4d2f1
단계 2: 테스트 파일 작성 승인
euleragent approve list --run-id b7e4d2f1
예상 출력:
Pending Approvals for run: b7e4d2f1
─────────────────────────────────────────────────
Node: write_tests
#1 file.write path=tests/test_calculator.py
Content preview:
import pytest
from calculator import add
def test_add_integers():
assert add(1, 2) == 3
def test_add_with_none():
with pytest.raises(TypeError):
add(None, 1)
[... 47 more lines]
1 file write pending approval.
euleragent approve accept-all --run-id b7e4d2f1 --execute
euleragent pattern resume b7e4d2f1 --execute
두 번째 pause (run_tests에서):
[run:b7e4d2f1] Resuming from: write_tests → implement
✓ write_tests Completed — tests/test_calculator.py written
✓ implement Completed — calculator.py implemented
⏸ run_tests PAUSED — Waiting for HITL approval (shell.exec)
단계 3: 테스트 실행 승인
euleragent approve list --run-id b7e4d2f1
#1 shell.exec cmd="python -m pytest tests/test_calculator.py -v"
cwd="./"
1 shell command pending approval.
euleragent approve accept-all --run-id b7e4d2f1 --execute
euleragent pattern resume b7e4d2f1 --execute
예상 최종 출력:
✓ run_tests Completed — pytest: 8 passed, 0 failed
✓ evaluate Completed — score: 0.92 → route: finalize
✓ finalize Completed
Artifacts:
.euleragent/runs/b7e4d2f1/artifacts/implementation.py
.euleragent/runs/b7e4d2f1/artifacts/tests.py
패턴 3: ops.triage — 운영 티켓 분류
패턴 설명
운영 티켓을 분류하고, 해결책 초안을 작성하고(HITL), 품질을 평가하는 짧고 빠른 패턴입니다. 웹 검색 없이 LLM 지식만으로 동작합니다.
노드 흐름도
┌─────────────────────────────────────────────────────────────────┐
│ ops.triage 패턴 흐름 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ [classify] │
│ │ 티켓 분류 및 우선순위 결정 (llm/execute) │
│ │ when: true │
│ ▼ │
│ [draft] ◄── HITL PAUSE (file.write 승인 필요) │
│ │ 해결책 초안 작성 (llm/plan, force_tool=file.write) │
│ │ when: approvals_resolved │
│ ▼ │
│ [evaluate] ──────────── when: judge.route == finalize ─────────┐
│ │ 해결책 품질 평가 (judge/evaluator_v1) │
│ │ when: judge.route == revise │
│ ▼ │
│ [revise] │
│ │ 해결책 개선 (llm/execute) │
│ └────────────────────────► [evaluate] (루프, max: 2회) │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ [FINALIZE] triage_report.md 저장 │◄──┘
│ └──────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
단계 1: 검증 및 실행
euleragent pattern validate ops.triage
euleragent pattern run ops.triage my-agent \
--task "고객 지원 티켓: 로그인 타임아웃 오류 발생. 사용자 보고: '30분마다 자동 로그아웃됨, 업무 중단'. 시스템: Django + Redis 세션." \
--project default
예상 출력 (draft에서 pause):
[run:c1a8e3b5] Starting pattern: ops.triage
✓ classify Completed
Priority: HIGH | Category: Authentication/Session
Impact: Medium (multiple users affected)
⏸ draft PAUSED — Waiting for HITL approval (file.write)
단계 2: 초안 파일 승인
euleragent approve list --run-id c1a8e3b5
#1 file.write path=triage/login_timeout_resolution.md
Content preview:
# 티켓 해결책: 로그인 타임아웃 오류
## 원인 분석
Django 세션 타임아웃 설정이 기본값(30분)으로 설정되어 있음
Redis 세션 백엔드 연결 불안정 가능성
## 즉시 조치
1. settings.py SESSION_COOKIE_AGE 값 확인
[... 32 more lines]
euleragent approve accept-all --run-id c1a8e3b5 --execute
euleragent pattern resume c1a8e3b5 --execute
예상 최종 출력:
✓ draft Completed — triage/login_timeout_resolution.md written
✓ evaluate Completed — score: 0.89 → route: finalize
✓ finalize Completed
Artifact: .euleragent/runs/c1a8e3b5/artifacts/triage_report.md
Run time: 47 seconds
패턴 4: research.broad_to_narrow — 광범위→심층 연구
패턴 설명
먼저 넓게 조사하고(web.search), 주제를 클러스터링하고, 갭을 찾아 심층 조사하고, 종합하는 연구 패턴입니다. Judge가 더 좁은 조사가 필요하면 narrow_search로 다시 보냅니다.
노드 흐름도
┌─────────────────────────────────────────────────────────────────┐
│ research.broad_to_narrow 패턴 흐름 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ [broad_search] ◄── HITL PAUSE (web.search, 5개 이상) │
│ │ 광범위 웹 검색 (llm/plan, force_tool=web.search) │
│ │ when: approvals_resolved │
│ ▼ │
│ [cluster_gaps] │
│ │ 주제 클러스터링, 갭 식별 (llm/execute) │
│ │ when: true │
│ ▼ │
│ [narrow_search] ◄── HITL PAUSE (web.search, 갭 집중) ◄──────┐
│ │ 갭 대상 심층 검색 (llm/plan, force_tool=web.search) │
│ │ when: approvals_resolved │
│ ▼ │
│ [synthesize] │
│ │ 연구 결과 종합 (llm/execute) │
│ │ when: true │
│ ▼ │
│ [evaluate] ───── when: judge.route == finalize ────────────────┐
│ │ 연구 완결성 평가 (judge/evaluator_v1) │
│ ├── when: judge.route == narrow_search ────────────────────►┘
│ │ (더 좁은 조사 필요) │
│ │ when: judge.route == refine │
│ ▼ │
│ [refine] │
│ │ 종합문 개선 (llm/execute) │
│ └────────────────────────► [evaluate] (루프, max: 3회) │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ [FINALIZE] research_report.md 저장 │◄──┘
│ └──────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
단계 1: 검증 및 실행
euleragent pattern validate research.broad_to_narrow
euleragent pattern run research.broad_to_narrow my-agent \
--task "AI 에이전트의 장기기억 메커니즘 연구. RAG, 벡터 DB, 메모리 압축, 에피소딕 메모리를 포함할 것." \
--project default
예상 출력 (broad_search에서 첫 pause):
[run:d4f9c2a7] Starting pattern: research.broad_to_narrow
⏸ broad_search PAUSED — Waiting for HITL approval (web.search × 7)
단계 2: 넓은 검색 승인
euleragent approve list --run-id d4f9c2a7
#1 web.search "AI agent long-term memory mechanisms 2024"
#2 web.search "RAG retrieval augmented generation agent memory"
#3 web.search "vector database agent memory LlamaIndex LangChain"
#4 web.search "episodic memory artificial intelligence agents"
#5 web.search "memory compression summarization LLM agents"
#6 web.search "agent memory benchmark evaluation"
#7 web.search "cognitive architecture memory AI 2024"
7 tool calls pending approval.
euleragent approve accept-all --run-id d4f9c2a7 --execute
euleragent pattern resume d4f9c2a7 --execute
narrow_search에서 두 번째 pause:
✓ broad_search Completed — 7 searches, 73 results collected
✓ cluster_gaps Completed — 4 clusters, 3 gaps identified
Gaps: [메모리 압축 알고리즘 구체적 비교, 실시간 메모리 업데이트, 멀티에이전트 메모리 공유]
⏸ narrow_search PAUSED — Waiting for HITL approval (web.search × 5)
euleragent approve accept-all --run-id d4f9c2a7 --execute
euleragent pattern resume d4f9c2a7 --execute
예상 최종 출력:
✓ narrow_search Completed — 5 targeted searches
✓ synthesize Completed — 4,312 words synthesis generated
✓ evaluate Completed — score: 0.88 → route: finalize
✓ finalize Completed
Artifact: .euleragent/runs/d4f9c2a7/artifacts/research_report.md
스트리밍 모드 실행
--stream 플래그를 사용하면 각 노드의 진행 상황을 실시간으로 확인할 수 있습니다.
euleragent pattern run research.broad_to_narrow my-agent \
--task "AI 에이전트의 장기기억 메커니즘 연구" \
--project default \
--stream
스트리밍 출력 예시:
[event] pattern.start {pattern: research.broad_to_narrow, run_id: e5a1d3c9}
[event] node.start {node: broad_search, kind: llm}
[event] node.hitl {node: broad_search, pending: 7}
[event] node.pause {node: broad_search, reason: hitl_pending}
...
[event] hitl.resolved {node: broad_search, accepted: 7, rejected: 0}
[event] node.resume {node: broad_search}
[event] tool.call {tool: web.search, query: "AI agent long-term memory..."}
[event] tool.result {tool: web.search, results: 12}
...
[event] node.complete {node: broad_search}
[event] edge.traverse {from: broad_search, to: cluster_gaps, when: approvals_resolved}
[event] node.start {node: cluster_gaps, kind: llm}
공통 운영 명령
run-id 확인
# 최근 실행 목록
euleragent runs list
# 특정 run 상태 확인
euleragent runs status <run-id>
# pause된 run 목록만
euleragent runs list --status paused
개별 승인/거절
전체 일괄 승인 대신 개별 처리:
# 특정 항목 수락
euleragent approve accept --run-id <id> --item 1 --item 3
# 특정 항목 거절 (사유 포함)
euleragent approve reject --run-id <id> --item 2 --reason "관련성 낮은 쿼리"
# 수락 후 즉시 실행
euleragent approve accept --run-id <id> --item 1 --execute
실행 취소
euleragent runs cancel <run-id>
흔한 오류와 해결법
오류 1: Agent not found
Error: Agent 'my-agent' not found in workspace
해결: euleragent agent new my-agent로 에이전트를 먼저 생성합니다.
오류 2: run-id expired
Error: Run 'a3f2b1c0' not found or expired
해결: euleragent runs list로 활성 run 목록을 확인합니다. 실행이 너무 오래 pause 상태면 만료될 수 있습니다.
오류 3: resume에 --execute 없이 실행
euleragent pattern resume a3f2b1c0
Run a3f2b1c0 is ready to resume. Add --execute to actually run.
(Dry-run mode: showing what would happen next)
Next step: draft → evaluate (when: true)
--execute 없이 실행하면 dry-run 모드로 동작합니다. 실제 실행하려면 --execute를 추가하세요.
오류 4: 이미 완료된 run을 resume
Error: Run 'a3f2b1c0' is already in 'completed' state. Cannot resume.
해결: 새 실행을 시작하거나 euleragent runs list로 상태를 확인합니다.
다음 단계
4가지 내장 패턴을 모두 실행해봤습니다. 이제 직접 패턴을 만들어볼 차례입니다.
- 다음 튜토리얼: 03_simple_linear.md — 가장 단순한 3-노드 선형 패턴을 처음부터 작성합니다
- Judge 루프 이해: 04_judge_and_loop.md — evaluate-revise 루프를 직접 설계합니다