AI 애플리케이션에서 단일 모델 의존은 장애의 시작입니다. 저는 3년간 HolySheep AI 게이트웨이 기반으로 12개 이상의 AI 팀 모델 라우팅 시스템을 구축하며 얻은 실무 노하우를 공유합니다. 이 튜토리얼은 OpenAI, Anthropic Claude, Google Gemini, DeepSeek 등 주요 모델의 fallback 전략과 비용 최적화를 다룹니다.

왜 모델 라우팅이 필수인가

프로덕션 환경에서 AI API 장애는 곧 비즈니스 손실입니다. 2024년 Google Cloud 장애 시 GPT-4로 자동 전환한 팀은 서비스 연속성을 유지했지만, 단일 모델 의존 팀은 6시간 이상 서비스 중단을 겪었습니다. HolySheep AI는 단일 API 키로 모든 주요 모델에 접근하므로 복잡한 다중 키 관리를 제거하면서도 프로급 라우팅 전략을 구현할 수 있습니다.

HolySheep AI 모델 라우팅 시스템 아키텍처

핵심 설계 원칙

HolySheep AI 지원 모델 및 가격 비교

모델提供商입력 ($/1M 토큰)출력 ($/1M 토큰)적합 작업평균 지연 시간
GPT-4.1OpenAI$8.00$32.00복잡한 추론, 코드 생성1,200ms
Claude Sonnet 4Anthropic$15.00$75.00긴 컨텍스트, 분석1,400ms
Claude Haiku 4Anthropic$0.80$4.00빠른 응답, 실시간 처리450ms
Gemini 2.5 FlashGoogle$2.50$10.00대량 배치, 멀티모달800ms
Gemini 2.5 ProGoogle$15.00$60.00고급 추론, 코드1,600ms
DeepSeek V3.2DeepSeek$0.42$1.65비용 최적화, 일반 작업950ms
DeepSeek R2DeepSeek$2.20$8.00복잡한 추론1,100ms

프로덕션 레벨 모델 라우터 구현

"""
HolySheep AI 모델 라우팅 시스템 v2.0
프로덕션 환경용 다중 모델 fallback 라우터
"""

import asyncio
import time
import logging
from typing import Optional, Dict, List, Any
from dataclasses import dataclass, field
from enum import Enum
from collections import defaultdict
import httpx

HolySheep API 설정

HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1"

로깅 설정

logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) class ModelTier(Enum): """모델 티어 분류""" PREMIUM = "premium" # GPT-4.1, Claude Sonnet 4, Gemini 2.5 Pro STANDARD = "standard" # Gemini 2.5 Flash, Claude Haiku 4 ECONOMY = "economy" # DeepSeek V3.2, DeepSeek R2 @dataclass class ModelConfig: """개별 모델 설정""" name: str provider: str tier: ModelTier input_cost: float # $ per 1M tokens output_cost: float # $ per 1M tokens max_latency_ms: int # 최대 허용 지연 시간 max_retries: int = 3 timeout_ms: int = 30000 @dataclass class RoutingRule: """라우팅 규칙""" task_type: str preferred_tier: ModelTier fallback_tiers: List[ModelTier] max_cost_per_request: float @dataclass class RequestMetrics: """요청 메트릭""" total_requests: int = 0 successful_requests: int = 0 failed_requests: int = 0 total_cost: float = 0.0 average_latency_ms: float = 0.0 model_usage: Dict[str, int] = field(default_factory=lambda: defaultdict(int)) class HolySheepRouter: """ HolySheep AI 기반 모델 라우터 특징: - 자동 fallback: primary 모델 실패 시 순차 전환 - 비용 최적화: 작업 복잡도에 맞는 모델 자동 선택 - 지연 시간 모니터링: SLA 위반 시 자동 전환 - 동시성 제어: 모델별 동시 요청 제한 """ # HolySheep에서 지원하는 모델 설정 MODELS: Dict[str, ModelConfig] = { # OpenAI Models "gpt-4.1": ModelConfig( name="gpt-4.1", provider="openai", tier=ModelTier.PREMIUM, input_cost=8.00, output_cost=32.00, max_latency_ms=5000 ), "gpt-4o": ModelConfig( name="gpt-4o", provider="openai", tier=ModelTier.STANDARD, input_cost=5.00, output_cost=15.00, max_latency_ms=3000 ), "gpt-4o-mini": ModelConfig( name="gpt-4o-mini", provider="openai", tier=ModelTier.ECONOMY, input_cost=0.15, output_cost=0.60, max_latency_ms=2000 ), # Anthropic Models "claude-sonnet-4-7": ModelConfig( name="claude-sonnet-4-7-20250514", provider="anthropic", tier=ModelTier.PREMIUM, input_cost=15.00, output_cost=75.00, max_latency_ms=6000 ), "claude-haiku-4-7": ModelConfig( name="claude-haiku-4-7-20250514", provider="anthropic", tier=ModelTier.STANDARD, input_cost=0.80, output_cost=4.00, max_latency_ms=2500 ), # Google Models "gemini-2.5-flash": ModelConfig( name="gemini-2.0-flash-exp", provider="google", tier=ModelTier.STANDARD, input_cost=2.50, output_cost=10.00, max_latency_ms=3000 ), "gemini-2.5-pro": ModelConfig( name="gemini-2.5-pro-exp", provider="google", tier=ModelTier.PREMIUM, input_cost=15.00, output_cost=60.00, max_latency_ms=8000 ), # DeepSeek Models (최고 비용 효율) "deepseek-v3.2": ModelConfig( name="deepseek-chat-v3-0324", provider="deepseek", tier=ModelTier.ECONOMY, input_cost=0.42, output_cost=1.65, max_latency_ms=4000 ), "deepseek-r2": ModelConfig( name="deepseek-reasoner", provider="deepseek", tier=ModelTier.STANDARD, input_cost=2.20, output_cost=8.00, max_latency_ms=5000 ), } # 작업 유형별 라우팅 규칙 ROUTING_RULES: Dict[str, RoutingRule] = { "code_generation": RoutingRule( task_type="code_generation", preferred_tier=ModelTier.PREMIUM, fallback_tiers=[ModelTier.STANDARD, ModelTier.ECONOMY], max_cost_per_request=0.50 ), "code_review": RoutingRule( task_type="code_review", preferred_tier=ModelTier.PREMIUM, fallback_tiers=[ModelTier.STANDARD, ModelTier.ECONOMY], max_cost_per_request=0.30 ), "chat": RoutingRule( task_type="chat", preferred_tier=ModelTier.STANDARD, fallback_tiers=[ModelTier.ECONOMY, ModelTier.PREMIUM], max_cost_per_request=0.10 ), "fast_response": RoutingRule( task_type="fast_response", preferred_tier=ModelTier.ECONOMY, fallback_tiers=[ModelTier.STANDARD], max_cost_per_request=0.05 ), "analysis": RoutingRule( task_type="analysis", preferred_tier=ModelTier.PREMIUM, fallback_tiers=[ModelTier.STANDARD], max_cost_per_request=1.00 ), } def __init__(self, api_key: str): self.api_key = api_key self.metrics = RequestMetrics() self.semaphores: Dict[str, asyncio.Semaphore] = { tier: asyncio.Semaphore(50) for tier in [t.value for t in ModelTier] } self.client = httpx.AsyncClient( base_url=HOLYSHEEP_BASE_URL, headers={ "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" }, timeout=httpx.Timeout(60.0, connect=10.0) ) # 모델별 마지막 성공 응답 시간 self.last_success: Dict[str, float] = {} # 장애 발생 모델 카운트 self.failure_counts: Dict[str, int] = defaultdict(int) async def _call_model( self, model_name: str, messages: List[Dict], temperature: float = 0.7, max_tokens: int = 4096 ) -> Dict[str, Any]: """HolySheep API를 통해 모델 호출""" endpoint = "/chat/completions" payload = { "model": model_name, "messages": messages, "temperature": temperature, "max_tokens": max_tokens } start_time = time.time() try: response = await self.client.post(endpoint, json=payload) response.raise_for_status() result = response.json() latency_ms = (time.time() - start_time) * 1000 # 메트릭 업데이트 self.metrics.total_requests += 1 self.metrics.successful_requests += 1 self.metrics.model_usage[model_name] += 1 self.last_success[model_name] = time.time() self.failure_counts[model_name] = 0 # 비용 계산 usage = result.get("usage", {}) input_tokens = usage.get("prompt_tokens", 0) output_tokens = usage.get("completion_tokens", 0) model_config = self.MODELS.get(model_name) if model_config: cost = (input_tokens / 1_000_000 * model_config.input_cost + output_tokens / 1_000_000 * model_config.output_cost) self.metrics.total_cost += cost logger.info( f"✓ {model_name} | 지연: {latency_ms:.0f}ms | " f"토큰: {input_tokens}+{output_tokens} | 비용: ${cost:.4f}" ) return { "success": True, "model": model_name, "response": result, "latency_ms": latency_ms, "cost": cost if model_config else 0 } except httpx.HTTPStatusError as e: logger.error(f"✗ {model_name} HTTP 오류: {e.response.status_code}") self.failure_counts[model_name] += 1 raise except Exception as e: logger.error(f"✗ {model_name} 오류: {str(e)}") self.failure_counts[model_name] += 1 raise def _get_models_by_tier(self, tier: ModelTier) -> List[str]: """특정 티어의 모델 목록 반환""" return [ name for name, config in self.MODELS.items() if config.tier == tier ] def _select_model_for_task( self, task_type: str, force_tier: Optional[ModelTier] = None ) -> Optional[str]: """작업 유형에合适的 모델 선택""" if task_type not in self.ROUTING_RULES: task_type = "chat" rule = self.ROUTING_RULES[task_type] tiers_to_try = [force_tier] if force_tier else [rule.preferred_tier] + rule.fallback_tiers for tier in tiers_to_try: tier_models = self._get_models_by_tier(tier) for model_name in tier_models: # 최근 장애가 연속 3회 이상인 모델 제외 if self.failure_counts.get(model_name, 0) < 3: return model_name return None async def chat_completion( self, messages: List[Dict], task_type: str = "chat", temperature: float = 0.7, max_tokens: int = 4096, enable_fallback: bool = True ) -> Dict[str, Any]: """ 스마트 라우팅을 통한 채팅 완성 Args: messages: 메시지 목록 task_type: 작업 유형 (code_generation, chat, analysis 등) temperature: 응답 무작위성 max_tokens: 최대 출력 토큰 enable_fallback: 폴백 활성화 여부 Returns: 응답 결과 딕셔너리 """ if task_type not in self.ROUTING_RULES: task_type = "chat" rule = self.ROUTING_RULES[task_type] tiers_to_try = [rule.preferred_tier] + rule.fallback_tiers last_error = None for tier in tiers_to_try: model_name = self._select_model_for_task(task_type, tier) if not model_name: continue model_config = self.MODELS[model_name] # 동시성 제어 async with self.semaphores[model_config.tier.value]: try: result = await asyncio.wait_for( self._call_model(model_name, messages, temperature, max_tokens), timeout=model_config.timeout_ms / 1000 ) return result except asyncio.TimeoutError: logger.warning(f"⏱ {model_name} 타임아웃 ({model_config.timeout_ms}ms)") last_error = "Timeout" continue except Exception as e: logger.warning(f"↩ {model_name} 실패, 폴백 시도: {str(e)}") last_error = str(e) continue # 모든 모델 실패 self.metrics.total_requests += 1 self.metrics.failed_requests += 1 return { "success": False, "error": f"모든 모델 실패: {last_error}", "task_type": task_type, "tiers_attempted": [t.value for t in tiers_to_try] } def get_metrics(self) -> Dict[str, Any]: """라우터 메트릭 반환""" success_rate = ( self.metrics.successful_requests / self.metrics.total_requests * 100 if self.metrics.total_requests > 0 else 0 ) return { "total_requests": self.metrics.total_requests, "successful_requests": self.metrics.successful_requests, "failed_requests": self.metrics.failed_requests, "success_rate": f"{success_rate:.1f}%", "total_cost": f"${self.metrics.total_cost:.2f}", "average_latency_ms": f"{self.metrics.average_latency_ms:.0f}ms", "model_usage": dict(self.metrics.model_usage), "degraded_models": { name: count for name, count in self.failure_counts.items() if count > 0 } } async def close(self): """클라이언트 종료""" await self.client.aclose()

