저는 3년 전 이커머스 스타트업에서 AI 고객 서비스 시스템을 구축할 때 흥미로운 도전에 직면했습니다. 매출이 급증하면서 피크 타임에 ChatGPT API 응답이 8초 이상 지연되는 문제가 발생한 것이죠. 비용을 절감하면서도 응답 속도를 유지하는 방법을 찾다 보니, 여러 AI 모델을 통합하는 다중 모델聚合 게이트웨이가 필요하게 되었습니다. 오늘은 HolySheep AI를 활용하여 고성능 다중 모델聚合 게이트웨이를 구축하는 방법을 상세히 알려드리겠습니다.

다중 모델聚合 게이트웨이란?

다중 모델聚合 게이트웨이는 단일 API 엔드포인트를 통해 여러 AI 모델(GPT-5.5, Gemini, Claude 등)을 통합 관리하는 시스템입니다. 다음과 같은 핵심 이점을 제공합니다:

실전 구축: 이커머스 AI 고객 서비스 시스템

실제 사용 사례로, 이커머스 플랫폼의 AI 고객 서비스를 구축해보겠습니다. 이 시스템은 다음과 같은 요구사항을 충족해야 합니다:

아키텍처 설계

┌─────────────────────────────────────────────────────────────┐
│                    HolySheep AI Gateway                      │
│              https://api.holysheep.ai/v1                     │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│  ┌──────────┐   ┌──────────┐   ┌──────────┐   ┌──────────┐ │
│  │  Client  │──▶│ Router   │──▶│ Model    │──▶│ Response │ │
│  │  Request │   │ (Task    │   │ Pool     │   │ Aggre-   │ │
│  │          │   │ Analysis)│   │          │   │ gator    │ │
│  └──────────┘   └──────────┘   └──────────┘   └──────────┘ │
│                            │                                │
│              ┌─────────────┼─────────────┐                  │
│              ▼             ▼             ▼                  │
│        ┌──────────┐ ┌──────────┐ ┌──────────┐               │
│        │  Gemini  │ │  GPT-5.5 │ │  Claude  │               │
│        │  2.5     │ │          │ │  Sonnet  │               │
│        │  Flash   │ │          │ │  4.5     │               │
│        │ $2.50/M  │ │ $8/MTok  │ │ $15/MTok │               │
│        └──────────┘ └──────────┘ └──────────┘               │
└─────────────────────────────────────────────────────────────┘

1단계: Python SDK 설치 및 기본 설정

# HolySheep AI Multi-Model Gateway SDK

Python 3.9+ 권장

pip install requests httpx asyncio openai anthropic google-generativeai pip install holy-sheep-sdk # 실제 SDK (선택사항)

프로젝트 디렉토리 구조

mkdir -p multi_model_gateway/{core,models,utils} cd multi_model_gateway

환경 변수 설정

export HOLYSHEEP_API_KEY="YOUR_HOLYSHEEP_API_KEY" export HOLYSHEEP_BASE_URL="https://api.holysheep.ai/v1"

2단계: HolySheep AI 기본 클라이언트 구현

# core/holy_sheep_client.py
"""
저는 HolySheep AI의 unified endpoint를 활용하여
여러 모델을 단일 인터페이스로 접근하는 클라이언트를 구현했습니다.
이 방식의 장점은 API 엔드포인트 변경 없이 모델 교체 가능하다는 점입니다.
"""

import os
import json
import time
from typing import Optional, Dict, Any, List
from dataclasses import dataclass
from enum import Enum
import requests

class ModelType(Enum):
    GPT_55 = "gpt-5.5"
    GEMINI_FLASH = "gemini-2.5-flash"
    CLAUDE_SONNET = "claude-sonnet-4.5"
    DEEPSEEK = "deepseek-v3.2"

@dataclass
class ModelConfig:
    name: str
    provider: str
    cost_per_1m_tokens: float
    max_tokens: int
    avg_latency_ms: int
    strengths: List[str]

