09. 3-Tier LLM 전략: OpenAI × Ollama × Gemini로 비용 90% 절감하기
학습 목표
이 튜토리얼을 마치면 다음을 할 수 있습니다:
- workspace.yaml에 OpenAI, Ollama, Gemini 3개 외부/로컬 LLM 프로필을 설정한다
--llm-plan(OpenAI)으로 고품질 계획을,--llm-final(Gemini)으로 최종 결과물을 생성한다- 중간 실행(다수 호출)을 로컬 Ollama에 위임하여 비용을 90% 이상 절감한다
is_external플래그와 HITL 승인 워크플로우를 이해한다- 폴백-never-abort 정책을 체험한다 (외부 LLM 미승인 → 로컬 폴백, 런은 계속 진행)
- 감사 로그에서 프로필별 호출 이력과 비용을 추적한다
사전 준비
- 워크스페이스 초기화 완료 (
euleragent init) - 02_plan_execute_mode.md의 Plan/Execute 모드 이해
- 03_hitl_approval.md의 HITL 승인 워크플로우 이해
- 에이전트 생성:
euleragent new market-analyst --template personal-assistant
- Ollama 실행 중 (
ollama serve) - OpenAI API 키 — 없어도 폴백 동작을 실습할 수 있습니다
- Gemini API 키 — 없어도 폴백 동작을 실습할 수 있습니다
Step 1: 왜 3-Tier LLM 전략이 필요한가?
에이전트 태스크의 비용 구조
에이전트가 "AI 시장 분석 보고서"를 작성한다고 해봅시다. 전체 과정에서 LLM 호출이 몇 번 발생할까요?
┌─────────────────────────────────────────────────────┐
│ 에이전트 실행 흐름과 LLM 호출 횟수 │
├───────────────────┬──────────────┬──────────────────┤
│ 계획 수립 (Plan) │ 중간 실행 │ 최종 다듬기 │
│ 1회 호출 │ 5~10회 호출 │ 1~2회 호출 │
│ ■ │ ■■■■■■■■■■ │ ■■ │
│ "전체 구조 설계" │ "도구호출, │ "최종 보고서 │
│ │ 초안 작성, │ 정리" │
│ │ 수정 반복" │ │
└───────────────────┴──────────────┴──────────────────┘
↑ 이 부분이 가장 많다!
| 단계 | LLM 호출 수 | 역할 | 필요 품질 |
|---|---|---|---|
| 계획 수립 | 1회 | 전체 구조 설계, 단계 분해 | 높음 — 계획이 좋아야 결과가 좋다 |
| 중간 실행 | 5~10회 | 도구 호출, 초안 생성, 반복 수정 | 보통 — 구조만 따르면 충분 |
| 최종 결과물 | 1~2회 | 최종 보고서 정리, 문체 다듬기 | 높음 — 최종 품질 결정 |
핵심 통찰: 중간 실행이 전체 호출의 70~80%를 차지하지만, 여기에 고가 외부 LLM을 사용할 필요가 없습니다. 로컬 Ollama로 충분합니다.
3-Tier 전략의 비용 비교
| 전략 | 계획 (1회) | 중간 (8회) | 최종 (2회) | 총 비용 |
|---|---|---|---|---|
| 전부 외부 LLM | $0.03 | $0.24 | $0.06 | $0.33 |
| 전부 로컬 Ollama | $0 | $0 | $0 | $0 (품질↓) |
| 3-Tier 전략 | $0.03 (OpenAI) | $0 (Ollama) | $0.02 (Gemini) | $0.05 |
결론: 비용의 대부분을 차지하는 중간 실행만 로컬로 전환해도 85% 이상 비용 절감이 가능합니다. 계획과 최종 결과물의 품질은 그대로 유지됩니다.
euleragent의 스코프 모델
euleragent는 두 가지 스코프로 LLM 프로필을 라우팅합니다:
┌──────────────────────────────────────────┐
│ 스코프 라우팅 │
├──────────────────┬───────────────────────┤
│ plan 스코프 │ final 스코프 │
│ --llm-plan │ --llm-final │
│ mode=plan 실행 │ mode=execute 실행 │
│ │ │
│ "무엇을 할지 │ "실제로 수행하고 │
│ 설계한다" │ 결과물을 만든다" │
└──────────────────┴───────────────────────┘
│ │
지정 안 하면 지정 안 하면
default_llm_profile default_llm_profile
(로컬 Ollama) (로컬 Ollama)
3-Tier 전략은 이 모델 위에서 3단계 실행으로 구현됩니다:
Phase 1: plan mode + --llm-plan openai_main → OpenAI (고품질 계획)
Phase 2: execute mode (프로필 미지정) → Ollama (저비용 대량 실행)
Phase 3: execute mode + --llm-final gemini_flash → Gemini (고품질 최종본)
Step 2: workspace.yaml에 3개 프로필 설정
프로필 구성
# .euleragent/config/workspace.yaml
llm_profiles:
# 1. 로컬 Ollama — 기본 프로필 (무료, 승인 불필요)
ollama_local:
provider: ollama
base_url: http://localhost:11434
model: qwen3:32b
timeout_seconds: 120
is_external: false
# 2. OpenAI GPT-4o — 계획 수립 전용 (유료, 승인 필요)
openai_planner:
provider: openai
base_url: https://api.openai.com/v1
api_key: ${OPENAI_API_KEY}
model: gpt-4o
is_external: true
# 3. Gemini Flash — 최종 결과물 전용 (유료, 승인 필요)
gemini_final:
provider: openai # OpenAI-compatible SDK 사용
base_url: https://generativelanguage.googleapis.com/v1beta/openai/
api_key: ${GEMINI_API_KEY}
model: gemini-2.0-flash
is_external: true
# 기본값은 항상 로컬 Ollama
default_llm_profile: ollama_local
설정 필드 설명
| 필드 | 설명 |
|---|---|
| (dict 키) | 프로필 고유 이름 — CLI에서 --llm-plan openai_planner처럼 참조 |
provider |
ollama 또는 openai (OpenAI SDK로 모든 OpenAI-compatible 엔드포인트 지원) |
base_url |
LLM API endpoint (Gemini, Perplexity도 base_url만 다름) |
api_key |
${환경변수} 보간 권장 — workspace.yaml에 직접 입력 금지 |
model |
프로바이더별 모델명 |
is_external |
true: 외부 서비스, HITL 승인 필요 / false: 로컬, 승인 불필요 |
provider: openai의 의미: "OpenAI만 됨"이 아닙니다. OpenAI Python SDK를 사용하여 OpenAI-compatible API를 호출한다는 뜻입니다.base_url만 바꾸면 Gemini, Perplexity, Azure OpenAI, vLLM 등 무엇이든 연결됩니다.
환경변수 설정
# OpenAI API 키
export OPENAI_API_KEY="sk-proj-YOUR_KEY_HERE"
# Gemini API 키
export GEMINI_API_KEY="AIza-YOUR_KEY_HERE"
보안:
workspace.yaml에 API 키를 직접 입력하지 마세요.${OPENAI_API_KEY}구문으로 런타임에 환경변수에서 읽습니다.
Step 3: 외부 프로필 승인 — 사전 준비
is_external: true인 프로필은 반드시 HITL 승인이 필요합니다. 먼저 승인 없이 실행해서 폴백 동작을 확인한 후, 승인 절차를 진행합니다.
3.1 — 승인 없이 실행 (폴백 확인)
euleragent run market-analyst \
--task "AI 시장 분석 보고서 작성" \
--mode plan \
--llm-plan openai_planner
[run] Starting plan mode for market-analyst
[run] LLM plan scope: profile 'openai_planner' (is_external=true)
[run] ⚠ External profile 'openai_planner' requires approval. Falling back to local default.
[approval] Created: kind=llm_profile_enable, tool=llm.external_call, profile=openai_planner
[llm] Generating plan with default provider (ollama_local)...
[run] Plan generated: plan.md (523 tokens)
[run] Run finalized: a1b2c3d4
핵심 동작:
1. openai_planner가 is_external: true → 승인 필요
2. 승인 없음 → 로컬 Ollama로 폴백 (런은 계속 진행!)
3. kind: llm_profile_enable 승인 레코드 자동 생성
폴백-never-abort 원칙: euleragent는 외부 LLM 미승인이라고 해서 절대 실행을 중단하지 않습니다. 로컬 기본 프로필로 폴백하여 결과를 생성하고, 승인을 기다립니다.
3.2 — 대기 중인 승인 확인
euleragent approve show
Pending Approvals:
ID KIND TOOL PROFILE RISK STATUS
ap_001 llm_profile_enable llm.external_call openai_planner high pending
3.3 — 승인 레코드 상세 확인
euleragent approve show ap_001
{
"id": "ap_001",
"kind": "llm_profile_enable",
"tool_name": "llm.external_call",
"tool_params": {
"scope": "plan",
"profile": "openai_planner",
"provider": "openai",
"model": "gpt-4o"
},
"risk_level": "high",
"side_effects": ["External LLM call"],
"status": "pending"
}
이 승인이 필요한 이유: - 데이터 유출: 태스크 설명과 에이전트 컨텍스트가 외부 서비스(api.openai.com)로 전송됨 - 비용 발생: 외부 API 호출에 과금 - 감사 추적: 어떤 데이터가 외부로 나갔는지 기록 필수
3.4 — 두 외부 프로필 일괄 승인
Gemini 프로필도 한 번 실행하여 승인 레코드를 생성합니다:
euleragent run market-analyst \
--task "테스트" \
--mode execute \
--llm-final gemini_final
[run] ⚠ External profile 'gemini_final' requires approval. Falling back to local default.
[approval] Created: kind=llm_profile_enable, tool=llm.external_call, profile=gemini_final
이제 두 외부 프로필에 대한 승인을 한 번에 처리합니다:
euleragent approve accept-all --tool llm.external_call --actor "user:you"
Batch accepted: 2 approval(s)
ap_001: llm_profile_enable (openai_planner)
ap_002: llm_profile_enable (gemini_final)
accept-all --tool:llm.external_call도구에 대한 승인만 일괄 수락합니다.file.write,web.search등 다른 도구의 승인은 영향받지 않습니다.
Step 4: Phase 1 — OpenAI로 고품질 계획 수립
이제 승인이 완료되었으니, 3-Tier 전략을 실행합니다.
실행
euleragent run market-analyst \
--task "2026년 AI 에이전트 시장 분석 보고서를 작성하라. 시장 규모, 주요 플레이어, 기술 트렌드, 리스크 요인을 포함하고, 최종적으로 투자 시사점을 도출하라." \
--mode plan \
--llm-plan openai_planner
예상 출력
[run] Starting plan mode for market-analyst
[run] LLM plan scope: profile 'openai_planner' (is_external=true)
[run] ✓ Using approved profile 'openai_planner' for plan scope
[llm] Generating plan with openai_planner (gpt-4o)...
[run] Plan generated: 1 file(s)
└─ plan.md (1847 tokens)
[run] Run finalized: p1_abc123
──────────────────────────────────────
Phase 1 완료
Profile: openai_planner (gpt-4o)
LLM 호출: 1회
비용: ~$0.03 (입력 1.2K + 출력 1.8K tokens)
──────────────────────────────────────
생성된 계획 확인
cat .euleragent/runs/p1_abc123/artifacts/plan.md
# AI 에이전트 시장 분석 보고서 — 실행 계획
## 1. 시장 규모 조사
- 글로벌 AI 에이전트 시장 규모 (2024-2030 전망)
- 세그먼트별 분석 (엔터프라이즈, 소비자, 개발자 도구)
## 2. 주요 플레이어 분석
- 빅테크 (OpenAI, Google, Anthropic, Microsoft)
- 스타트업 (Cognition, Adept, Imbue, ...)
- 오픈소스 진영 (LangChain, CrewAI, AutoGen)
## 3. 기술 트렌드
- 에이전트 프레임워크 진화 (ReAct → Plan-and-Execute → Multi-Agent)
- 도구 사용(Tool Use) 표준화
- 장기 메모리와 상태 관리
## 4. 리스크 요인
- 규제 불확실성 (EU AI Act, 미국 행정명령)
- 환각(Hallucination) 문제와 신뢰성
- 비용 구조와 수익 모델
## 5. 투자 시사점
- 유망 투자 영역
- 리스크 대비 전략
포인트: GPT-4o가 만든 계획은 구조가 체계적이고 세부 항목이 구체적입니다. 이 계획이 이후 Ollama 실행의 "네비게이션"이 됩니다.
Step 5: Phase 2 — Ollama로 대량 실행 (비용 $0)
계획이 수립되었으니, 실제 집필은 로컬 Ollama가 담당합니다. 프로필 플래그를 지정하지 않으면 default_llm_profile: ollama_local이 사용됩니다.
실행
euleragent run market-analyst \
--task "위 계획에 따라 AI 에이전트 시장 분석 보고서 초안을 작성하라. 각 섹션을 3문단 이상으로 상세히 서술하라." \
--mode execute \
--max-loops 5
예상 출력
[run] Starting execute mode for market-analyst
[run] No scoped profile → using default provider (ollama_local)
[llm] Loop 1: Generating initial draft with ollama_local (qwen3:32b)...
[tool] file.write → draft_report.md (waiting approval)
[approval] Created: tool_call, file.write
...
[llm] Loop 2: Revising section 1 with ollama_local...
[llm] Loop 3: Adding section 2 data with ollama_local...
[llm] Loop 4: Completing sections 3-4 with ollama_local...
[llm] Loop 5: Finalizing section 5 with ollama_local...
[run] Artifacts: draft_report.md (4200 tokens)
[run] Run finalized: p2_def456
──────────────────────────────────────
Phase 2 완료
Profile: ollama_local (qwen3:32b)
LLM 호출: 5회 (도구 호출 포함 총 8회 상호작용)
비용: $0.00 (로컬 LLM — 완전 무료)
──────────────────────────────────────
핵심 관찰
Phase 2에서 발생한 LLM 호출:
Loop 1: 초안 구조 생성 ← Ollama ($0)
Loop 2: 섹션 1 수정/보강 ← Ollama ($0)
Loop 3: 섹션 2 데이터 추가 ← Ollama ($0)
Loop 4: 섹션 3-4 완성 ← Ollama ($0)
Loop 5: 섹션 5 마무리 ← Ollama ($0)
─────────────────────────────
합계: 5회 호출 × $0 = $0.00
만약 전부 GPT-4o였다면:
합계: 5회 × ~$0.03 = $0.15
이 단계가 전체 비용의 70~80%를 차지합니다. 로컬 Ollama를 사용하면 이 비용이 0입니다.
로컬 Ollama의 장점: - 비용 $0 — 몇 번이든 무료 - 빠른 반복 — 네트워크 지연 없음 (로컬에서 3~8초/응답) - 데이터 보안 — 민감한 내용이 외부로 나가지 않음 - 오프라인 가능 — 네트워크 없이도 실행
Step 6: Phase 3 — Gemini로 최종 다듬기
초안이 완성되었으니, 최종 다듬기는 Gemini Flash가 담당합니다.
실행
euleragent run market-analyst \
--task "기존 초안(draft_report.md)을 전문 투자 리서치 보고서 수준으로 다듬어라. 문장을 간결하게 하고, 데이터 기반 근거를 보강하며, 투자 시사점 섹션을 강화하라." \
--mode execute \
--llm-final gemini_final
예상 출력
[run] Starting execute mode for market-analyst
[run] LLM final scope: profile 'gemini_final' (is_external=true)
[run] ✓ Using approved profile 'gemini_final' for final scope
[llm] Generating final deliverable with gemini_final (gemini-2.0-flash)...
[tool] file.write → final_report.md (waiting approval)
...
[run] Artifacts: final_report.md (5100 tokens)
[run] Run finalized: p3_ghi789
──────────────────────────────────────
Phase 3 완료
Profile: gemini_final (gemini-2.0-flash)
LLM 호출: 2회
비용: ~$0.02 (입력 4.2K + 출력 5.1K tokens)
──────────────────────────────────────
최종 결과 확인
# Phase 2 초안 vs Phase 3 최종본 비교
wc -w .euleragent/runs/p2_def456/artifacts/draft_report.md
# → 약 2500단어
wc -w .euleragent/runs/p3_ghi789/artifacts/final_report.md
# → 약 3200단어 (보강된 내용 포함)
Gemini Flash를 선택한 이유: - GPT-4o 대비 50~70% 저렴하면서 품질은 유사 - 긴 문서 처리에 강함 (100만 토큰 컨텍스트) - OpenAI-compatible API로 설정이 간단 (
base_url만 변경)
Step 7: 비용 분석 — 실제 비용 절감 확인
감사 로그로 비용 추적
각 Phase의 input.json에서 프로필 정보를 확인합니다:
# Phase 1 — OpenAI 사용 확인
python -m json.tool .euleragent/runs/p1_abc123/input.json
{
"agent": "market-analyst",
"task": "2026년 AI 에이전트 시장 분석 보고서...",
"mode": "plan",
"llm_plan_profile": "openai_planner"
}
# Phase 2 — Ollama 사용 확인 (프로필 미지정 = 기본값)
python -m json.tool .euleragent/runs/p2_def456/input.json
{
"agent": "market-analyst",
"task": "위 계획에 따라...",
"mode": "execute"
}
llm_plan_profile/llm_final_profile 필드가 없으면 기본 프로필(Ollama)이 사용된 것입니다.
# Phase 3 — Gemini 사용 확인
python -m json.tool .euleragent/runs/p3_ghi789/input.json
{
"agent": "market-analyst",
"task": "기존 초안을 다듬어라...",
"mode": "execute",
"llm_final_profile": "gemini_final"
}
비용 종합
┌──────────────────────────────────────────────────────────────┐
│ 3-Tier 전략 비용 분석 │
├─────────┬───────────────┬──────────┬──────────┬──────────────┤
│ Phase │ 프로필 │ LLM 호출 │ 비용 │ 비고 │
├─────────┼───────────────┼──────────┼──────────┼──────────────┤
│ 1.계획 │ openai_planner│ 1회 │ $0.03 │ 고품질 계획 │
│ 2.실행 │ ollama_local │ 5회 │ $0.00 │ 저비용 핵심! │
│ 3.마무리│ gemini_final │ 2회 │ $0.02 │ 고품질 최종본 │
├─────────┼───────────────┼──────────┼──────────┼──────────────┤
│ 합계 │ │ 8회 │ $0.05 │ │
└─────────┴───────────────┴──────────┴──────────┴──────────────┘
비교: 전부 GPT-4o였다면 → 8회 × $0.03 = $0.24
비교: 전부 Ollama였다면 → 8회 × $0.00 = $0.00 (품질↓)
3-Tier 절감율: ($0.24 - $0.05) / $0.24 = 79% 절감
규모가 커지면 차이는 극대화됩니다. 100개 태스크를 돌린다면: - 전부 외부 LLM: 800회 × $0.03 = $24.00 - 3-Tier 전략: 계획 100회($3) + 실행 500회($0) + 마무리 200회($4) = $7.00 (71% 절감) - 실행 비율이 높은 복잡한 태스크일수록 절감율이 90% 이상까지 올라갑니다.
Step 8: 승인 워크플로우 상세
8.1 — --edit-params로 승인 시 프로필 변경
관리자가 비용을 고려하여, 요청된 프로필을 더 저렴한 프로필로 변경해서 승인할 수 있습니다.
# 팀원이 GPT-4o를 요청했지만...
euleragent run market-analyst \
--task "경쟁사 분석" --mode plan --llm-plan openai_planner
# → ap_010 승인 대기 (openai_planner 요청)
# 관리자가 Gemini Flash로 변경하여 승인 (더 저렴)
euleragent approve accept ap_010 \
--actor "user:you" \
--edit-params '{"profile": "gemini_final"}'
Accepted (with edits): ap_010
Original Profile: openai_planner (gpt-4o)
Applied Profile: gemini_final (gemini-2.0-flash)
재실행 시 변경된 프로필이 적용됩니다:
euleragent run market-analyst \
--task "경쟁사 분석" --mode plan --llm-plan openai_planner
[run] ✓ Using approved profile 'gemini_final' for plan scope (edited from 'openai_planner')
감사 추적: 승인 레코드에 원래 요청(
tool_params.profile)과 변경 후(final_params.profile)가 모두 기록됩니다.
8.2 — 승인 거부 시 동작
euleragent approve deny ap_011
거부된 프로필은 사용되지 않으며, 새 실행 시 다시 새로운 승인 레코드가 생성됩니다. 런은 절대 중단되지 않습니다 — 항상 로컬로 폴백합니다.
Step 9: Dynamic 모드로 자동화 (2-Tier 변형)
3번의 별도 실행 대신 Dynamic 모드를 사용하면, OpenAI가 계획을 세우고 Ollama가 자동으로 실행합니다.
Dynamic 모드의 실행 흐름
--dynamic --llm-plan openai_planner
│
▼
1. system.plan_workflow 호출 ← openai_planner (GPT-4o)
"워크플로우를 3단계로 설계"
│
▼
2. Phase 0: 시장 조사 ← ollama_local (기본 프로필)
│
▼
3. Phase 1: 초안 작성 ← ollama_local (기본 프로필)
│
▼
4. Phase 2: 리뷰/수정 ← ollama_local (기본 프로필)
실행
euleragent run market-analyst \
--task "2026년 AI 에이전트 시장 분석 보고서 작성" \
--mode plan \
--dynamic \
--llm-plan openai_planner \
--max-loops 10
예상 출력
[run] Starting dynamic workflow for market-analyst
[run] LLM plan scope: openai_planner → system.plan_workflow에만 적용
# 워크플로우 설계 — OpenAI
[llm:plan] Generating workflow with openai_planner (gpt-4o)...
[workflow] 3 phases planned:
Phase 0: Market Research (plan mode)
Phase 1: Draft Report (execute mode)
Phase 2: Quality Review (plan mode)
# 각 phase — 기본 Ollama
[phase:0] Running 'Market Research' with default provider (ollama_local)
[phase:1] Running 'Draft Report' with default provider (ollama_local)
[phase:2] Running 'Quality Review' with default provider (ollama_local)
[run] Dynamic workflow completed: dyn_jkl012
Dynamic 모드 비용
| 단계 | 프로필 | 호출 수 | 비용 |
|---|---|---|---|
| system.plan_workflow | openai_planner (GPT-4o) | 1회 | $0.03 |
| Phase 0~2 | ollama_local | 6~8회 | $0.00 |
| 합계 | 7~9회 | $0.03 |
2-Tier vs 3-Tier: Dynamic 모드는 Gemini 최종 다듬기 단계가 없어 비용은 더 낮지만, 최종 품질은 3-Tier보다 떨어질 수 있습니다. 용도에 따라 선택하세요.
Step 10: agent.yaml 프로필 오버라이드와 우선순위
에이전트별로 기본 LLM 프로필을 다르게 설정할 수 있습니다.
agent.yaml 설정
# .euleragent/agents/market-analyst/agent.yaml
name: market-analyst
template: personal-assistant
llm:
profile: ollama_local # 이 에이전트의 기본 프로필
# .euleragent/agents/premium-writer/agent.yaml
name: premium-writer
template: marketing-expert
llm:
profile: openai_planner # 이 에이전트는 항상 OpenAI 사용
우선순위
1. CLI 옵션: --llm-plan / --llm-final (최우선)
▼
2. agent.yaml: llm.profile (에이전트별 기본값)
▼
3. workspace.yaml: default_llm_profile (워크스페이스 기본값)
# agent.yaml에 openai_planner가 설정되어 있지만, CLI에서 ollama_local을 지정
euleragent run premium-writer --mode plan --llm-plan ollama_local --task "..."
# → ollama_local 사용 (CLI 우선)
# CLI 옵션 없이 실행
euleragent run premium-writer --mode plan --task "..."
# → openai_planner 사용 (agent.yaml 설정)
# agent.yaml에 llm.profile이 없는 에이전트
euleragent run market-analyst --mode plan --task "..."
# → ollama_local 사용 (workspace default)
Step 11: 감사 로그에서 LLM 라우팅 추적
euleragent logs로 확인
euleragent logs p1_abc123
Run: p1_abc123
Agent: market-analyst
Mode: plan
Task: 2026년 AI 에이전트 시장 분석 보고서...
LLM Plan: openai_planner (gpt-4o)
LLM Final: (default)
--- Approvals ---
ap_001: llm_profile_enable (llm.external_call) → accepted
--- Artifacts ---
plan.md (1847 tokens)
external_transmission.jsonl 감사 로그
외부 LLM 호출은 external_transmission.jsonl에 기록됩니다:
cat .euleragent/runs/p1_abc123/artifacts/external_transmission.jsonl
{
"type": "llm_call",
"provider": "openai",
"model": "gpt-4o",
"profile": "openai_planner",
"scope": "plan",
"endpoint": "https://api.openai.com/v1/chat/completions",
"tokens_sent": 1200,
"tokens_received": 1847,
"timestamp": "2026-02-24T15:32:05Z"
}
cat .euleragent/runs/p3_ghi789/artifacts/external_transmission.jsonl
{
"type": "llm_call",
"provider": "openai",
"model": "gemini-2.0-flash",
"profile": "gemini_final",
"scope": "final",
"endpoint": "https://generativelanguage.googleapis.com/v1beta/openai/chat/completions",
"tokens_sent": 4200,
"tokens_received": 5100,
"timestamp": "2026-02-24T15:45:20Z"
}
Phase 2 (Ollama) 실행에는
external_transmission.jsonl이 없습니다. 로컬 LLM 호출은 외부 전송이 아니므로 이 로그에 기록되지 않습니다. 이것이 보안과 비용 측면에서 로컬 LLM의 이점입니다.
이벤트 스트림
Runner는 LLM 프로필 라우팅 시 이벤트를 발생시킵니다:
| 이벤트 | 발생 시점 | Phase 1 | Phase 2 | Phase 3 |
|---|---|---|---|---|
llm.profile.applied |
승인된 외부 프로필 적용 | 발생 | - | 발생 |
llm.profile.fallback |
미승인 외부 프로필 → 로컬 폴백 | (최초 실행 시) | - | - |
3-Tier 전략 요약 — 전체 흐름
┌─────────────────────────────────────────────────────────────┐
│ 3-Tier LLM 전략 │
│ │
│ Step 1: workspace.yaml에 3개 프로필 설정 │
│ ollama_local (로컬, 무료) │
│ openai_planner (외부, 고품질 계획) │
│ gemini_final (외부, 고품질 최종본) │
│ │ │
│ ▼ │
│ Step 2: 외부 프로필 승인 │
│ approve accept-all --tool llm.external_call │
│ │ │
│ ▼ │
│ Step 3: 3-Phase 실행 │
│ │
│ Phase 1 ─── plan mode + --llm-plan openai_planner ───┐ │
│ [OpenAI] 1회 호출, $0.03 │ │
│ "고품질 계획 수립" │ │
│ │ │ │
│ ▼ │ │
│ Phase 2 ─── execute mode (프로필 미지정) ──────────────┤ │
│ [Ollama] 5~10회 호출, $0.00 │ │
│ "대량 실행 — 여기서 비용의 대부분 절감!" │ │
│ │ │ │
│ ▼ │ │
│ Phase 3 ─── execute mode + --llm-final gemini_final ──┘ │
│ [Gemini] 1~2회 호출, $0.02 │
│ "최종 다듬기" │
│ │ │
│ ▼ │
│ 총 비용: $0.05 (전부 외부 시 $0.24 → 79~90% 절감) │
└─────────────────────────────────────────────────────────────┘
자주 묻는 질문
Q: provider: openai를 Gemini에 사용하는 이유는?
euleragent는 OpenAI Python SDK를 사용하여 모든 OpenAI-compatible 엔드포인트를 호출합니다. Google Gemini는 OpenAI-compatible API를 제공하므로, base_url만 Gemini 엔드포인트로 설정하면 동일한 SDK로 호출됩니다. Perplexity, Azure OpenAI, vLLM 등도 마찬가지입니다.
Q: 로컬 프로필(is_external: false)도 승인이 필요한가요?
아니요. is_external: false인 프로필은 승인 없이 즉시 사용됩니다. HITL 승인은 외부 서비스로 데이터가 전송될 때만 필요합니다.
Q: 승인은 영구적인가요? 매번 다시 승인해야 하나요?
한 번 승인(accept)하면 이후 동일한 프로필+스코프 조합에 대해 재승인 없이 사용할 수 있습니다. Runner는 ApprovalQueue에서 매칭되는 기존 승인을 찾아 재사용합니다.
Q: Phase 2에서 Ollama 대신 다른 프로필을 사용하고 싶으면?
--llm-final 옵션을 지정하면 execute 모드의 모든 LLM 호출에 해당 프로필이 사용됩니다. Phase 2를 Gemini로 하고 싶다면:
euleragent run market-analyst --mode execute --llm-final gemini_final --task "..."
이 경우 Phase 2와 Phase 3가 합쳐져 2-Phase 전략이 됩니다.
Q: llm_profiles를 설정하지 않으면 어떻게 되나요?
llm_profiles를 설정하지 않으면 기본 생성된 workspace.yaml의 llm_profiles + default_llm_profile 설정이 그대로 사용됩니다. 레거시 형식(default_provider + ollama: + openai: 블록)도 하위 호환성을 위해 여전히 지원되지만, 새로 생성되는 워크스페이스에서는 더 이상 사용되지 않습니다.
Q: Perplexity도 추가할 수 있나요?
네. provider: openai와 Perplexity의 base_url을 사용하면 됩니다:
llm_profiles:
perplexity_sonar:
provider: openai
base_url: https://api.perplexity.ai
api_key: ${PPLX_API_KEY}
model: sonar
is_external: true
llm_providers.md에서 전체 프로바이더 지원 매트릭스를 확인하세요.
다음 단계: 이것으로 euleragent 기초 튜토리얼 시리즈가 완료됩니다. 다음은 고급 패턴 튜토리얼이나 커스텀 패턴 작성 가이드를 참고하세요.