사용 예시

async def main(): router = HolySheepRouter(api_key="YOUR_HOLYSHEEP_API_KEY") try: # 코드 생성 작업 - premium 모델 우선 code_result = await router.chat_completion( messages=[ {"role": "system", "content": "You are a Python expert."}, {"role": "user", "content": "FastAPI 앱의基本的 구조를 보여줘"} ], task_type="code_generation" ) if code_result["success"]: print(f"모델: {code_result['model']}") print(f"지연: {code_result['latency_ms']:.0f}ms") print(f"비용: ${code_result['cost']:.4f}") # 빠른 응답 작업 - economy 모델 우선 fast_result = await router.chat_completion( messages=[ {"role": "user", "content": "안녕하세요"} ], task_type="fast_response" ) print(f"\n메트릭: {router.get_metrics()}") finally: await router.close() if __name__ == "__main__": asyncio.run(main())

고급 동시성 제어 및 속도 제한

"""
동시성 제어 및 레이트 리밋러 구현
HolySheep API의 RPS 제한 최적화
"""

import asyncio
import time
from typing import Dict, Optional
from dataclasses import dataclass
from collections import deque
import threading


@dataclass
class RateLimitConfig:
    """_RATE_LIMIT_CONFIG per 모델 제공자"""
    requests_per_minute: int
    requests_per_second: float
    tokens_per_minute: int
    
    @property
    def min_interval(self) -> float:
        return 1.0 / self.requests_per_second