MODEL_CONFIGS = {
    ModelType.GPT_55: ModelConfig(
        name="gpt-5.5",
        provider="openai",
        cost_per_1m_tokens=8.00,  # $8/MTok
        max_tokens=128000,
        avg_latency_ms=1200,
        strengths=["복잡한 추론", "코드 생성", "창작 작문"]
    ),
    ModelType.GEMINI_FLASH: ModelConfig(
        name="gemini-2.5-flash",
        provider="google",
        cost_per_1m_tokens=2.50,  # $2.50/MTok
        max_tokens=1000000,
        avg_latency_ms=800,
        strengths=["빠른 응답", "비용 효율", "장문 처리"]
    ),
    ModelType.CLAUDE_SONNET: ModelConfig(
        name="claude-sonnet-4.5",
        provider="anthropic",
        cost_per_1m_tokens=15.00,  # $15/MTok
        max_tokens=200000,
        avg_latency_ms=1500,
        strengths=["긴 컨텍스트", "안전한 출력", "명확한 설명"]
    ),
    ModelType.DEEPSEEK: ModelConfig(
        name="deepseek-v3.2",
        provider="deepseek",
        cost_per_1m_tokens=0.42,  # $0.42/MTok
        max_tokens=64000,
        avg_latency_ms=900,
        strengths=["초저비용", "수학 추론", "코드"]
    ),
}

class HolySheepClient:
    """HolySheep AI Unified Gateway Client"""
    
    def __init__(self, api_key: str = None):
        self.api_key = api_key or os.getenv("HOLYSHEEP_API_KEY")
        if not self.api_key:
            raise ValueError("HolySheep API key is required")
        
        self.base_url = "https://api.holysheep.ai/v1"
        self.session = requests.Session()
        self.session.headers.update({
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        })
        
        # 실제 지연 시간 추적 (프로덕션 환경)
        self.latency_tracker = {
            ModelType.GPT_55: [],
            ModelType.GEMINI_FLASH: [],
            ModelType.CLAUDE_SONNET: [],
            ModelType.DEEPSEEK: [],
        }
    
    def chat_completion(
        self,
        model: ModelType,
        messages: List[Dict],
        temperature: float = 0.7,
        max_tokens: int = 2048
    ) -> Dict[str, Any]:
        """
        HolySheep AI를 통한 채팅 완성 요청
        모든 모델은 unified endpoint 하나로 접근
        """
        start_time = time.time()
        
        payload = {
            "model": model.value,
            "messages": messages,
            "temperature": temperature,
            "max_tokens": max_tokens
        }
        
        try:
            response = self.session.post(
                f"{self.base_url}/chat/completions",
                json=payload,
                timeout=30
            )
            response.raise_for_status()
            result = response.json()
            
            # 지연 시간 기록
            latency_ms = (time.time() - start_time) * 1000
            self._track_latency(model, latency_ms)
            
            # 비용 계산
            input_tokens = result.get("usage", {}).get("prompt_tokens", 0)
            output_tokens = result.get("usage", {}).get("completion_tokens", 0)
            cost = self._calculate_cost(model, input_tokens, output_tokens)
            
            return {
                "success": True,
                "model": model.value,
                "content": result["choices"][0]["message"]["content"],
                "latency_ms": round(latency_ms, 2),
                "tokens": {"input": input_tokens, "output": output_tokens},
                "cost_usd": cost
            }
            
        except requests.exceptions.RequestException as e:
            return {
                "success": False,
                "error": str(e),
                "model": model.value
            }
    
    def _track_latency(self, model: ModelType, latency_ms: float):
        """지연 시간 추적 (최근 100개 샘플)"""
        self.latency_tracker[model].append(latency_ms)
        if len(self.latency_tracker[model]) > 100:
            self.latency_tracker[model].pop(0)
    
    def _calculate_cost(self, model: ModelType, input_tokens: int, output_tokens: int) -> float:
        """토큰 사용량 기반 비용 계산"""
        config = MODEL_CONFIGS[model]
        total_tokens = input_tokens + output_tokens
        return round((total_tokens / 1_000_000) * config.cost_per_1m_tokens, 6)
    
    def get_average_latency(self, model: ModelType) -> float:
        """평균 지연 시간 반환 (밀리초)"""
        latencies = self.latency_tracker.get(model, [])
        return round(sum(latencies) / len(latencies), 2) if latencies else 0

사용 예시

