[기술검토] Claude `claude -p` 비용 정책 변경(2026-06-15) 대응 — 5단계 전략 + PoC 7건 + 모드 토글 구현 가이드
Agent SDK 크레딧 분리 정책(2026-06-15) 대응 전략. API 키 분리, 모델 등급 튜닝, 비용 대시보드, Gemini/Codex 다변화, 외부 통합 이전의 5단계와 PoC 7건·모드 토글 구현 가이드로 월 LLM 자동화 비용을 68-87% 절감하는 방법.
Claude claude -p 비용 정책 변경 대응 보고서 (v3)
2026-06-15부터
claude -p(비대화형 자동 실행)가 구독과 분리된 Agent SDK 크레딧 풀로 차감되는 정책 변경을 검토하고, API 키 분리·모델 등급 튜닝·비용 대시보드·멀티 CLI 다변화·외부 통합 이전의 5단계 대응으로 월 비용을 68-87% 절감하면서 차단 위험을 0으로 만드는 전략을 제시합니다.
시행일: 2026-06-15 영향 범위: AI 개발 파이프라인(자체 구축 멀티에이전트 하네스, 이하 파이프라인) 자동화 전체 — 자동개발, 자동검증, 주문검증, SNS자동검증, 마켓정산자동화 등 개정: 2026-05-14 (v3 — 보유 도구 현황 반영 + 쉬운 설명으로 재작성)
1. 한 줄 요약
2026년 6월 15일부터 Claude의 "자동 실행" 기능이 별도 요금 통장으로 분리됩니다. 지금 그대로 두면 며칠 만에 자동화가 멈추거나, 갑자기 큰 청구서가 발생할 수 있습니다. 다음 5단계를 권장합니다:
- Claude API 키로 분리 (즉시, 코드 변경 0)
- 파이프라인 안에 비용 대시보드 (2-3주)
- 비상등 + 화면에서 즉시 모드 전환 스위치 (1-2주)
- 모델 등급 튜닝 + Gemini/Codex 다변화 (스킬별로 Opus → Sonnet/Haiku 다운그레이드 + 호스트에 이미 깔린 Gemini/Codex 분산)
- 스킬/커맨드 튜닝 — 외부 통합(JIRA 코멘트·Google Docs·Slack·DB 쓰기)을 모두 파이프라인으로 이전 (토큰 자체 감소로 추가 비용 절감)
2. 무엇이 바뀌나? (개발 모르는 분도 이해할 수 있게)
Claude를 쓰는 두 가지 방식
| 방식 | 누가 쓰나 | 6/15 이후 |
|---|---|---|
| 대화형 (터미널/IDE에서 직접 채팅) | 사람 (개발자) | 그대로, 변화 없음 |
자동 실행 (claude -p) | 파이프라인 같은 자동화 | 별도 요금 통장으로 분리 |
자동 실행용 별도 통장의 한도 (월 단위, 이월 안 됨)
| 플랜 | 월 한도 |
|---|---|
| Pro | $20 |
| Max 5x | $100 |
| Max 20x (현재 회사 사용) | $200 |
| Team Premium | $100 |
| Enterprise Premium | $200 |
다 쓰면 어떻게 되나? (계정 설정에 따라 둘 중 하나)
| 계정 설정 | 결과 |
|---|---|
| "추가 사용량" 끄기 | 즉시 차단 → 자동개발/자동검증 등 전부 정지 |
| "추가 사용량" 켜기 | 종량제로 자동 청구 → 월말에 큰 청구서 가능 |
왜 위험한가? (간단 추산)
- 자동개발 1건 ≈ 약 $5 (Claude Opus 기준)
- 하루 10건 처리 → 일 $50 → 월 $1,500 수준
- Max 20x $200 한도는 약 1-2일이면 소진
- 위 두 시나리오 중 어느 쪽이든 비상 상황 발생
3. 권장 대응 (5단계)
1단계 — API 키로 분리 (즉시, 코드 변경 0줄) ⭐
왜 필요한가 자동 실행을 "API 종량제 모드"로 돌리면, 6/15 정책 변경 영향을 받지 않습니다. 사람이 쓰는 대화형 Claude(구독 한도)는 별개로 보존됩니다.
무엇을 하나
| Step | 작업 |
|---|---|
| 1 | Anthropic 콘솔(console.anthropic.com)에서 API 키 발급 (이름: pipeline-prod) |
| 2 | 콘솔에서 월 사용 한도(권장 $500) 설정 → 초과 시 키 자동 차단 (비용 폭주 방지) |
| 3 | 파이프라인 호스트(Mac)에 환경변수 등록: ~/.zshrc에 export ANTHROPIC_API_KEY="..." 한 줄 추가 |
| 4 | 파이프라인 데몬 재시작 |
| 5 | claude /status로 "API Key" 모드 확인 |
왜 코드 변경 없이 되나
파이프라인의 헤드리스 실행 워커(이하 워커, worker.py)가 자동 실행할 때 호스트의 환경변수를 그대로 자식 프로세스에 넘기는 구조(worker.py:684)입니다. 환경변수만 추가하면 즉시 적용됩니다.
2단계 — 파이프라인 안에 비용 대시보드 (2-3주)
왜 필요한가 얼마나 쓰고 있는지 화면에서 보여야 다음 결정(전환·차단)이 가능합니다.
무엇을 만드나 (파이프라인 화면 신설)
/settings/usage라우트 추가- 카드: 오늘 / 이번 주 / 이번 달 누적 비용
- 차트: 일별 추세, 스킬별 Top 10, 사용자별 비용
- 게이지: 별도 통장 추정 잔액 (현재까지 누적이 한도의 몇 %인지)
- 테이블: 최근 100건 실행 내역 (JIRA 키, 스킬, 비용, 모드)
이미 준비된 것 / 새로 만들 것
| 항목 | 상태 |
|---|---|
| 호출당 비용 데이터 수집 | ✅ 파이프라인이 이미 매 호출마다 cost_usd 기록 중 (worker.py:1219) |
| 비용 누적 저장 컬럼 | ❌ DB에 컬럼 추가 필요 (skill_runs.cost_usd) |
| 비용 조회 API | ❌ 신규 (/api/usage/summary, /api/usage/by-skill 등) |
| 대시보드 화면 | ❌ 신규 (Next.js 페이지 1개) |
| Anthropic Admin API 폴링 | ❌ 신규 (5분 간격 cron, 실제 청구액 교차 검증용) |
3단계 — 비상등 + 즉시 모드 전환 스위치 (1-2주)
왜 필요한가 임계치를 넘으면 운영자가 화면에서 바로 보고, 같은 화면에서 모드를 즉시 바꿀 수 있어야 합니다. (사용자 요구사항: "비상등 켜지면 보고 바로 화면에서 전환")
무엇을 만드나
비상등 (시각 경고 + Slack 알림)
| 단계 | 표시 | Slack |
|---|---|---|
| 🟢 정상 (약 70%) | 평소 | — |
| 🟡 경고 (70-85%) | 노란 배지 | "사용량 70% 도달" |
| 🔴 위험 (85%+) | 빨간 배지 깜빡임 | 🚨 "임박, 모드 전환 검토" |
| 🚨 비상 (95%+) | 큰 빨간 알람 | 🚨🚨 "자동 차단 임박" |
이미 있는 WebSocket 이벤트(skill_execution_completed)에 임계치 체크만 추가하면 됨.
화면 상단 모드 전환 스위치 (운영자 권한)
[ Mode: Claude (API 키) | Claude (구독) | Gemini | Codex | Hybrid ]
↑ 클릭 즉시 다음 호출부터 적용
- 운영자(admin)만 클릭 가능
- 변경 이력 DB 저장 (감사·디버깅)
- 동작 방식:
worker.py:684에서 자식 프로세스 실행 직전에 DB의 현재 모드 설정을 읽어 적절한 환경변수/명령어 분기
4단계 — 모델 등급 튜닝 + 다른 LLM 도구 함께 활용
4-A. Claude 모델 등급 다운그레이드 (스킬·커맨드별 Opus → Sonnet/Haiku) ⭐
왜 가장 큰 단일 효과인가
Claude 모델별 토큰 단가 (2026년 기준):
| 모델 | 입력 $/M 토큰 | 출력 $/M 토큰 | Opus 대비 |
|---|---|---|---|
| Opus 4.7 | $15 | $75 | 1× (기준) |
| Sonnet 4.6 | $3 | $15 | 약 1/5 (80% 절감) |
| Haiku 4.5 | $1 | $5 | 약 1/15 (93% 절감) |
자동개발 1회를 Opus로 돌리면 약 $5.25, 같은 작업을 Sonnet으로 돌리면 약 $1.05. 가장 큰 단일 절감 메커니즘.
스킬·커맨드별 권장 모델 매핑
| 스킬·커맨드 | 현재 (대부분 Opus) | 권장 | 비고 |
|---|---|---|---|
| 자동개발_V3/V4 (코드 생성 본체) | Opus | Opus 유지 (또는 Sonnet 검증 후 전환) | 복잡 추론·1M 컨텍스트 필요. 단, Sonnet PoC 후 결과 동등하면 전환 가능 |
| 자동기획_V3/V4 | Opus | Opus 유지 | 창작 + 정합성 검증 필요 |
| 자동검증_V3/V4 | Opus | Sonnet | 정형 검증 흐름. Opus 필요한 단계만 부분 사용 |
| SNS자동검증 | Opus | Sonnet | 검증 루프. auto-fix 단계만 Opus |
| SNS자동기획 | Opus | Sonnet | 콘텐츠 생성. 품질 차이 적음 |
| 주문검증 (차세대 주문 파이프라인) | Opus | Sonnet | 정형 비교 작업 |
| 마켓정산자동화 | Opus | Sonnet → Haiku | 정형 데이터 처리 |
| agent-pipeline-creator (router/라벨링) | Opus | Haiku | 단순 분류 |
| AI어시스턴트(확인/수정) | Opus | Sonnet | 알림형 |
| ai-yield (수율 집계) | Opus | Haiku | 단순 집계 |
| 로그분석 | Opus | Sonnet | 패턴 추출 |
| CS분석/VOC분석 | Opus | Sonnet | 자연어 분류 |
적용 방식
- 이미 파이프라인이 스킬별
models=인자를 지원 (harness_utils.py:602,worker.py:1183-1190) - skill metadata의 모델 기본값만 변경하면 즉시 적용 (코드 변경 거의 없음)
- 스킬별 PoC 1건씩 돌려 품질 동등성 확인 후 전환
예상 절감 (모델 튜닝 단독 효과)
- 6개 핵심 스킬 중 4-5개를 Sonnet으로 전환 → 약 50-60% 토큰 비용 절감
- 추가로 가벼운 작업 일부를 Haiku로 → 추가 5-10% 절감
4-B. 외부 LLM CLI 도구 함께 활용 (벤더 다변화)
호스트에 이미 깔려 있는 것 (별도 설치 불필요)
- ✅ Claude CLI (
claude -p) - ✅ Gemini CLI (
gemini -p) — Google 계정만 있으면 분당 60회 / 일 1,000회 무료 - ✅ Codex CLI (
codex -p) — ChatGPT 사내 계정 또는 API 키
호출 모드 매트릭스 — 어떤 모드를 지원할 것인가?
skill metadata로 다음 호출 모드 중 하나를 선택할 수 있게 합니다. 운영자가 스킬·커맨드별로 또는 화면 토글로 즉시 전환 가능.
| 호출 모드 | 구현 가능 | 난이도 | 비고 |
|---|---|---|---|
A. claude -p (현재 baseline) | ✅ 구현됨 | — | 기본값. 6/15 이후 Agent SDK 크레딧 풀로 차감 |
B. claude -p + ANTHROPIC_API_KEY 분리 | ✅ 즉시 | 🟢 매우 쉬움 | worker.py:684 sub_env에 조건부 주입. 6/15 영향 0 |
C. claude -p + apiKeyHelper 동적 인증 | ✅ 가능 | 🟢 쉬움 | Claude Code 공식 지원. settings.json + 셸 스크립트로 호출별 다른 키 |
D. gemini -p, codex -p 등 다른 CLI | ✅ 가능 | 🟡 중간 | worker.py:1171 분기 + envelope 정규화 어댑터 1개 |
E. claude 인터랙티브 모드 자동화 | ⚠️ 구현 가능 (비권장 옵션) | 🟡 중간 — PTY 처리 신규 모듈 필요 | 기술적 구현은 가능하나 트레이드오프 큼: (1) cost_usd 직접 추출 불가 → Admin API 사후 조회 (2) 출력 텍스트 파싱 안정성 ↓ (3) TOS 회색 지대 — 부록 A 구현 가이드 참조. 기본 비활성화 옵션으로 노출 |
권장 설계 원칙: 5가지 모드 모두 skill metadata 옵션으로 노출하여 운영자가 선택 가능. 다만 E (인터랙티브 자동화)는 기본값 비활성화 + 비권장 표시 + 활성화 시 경고. "혹시 필요한 상황"을 대비한 선택지로만 유지.
skill metadata 권장 스키마 (5단계와 통합, 모든 모드 옵션 노출):
cli_agent: claude | gemini | codex # CLI 도구 선택 (모드 D)
billing_mode: api_key | apiKeyHelper | subscription # 인증 방식 (모드 A/B/C)
model_tier: heavy | medium | light # 4-A 모델 등급
external_integrations: 파이프라인 | self # 5단계 외부 통합 책임 주체
interactive_mode: false (기본) | true # 모드 E — true는 비권장 (부록 A 참조)
UI 처리 권장:
- 모드 스위치(3단계 UI)에서 E 옵션은 회색 처리 + "비권장 — 클릭 시 경고 팝업"
- 경고 팝업 내용: "인터랙티브 모드는 (1) TTY 의존 (2) cost_usd 추적 불가 (3) TOS 회색 지대로 권장되지 않습니다. 그래도 진행하시겠습니까?"
- 운영자가 의식적으로 선택할 수 있게 보장 — 자유 + 안전 동시 확보
구현 지점:
worker.py:1171—cli_agent읽어 명령어 분기.interactive_mode=true시pexpect/pty모듈로 우회 실행 분기 (구현 가이드는 부록 A)worker.py:684—billing_mode읽어 sub_env에ANTHROPIC_API_KEY주입/제거~/.claude/settings.json—apiKeyHelper셸 스크립트 등록 (모드 C 사용 시)
왜 같이 쓰나
- 비용 분산: Claude만 의존하면 정책 변경/장애 시 전체 멈춤. Gemini/Codex 병행이 안전망.
- 무료 한도 활용: Gemini는 무료 한도가 매우 큼 → 보조 작업은 무료로 처리 가능
- 작업별 최적: 1M 컨텍스트 코딩=Claude, 빠른 분류=Gemini Flash, 코드 분석=Codex
- 장애 대응: Claude 차단/장애 시 화면 스위치 한 번으로 Gemini로 전환
작업별 권장 라우팅
| 작업 | 어디로? | 이유 |
|---|---|---|
| 자동개발, 자동검증, 자동기획 (본체) | Claude (API 키) | 1M 컨텍스트 + 품질 검증됨 |
| JIRA 이슈 분류/태깅 | Gemini Flash | 무료, 빠름, 분류 충분 |
| Slack 알림 메시지 작성 | Gemini Flash | 무료, 한국어 우수 |
| JIRA 코멘트 요약 | Gemini Flash | 무료 |
| 코드 리뷰 보조 분석 | Codex | 이미 깔린 도구 활용 |
| 마켓명·도메인 라우팅 판정 | Gemini Flash 또는 Codex | 단순 의사결정 |
| 사내 데이터 보안 필요한 작업 | (선택) 로컬 Ollama | 외부 전송 0 |
파이프라인 워커 통합 변경
| 변경 위치 | 작업 |
|---|---|
worker.py:1171 | ["claude", "-p", ...] 부분을 모드에 따라 ["gemini", "-p", ...] 또는 ["codex", "-p", ...] 로 분기 |
harness_utils.py (skill metadata) | cli_agent: "claude" | "gemini" | "codex" 필드 추가 |
| 출력 정규화 어댑터 | 각 CLI의 출력 포맷이 다르므로 envelope 변환 레이어 1개 신설 |
| 대시보드 (2단계) | CLI별 비용·성공률 분리 표시 |
예상 비용 절감
- 보조 작업 30-40%를 Gemini 무료/Codex로 분산 → 월 비용 30-40% 절감 가능
5단계 — 스킬/커맨드 튜닝: 외부 통합을 파이프라인으로 이전 (추가 절감)
왜 비용이 절감되나? (핵심 메커니즘)
현재 스킬(예: /자동개발_V3, /자동검증_V4, /SNS자동검증, /마켓정산자동화)은 LLM 안에서 직접 JIRA에 댓글 달고, Google Docs에 업로드하고, Slack 알림 보내고, DB에 쓰는 작업을 수행합니다. 이 외부 호출 하나하나가 LLM의 turn(대화 한 단계)을 추가로 잡아먹습니다.
매 turn마다 이전 컨텍스트 전체가 다시 LLM에 입력됨 → 호출 한 번을 줄이면 컨텍스트 전체 입력 토큰을 통째로 아낄 수 있음.
| 항목 | 현재 | 이전 후 |
|---|---|---|
| 스킬당 평균 외부 호출 (조사 결과) | 4-8회 | 0회 (결과 JSON만 반환) |
| turn 추가 분 | 호출당 1-2 turn | 0 |
| 입력 토큰 절약 | — | 호출당 컨텍스트 전체 × 1-2 turn |
| 추정 추가 절감 | — | 약 20-40% (스킬별 차이) |
원칙: 스킬은 "순수 함수", 외부 쓰기는 모두 파이프라인
| 동작 | 현재 (스킬 안에서) | 변경 후 (파이프라인이) |
|---|---|---|
| JIRA 코멘트 작성 | ❌ 스킬이 jira/client.py 직접 호출 | ✅ 파이프라인이 결과 받아 댓글 작성 |
| JIRA 필드/라벨 업데이트 | ❌ 스킬에서 직접 PUT | ✅ 파이프라인 |
| Google Docs/Drive 업로드 | ❌ 스킬에서 직접 업로드 | ✅ 파이프라인이 결과 마크다운 받아 업로드 |
| Slack 알림 | ❌ 스킬에서 직접 webhook | ✅ 파이프라인 |
| SHARED_DB 쓰기 (정산/결과 적재) | ❌ 스킬에서 직접 INSERT | ✅ 파이프라인 |
스킬이 반환할 표준 결과 JSON (envelope)
{
"status": "ok",
"summary": "한 줄 요약",
"artifacts": [
{"type": "markdown", "content": "...리포트 본문..."},
{"type": "image", "path": "/tmp/screenshot.png"}
],
"jira": {
"add_comment": "검증 완료. 통과 항목 12 / 실패 0",
"set_labels": ["검증완료"]
},
"notifications": [
{"channel": "slack", "message": "..."}
],
"db_writes": [
{"table": "settlement_runs", "row": {...}}
]
}
→ 파이프라인이 이 envelope 하나 받아서 모든 외부 사이드 이펙트를 일괄 실행.
예외 — 스킬 안에 남아야 하는 호출
| 케이스 | 이유 |
|---|---|
| JIRA 이슈 정보 읽기 (시작 시 컨텍스트 수집) | 다만 파이프라인이 호출 시 input_data에 미리 넣어주면 스킬에서도 제거 가능 (이상적) |
| 자동 수정 루프 중 JIRA 재조회 (SNS자동검증) | 검증→수정→재검증 루프가 외부 상태에 의존 |
| 조건부 browser 검증 동적 트리거 (자동검증_V4) | 검증 흐름 제어 |
| KB-RAG / Vector 검색 | 검증 도중 필요. 읽기 작업 |
→ 원칙: "쓰기는 전부 파이프라인, 읽기는 가능한 한 사전 주입, 검증 루프 중 동적 외부 호출만 예외"
마이그레이션 대상 분류 (조사 결과 기준)
| 스킬 | 현재 외부 호출 수 | 이전 적합성 | 비고 |
|---|---|---|---|
| ai-yield | 2 (Drive 업로드, DB SELECT) | ✅ 즉시 가능 | 순수 데이터 집계 |
| 마켓정산자동화 | 8 (Sheets, JIRA, DB) | ✅ 가능 | result_assembler 패턴 이미 있음 |
| 주문검증 (차세대 주문 파이프라인) | 2 (JIRA, DB) | ✅ 가능 | 검증 결과만 반환 |
| 자동개발_V3 | 5 (JIRA, Drive) | 🟡 부분 가능 | 일부 흐름 제어 검토 필요 |
| 자동검증_V4 | 4 (JIRA, Drive) | 🟡 부분 가능 | browser 검증 동적 트리거는 유지 |
| SNS자동검증 | 5 (JIRA, Drive, Slack) | 🟡 부분 가능 | auto-fix 루프 중 JIRA 재조회 예외 |
파이프라인 측 신규 모듈: ResultProcessor
- 위치 예시:
backend/app/services/result_processor.py - 동작: 스킬 envelope 수신 → JIRA/Google Docs/Slack/DB 어댑터에 순차 위임 → 실패 시 후처리만 재시도 (스킬 재실행 없이)
- 트리거: 기존 WebSocket 이벤트
skill_execution_completed에 hook 부착
추가 이점 (비용 외)
- 재사용성 — 스킬을 파이프라인 외부(CLI 직접/다른 자동화)에서도 동일하게 호출 가능
- 테스트 용이 — 외부 의존성 mock 없이 스킬 단위 검증
- 권한 분리 — 스킬 컨테이너에 Google/JIRA/Slack credential 노출 불필요
- 재시도/idempotency — 후처리만 재실행 가능 (비싼 스킬 재실행 회피)
- 회계·감사 단일화 — 모든 외부 영향이 파이프라인 로그에 기록
스킬 메타데이터 권장 스키마 (1-5단계 통합)
스킬·커맨드 정의 파일에 다음 필드를 명시하면 파이프라인 워커가 호출 시점에 적절히 라우팅합니다. 이를 통해 인증/모델/CLI/외부 통합 책임 주체를 호출 단위로 정밀 제어 가능:
billing_mode: api_key | subscription # 1단계 — 인증 모드 분기 (API 종량제 vs 구독)
model_tier: heavy | medium | light # 4-A — Opus / Sonnet / Haiku 선택
cli_agent: claude | gemini | codex # 4-B — CLI 도구 분기
external_integrations: 파이프라인 | self # 5단계 — JIRA/GoogleDocs/Slack 등 외부 통합을 누가 수행
적용 지점:
backend/app/api/routes/harness_utils.py— skill metadata 스키마 확장scripts/worker.py:684—billing_mode보고ANTHROPIC_API_KEY조건부 주입/제거scripts/worker.py:1171—cli_agent보고 명령어 분기 (claude/gemini/codex)backend/app/services/result_processor.py(신규) —external_integrations=파이프라인인 스킬의 결과 envelope을 받아 후처리
왜 메타데이터로 통제하나 — 인터랙티브 모드 우회 같은 정책상 회색 지대를 시도하지 않고도, 호출별 모드 분기를 합법적으로 운영 가능. 자세한 정책 검토는 12번 부록 A 참조.
4. (선택) 로컬 무료 LLM 추가 — 보안이 중요한 작업용
호스트에 이미 깔린 Gemini/Codex로 대부분 해결되므로, 로컬 LLM은 사내 데이터를 외부에 보내지 말아야 할 작업에만 추가 검토합니다.
Mac에서 돌릴 만한 모델 (기업 라이선스 안전)
| Mac 사양 | 1순위 모델 | 라이선스 | 용도 |
|---|---|---|---|
| Mac Mini M2 16GB | Qwen 2.5 Coder 7B | Apache 2.0 ✅ | 코드 분석, 분류 |
| Mac Mini M2 16GB | Gemma 3 9B | Gemma License ✅ | 한국어 자연어 |
| M3 Pro 32GB+ | Qwen 2.5 Coder 32B | Apache 2.0 ✅ | 코딩 (Sonnet급) |
설치 (필요할 때만)
brew install ollama
ollama pull qwen2.5-coder:7b
ollama pull gemma2:9b
# OpenAI 호환 API endpoint 자동 노출: http://localhost:11434/v1
피해야 할 모델
- ❌ DeepSeek 시리즈 — 중국 기업 출신, 사내 보안 정책 검토 부담 (로컬이라면 무관하지만 보수적으로 제외 권장)
- ⚠️ Llama 4 (Meta) — 라이선스 변경 위험 (상업적 사용은 가능하지만 의존도 높이지 말 것)
5. 한눈에 보는 현재 인프라 상태
이미 있어서 재사용
- 자동화 호출 구조 (
worker.py의 subprocess 패턴) — Claude/Gemini/Codex 모두 같은 방식으로 호출 가능 - 호출당 비용 데이터 수집 (
cost_usd필드) - 모드 전환 DB 필드 (
skill_metadata.execution_mode) - 실시간 알림 채널 (WebSocket
skill_execution_completed이벤트) - JIRA 클라이언트 (
backend/app/services/clients/jira_client.py) - 호스트에 Claude/Gemini/Codex CLI 모두 설치되어 있음
새로 만들어야
- DB:
skill_runs.cost_usd컬럼 - API: 비용 조회 엔드포인트 (
/api/usage/*) - 화면: 대시보드 1개, 모드 스위치 1개
- 폴러: Anthropic Admin Cost API 5분 폴링 (실제 청구액 교차 검증)
- 어댑터: Gemini/Codex 출력 → Claude envelope 정규화 1개
6. 결정해야 할 사항
| # | 항목 | 권장 |
|---|---|---|
| 1 | 1단계 즉시 적용 (API 키 분리) | ✅ 승인 (가장 안전, 코드 변경 0줄) |
| 2 | API 키 월 한도 금액 | 권장 $500 (이후 베이스라인 측정 후 조정) |
| 3 | 2-3단계 (대시보드 + 비상등 + 스위치) | ✅ 승인 |
| 4 | 임계치 단계 | 70% / 85% / 95% |
| 5 | 모드 스위치 권한 | 운영자(admin)만 |
| 6-A | 4-A 모델 튜닝 (Opus → Sonnet/Haiku) 즉시 진행 | ✅ 승인 (단일 메커니즘 중 가장 큰 절감 효과, 코드 변경 거의 없음). 스킬별 PoC 1건씩 품질 검증 후 전환 |
| 6-B | 4-B (Gemini/Codex 통합) 우선순위 | ✅ 승인 (이미 호스트 설치되어 추가 비용 없음) |
| 7 | 5단계 (스킬 외부 통합 → 파이프라인 이전) 적용 순서 | ai-yield · 마켓정산자동화 · 주문검증 부터 PoC → 자동검증/자동개발 확대 |
| 8 | ResultProcessor 모듈 신설 | 파이프라인 백엔드에 신규 (backend/app/services/result_processor.py) |
| 9 | 로컬 Ollama 도입 | 보안 필요 작업 발생 시 (선택) |
| 10 | Anthropic 측 확인 | 6/15 이전 — 청구 통합 명세 / 마이그레이션 가이드 / 에러 메시지 형태 |
7. 일정 (권장 로드맵)
| 시기 | 작업 | 결과물 |
|---|---|---|
| 즉시 (약 1주) | 1단계: API 키 발급 + 환경변수 + 콘솔 한도 설정 | 6/15 영향 차단 |
| 즉시 (약 2주) | 4-A 모델 튜닝: 스킬별 Opus → Sonnet/Haiku PoC 후 전환 (가벼운 스킬부터: ai-yield, 마켓정산, 라벨링 라우터) | 40-55% 비용 절감 (가장 큰 단일 효과) |
| 1-3주 | 2단계: 대시보드 (DB 마이그레이션 + API + 화면) | 비용 가시화 |
| 4-5주 | 3단계: 비상등 + 모드 스위치 | 즉시 대응 가능 |
| 4-8주 | 4-A 확대: 자동검증/SNS자동검증/주문검증 등 추가 전환 | 누적 절감 ↑ |
| 6-8주 | 4-B: Gemini/Codex 라우팅 추가 | 추가 분산 |
| 8-12주 | 5단계: 스킬 외부 통합 → 파이프라인 이전 (ai-yield/마켓정산/주문검증부터 PoC) | 추가 토큰 절감 |
| (선택) | 보안 필요 시: Ollama 로컬 LLM | 외부 전송 0 |
8. 종합 효과 추정 (모든 단계 적용 시 얼마나 절감되나)
베이스라인 가정
- 자동개발_V3 1회 ≈ $5.25 (Claude Opus 4.7, 입력 20만 + 출력 3만 토큰)
- 일 평균 10건 처리 → 일 약 $52 → 월 약 $1,500 (Opus 기준)
- 현재 구조 = Max 20x 별도 크레딧 $200은 약 1-2일에 소진 → 이후 차단 또는 종량제 자동 청구
단계별 절감 효과 (누적, 보수/낙관 두 시나리오)
| 단계 적용 | 핵심 절감 메커니즘 | 보수 추정 월 비용 | 낙관 추정 월 비용 | 누적 절감률 |
|---|---|---|---|---|
| 현재 (Baseline) | 대부분 Opus, 외부 호출 다수 | $1,500 | $1,500 | 0% |
| +1단계 (API 키 분리) | 비용 자체는 동일. 콘솔 한도로 상한 강제 + 폭주 위험 0 | $1,500 | $1,500 | 0% (안정성 ↑) |
| +2-3단계 (대시보드 + 비상등 + 스위치) | 운영자 개입(임계치 시 모드 전환)으로 5-10% 절감 | $1,425 | $1,350 | 5-10% |
| +4-A (Claude 모델 튜닝 Opus → Sonnet/Haiku) | 4-5개 스킬을 Sonnet으로 전환 (Opus 대비 1/5 단가). 모델 튜닝만으로 40-55% 절감 | $710 | $470 | 53-69% |
| +4-B (Gemini/Codex 분산) | 보조 작업 20-40%를 무료/저렴한 곳으로 이전 | $570 | $295 | 62-80% |
| +5단계 (스킬 외부 통합 → 파이프라인 이전) | 스킬당 외부 호출 4-8회 제거 → turn 감소 → 토큰 15-35% 직접 감소 | $485 | $190 | 68-87% |
5단계 모두 적용 시: 월 $1,500 → 약 $190-$485 (보수에서 낙관, 68-87% 절감)
가장 큰 효과를 내는 두 메커니즘 (우선순위)
- 4-A 모델 튜닝 (Opus → Sonnet/Haiku) — 단일 메커니즘 중 40-55% 절감으로 가장 큼. 코드 변경 거의 없음 (skill metadata의 모델 기본값만 수정). PoC 결과 품질 동등하면 즉시 적용.
- 5단계 스킬 외부 통합 이전 — 토큰 자체를 줄이는 효과. 아키텍처 개선 가치도 큼.
위험 회피 효과 (비용 외)
| 위험 | 현재 | 5단계 모두 적용 |
|---|---|---|
| 6/15 이후 별도 크레딧 1-2일 소진으로 자동화 차단 | 🔴 거의 확실 | 🟢 없음 (API 종량제) |
| 종량제 자동 청구로 월 청구서 폭탄 | 🔴 $1,500+ 가능 | 🟢 콘솔 한도($500)로 강제 상한 |
| Claude 서비스 장애 시 자동화 전면 정지 | 🔴 100% 의존 | 🟢 Gemini/Codex 즉시 fallback |
| 비용 가시성 없음 (월말까지 모름) | 🔴 사후 인지 | 🟢 실시간 화면 + 임계치 알림 |
| 스킬에 외부 시스템 credential 노출 | 🔴 다수 | 🟢 파이프라인만 보유 |
한 줄로 본 효과
현재 1-2일에 별도 크레딧 소진되어 자동화가 멈추거나 월 $1,500+ 청구되는 상태 → 5단계 적용 시 안정적으로 월 $190-$485 (68-87% 절감), 차단 위험 0, 즉시 모드 전환 가능, 비용 분산까지. 가장 큰 효과는 4-A 모델 튜닝(Opus → Sonnet/Haiku)으로 단일 메커니즘만으로 40-55% 절감 가능.
추산의 한계 명시
- 모든 수치는 현재 평균 사용량 기준 추정. 실측은 1단계 적용 후 대시보드(2단계)로 베이스라인 확정 필요.
- 절감률은 곱셈 누적이라 실제는 시너지/상충 가능. 보수에서 낙관 범위로 제시.
- 5단계는 스킬 6개 중 적용 가능 3개 PoC(ai-yield/마켓정산/주문검증)부터 단계 확대 가정.
9. PoC 실행 가이드 (단계별 실행 시나리오)
각 단계를 작게 시작해서 검증 후 확대하는 PoC 시나리오. 운영자가 그대로 따라할 수 있는 명령어·검증 항목·롤백 방법까지 포함.
공통 원칙
- 가장 가벼운 스킬부터 (예:
/업무우선순위,/ai-yield)- 1건 → 1일 → 1주 단계적 확대
- 각 PoC마다 baseline cost_usd 기록 후 비교
- 실패 시 즉시 롤백 가능한 변경만
PoC 1 — API 키 분리 (1단계 검증)
목표: 파이프라인 자동화 1건이 API 종량제로 차감되는지 확인. 구독 풀에는 영향 없음을 검증.
기간: 30분~1시간 / 롤백: 환경변수 unset + 데몬 재시작
사전 준비
- Anthropic Console → API Keys → Create Key (이름:
pipeline-poc) - 콘솔 Plans & Billing → Usage Limits → 월 한도 $50 (PoC라 작게)
- 발급된 키를 안전한 곳에 임시 저장
실행
# 1) 현재 셸에만 임시 export (PoC 끝나면 사라짐 — 안전)
export ANTHROPIC_API_KEY="sk-ant-api03-<발급키>"
# 2) 파이프라인 데몬 재시작 (해당 셸에서 시작)
cd /path/to/pipeline
# 데몬 실행 방식대로 (예시):
# pkill -f worker && python3 scripts/worker.py &
# 3) 인증 모드 확인
claude /status # "Auth: API Key" 표시되면 성공
# 4) 가벼운 스킬 1건 실행
claude -p "/업무우선순위" --output-format json | jq '.cost_usd, .session_id'
검증
| 검증 항목 | 기대 결과 | 확인 방법 |
|---|---|---|
| 인증 모드 변경 | API Key 모드 | claude /status |
| cost_usd 값 정상 추출 | 양수 ( | envelope 출력 |
| Console에 차감 확인 | console.anthropic.com Usage에 표시 (5분 후) | https://console.anthropic.com/usage |
| 구독 Plan Usage 비영향 | claude.ai Plan Usage 변화 없음 | claude.ai → Settings → Plan & Usage |
| 스킬 결과 정상 | 평소와 동일 출력 | 결과 비교 |
롤백
unset ANTHROPIC_API_KEY
# 데몬 재시작
PoC 2 — 모델 다운그레이드 Opus → Haiku (4-A 검증)
목표: ai-yield 같은 단순 집계 스킬을 Haiku로 전환했을 때 품질 동등성과 비용 1/15 절감 확인.
기간: 1일 / 롤백: skill metadata revert
대상 선정 기준 (안전한 후보 순)
- ai-yield (수율 집계 — 단순)
- agent-pipeline-creator (라벨링/라우팅 — 단순 분류)
- 마켓정산자동화 (정형 데이터 — 검증 후)
실행
# 1) baseline: 현재 Opus로 1건 실행 + cost 기록
cd /path/to/devskills
claude -p "/ai-yield 기간=2026-05-01:2026-05-07 models=claude-opus-4-7" \
--output-format json > /tmp/ai_yield_opus.json
jq '.cost_usd, .result' /tmp/ai_yield_opus.json
# 2) skill metadata 또는 호출 시 모델 지정
claude -p "/ai-yield 기간=2026-05-01:2026-05-07 models=claude-haiku-4-5" \
--output-format json > /tmp/ai_yield_haiku.json
jq '.cost_usd, .result' /tmp/ai_yield_haiku.json
# 3) 두 결과 비교
diff <(jq '.result' /tmp/ai_yield_opus.json) \
<(jq '.result' /tmp/ai_yield_haiku.json)
검증
| 검증 항목 | 기대 결과 |
|---|---|
| 결과 동등성 | 핵심 수치 일치 (소수 표현 차이는 허용) |
| cost_usd 비교 | Haiku가 Opus 대비 약 1/15 (~93% 절감) |
| duration_ms | Haiku가 1.5~2배 빠름 |
| 실패율 | 0% (정상 완료) |
확대 단계 (성공 시)
- Day 1: ai-yield Haiku 전환
- Day 2-3: agent-pipeline-creator Haiku 전환
- Week 1: 마켓정산자동화 Sonnet (Haiku는 정형 처리에 약할 수 있어 Sonnet 권장)
- Week 2-3: 자동검증/SNS자동검증/주문검증 Sonnet PoC (자동개발은 마지막)
롤백
skill metadata 또는 models= 인자를 원래 값으로 되돌림.
PoC 3 — 비용 대시보드 MVP (2단계 검증)
목표: cost_usd 데이터를 DB에 저장하고 API로 조회 가능하게 함. 화면은 최소 MVP.
기간: 3~5일 / 롤백: DB 컬럼 drop, 라우트 제거
실행
# 1) DB 마이그레이션
cd /path/to/pipeline/backend
# alembic 또는 사용 중인 마이그레이션 도구로:
# ALTER TABLE skill_runs ADD COLUMN cost_usd NUMERIC(10,4);
# ALTER TABLE skill_runs ADD COLUMN cli_agent VARCHAR(20);
# ALTER TABLE skill_runs ADD COLUMN billing_mode VARCHAR(20);
# 2) worker.py 수정 (envelope에서 cost_usd 추출 후 DB 저장)
# worker.py:1219 부근의 envelope_meta 처리에 DB INSERT 추가
# 3) 비용 조회 API 신규
# backend/app/api/routes/usage.py 신규:
# GET /api/usage/summary?period=daily
# GET /api/usage/by-skill?days=7
# 4) Frontend MVP (Next.js 페이지 1개)
# frontend/src/app/(with-sidebar)/settings/usage/page.tsx
# 단순 카드 + 표 + 일별 라인차트 (recharts)
검증
| 검증 항목 | 기대 결과 |
|---|---|
| 호출당 cost_usd DB 저장 | skill_runs.cost_usd 정상 적재 |
| 일별 합계 API | /api/usage/summary 정상 응답 |
| Anthropic Console 교차 검증 | 일별 합계 오차 ±10% 이내 |
| 화면 렌더링 | 카드 3개 + 라인차트 + 표 정상 표시 |
| 부하 | 1주일 데이터 (~500건) 1초 이내 응답 |
PoC 4 — Gemini CLI 분기 (4-B 검증)
목표: 가벼운 스킬 1개를 Gemini로 라우팅 → 결과 품질·비용·속도 비교.
기간: 3~5일 / 롤백: cli_agent metadata 되돌림
대상 선정 (안전한 후보)
- AI어시스턴트(확인) — 알림형, 짧은 출력
- agent-pipeline-creator — 라우팅 분류 (Gemini Flash 충분)
- CS분석/VOC분석 — 자연어 분류
실행
# 1) 사전: Gemini CLI 인증 확인 (호스트에 이미 설치됨)
gemini auth status
# 2) 동일 입력으로 Claude vs Gemini 직접 비교
INPUT='JIRA 라벨 추천 작업: "결제 모듈 NPE 발생"'
# Claude (현재)
claude -p "$INPUT" --output-format json > /tmp/cmp_claude.json
jq '.cost_usd, .result' /tmp/cmp_claude.json
# Gemini (PoC)
echo "$INPUT" | gemini -p > /tmp/cmp_gemini.txt
cat /tmp/cmp_gemini.txt
# 3) worker.py:1171에 임시 분기 로직 추가
# skill metadata.cli_agent == "gemini" 면 cmd = ["gemini", "-p", prompt]
# 출력 정규화 어댑터: gemini 평문 출력 → {"result": "...", "cost_usd": 0} 형태로 변환
# 4) AI어시스턴트(확인) skill metadata 변경
# cli_agent: gemini
검증
| 검증 항목 | 기대 결과 |
|---|---|
| Gemini 응답 정상 | 평문 결과 정상 출력 |
| 한국어 품질 | Claude와 동등 (운영자 정성 평가) |
| 응답 속도 | Claude보다 빠름 (Gemini Flash 기준) |
| 비용 | $0 (무료 한도 내) |
| 분당 호출 수 | Gemini 무료 한도 60 req/min 위반 안 함 |
PoC 5 — ResultProcessor: 스킬 외부 통합 이전 (5단계 검증)
목표: ai-yield에서 Google Drive 업로드 로직을 빼고 envelope만 반환 → 파이프라인이 받아서 업로드. 결과 동등성과 토큰 절감 확인.
기간: 1~2주 / 롤백: 스킬 원복 + ResultProcessor 비활성화
실행
# 1) ai-yield 스킬 수정 (devskills 측)
# .claude/skills/ai-yield/SKILL.md 또는 prompt.md에서:
# - googleapis 호출 코드 제거
# - 결과를 다음 envelope으로 반환:
# {
# "status": "ok",
# "summary": "...",
# "artifacts": [
# {"type": "csv", "path": "/tmp/yield.csv", "filename": "yield_2026-05-07.csv"}
# ],
# "drive": {
# "folder_id": "...",
# "filename": "yield_2026-05-07.csv"
# }
# }
# 2) 파이프라인에 ResultProcessor 신설
# backend/app/services/result_processor.py:
# - envelope의 artifacts + drive 받아서 GoogleDocsClient 호출
# - 실패 시 재시도, 성공 시 결과 envelope에 file_url 추가
# 3) skill metadata 추가
# external_integrations: 파이프라인
# 4) worker.py:1216-1234 부근에서 envelope 수신 후 ResultProcessor 호출
검증
| 검증 항목 | 기대 결과 |
|---|---|
| Drive 파일 동일성 | 기존 방식과 같은 내용·위치 |
| 스킬 turn 수 감소 | envelope.usage.turns가 1-2회 감소 |
| cost_usd 절감 | 약 15~25% 감소 (외부 호출 turn 만큼) |
| 실패 시 재시도 | Drive 일시 장애 → 스킬 재실행 없이 후처리만 재시도 |
| 권한 분리 | 스킬에서 Google credential 미사용 확인 |
확대 (성공 시)
- Week 1: ai-yield (PoC)
- Week 2: 마켓정산자동화 (이미 result_assembler 패턴 있어서 통합 쉬움)
- Week 3-4: 주문검증, 자동검증_V4 (검증 루프 예외 처리 주의)
PoC 6 — apiKeyHelper 동적 인증 전환 (호출 모드 C 검증)
목표: settings.json의 apiKeyHelper 셸 스크립트로 호출 시점·환경·스킬별 다른 API 키를 동적 반환. Claude Code 공식 지원 메커니즘 검증.
기간: 1-2일 / 롤백: settings.json apiKeyHelper 항목 제거
실행
# 1) 셸 스크립트 작성
cat > ~/.claude/get_dynamic_key.sh <<'EOF'
#!/bin/bash
# 시간대별 / 환경별 다른 키 반환 예시
HOUR=$(date +%H)
if [[ $HOUR -ge 9 && $HOUR -lt 18 ]]; then
echo "$ANTHROPIC_API_KEY_BUSINESS" # 업무시간 — 한도 큰 키
else
echo "$ANTHROPIC_API_KEY_OFFHOURS" # 야간 — 한도 작은 키
fi
EOF
chmod +x ~/.claude/get_dynamic_key.sh
# 2) settings.json 등록
cat > ~/.claude/settings.json <<'EOF'
{
"apiKeyHelper": "~/.claude/get_dynamic_key.sh"
}
EOF
# 3) TTL 조정 (기본 5분)
export CLAUDE_CODE_API_KEY_HELPER_TTL_MS=300000
# 4) 검증
claude /status # 사용 중인 키 확인 가능
claude -p "test" --output-format json | jq '.session_id'
검증
| 항목 | 기대 |
|---|---|
apiKeyHelper 스크립트 호출 확인 | 로그에 스크립트 실행 흔적 |
| TTL 만료 후 재호출 | 5분 후 새 키 사용 |
| 시간대별 다른 키 적용 | 9-18시 vs 그 외 다른 sk-ant-... 사용 |
| Console Usage 분리 | API 키별 사용량이 콘솔에서 분리 표시 |
PoC 7 — 인터랙티브 모드 세션 재사용 자동화 (호출 모드 E 검증, 옵션·비권장)
목표: claude 인터랙티브 세션을 devskills 폴더에서 유지하면서 prompt 주입으로 스킬 실행. 시작 비용 절감 + 구독 풀 차감 가능성 검증.
기간: 3-5일 / 롤백: skill_metadata interactive_mode=false 복귀
⚠️ 사전 의사결정 필수:
- 부록 A의 정책 위험 (TOS 회색 지대) 사내 의사결정자 승인
- cost_usd 실시간 추적 불가 수용
- 세션 풀 운영 부담 (재시작·에러 복구) 수용
실행
# 1) Python 의존성 추가
pip install pexpect # 또는 stdlib pty + asyncio
# 2) worker-interactive.py 신규 모듈 (참고: 11번 구현 가이드 코드)
# - ClaudeInteractiveSession 클래스
# - ClaudeSessionPool 클래스 (size=3)
# 3) skill metadata에 interactive_mode 옵션 추가
# - test 스킬 하나(예: /업무우선순위) 에 interactive_mode: true
# 4) PoC 실행
cd /path/to/devskills
# 워커 시작 (인터랙티브 풀 활성화)
python3 -c "
import asyncio
from worker_interactive import ClaudeSessionPool
async def main():
pool = ClaudeSessionPool(size=1, cwd='/path/to/devskills')
await pool.init()
result = await pool.execute('업무우선순위', '')
print('Result:', result[:200])
await pool.close()
asyncio.run(main())
"
검증
| 항목 | 기대 결과 |
|---|---|
| PTY 할당 성공 | pty.openpty() 정상, child process alive |
| 초기 프롬프트 감지 | > 마커 등장 |
| 스킬 실행 결과 캡처 | 평문 출력 받음 (ANSI escape 제거 후) |
/clear 후 다음 작업 격리 | 이전 컨텍스트 영향 없음 |
| 세션 재사용 비용 절감 | 두 번째 호출이 첫 호출보다 빠름 (CLAUDE.md 재로딩 없음) |
| claude.ai Plan Usage 증가 확인 | 구독 풀 차감 여부 모니터링 (이론적 기대) |
| Anthropic Console Usage 미증가 | API 종량제 안 잡힘 확인 |
| 동시 작업 처리 (풀 size=3) | 3건 병렬 실행 정상 |
| 세션 사망 → 재시작 | 일부러 kill 후 풀이 새 세션 spawn |
결과 평가 기준
- ✅ 성공 시: 시작 비용 절감 효과 측정, 구독 풀 차감 확인 → 운영 검토
- ⚠️ 부분 성공: 동작은 하나 안정성 낮음 → 일부 가벼운 스킬만 적용
- ❌ 실패 시: 출력 파싱 불안정, 잦은 세션 사망 → 모드 E 운영 부적합 결론
롤백
즉시. skill_metadata interactive_mode: false 복귀 + 인터랙티브 풀 종료.
PoC 우선순위 권장
| PoC | 효과 | 난이도 | 권장 순서 |
|---|---|---|---|
| PoC 1 (API 키 분리) | 6/15 영향 차단 | 🟢 매우 쉬움 | 1순위 — 즉시 |
| PoC 2 (모델 다운그레이드) | 40-55% 절감 (단일 최대) | 🟢 쉬움 | 2순위 — 1주 내 |
| PoC 3 (비용 대시보드) | 가시화 | 🟡 중간 | 3순위 — 2-3주 |
| PoC 4 (Gemini 분기) | 보조 작업 절감 | 🟡 중간 | 4순위 — 1개월 |
| PoC 5 (ResultProcessor) | 추가 토큰 절감 + 아키텍처 개선 | 🔴 어려움 | 5순위 — 2-3개월 |
| PoC 6 (apiKeyHelper 동적 인증) | 호출별 인증 정밀 제어 | 🟢 쉬움 | 옵션 — 1개월 |
| PoC 7 (인터랙티브 세션 재사용) | 시작 비용 절감 가능성 검증 | 🟡 중간 + 정책 위험 | 옵션 (비권장) — 사내 의사결정 후 |
→ PoC 1 + PoC 2 만으로도 약 50% 절감 + 정책 영향 0. 가장 큰 효과 대비 가장 쉬운 두 가지 먼저 시작 권장.
10. TodoList — 전체 작업 체크리스트
운영자가 그대로 따라가며 체크할 수 있는 통합 작업 리스트. 5단계 + 결정 사항 + PoC를 시기별로 정리.
즉시 (~1주) — 가장 시급
- Anthropic Console에서 API 키 발급 (
pipeline-prod) - 콘솔 Plans & Billing → Usage Limits 월 한도 $500 설정
- 파이프라인 호스트
.zshrc에export ANTHROPIC_API_KEY=...추가 - 파이프라인 데몬 재시작
-
claude /status로 "API Key" 모드 확인 (= PoC 1) - 시나리오 A vs B 최종 결정 (옵션 3 권장 — 단계적)
- Anthropic 계정 "추가 사용량(extra usage)" 토글 OFF 확인 (폭주 방지)
1-2주 — 모델 튜닝 PoC (가장 큰 단일 절감 40-55%)
- PoC 2: ai-yield Opus 베이스라인 측정 → Haiku 전환 → 결과 동등성 비교
- agent-pipeline-creator (라벨링) → Haiku 전환
- 마켓정산자동화 → Sonnet PoC
- AI어시스턴트(확인/수정) → Sonnet 전환
2-3주 — 비용 대시보드 (가시화)
- DB 마이그레이션:
skill_runs.cost_usd/cli_agent/billing_mode컬럼 추가 -
worker.py:1219-1234envelope 파싱 후 DB INSERT 추가 - 비용 조회 API:
/api/usage/summary,/api/usage/by-skill,/api/usage/by-user - Anthropic Admin Cost API 폴러
backend/app/collectors/anthropic_cost_collector.py신규 - 프론트엔드 화면:
frontend/src/app/(with-sidebar)/settings/usage/page.tsx - PoC 3 실행: Admin API 데이터 ±10% 교차 검증
4-5주 — 비상등 + 모드 스위치 UI
- WebSocket
skill_execution_completed이벤트에 임계치 hook 부착 - 임계치 단계 구현: 70% (🟡) / 85% (🔴) / 95% (🚨)
- Slack 알림 채널 연동 (#ai-pipeline-alerts)
- 화면 상단 모드 전환 스위치 UI (운영자 권한)
- 모드 변경 이력 DB 저장 (감사 추적)
-
worker.py:684sub_env 분기 로직 (DB 모드 설정 읽음) - 인터랙티브 모드(E) 선택 시 경고 팝업 (비권장 명시)
6-8주 — Gemini/Codex 다변화
- skill metadata 스키마 확장:
cli_agent/model_tier/billing_mode/external_integrations/interactive_mode -
worker.py:1171다중 CLI 분기 (claude / gemini / codex) - 출력 정규화 어댑터: 각 CLI 출력 → 통일 envelope
- PoC 4 실행: AI어시스턴트(확인) → Gemini Flash 라우팅 검증
- 자동검증_V4 → Sonnet 전환
- SNS자동검증 → Sonnet 전환
- 주문검증 (차세대 주문 파이프라인) → Sonnet 전환
6-8주 (옵션) — apiKeyHelper 동적 인증
-
~/.claude/settings.json에apiKeyHelper등록 - 셸 스크립트 작성: 환경/시간/스킬별 API 키 동적 반환
- PoC 6 실행: 호출별 다른 인증 키 사용 검증
6-10주 (옵션, 비권장) — 인터랙티브 모드 자동화
⚠️ 사내 의사결정자 승인 필수. 부록 A 정책 위험 + 트레이드오프 수용 확인.
- 사내 의사결정자 승인 획득 (TOS 회색 지대 수용)
-
worker-interactive.py신규 모듈 (PTY + 세션 풀) -
pexpect또는 stdlibpty의존성 추가 -
ClaudeInteractiveSession클래스 (PTY 할당, 프롬프트 감지, ANSI strip) -
ClaudeSessionPool클래스 (size=3, 자동 재시작) - skill metadata
interactive_mode: true옵션 추가 - PoC 7 실행: 세션 재사용 + claude.ai Plan Usage 차감 확인
8-12주 — 스킬 외부 통합 → 파이프라인 이전 (5단계)
-
backend/app/services/result_processor.py신규 모듈 - 표준 envelope JSON 스키마 정식화 (
artifacts/jira/notifications/db_writes) - PoC 5: ai-yield 외부 통합 제거 + envelope 반환 + 파이프라인이 Drive 업로드
- 마켓정산자동화 ResultProcessor 통합
- 주문검증 (차세대 주문 파이프라인) ResultProcessor 통합
시점별 검증 항목
- 1단계 적용 후
claude /status로 API Key 모드 확인 - 6/15 이후 Anthropic Console Usage 차감 / claude.ai Plan Usage 비영향 모니터링
- 모델 튜닝 PoC 결과 품질 동등성 정성 평가 (운영자 검토)
- 임계치 알람 트리거 (한도 일부러 낮춰 발사 확인)
- 모드 스위치 동작 (UI 토글 → 다음 호출 sub_env 반영 로그 확인)
Anthropic 측 공식 확인 (6/15 시행 전)
- 사내 자동화의 third-party app 분류 여부
- 인터랙티브 호출 자동화 시 트래픽 패턴 탐지 정책
- 위반 시 정상화 절차
- 청구서 통합 명세 vs 분리 명세
명시적 비권장 / 회피 (참고)
- ⚠️
claude인터랙티브 모드 자동화 — 옵션으로 제공하되 기본 비활성화 (부록 A) - ❌ DeepSeek 모델 사용 — 보안 검토 부담
- ❌ Llama 4 의존 — 라이선스 변경 위험
- ❌
claude.ai login을 외부 사용자에게 노출 — Anthropic 약관 명시적 금지
11. 모드 토글 구현 가이드 (파이프라인 구조 + 변경 지점)
개정 v7 신규: 실제 파이프라인 코드 분석을 통해 모드 토글 구현의 정확한 구조와 함정을 정리. PoC 1을 두 단계(임시 안전망 → DB 토글)로 분리하고, 각 코드 변경 지점 명세.
11.1 파이프라인 데몬 구조 (확인된 사실)
| 프로세스 | 실행 환경 | claude CLI 호출? | .env 자동 로드 |
|---|---|---|---|
| Backend (FastAPI) | Docker 컨테이너 (make up) | ❌ 안 함 | ✅ docker-compose.yml env_file: .env 자동 주입 |
| 워커 (헤드리스 실행) | 호스트 PC 직접 (make host → python3 scripts/worker.py) | ✅ 함 (subprocess) | ❌ 자동 로드 안 함 — 명시적 로드 코드 필요 |
근거:
Makefile:host: python3 scripts/worker.py(Docker 아님)worker.py에load_dotenv호출 없음 (확인됨)config.pySettings클래스에ANTHROPIC_API_KEY필드 정의 없음 (pydantic-settings는 정의된 필드만 로드)
→ .env에 키만 추가한다고 워커가 자동으로 못 본다. 명시적 로드 코드 필수.
11.2 핵심 함정 — load_dotenv() vs dotenv_values()
토글 가능한 구조를 만들려면 load_dotenv()를 쓰면 안 됨:
| 함수 | 동작 | 토글 가능? |
|---|---|---|
load_dotenv() | .env 읽어 os.environ에 등록 | ❌ os.environ에 박혀서 토글 불가 |
dotenv_values() | .env 읽어 dict만 반환 (os.environ 안 건드림) | ✅ Python 변수로만 보관 → 호출별 분기 가능 |
11.3 부모-자식 프로세스 환경변수 독립성 (핵심 메커니즘)
- 워커 자체의
os.environ= 시작 시 정해지고 안 바뀜 (API 키 미포함) - 자식 프로세스(claude)의
os.environ= spawn 시 부모가env=로 명시한 값 (부모와 별개 사본) - spawn 후 자식과 부모는 분리됨 → 부모 환경 변경 불필요
- 호출마다 sub_env 다르게 줘도 워커 재시작 불필요
워커 프로세스 (시작 시 1회 로드, 평생 유지)
os.environ → 깨끗 (API 키 미포함)
_ANTHROPIC_API_KEY = 'sk-ant-...' ← Python 변수만
│
│ 호출마다 sub_env 새로 구성
▼
┌─ billing_mode='api_key' → sub_env에 키 주입 → 자식 1: API 키 모드
├─ [UI 토글 → DB 'subscription' (워커 재시작 X)]
├─ billing_mode='subscription' → 키 안 넣음 → 자식 2: OAuth 폴백
├─ [UI 토글 → 'api_key' 복귀]
└─ billing_mode='api_key' → 키 주입 → 자식 3: API 키 모드
11.4 책임 분리 — DB 조회는 Backend, 워커는 mode 받기만
워커는 backend와 WebSocket으로 연결되어 작업 dispatch 받음:
DEFAULT_WS_URL = "ws://localhost:10082/ws/gateway-bridge"(worker.py:47)- backend가 작업 메시지에
billing_mode필드 포함 → 워커가 그대로 사용
→ 워커는 DB 접근 안 함 (credential 노출 X, 단일 책임)
11.5 .env + DB 하이브리드 저장 패턴
| 데이터 | 위치 | 변경 빈도 |
|---|---|---|
ANTHROPIC_API_KEY 값 (정적) | .env | 거의 안 바뀜 (분기 회전) |
billing_mode 토글 (동적) | pipeline_config DB | UI 클릭 즉시 |
키 자체는 자주 안 바뀌니 .env로 충분, 모드만 DB로 동적 관리.
11.6 변경 파일 매트릭스
| 파일 | 변경 | 작업량 |
|---|---|---|
.env | ANTHROPIC_API_KEY=sk-ant-... 한 줄 | 1줄 |
scripts/worker.py | dotenv_values() import + _ANTHROPIC_API_KEY 변수 + build_sub_env(billing_mode) 함수 + WebSocket 메시지 핸들러에서 mode 추출 | 약 20줄 |
backend/app/api/routes/harness_utils.py (또는 dispatch 부근) | WebSocket 메시지에 billing_mode 필드 추가 + DB 조회 호출 | 약 10줄 |
backend/app/api/routes/config.py (신규) | GET/PUT /api/config/billing_mode | 약 30줄 |
| DB 마이그레이션 | pipeline_config 테이블 또는 기존 settings 테이블에 billing_mode row | SQL 1개 |
frontend/src/app/(with-sidebar)/settings/usage/page.tsx | Toggle 컴포넌트 | 약 30줄 |
11.7 핵심 코드 스니펫
worker.py (시작 시 1회 + 호출별 분기)
from pathlib import Path
from dotenv import dotenv_values
# 시작 시 한 번 — os.environ 안 건드림
_DOTENV = dotenv_values(Path(__file__).resolve().parent.parent / ".env")
_ANTHROPIC_API_KEY = _DOTENV.get("ANTHROPIC_API_KEY", "")
# 호출마다 sub_env 구성
def build_sub_env(billing_mode: str) -> dict:
sub_env = {**os.environ, 'PYTHONIOENCODING': 'utf-8'}
if billing_mode == 'api_key' and _ANTHROPIC_API_KEY:
sub_env['ANTHROPIC_API_KEY'] = _ANTHROPIC_API_KEY
else: # 'subscription'
sub_env.pop('ANTHROPIC_API_KEY', None) # 안전망
return sub_env
# WebSocket 메시지 핸들러
async def handle_execute_skill(message):
billing_mode = message.get("billing_mode", "api_key")
sub_env = build_sub_env(billing_mode)
# ... 기존 subprocess 실행 로직 (env=sub_env)
backend dispatch
# backend가 작업 메시지 구성 시
async def build_skill_dispatch_message(skill_id, args, ...):
billing_mode = await get_config('billing_mode', default='api_key') # DB 조회
return {
"type": "execute_skill",
"skill_id": skill_id,
"args": args,
"billing_mode": billing_mode, # 신규 필드
# ... 기존 필드
}
11.8 동작 검증
| Step | 검증 |
|---|---|
| 1 | make host 재시작 후 _ANTHROPIC_API_KEY 변수 로드 확인 (로그) |
| 2 | UI 토글 api_key → 다음 작업 실행 시 워커 로그에서 sub_env 키 포함 확인 |
| 3 | UI 토글 subscription → 워커 재시작 없이 다음 작업에서 키 미포함 확인 |
| 4 | claude.ai Plan Usage (subscription) vs Anthropic Console Usage (api_key) 분리 차감 확인 |
| 5 | 호스트 별도 셸에서 사용자가 claude 직접 실행 → OAuth 그대로 (분리 확인) |
| 6 | .env 키 변경 후 워커 재시작 1번 (메모리 변수 갱신) |
11.9 보안 체크리스트
-
.gitignore에.env포함 확인 (이미 포함됨 — 확인됨) -
.env파일 권한600:chmod 600 .env - Anthropic Console에서 키별 spend limit ($500/월)
-
pipeline_config테이블에 키 자체 저장 금지 (mode만) - 키 회전 절차:
.env수정 + 워커 재시작 1번
11.10 권장 진행 순서
| # | 작업 | 담당 |
|---|---|---|
| 1 | DB 마이그레이션 (config 테이블 + billing_mode row) | 파이프라인 개발 |
| 2 | Backend /api/config/billing_mode REST API | 파이프라인 개발 |
| 3 | Backend dispatch 메시지에 billing_mode 포함 | 파이프라인 개발 |
| 4 | worker.py에 dotenv_values + build_sub_env 분기 | 파이프라인 개발 |
| 5 | .env에 키 추가 (운영자) + 워커 재시작 | 운영자 |
| 6 | 기본값 api_key로 동작 검증 (UI 없이 REST API로 mode 변경 테스트) | 운영자 |
| 7 | Frontend 토글 UI (마지막) | 파이프라인 개발 |
→ 6번까지 완료 시 토글 기능 완성 (UI 없어도 REST API로 동작 가능). UI는 7번에서 추가.
12. 결론 한 줄
즉시 Claude API 키로 분리 → 스킬별 Opus → Sonnet/Haiku 튜닝(가장 큰 단일 절감) → 파이프라인 비용 대시보드 + 비상등 + 모드 스위치 → Gemini/Codex 활용 → 스킬 외부 통합을 파이프라인으로 이전.
이 5단계를 모두 적용하면 6/15 정책 영향을 완전히 회피하면서 월 비용을 현재 $1,500+에서 $190-$485 수준(68-87% 절감)으로 낮추고, 동시에 차단 위험·청구 폭탄 위험·벤더 락인을 모두 제거할 수 있습니다. 그 중 모델 튜닝(4-A) 한 가지만으로도 40-55%가 절감되므로 즉시 착수 우선순위는 1단계(API 키 분리) + 4-A(모델 튜닝) 입니다.
최종 요약 표
| 단계 | 핵심 조치 | 기간 | 효과 | 착수 우선순위 |
|---|---|---|---|---|
| 1단계 | API 키 분리 + 콘솔 한도 $500 | 즉시 (코드 0줄) | 6/15 영향 차단, 폭주 상한 강제 | ⭐ 1순위 |
| 4-A | 스킬별 Opus → Sonnet/Haiku 튜닝 | 1-2주 | 40-55% 절감 (단일 최대) | ⭐ 2순위 |
| 2-3단계 | 비용 대시보드 + 비상등 + 모드 스위치 | 1-5주 | 가시화 + 즉시 대응, 5-10% 절감 | 3순위 |
| 4-B | Gemini/Codex 다변화 | 6-8주 | 추가 분산, 누적 62-80% 절감 | 4순위 |
| 5단계 | 스킬 외부 통합 → 파이프라인 이전 | 8-12주 | 토큰 자체 감소, 누적 68-87% 절감 | 5순위 |
| 옵션 E | 인터랙티브 모드 자동화 | — | 비권장 (TOS 회색 지대, 부록 A) | 기본 비활성화 |
참고: "
claude -p안 쓰고 인터랙티브 모드로 자동화하면 되지 않나?" 라는 우회 시도에 대한 정책 검토는 12번 부록 A 참조. 결론은 권장하지 않음 (TOS 회색 지대 + 계정 차단 리스크).
13. 참고 자료
Anthropic 공식
- 6/15 정책 공지 (한국어): https://support.claude.com/ko/articles/15036540
- 6/15 정책 공지 (영어): https://support.claude.com/en/articles/15036540-use-the-claude-agent-sdk-with-your-claude-plan
- Claude Code 인증 가이드: https://code.claude.com/docs/en/authentication
- Admin Usage & Cost API: https://platform.claude.com/docs/en/build-with-claude/usage-cost-api
- 추가 사용량(extra usage) 관리: https://support.claude.com/en/articles/12429409
다른 CLI 도구
- Gemini CLI: https://github.com/google-gemini/gemini-cli
- Codex CLI: https://github.com/openai/codex
- Aider: https://aider.chat
- Ollama: https://ollama.com
파이프라인 내부 코드 참조 지점
scripts/worker.py:684, :842— 자식 프로세스 환경변수 구성 (모드 분기 진입점)scripts/worker.py:1171—claude -p실행 (다중 CLI 분기 지점)scripts/worker.py:1219, :1283— cost_usd 파싱backend/app/api/routes/harness_utils.py:602, :628— 모델/max_turns 기본값backend/app/services/clients/jira_client.py— JIRA 통합skill_metadata.execution_mode— DB 토글 필드 (의미 확장 예정)skill_execution_completed(WebSocket) — 임계치 hook 부착 지점
관련 후속 기술검토 (별도 등록 예정)
- "파이프라인 통합 후처리 아키텍처 — 스킬은 결과만 반환, 외부 통합은 파이프라인 일임" (비용 절감 시너지)
14. 부록 A — 인터랙티브 모드 우회 검토 (정책 + 구현 가이드)
검토 배경
운영팀 내부 질문: "claude -p 옵션을 안 쓰고 인터랙티브 모드(claude)를 사람 입력 없이 자동화(pexpect/TTY 시뮬레이션 등)로 돌리면, 자동 실행도 구독 한도(claude.ai Plan Usage)로 처리되어 6/15 정책 영향을 피할 수 있지 않은가?"
결론
기술적으로는 가능하지만 권장하지 않습니다. 정책 회색 지대에 들어가며, 잠재적 계정·서비스 차단 리스크가 단기 비용 회피 효과보다 큽니다. 정공법은 본문 1단계 (API 키 분리).
근거 1 — 2026-06-15 정책 공지 직접 인용 (핵심)
출처: https://support.claude.com/en/articles/15036540-use-the-claude-agent-sdk-with-your-claude-plan
"When does the Agent SDK credit apply? The Agent SDK credit applies to:
- Claude Agent SDK usage in your own projects (Python or TypeScript)
- The
claude -pcommand in Claude Code (non-interactive mode)- The Claude Code GitHub Actions integration
- Third-party apps that authenticate with your Claude subscription"
해석: "Third-party apps that authenticate with your Claude subscription"이 결정적 조항. 파이프라인은 Claude 구독으로 인증해서 자동으로 작업을 수행하는 third-party app으로 분류될 가능성이 매우 큽니다. 호출 방식(-p 플래그 사용 여부 / 인터랙티브 시뮬레이션)과 무관하게 Agent SDK 크레딧 풀로 분류될 위험이 있습니다.
근거 2 — Agent SDK Overview 직접 인용
출처: https://code.claude.com/docs/en/agent-sdk/overview
"Anthropic does not allow third party developers to offer claude.ai login or rate limits for their products, including agents built on the Claude Agent SDK. Please use the API key authentication methods described in this document instead."
해석에 nuance가 있음 (솔직히):
- 이 조항은 엄밀히 "외부 사용자에게 claude.ai 인증을 제공하는 제품을 만드는 third-party 개발자" 를 대상으로 한 금지 조항입니다.
- 파이프라인처럼 사내에서 운영자 본인 계정으로 자기 자동화에 사용하는 케이스는 회색 지대 — 100% 위반이라고 단정하기 어렵습니다.
- 그러나 근거 1의 광범위한 분류와 결합하면, 사내 자동화 역시 Agent SDK 풀로 분류될 가능성이 큽니다. Anthropic이 향후 강제 방식(TTY 탐지, 트래픽 패턴 분석, 계정 차단 등)을 공개하지 않은 만큼 리스크 감수 가치가 낮습니다.
근거 3 — --bare 모드도 우회 수단 아님
출처: https://code.claude.com/docs/en/headless
"
--bareis the recommended mode for scripted and SDK calls, and will become the default for-pin a future release."
해석: --bare는 claude -p 의 sub-option (hooks/skills/plugins/MCP/CLAUDE.md 로딩을 스킵하는 빠른 모드). 결국 -p 와 같은 카테고리이므로 Agent SDK 크레딧 풀에서 동일하게 차감됩니다. "bare가 별도 카테고리"가 아닙니다.
근거 4 — 기술적 우회 시도가 가능한 모든 방법
| 방법 | 가능 여부 | 정책상 분류 |
|---|---|---|
pexpect 등으로 TTY 시뮬레이션 후 claude 인터랙티브 호출 | ✅ 기술 가능 | ⚠️ third-party app 회피로 간주될 가능성 |
claude --bare 사용 | ✅ 공식 지원 | ❌ Agent SDK 크레딧 풀 (동일 풀) |
| Claude Agent SDK (Python/TS 라이브러리)로 OAuth 자격증명 사용 | ✅ 기술 가능 | ❌ 명시적으로 Agent SDK 크레딧 풀 |
| 사람이 시작한 인터랙티브 세션에 자동 입력 주입 | ✅ 기술 가능 | ⚠️ 인터랙티브 흉내 — 회색 지대 |
--input-format stream-json 으로 stdin 파이프 | ✅ 공식 지원 | ❌ -p 와 함께 쓰는 옵션 — Agent SDK 풀 |
→ 공식적으로 인터랙티브 풀에 차감되도록 보장하는 자동화 호출 방법은 없습니다.
근거 5 — Anthropic의 우선순위 분리 의도
출처: https://support.claude.com/en/articles/15036540 (동일 공지 본문)
"Your subscription usage limits stay the same and stay reserved for interactive use of Claude Code, Claude Cowork, and Claude."
해석: "stay reserved for interactive use" 라는 표현이 정책의 의도를 명확히 보여줍니다. 사람이 직접 사용하는 인터랙티브 용도로 구독 한도를 보호하는 것이 정책의 목적이며, 자동화가 인터랙티브를 흉내내는 패턴은 정책 의도와 명백히 충돌합니다.
리스크 평가
| 항목 | 인터랙티브 우회 시도 | API 키 분리 (정공법) |
|---|---|---|
| 단기 비용 절감 | 구독 한도 활용 → 단기적으로 무료 효과 | 종량제 → 사용량만큼 청구 (단, 콘솔 한도로 상한 강제) |
| 계정 정지 위험 | 🔴 있음 (회피 시도로 적발 가능) | 🟢 없음 |
| 서비스 차단 위험 | 🔴 ��음 (Anthropic이 향후 차단 방식 추가 가능) | 🟢 없음 |
| TOS 위반 가능성 | 🟡 회색 지대 (근거 1·2에 따라 분류 가능) | 🟢 없음 (공식 권장 방식) |
| 운영 안정성 | 🔴 정책 변경 시 즉각 영향 | 🟢 정책 변경 영향 0 |
| 회계·감사 | 🔴 청구가 어디 풀에 잡힐지 불확실 | 🟢 콘솔 Usage에 명확히 잡힘 |
운영 결정 권장
- 인터랙티브 우회는 채택하지 않는다.
- 정공법인 본문 1단계 (API 키 분리) 로 운영을 시작한다.
- 호출별 정밀 제어가 필요한 경우, 본문 5단계 스킬 메타데이터 스키마(
billing_mode,model_tier,cli_agent)를 활용한다 — 합법적·공식적 방법으로 동일한 운영 유연성 확보 가능. - Anthropic 측에 6/15 시행 전 다음 사항 공식 문의 권장: ① 사내 자동화의 third-party app 분류 여부 ② 인터랙티브 호출 자동화 시 트래픽 패턴 탐지 정책 ③ 위반 시 정상화 절차
참고 인용 페이지 (전체 URL)
- https://support.claude.com/en/articles/15036540-use-the-claude-agent-sdk-with-your-claude-plan (6/15 정책 공지)
- https://code.claude.com/docs/en/agent-sdk/overview (Agent SDK Overview — third-party 금지 조항)
- https://code.claude.com/docs/en/headless (Headless / bare mode 설명)
- https://code.claude.com/docs/en/authentication (Claude Code 인증 우선순위)
구현 가이드: 인터랙티브 모드 자동화 (옵션 E)
정정 사항: 본 보고서 초기 버전에서는 인터랙티브 모드 자동화를 "구조적으로 불가능"으로 분류했으나, 정밀 재검토 결과 기술적 구현은 가능합니다. 트레이드오프 명시 후 옵션으로 제공합니다.
권장 구현 패턴: 세션 재사용 REPL 패턴
devskills 폴더에서 claude 인터랙티브 세션을 1회 시작 후 유지하면서 여러 작업을 prompt 주입으로 처리. 시작 비용(CLAUDE.md/MCP/skills 로딩) 절감 + 컨텍스트 활용 이점.
# scripts/worker-interactive.py (신규 모듈 예시)
import asyncio
import pty
import os
import re
class ClaudeInteractiveSession:
def __init__(self, cwd: str):
self.cwd = cwd
self.proc = None
self.master_fd = None
async def spawn(self):
"""devskills 폴더에서 claude 인터랙티브 세션 시작"""
self.master_fd, slave_fd = pty.openpty()
self.proc = await asyncio.create_subprocess_exec(
'claude',
stdin=slave_fd, stdout=slave_fd, stderr=slave_fd,
cwd=self.cwd, start_new_session=True,
)
os.close(slave_fd)
await self._wait_for_prompt() # 초기 프롬프트 대기
async def execute_skill(self, skill_name: str, args: str) -> str:
"""세션 유지 상태에서 스킬 1건 실행"""
await self._send('/clear') # 이전 컨텍스트 초기화
await self._wait_for_prompt()
await self._send(f'/{skill_name} {args}')
output = await self._collect_until_prompt(timeout=3600)
return self._strip_ansi(output) # ANSI escape 제거
async def _send(self, line: str):
os.write(self.master_fd, (line + '\n').encode())
async def _wait_for_prompt(self):
"""'> ' 프롬프트 마커 감지"""
# asyncio + os.read(master_fd) 패턴
...
def _strip_ansi(self, text: str) -> str:
return re.sub(r'\x1b\[[0-9;]*[a-zA-Z]', '', text)
async def close(self):
await self._send('/exit')
await self.proc.wait()
동시성 — 세션 풀 패턴
단일 세션은 동시 작업 1건만 처리 가능. 처리량 확보를 위해 풀 사용:
class ClaudeSessionPool:
def __init__(self, size: int = 3, cwd: str = '/path/to/devskills'):
self.pool = asyncio.Queue(maxsize=size)
self.size = size
self.cwd = cwd
async def init(self):
for _ in range(self.size):
session = ClaudeInteractiveSession(self.cwd)
await session.spawn()
await self.pool.put(session)
async def execute(self, skill_name: str, args: str) -> str:
session = await self.pool.get()
try:
return await session.execute_skill(skill_name, args)
except Exception:
# 세션 사망 시 재생성
session = ClaudeInteractiveSession(self.cwd)
await session.spawn()
raise
finally:
await self.pool.put(session)
트레이드오프 명시
| 항목 | 인터랙티브 모드 | claude -p 모드 (현행) |
|---|---|---|
| 시작 비용 | 세션당 1회 (재사용) | 호출당 매번 |
| cost_usd 실시간 추출 | ❌ 불가 (Admin API 사후 조회) | ✅ envelope에서 직접 |
| 출력 파싱 안정성 | ⚠️ ANSI escape 처리 필요 | ✅ stream-json JSON |
| 동시성 | 세션 풀 (예: 3개) | 무제한 (호출당 독립) |
| 에러 복구 | 세션 재시작 + 컨텍스트 손실 | 호출별 독립 — 단순 |
| 정책 분류 | 회색 지대 (부록 A) | 명확 (Agent SDK 풀) |
| 구독 풀 차감 | 가능 (이론적, 위험 감수 시) | Agent SDK 크레딧 풀 |
적용 결정 기준
이 모드를 활성화할 가치가 있는 경우:
- Agent SDK 크레딧 풀의 한계를 임시 회피하고 싶고
- TOS 회색 지대 리스크를 사내 의사결정자가 승인했으며
- cost_usd 실시간 추적 손실을 수용 가능하고
- 출력 파싱 안정성 저하 + 세션 풀 운영 부담을 감수 가능한 경우
→ 위 조건 모두 충족 시에만 활성화 권장. 일반적인 운영에서는 본문 1단계(API 키 분리)가 정공법.
Comments
No comments yet. Be the first to comment!
★Reviews for this material
Write a reviewNo reviews for this material yet.