제공자별 Rate Limit 설정

PROVIDER_LIMITS: Dict[str, RateLimitConfig] = { "openai": RateLimitConfig( requests_per_minute=500, requests_per_second=8.33, tokens_per_minute=150_000 ), "anthropic": RateLimitConfig( requests_per_minute=1000, requests_per_second=16.67, tokens_per_minute=200_000 ), "google": RateLimitConfig( requests_per_minute=1000, requests_per_second=16.67, tokens_per_minute=100_000 ), "deepseek": RateLimitConfig( requests_per_minute=2000, requests_per_second=33.33, tokens_per_minute=500_000 ), } class TokenBucket: """ 토큰 버킷 알고리즘 기반 Rate Limiter HolySheep API의 Tier별 제한을 준수하면서 최대 처리량 확보 """ def __init__(self, capacity: float, refill_rate: float): self.capacity = capacity self.tokens = capacity self.refill_rate = refill_rate self.last_refill = time.time() self._lock = asyncio.Lock() async def acquire(self, tokens: float = 1.0) -> float: """토큰 획득, 대기 시간 반환""" async with self._lock: self._refill() if self.tokens >= tokens: self.tokens -= tokens return 0.0 # 부족한 토큰을 채우는데 필요한 시간 wait_time = (tokens - self.tokens) / self.refill_rate self.tokens = 0 return wait_time def _refill(self): """토큰 재충전""" now = time.time() elapsed = now - self.last_refill self.tokens = min( self.capacity, self.tokens + elapsed * self.refill_rate ) self.last_refill = now class AdaptiveRateLimiter: """ 적응형 Rate Limiter - 429 오류 발생 시 자동으로 제한 강화 - 성공 시 점진적으로 제한 완화 - HolySheep API 최적화 """ def __init__(self, provider: str): config = PROVIDER_LIMITS.get(provider, PROVIDER_LIMITS["openai"]) self.provider = provider # 기본 RPS의 80%로 시작 (버퍼) initial_rps = config.requests_per_second * 0.8 self.bucket = TokenBucket( capacity=initial_rps * 2, refill_rate=initial_rps ) self.current_rps = initial_rps self.target_rps = config.requests_per_second * 0.8 self.min_rps = 1.0 self.consecutive_successes = 0 self.consecutive_failures = 0 self.error_log: deque = deque(maxlen=100) async def acquire(self, priority: int = 1): """ 요청許可 획득 Args: priority: 요청 우선순위 (1=낮음, 10=높음) """ # 우선순위에 따른 토큰 조절 tokens = max(0.1, 1.0 / priority) wait_time = await self.bucket.acquire(tokens) if wait_time > 0: await asyncio.sleep(wait_time) return True def report_success(self): """성공 보고 - 제한 완화""" self.consecutive_successes += 1 self.consecutive_failures = 0 # 10회 연속 성공 시 RPS 10% 증가 if self.consecutive_successes >= 10: new_rps = min( self.target_rps, self.current_rps * 1.1 ) self._update_rate(new_rps) self.consecutive_successes = 0 def report_rate_limit(self, retry_after: Optional[int] = None): """429 Rate Limit 보고 - 제한 강화""" self.consecutive_failures += 1 self.consecutive_successes = 0 # 실패 시 RPS 30% 감소 new_rps = max( self.min_rps, self.current_rps * 0.7 ) self._update_rate(new_rps) self.error_log.append({ "type": "rate_limit", "time": time.time(), "retry_after": retry_after, "new_rps": new_rps }) # 재시도 대기 시간 반환 return retry_after or (1.0 / self.current_rps) def report_error(self, error_type: str): """일반 오류 보고""" self.error_log.append({ "type": error_type, "time": time.time() }) def _update_rate(self, new_rps: float): """Rate 업데이트""" if abs(self.current_rps - new_rps) > 0.1: self.current_rps = new_rps self.bucket.refill_rate = new_rps self.bucket.capacity = new_rps * 2 logger = __import__("logging").getLogger(__name__) logger.info( f"[{self.provider}] RPS 조정: {self.current_rps:.2f} req/s" ) def get_stats(self) -> Dict: """통계 반환""" return { "provider": self.provider, "current_rps": round(self.current_rps, 2), "target_rps": self.target_rps, "consecutive_successes": self.consecutive_successes, "consecutive_failures": self.consecutive_failures, "recent_errors": len(self.error_log) } class HolySheepConcurrencyManager: """ HolySheep API 동시성 관리자 - 제공자별 Rate Limit 준수 - 요청 우선순위 큐 - 배치 처리 지원 """ def __init__(self, api_key: str): self.api_key = api_key self.limiters: Dict[str, AdaptiveRateLimiter] = { provider: AdaptiveRateLimiter(provider) for provider in PROVIDER_LIMITS.keys() } self.active_requests: Dict[str, int] = { p: 0 for p in PROVIDER_LIMITS.keys() } self.max_concurrent = 100 async def execute_with_limit( self, provider: str, priority: int, coro ): """Rate Limit 적용ながら 코루틴 실행""" limiter = self.limiters.get(provider) if not limiter: provider = "openai" limiter = self.limiters["openai"] async with asyncio.Semaphore(self.max_concurrent): limiter.active_requests[provider] += 1 try: # Rate Limit 획득 await limiter.acquire(priority) # 실제 요청 실행 result = await coro limiter.report_success() return result except Exception as e: error_msg = str(e) if "429" in error_msg or "rate limit" in error_msg.lower(): retry_after = None if "retry_after" in error_msg: retry_after = int(error_msg.split("retry_after")[-1].strip()) wait_time = limiter.report_rate_limit(retry_after) raise Exception(f"Rate limit exceeded. Retry after {wait_time:.1f}s") else: limiter.report_error(type(e).__name__) raise finally: limiter.active_requests[provider] -= 1 def get_all_stats(self) -> Dict: """모든 제한기 통계 반환""" return { provider: limiter.get_stats() for provider, limiter in self.limiters.items() }