if __name__ == "__main__": client = HolySheepClient() # Gemini 2.5 Flash로 간단한 질문 response = client.chat_completion( model=ModelType.GEMINI_FLASH, messages=[ {"role": "system", "content": "당신은 친절한 고객 서비스 담당자입니다."}, {"role": "user", "content": "반품 정책이 어떻게 되나요?"} ] ) print(f"Model: {response['model']}") print(f"Latency: {response['latency_ms']}ms") print(f"Cost: ${response['cost_usd']}") print(f"Response: {response['content'][:100]}...")

3단계: 스마트 라우팅 시스템 구현

# core/smart_router.py
"""
저는 이커머스 AI 고객 서비스를 구축하면서
작업 유형별로 최적 모델을 자동 선택하는 라우팅 로직을 구현했습니다.
이 시스템은 응답 시간, 비용, 품질을 자동으로 최적화합니다.
"""

import re
from typing import List, Dict, Optional, Tuple
from dataclasses import dataclass
from enum import Enum

class TaskType(Enum):
    PRODUCT_INQUIRY = "product_inquiry"        # 상품 문의
    ORDER_STATUS = "order_status"              # 주문 상태
    RETURN_REFUND = "return_refund"            # 반품/환불
    PRODUCT_RECOMMENDATION = "recommendation"  # 상품 추천
    COMPLEX_ANALYSIS = "complex_analysis"      # 복잡한 분석
    CODE_GENERATION = "code_generation"        # 코드 생성
    GENERAL = "general"                        # 일반 대화

@dataclass
class RoutingRule:
    task_type: TaskType
    primary_model: ModelType
    fallback_models: List[ModelType]
    priority_keywords: List[str]
    estimated_complexity: int  # 1-10

