Codium Lab
All materials
MaterialsJul 3, 2026Free0

[기술검토] Claude `claude -p` 비용 정책 변경(2026-06-15) 대응 — 5단계 전략 + PoC 7건 + 모드 토글 구현 가이드

Agent SDK 크레딧 분리 정책(2026-06-15) 대응 전략. API 키 분리, 모델 등급 튜닝, 비용 대시보드, Gemini/Codex 다변화, 외부 통합 이전의 5단계와 PoC 7건·모드 토글 구현 가이드로 월 LLM 자동화 비용을 68-87% 절감하는 방법.

#Claude Code#claude-p#Agent SDK#LLM 비용 최적화#ANTHROPIC_API_KEY#apiKeyHelper#dotenv_values#모드토글#sub_env#Gemini CLI#Codex CLI#Ollama#비용 대시보드#모델튜닝#Sonnet#Haiku#멀티에이전트#ResultProcessor#skill_metadata#PoC#PTY#pexpect#TOS#정책변경

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단계를 권장합니다:

  1. Claude API 키로 분리 (즉시, 코드 변경 0)
  2. 파이프라인 안에 비용 대시보드 (2-3주)
  3. 비상등 + 화면에서 즉시 모드 전환 스위치 (1-2주)
  4. 모델 등급 튜닝 + Gemini/Codex 다변화 (스킬별로 Opus → Sonnet/Haiku 다운그레이드 + 호스트에 이미 깔린 Gemini/Codex 분산)
  5. 스킬/커맨드 튜닝 — 외부 통합(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작업
1Anthropic 콘솔(console.anthropic.com)에서 API 키 발급 (이름: pipeline-prod)
2콘솔에서 월 사용 한도(권장 $500) 설정 → 초과 시 키 자동 차단 (비용 폭주 방지)
3파이프라인 호스트(Mac)에 환경변수 등록: ~/.zshrcexport ANTHROPIC_API_KEY="..." 한 줄 추가
4파이프라인 데몬 재시작
5claude /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$751× (기준)
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 (코드 생성 본체)OpusOpus 유지 (또는 Sonnet 검증 후 전환)복잡 추론·1M 컨텍스트 필요. 단, Sonnet PoC 후 결과 동등하면 전환 가능
자동기획_V3/V4OpusOpus 유지창작 + 정합성 검증 필요
자동검증_V3/V4OpusSonnet정형 검증 흐름. Opus 필요한 단계만 부분 사용
SNS자동검증OpusSonnet검증 루프. auto-fix 단계만 Opus
SNS자동기획OpusSonnet콘텐츠 생성. 품질 차이 적음
주문검증 (차세대 주문 파이프라인)OpusSonnet정형 비교 작업
마켓정산자동화OpusSonnet → Haiku정형 데이터 처리
agent-pipeline-creator (router/라벨링)OpusHaiku단순 분류
AI어시스턴트(확인/수정)OpusSonnet알림형
ai-yield (수율 집계)OpusHaiku단순 집계
로그분석OpusSonnet패턴 추출
CS분석/VOC분석OpusSonnet자연어 분류

적용 방식

  • 이미 파이프라인이 스킬별 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:1171cli_agent 읽어 명령어 분기. interactive_mode=truepexpect/pty 모듈로 우회 실행 분기 (구현 가이드는 부록 A)
  • worker.py:684billing_mode 읽어 sub_env에 ANTHROPIC_API_KEY 주입/제거
  • ~/.claude/settings.jsonapiKeyHelper 셸 스크립트 등록 (모드 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 turn0
입력 토큰 절약호출당 컨텍스트 전체 × 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-yield2 (Drive 업로드, DB SELECT)✅ 즉시 가능순수 데이터 집계
마켓정산자동화8 (Sheets, JIRA, DB)✅ 가능result_assembler 패턴 이미 있음
주문검증 (차세대 주문 파이프라인)2 (JIRA, DB)✅ 가능검증 결과만 반환
자동개발_V35 (JIRA, Drive)🟡 부분 가능일부 흐름 제어 검토 필요
자동검증_V44 (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:684billing_mode 보고 ANTHROPIC_API_KEY 조건부 주입/제거
  • scripts/worker.py:1171cli_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 16GBQwen 2.5 Coder 7BApache 2.0 ✅코드 분석, 분류
Mac Mini M2 16GBGemma 3 9BGemma License ✅한국어 자연어
M3 Pro 32GB+Qwen 2.5 Coder 32BApache 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. 결정해야 할 사항

#항목권장
11단계 즉시 적용 (API 키 분리)✅ 승인 (가장 안전, 코드 변경 0줄)
2API 키 월 한도 금액권장 $500 (이후 베이스라인 측정 후 조정)
32-3단계 (대시보드 + 비상등 + 스위치)✅ 승인
4임계치 단계70% / 85% / 95%
5모드 스위치 권한운영자(admin)만
6-A4-A 모델 튜닝 (Opus → Sonnet/Haiku) 즉시 진행✅ 승인 (단일 메커니즘 중 가장 큰 절감 효과, 코드 변경 거의 없음). 스킬별 PoC 1건씩 품질 검증 후 전환
6-B4-B (Gemini/Codex 통합) 우선순위✅ 승인 (이미 호스트 설치되어 추가 비용 없음)
75단계 (스킬 외부 통합 → 파이프라인 이전) 적용 순서ai-yield · 마켓정산자동화 · 주문검증 부터 PoC → 자동검증/자동개발 확대
8ResultProcessor 모듈 신설파이프라인 백엔드에 신규 (backend/app/services/result_processor.py)
9로컬 Ollama 도입보안 필요 작업 발생 시 (선택)
10Anthropic 측 확인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,5000%
+1단계 (API 키 분리)비용 자체는 동일. 콘솔 한도로 상한 강제 + 폭주 위험 0$1,500$1,5000% (안정성 ↑)
+2-3단계 (대시보드 + 비상등 + 스위치)운영자 개입(임계치 시 모드 전환)으로 5-10% 절감$1,425$1,3505-10%
+4-A (Claude 모델 튜닝 Opus → Sonnet/Haiku)4-5개 스킬을 Sonnet으로 전환 (Opus 대비 1/5 단가). 모델 튜닝만으로 40-55% 절감$710$47053-69%
+4-B (Gemini/Codex 분산)보조 작업 20-40%를 무료/저렴한 곳으로 이전$570$29562-80%
+5단계 (스킬 외부 통합 → 파이프라인 이전)스킬당 외부 호출 4-8회 제거 → turn 감소 → 토큰 15-35% 직접 감소$485$19068-87%

5단계 모두 적용 시: 월 $1,500 → 약 $190-$485 (보수에서 낙관, 68-87% 절감)

가장 큰 효과를 내는 두 메커니즘 (우선순위)

  1. 4-A 모델 튜닝 (Opus → Sonnet/Haiku) — 단일 메커니즘 중 40-55% 절감으로 가장 큼. 코드 변경 거의 없음 (skill metadata의 모델 기본값만 수정). PoC 결과 품질 동등하면 즉시 적용.
  2. 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 + 데몬 재시작

사전 준비

  1. Anthropic Console → API Keys → Create Key (이름: pipeline-poc)
  2. 콘솔 Plans & Billing → Usage Limits → 월 한도 $50 (PoC라 작게)
  3. 발급된 키를 안전한 곳에 임시 저장

실행

# 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 값 정상 추출양수 ($0.01$0.10)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

대상 선정 기준 (안전한 후보 순)

  1. ai-yield (수율 집계 — 단순)
  2. agent-pipeline-creator (라벨링/라우팅 — 단순 분류)
  3. 마켓정산자동화 (정형 데이터 — 검증 후)

실행

# 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_msHaiku가 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 설정
  • 파이프라인 호스트 .zshrcexport 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-1234 envelope 파싱 후 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:684 sub_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.jsonapiKeyHelper 등록
  • 셸 스크립트 작성: 환경/시간/스킬별 API 키 동적 반환
  • PoC 6 실행: 호출별 다른 인증 키 사용 검증

6-10주 (옵션, 비권장) — 인터랙티브 모드 자동화

⚠️ 사내 의사결정자 승인 필수. 부록 A 정책 위험 + 트레이드오프 수용 확인.

  • 사내 의사결정자 승인 획득 (TOS 회색 지대 수용)
  • worker-interactive.py 신규 모듈 (PTY + 세션 풀)
  • pexpect 또는 stdlib pty 의존성 추가
  • 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 hostpython3 scripts/worker.py) (subprocess)자동 로드 안 함 — 명시적 로드 코드 필요

근거:

  • Makefile: host: python3 scripts/worker.py (Docker 아님)
  • worker.pyload_dotenv 호출 없음 (확인됨)
  • config.py Settings 클래스에 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 DBUI 클릭 즉시

키 자체는 자주 안 바뀌니 .env로 충분, 모드만 DB로 동적 관리.

11.6 변경 파일 매트릭스

파일변경작업량
.envANTHROPIC_API_KEY=sk-ant-... 한 줄1줄
scripts/worker.pydotenv_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 rowSQL 1개
frontend/src/app/(with-sidebar)/settings/usage/page.tsxToggle 컴포넌트약 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검증
1make host 재시작 후 _ANTHROPIC_API_KEY 변수 로드 확인 (로그)
2UI 토글 api_key → 다음 작업 실행 시 워커 로그에서 sub_env 키 포함 확인
3UI 토글 subscription워커 재시작 없이 다음 작업에서 키 미포함 확인
4claude.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 권장 진행 순서

#작업담당
1DB 마이그레이션 (config 테이블 + billing_mode row)파이프라인 개발
2Backend /api/config/billing_mode REST API파이프라인 개발
3Backend dispatch 메시지에 billing_mode 포함파이프라인 개발
4worker.py에 dotenv_values + build_sub_env 분기파이프라인 개발
5.env에 키 추가 (운영자) + 워커 재시작운영자
6기본값 api_key로 동작 검증 (UI 없이 REST API로 mode 변경 테스트)운영자
7Frontend 토글 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-BGemini/Codex 다변화6-8주추가 분산, 누적 62-80% 절감4순위
5단계스킬 외부 통합 → 파이프라인 이전8-12주토큰 자체 감소, 누적 68-87% 절감5순위
옵션 E인터랙티브 모드 자동화비권장 (TOS 회색 지대, 부록 A)기본 비활성화

참고: "claude -p 안 쓰고 인터랙티브 모드로 자동화하면 되지 않나?" 라는 우회 시도에 대한 정책 검토는 12번 부록 A 참조. 결론은 권장하지 않음 (TOS 회색 지대 + 계정 차단 리스크).


13. 참고 자료

Anthropic 공식

다른 CLI 도구

파이프라인 내부 코드 참조 지점

  • scripts/worker.py:684, :842 — 자식 프로세스 환경변수 구성 (모드 분기 진입점)
  • scripts/worker.py:1171claude -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 -p command 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

"--bare is the recommended mode for scripted and SDK calls, and will become the default for -p in a future release."

해석: --bareclaude -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. 인터랙티브 우회는 채택하지 않는다.
  2. 정공법인 본문 1단계 (API 키 분리) 로 운영을 시작한다.
  3. 호출별 정밀 제어가 필요한 경우, 본문 5단계 스킬 메타데이터 스키마(billing_mode, model_tier, cli_agent)를 활용한다 — 합법적·공식적 방법으로 동일한 운영 유연성 확보 가능.
  4. Anthropic 측에 6/15 시행 전 다음 사항 공식 문의 권장: ① 사내 자동화의 third-party app 분류 여부 ② 인터랙티브 호출 자동화 시 트래픽 패턴 탐지 정책 ③ 위반 시 정상화 절차

참고 인용 페이지 (전체 URL)

구현 가이드: 인터랙티브 모드 자동화 (옵션 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

0/2000

No comments yet. Be the first to comment!

Reviews for this material

Write a review

No reviews for this material yet.