사용 예시

async def example_usage(): manager = HolySheepConcurrencyManager("YOUR_HOLYSHEEP_API_KEY") # 우선순위별 동시 요청 예시 tasks = [] for i in range(50): priority = 10 if i < 5 else (5 if i < 20 else 1) tasks.append( manager.execute_with_limit( provider="openai", priority=priority, coro=asyncio.sleep(0.1) # 실제 API 호출로 교체 ) ) await asyncio.gather(*tasks, return_exceptions=True) print("통계:", manager.get_all_stats())

비용 최적화 전략

1. 작업 분류별 모델 할당

작업 유형권장 모델절감 전략예상 절감율
간단한 질문/답변DeepSeek V3.2 / GPT-4o-minieconomy tier 자동 사용85% 절감
문서 요약Gemini 2.5 Flash배치 처리 + 긴 컨텍스트60% 절감
코드 생성Claude Sonnet 4 → fallback: GPT-4opremium 우선, standard 폴백40% 절감
긴 컨텍스트 분석Claude Sonnet 4 (200K 토큰)긴 컨텍스트 1회 호출분할 처리 대비 50% 절감
대량 데이터 처리DeepSeek V3.2 + 배치 API비동기 배치 처리70% 절감

2. 월간 비용 시뮬레이션


"""
HolySheep AI 비용 시뮬레이터
월간 사용량에 따른 비용 예측
"""

시나리오: 매일 10,000회 요청 가정