class SmartRouter:
    """작업 유형 기반 스마트 모델 라우팅 시스템"""
    
    def __init__(self, client: HolySheepClient):
        self.client = client
        self.rules = self._initialize_routing_rules()
    
    def _initialize_routing_rules(self) -> List[RoutingRule]:
        """라우팅 규칙 초기화"""
        return [
            RoutingRule(
                task_type=TaskType.PRODUCT_INQUIRY,
                primary_model=ModelType.GEMINI_FLASH,
                fallback_models=[ModelType.DEEPSEEK, ModelType.GPT_55],
                priority_keywords=[
                    "상품", "가격", "사이즈", "색상", "재고", 
                    "배송", "옵션", "규격", "사양"
                ],
                estimated_complexity=3
            ),
            RoutingRule(
                task_type=TaskType.ORDER_STATUS,
                primary_model=ModelType.GEMINI_FLASH,
                fallback_models=[ModelType.DEEPSEEK],
                priority_keywords=[
                    "주문", "배송", "도착", "追踪", "배달",
                    "발송", "상태", "예약", "결제"
                ],
                estimated_complexity=2
            ),
            RoutingRule(
                task_type=TaskType.RETURN_REFUND,
                primary_model=ModelType.GEMINI_FLASH,
                fallback_models=[ModelType.CLAUDE_SONNET, ModelType.GPT_55],
                priority_keywords=[
                    "반품", "환불", "취소", "교환", "리턴",
                    "환불금", "반품지", "회수"
                ],
                estimated_complexity=4
            ),
            RoutingRule(
                task_type=TaskType.PRODUCT_RECOMMENDATION,
                primary_model=ModelType.GPT_55,
                fallback_models=[ModelType.GEMINI_FLASH, ModelType.CLAUDE_SONNET],
                priority_keywords=[
                    "추천", "선호", "관심", "좋아하는", "스타일",
                    "메칭", "함께", "비슷한", "대안"
                ],
                estimated_complexity=7
            ),
            RoutingRule(
                task_type=TaskType.COMPLEX_ANALYSIS,
                primary_model=ModelType.GPT_55,
                fallback_models=[ModelType.CLAUDE_SONNET],
                priority_keywords=[
                    "분석", "비교", "평가", "장단점", "차이",
                    "이유", "원인", "결과", "영향"
                ],
                estimated_complexity=9
            ),
            RoutingRule(
                task_type=TaskType.CODE_GENERATION,
                primary_model=ModelType.DEEPSEEK,
                fallback_models=[ModelType.GPT_55, ModelType.GEMINI_FLASH],
                priority_keywords=[
                    "코드", "프로그래밍", "함수", "알고리즘",
                    "디버그", "리팩토링", "스키마", "API"
                ],
                estimated_complexity=6
            ),
        ]
    
    def classify_task(self, user_message: str) -> Tuple[TaskType, float]:
        """
        사용자 메시지 기반으로 작업 유형 분류
        반환값: (작업 유형, 신뢰도 점수)
        """
        user_message_lower = user_message.lower()
        
        best_match = TaskType.GENERAL
        best_score = 0.0
        
        for rule in self.rules:
            score = 0
            for keyword in rule.priority_keywords:
                if keyword in user_message_lower:
                    score += 1
            
            # 복잡도에 따른 가중치 조정
            if score > 0:
                final_score = score * (10 - rule.estimated_complexity) / 10
                if final_score > best_score:
                    best_score = final_score
                    best_match = rule.task_type
        
        return best_match, best_score
    
    def select_model(self, task_type: TaskType) -> ModelType:
        """현재 시스템 상태 기반 최적 모델 선택"""
        
        # 부하 분산 및 지연 시간 기반 선택
        for rule in self.rules:
            if rule.task_type == task_type:
                # 기본적으로 primary 모델 선택
                primary = rule.primary_model
                
                # 지연 시간이 임계값 초과 시 faster 모델로 전환
                avg_latency = self.client.get_average_latency(primary)
                if avg_latency > 2000:  # 2초 이상
                    for fallback in rule.fallback_models:
                        fallback_latency = self.client.get_average_latency(fallback)
                        if fallback_latency < avg_latency * 0.8:
                            return fallback
                
                return primary
        
        return ModelType.GEMINI_FLASH  # 기본값
    
    def execute_with_fallback(
        self,
        messages: List[Dict],
        max_retries: int = 2
    ) -> Dict[str, Any]:
        """
        실패 시 자동 Failover가 포함된 요청 실행
        """
        task_type, confidence = self.classify_task(messages[-1]["content"])
        primary_model = self.select_model(task_type)
        
        # 라우팅 규칙 찾기
        rule = next(
            (r for r in self.rules if r.task_type == task_type),
            None
        )
        
        fallback_chain = [primary_model]
        if rule:
            fallback_chain.extend(rule.fallback_models[:max_retries])
        
        last_error = None
        for model in fallback_chain[:max_retries + 1]:
            response = self.client.chat_completion(
                model=model,
                messages=messages,
                max_tokens=2048
            )
            
            if response["success"]:
                return {
                    **response,
                    "task_type": task_type.value,
                    "confidence": round(confidence, 2),
                    "model_selection": "primary" if model == primary_model else "fallback"
                }
            
            last_error = response.get("error")
        
        return {
            "success": False,
            "error": f"All models failed. Last error: {last_error}",
            "task_type": task_type.value
        }

통합 이커머스 AI 서비스

class EcommerceAIService: """이커머스 AI 고객 서비스 통합 시스템""" def __init__(self, api_key: str): self.client = HolySheepClient(api_key) self.router = SmartRouter(self.client) def chat(self, user_id: str, message: str, context: Dict = None) -> Dict: """통합 채팅 인터페이스""" # 시스템 프롬프트 구성 system_prompt = self._build_system_prompt(context) messages = [ {"role": "system", "content": system_prompt}, {"role": "user", "content": message} ] # 스마트 라우팅 실행 result = self.router.execute_with_fallback(messages) # 응답 로깅 (비용 추적용) if result.get("success"): self._log_interaction(user_id, result) return result def _build_system_prompt(self, context: Dict = None) -> str: """컨텍스트 기반 시스템 프롬프트 생성""" base = """당신은 친절하고 전문적인 이커머스 고객 서비스 담당자입니다. 한국어로 답변하며, 간결하고 명확하게 정보를 제공합니다. 상품 문의, 주문 상태, 반품/환불 절차를 안내해주세요.""" if context and context.get("user_preferences"): base += f"\n\n고객 선호사항: {context['user_preferences']}" if context and context.get("recent_orders"): base += f"\n\n최근 주문: {context['recent_orders']}" return base def _log_interaction(self, user_id: str, result: Dict): """대화 상호작용 로깅""" print(f"[LOG] User: {user_id} | Model: {result['model']} | " f"Cost: ${result.get('cost_usd', 0):.6f} | " f"Latency: {result.get('latency_ms', 0)}ms | " f"Task: {result.get('task_type')}")

사용 예시

if __name__ == "__main__": service = EcommerceAIService(api_key="YOUR_HOLYSHEEP_API_KEY") # 다양한 유형의 쿼리 테스트 queries = [ "상품 재고 확인해주세요", "주문한 상품 언제 도착하나요?", "이 상품과 비슷한 추천 해주세요", "반품 신청하고 싶은데요" ] for query in queries: print(f"\n{'='*60}") print(f"Query: {query}") result = service.chat(user_id="user_123", message=query) print(f"Result: {result.get('content', result.get('error'))[:200]}...") print(f"Metadata: model={result.get('model')}, " f"task={result.get('task_type')}, " f"cost=${result.get('cost_usd', 0):.6f}")

4단계: Node.js/JavaScript 구현

// models/multiModelClient.js
/**
 * HolySheep AI Multi-Model Gateway Client for Node.js
 * 비동기 API 호출 및 배치 처리 지원
 */

const https = require('https');

class HolySheepClient {
    constructor(apiKey) {
        this.apiKey = apiKey || process.env.HOLYSHEEP_API_KEY;
        this.baseUrl = 'api.holysheep.ai';
        this.basePath = '/v1';
        
        if (!this.apiKey) {
            throw new Error('HolySheep API key is required');
        }
    }
    
    // HTTP 요청 헬퍼
    async request(endpoint, payload, timeout = 30000) {
        return new Promise((resolve, reject) => {
            const startTime = Date.now();
            
            const options = {
                hostname: this.baseUrl,
                path: ${this.basePath}${endpoint},
                method: 'POST',
                headers: {
                    'Authorization': Bearer ${this.apiKey},
                    'Content-Type': 'application/json'
                },
                timeout: timeout
            };
            
            const req = https.request(options, (res) => {
                let data = '';
                
                res.on('data', (chunk) => {
                    data += chunk;
                });
                
                res.on('end', () => {
                    const latencyMs = Date.now() - startTime;
                    
                    try {
                        const result = JSON.parse(data);
                        
                        // 토큰 사용량 및 비용 계산
                        const inputTokens = result.usage?.prompt_tokens || 0;
                        const outputTokens = result.usage?.completion_tokens || 0;
                        const cost = this.calculateCost(payload.model, inputTokens, outputTokens);
                        
                        resolve({
                            success: true,
                            model: payload.model,
                            content: result.choices?.[0]?.message?.content || '',
                            latencyMs: latencyMs,
                            tokens: { input: inputTokens, output: outputTokens },
                            costUsd: cost
                        });
                    } catch (e) {
                        resolve({
                            success: false,
                            error: Parse error: ${e.message},
                            latencyMs: latencyMs
                        });
                    }
                });
            });
            
            req.on('error', (e) => {
                resolve({
                    success: false,
                    error: e.message
                });
            });
            
            req.on('timeout', () => {
                req.destroy();
                resolve({
                    success: false,
                    error: 'Request timeout'
                });
            });
            
            req.write(JSON.stringify(payload));
            req.end();
        });
    }
    
    calculateCost(model, inputTokens, outputTokens) {
        const modelCosts = {
            'gpt-5.5': 8.00,           // $8/MTok
            'gemini-2.5-flash': 2.50,  // $2.50/MTok
            'claude-sonnet-4.5': 15.00, // $15/MTok
            'deepseek-v3.2': 0.42      // $0.42/MTok
        };
        
        const costPerM = modelCosts[model] || 8.00;
        const totalTokens = inputTokens + outputTokens;
        return parseFloat(((totalTokens / 1_000_000) * costPerM).toFixed(6));
    }
    
    // 채팅 완성
    async chatCompletion(model, messages, options = {}) {
        return this.request('/chat/completions', {
            model: model,
            messages: messages,
            temperature: options.temperature || 0.7,
            max_tokens: options.maxTokens || 2048
        });
    }
    
    // 다중 모델 병렬 요청
    async multiModelRequest(models, messages) {
        const requests = models.map(model => 
            this.chatCompletion(model, messages)
        );
        
        return Promise.allSettled(requests);
    }
    