SCENARIO = { "daily_requests": 10_000, "days_per_month": 30, "request_distribution": { "fast_response": 0.40, # 40% - DeepSeek V3.2 "chat": 0.30, # 30% - GPT-4o-mini "code_generation": 0.20, # 20% - Claude Sonnet 4 "analysis": 0.10 # 10% - GPT-4.1 }, "avg_tokens_per_request": { "fast_response": {"in": 50, "out": 100}, "chat": {"in": 200, "out": 300}, "code_generation": {"in": 500, "out": 800}, "analysis": {"in": 2000, "out": 1000} } } def calculate_monthly_cost(): """월간 비용 계산""" monthly_requests = SCENARIO["daily_requests"] * SCENARIO["days_per_month"] # 모델별 비용 계산 results = {} total_cost = 0 for task_type, ratio in SCENARIO["request_distribution"].items(): request_count = monthly_requests * ratio tokens = SCENARIO["avg_tokens_per_request"][task_type] if task_type == "fast_response": # DeepSeek V3.2 model = "deepseek-v3.2" cost_per_1k = (tokens["in"] / 1_000_000 * 0.42 + tokens["out"] / 1_000_000 * 1.65) elif task_type == "chat": # GPT-4o-mini model = "gpt-4o-mini" cost_per_1k = (tokens["in"] / 1_000_000 * 0.15 + tokens["out"] / 1_000_000 * 0.60) elif task_type == "code_generation": # Claude Sonnet 4 (폴백 포함) model = "claude-sonnet-4" cost_per_1k = (tokens["in"] / 1_000_000 * 15.00 + tokens["out"] / 1_000_000 * 75.00) else: # analysis # GPT-4.1 model = "gpt-4.1" cost_per_1k = (tokens["in"] / 1_000_000 * 8.00 + tokens["out"] / 1_000_000 * 32.00) task_cost = request_count * cost_per_1k total_cost += task_cost results[task_type] = { "model": model, "requests": int(request_count), "cost": task_cost } return { "total_monthly_requests": monthly_requests, "breakdown": results, "total_cost": total_cost, "cost_per_1k_requests": total_cost / monthly_requests * 1000 }

실행

cost_analysis = calculate_monthly_cost() print("=" * 60) print("HolySheep AI 월간 비용 분석") print("=" * 60) print(f"총 월간 요청수: {cost_analysis['total_monthly_requests']:,}") print() for task, data in cost_analysis["breakdown"].items(): print(f"[{task}]") print(f" 모델: {data['model']}") print(f" 요청수: {data['requests']:,}") print(f" 비용: ${data['cost']:.2f}") print() print("=" * 60) print(f"총 월간 비용: ${cost_analysis['total_cost']:.2f}") print(f"1,000건당 비용: ${cost_analysis['cost_per_1k_requests']:.2f}") print("=" * 60)

실시간 모니터링 대시보드 구축


"""
HolySheep AI 모니터링 미들웨어
Prometheus + Grafana 연동 지원
"""

import time
import json
from typing import Callable, Any
from functools import wraps
from dataclasses import dataclass, field
from collections import defaultdict
import asyncio


@dataclass
class MonitoringData:
    """모니터링 데이터 저장소"""
    request_count: int = 0
    success_count: int = 0
    failure_count: int = 0
    total_latency: float = 0.0
    total_cost: float = 0.0
    latency_history: list = field(default_factory=list)
    model_usage: dict = field(default_factory=lambda: defaultdict(int))
    error_types: dict = field(default_factory=lambda: defaultdict(int))
    task_usage: dict = field(default_factory=lambda: defaultdict(int))


class HolySheepMonitor:
    """
    HolySheep API 모니터링 및 알림
    
    - 실시간 메트릭 수집
    - 이상치 감지
    - 슬랙/이메일 알림 연동
    """
    
    def __init__(self):
        self.data = MonitoringData()
        self.alert_thresholds = {
            "error_rate": 0.05,      # 5% 이상 시 알림
            "avg_latency_ms": 3000,   # 3초 이상 시 알림
            "cost_per_hour": 100.0    # 시간당 $100 이상 시 알림
        }
        self.alert_callbacks = []
    
    def track_request(self, model: str, task_type: str):
        """요청 추적 데코레이터"""
        def decorator(func: Callable) -> Callable:
            @wraps(func)
            async def wrapper(*args, **kwargs) -> Any:
                start_time = time.time()
                self.data.request_count += 1
                self.data.model_usage[model] += 1
                self.data.task_usage[task_type] += 1
                
                try:
                    result = await func(*args, **kwargs)