    // 비용 최적화: cheapest model 먼저 시도
    async costOptimizedRequest(messages, preferredModel = null) {
        // 비용 순서: DeepSeek < Gemini Flash < GPT-5.5 < Claude
        const modelPriority = ['deepseek-v3.2', 'gemini-2.5-flash', 'gpt-5.5', 'claude-sonnet-4.5'];
        
        // 선호 모델이 있으면 먼저 시도
        if (preferredModel && modelPriority.includes(preferredModel)) {
            const idx = modelPriority.indexOf(preferredModel);
            modelPriority.splice(idx, 1);
            modelPriority.unshift(preferredModel);
        }
        
        for (const model of modelPriority) {
            const result = await this.chatCompletion(model, messages);
            
            if (result.success) {
                return {
                    ...result,
                    costOptimization: Used ${model} (cost rank: ${modelPriority.indexOf(model) + 1})
                };
            }
        }
        
        return { success: false, error: 'All models failed' };
    }
}

// Express.js 기반 REST API 서버
const express = require('express');
const app = express();
app.use(express.json());

const client = new HolySheepClient(process.env.HOLYSHEEP_API_KEY);

// 기본 채팅 엔드포인트
app.post('/api/chat', async (req, res) => {
    try {
        const { model = 'gemini-2.5-flash', messages } = req.body;
        
        if (!messages || !Array.isArray(messages)) {
            return res.status(400).json({ 
                error: 'messages array is required' 
            });
        }
        
        const result = await client.chatCompletion(model, messages);
        res.json(result);
        
    } catch (error) {
        res.status(500).json({ error: error.message });
    }
});

// 다중 모델 비교 엔드포인트
app.post('/api/compare', async (req, res) => {
    try {
        const { messages, models = ['gemini-2.5-flash', 'gpt-5.5'] } = req.body;
        
        const results = await client.multiModelRequest(models, messages);
        
        const comparison = results.map((result, idx) => ({
            model: models[idx],
            success: result.status === 'fulfilled',
            latencyMs: result.value?.latencyMs || null,
            costUsd: result.value?.costUsd || null,
            preview: result.value?.content?.substring(0, 100) || result.reason?.message
        }));
        
        res.json({ comparison });
        
    } catch (error) {
        res.status(500).json({ error: error.message });
    }
});

// 비용 최적화 엔드포인트
app.post('/api/chat/optimized', async (req, res) => {
    try {
        const { messages, preferredModel } = req.body;
        
        const result = await client.costOptimizedRequest(messages, preferredModel);
        res.json(result);
        
    } catch (error) {
        res.status(500).json({ error: error.message });
    }
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(HolySheep AI Gateway running on port ${PORT});
    console.log(Base URL: https://api.holysheep.ai/v1);
});

// 실행 예시
async function example() {
    const client = new HolySheepClient('YOUR_HOLYSHEEP_API_KEY');
    
    const messages = [
        { role: 'system', content: '당신은 유용한 AI 어시스턴트입니다.' },
        { role: 'user', content: '한국의 유명한 관광지를 추천해주세요.' }
    ];
    
    // 단일 모델 요청
    console.log('Single Model Request:');
    const singleResult = await client.chatCompletion('gemini-2.5-flash', messages);
    console.log(Model: ${singleResult.model});
    console.log(Latency: ${singleResult.latencyMs}ms);
    console.log(Cost: $${singleResult.costUsd});
    
    // 다중 모델 비교
    console.log('\nMulti-Model Comparison:');
    const multiResults = await client.multiModelRequest(
        ['gemini-2.5-flash', 'deepseek-v3.2'],
        messages
    );
    
    multiResults.forEach((result, idx) => {
        if (result.status === 'fulfilled') {
            console.log(${['gemini-2.5-flash', 'deepseek-v3.2'][idx]}: ${result.value.latencyMs}ms, $${result.value.costUsd});
        }
    });
}

example().catch(console.error);

module.exports = { HolySheepClient };

5단계: 비용 모니터링 대시보드

# utils/cost_monitor.py
"""
저는 HolySheep AI 게이트웨이 사용 시
비용을 세밀하게 모니터링하는 시스템을 구축했습니다.
30일간의 비용 추적 및 알림 기능을 포함합니다.
"""

import time
from datetime import datetime, timedelta
from collections import defaultdict
from dataclasses import dataclass, field
from typing import Dict, List, Optional
import json

@dataclass
class UsageRecord:
    timestamp: datetime
    model: str
    input_tokens: int
    output_tokens: int
    cost_usd: float
    latency_ms: float
    success: bool

@dataclass
class CostAlert:
    threshold_usd: float
    percentage: float  # 임계값 대비 현재 사용량 %

class CostMonitor:
    """HolySheep AI 비용 모니터링 시스템"""
    
    def __init__(self, daily_budget_usd: float = 100.0):
        self.daily_budget = daily_budget_usd
        self.monthly_budget = daily_budget_usd * 30
        
        self.records: List[UsageRecord] = []
        self.alerts: List[CostAlert] = []
        
        # 모델별 비용 집계
        self.model_costs = defaultdict(float)
        self.model_tokens = defaultdict(int)
        self.model_requests = defaultdict(int)
        
    def record_usage(
        self,
        model: str,
        input_tokens: int,
        output_tokens: int,
        cost_usd: float,
        latency_ms: float,
        success: bool = True
    ):
        """API 사용량 기록"""
        record = UsageRecord(
            timestamp=datetime.now(),
            model=model,
            input_tokens=input_tokens,
            output_tokens=output_tokens,
            cost_usd=cost_usd,
            latency_ms=latency_ms,
            success=success
        )
        
        self.records.append(record)
        
        # 집계 업데이트
        self.model_costs[model] += cost_usd
        self.model_tokens[model] += input_tokens + output_tokens
        self.model_requests[model] += 1
        
        # 일일 예산 초과 체크
        daily_cost = self.get_daily_cost()
        if daily_cost > self.daily_budget * 0.9:  # 90% 임계값
            self._trigger_alert(daily_cost)
    
    def get_daily_cost(self) -> float:
        """오늘 총 비용"""
        today = datetime.now().date()
        return sum(
            r.cost_usd for r in self.records
            if r.timestamp.date() == today and r.success
        )
    
    def get_monthly_cost(self) -> float:
        """이번 달 총 비용"""
        first_of_month = datetime.now().replace(day=1, hour=0, minute=0, second=0)
        return sum(
            r.cost_usd for r in self.records
            if r.timestamp >= first_of_month and r.success
        )
    
    def get_model_breakdown(self) -> Dict:
        """모델별 비용 상세"""
        return {
            model: {
                "total_cost": round(cost, 6),
                "total_tokens": tokens,
                "request_count": self.model_requests[model],
                "avg_cost_per_request": round(cost / max(self.model_requests[model], 1), 6),
                "cost_percentage": round(cost / self.get_monthly_cost() * 100, 2)
            }
            for model, cost in self.model_costs.items()
        }
    
    def get_performance_stats(self) -> Dict:
        """성능 통계 (지연 시간 등)"""
        stats = defaultdict(list)
        
        for record in self.records:
            if record.success:
                stats[record.model].append(record.latency_ms)
        
        return {
            model: {
                "avg_latency_ms": round(sum(lats) / len(lats), 2),
                "min_latency_ms": round(min(lats), 2),
                "max_latency_ms": round(max(lats), 2),
                "p95_latency_ms": round(sorted(lats)[int(len(lats) * 0.95)], 2)
            }
            for model, lats in stats.items()
            if lats
        }
    
    def generate_report(self) -> str:
        """비용 보고서 생성"""
        daily = self.get_daily_cost()
        monthly = self.get_monthly_cost()
        
        report = f"""
{'='*60}
       HolySheep AI 비용 보고서
       생성일시: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
{'='*60}

📊 일일 비용
   사용액: ${daily:.4f} / ${self.daily_budget:.2f}
   사용률: {daily / self.daily_budget * 100:.1f}%

📊 월간 비용
   사용액: ${monthly:.4f} / ${self.monthly_budget:.2f}
   사용률: {monthly / self.monthly_budget * 100:.1f}%

📈 모델별 사용량
"""
        
        for model, data in self.get_model_breakdown().items():
            report += f"""
   {model}:
     -