Model Context Protocol(MCP)은 AI 모델과 외부 도구 간의 통신을 표준화하는 개방형 프로토콜입니다. 이 가이드에서는 HolySheep AI 게이트웨이를 기반으로 한 MCP Server 개발 방법과 실제 마이그레이션 사례를 소개합니다.

실제 마이그레이션 사례: 서울의 AI 스타트업

비즈니스 맥락

서울 강남구에 위치한 AI 스타트업 A社는 고객 지원 자동화 시스템을 운영하며 일 50,000건 이상의 대화 데이터를 처리하고 있었습니다. 기존 시스템은 다수의 AI 모델을 혼합 사용하면서 각각의 API 통합 방식이 상이하여 유지보수 비용이 급증한 상태였습니다.

기존 공급사의 페인포인트

A社の 기술팀이直面한 주요 문제:

HolySheep AI 선택 이유

A社가 HolySheep AI 게이트웨이를 선택한 결정적 이유:

마이그레이션 단계

1단계: base_url 교체

# 기존 코드 (개별 모델 연동)

OPENAI_ENDPOINT = "https://api.openai.com/v1/chat/completions"

ANTHROPIC_ENDPOINT = "https://api.anthropic.com/v1/messages"

마이그레이션 후 (HolySheep AI 게이트웨이)

import requests class HolySheepGateway: def __init__(self, api_key: str): self.base_url = "https://api.holysheep.ai/v1" self.headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" } def chat_completions(self, model: str, messages: list, **kwargs): payload = { "model": model, "messages": messages, **kwargs } response = requests.post( f"{self.base_url}/chat/completions", headers=self.headers, json=payload ) return response.json()

사용 예시

gateway = HolySheepGateway(api_key="YOUR_HOLYSHEEP_API_KEY") result = gateway.chat_completions( model="gpt-4.1", messages=[{"role": "user", "content": "안녕하세요"}] )

2단계: 키 로테이션 및 보안 강화

import os
import hashlib
import hmac
from datetime import datetime, timedelta

class SecureKeyManager:
    """HolySheep API 키의 안전한 관리 및 로테이션"""
    
    def __init__(self, primary_key: str, secondary_key: str = None):
        self.primary_key = primary_key
        self.secondary_key = secondary_key or os.environ.get("HOLYSHEEP_BACKUP_KEY")
        self._rotation_schedule = datetime.now()
    
    def get_active_key(self) -> str:
        """활성화된 API 키 반환"""
        return self.primary_key
    
    def should_rotate(self, days: int = 90) -> bool:
        """90일 주기 키 로테이션 필요 여부 확인"""
        return (datetime.now() - self._rotation_schedule).days >= days
    
    def verify_webhook_signature(self, payload: bytes, signature: str) -> bool:
        """웹훅 서명 검증"""
        expected = hmac.new(
            self.primary_key.encode(),
            payload,
            hashlib.sha256
        ).hexdigest()
        return hmac.compare_digest(expected, signature)
    
    def failover_request(self, model: str, messages: list):
        """セカンダ리 키를 사용한 장애 대응 요청"""
        if not self.secondary_key:
            raise ValueError("セカンダ리 키가 설정되지 않았습니다")
        
        gateway = HolySheepGateway(api_key=self.secondary_key)
        return gateway.chat_completions(model=model, messages=messages)

실제 사용

key_manager = SecureKeyManager( primary_key="YOUR_HOLYSHEEP_API_KEY", secondary_key=os.environ.get("HOLYSHEEP_BACKUP_KEY") )

3단계: 카나리아 배포 전략

import random
import time
from dataclasses import dataclass
from typing import Callable, Any

@dataclass
class DeploymentConfig:
    canary_percentage: float = 0.1  # 10% 트래픽 카나리아
    rollout_increment: float = 0.05  # 5%씩 증가
    health_check_interval: int = 60  # 60초 간격
    
class CanaryDeployment:
    """HolySheep AI 모델 카나리아 배포 관리"""
    
    def __init__(self, config: DeploymentConfig):
        self.config = config
        self.current_percentage = 0.0
        self.metrics = {"success": 0, "failure": 0, "latency": []}
    
    def should_use_new_endpoint(self) -> bool:
        """카나리아 배포 여부 결정"""
        return random.random() < self.config.canary_percentage
    
    def record_success(self, latency_ms: float):
        """성공 요청 기록"""
        self.metrics["success"] += 1
        self.metrics["latency"].append(latency_ms)
    
    def record_failure(self, error: str):
        """실패 요청 기록"""
        self.metrics["failure"] += 1
        print(f"[카나리아 실패] {error}")
    
    def should_continue_rollout(self) -> bool:
        """계속 롤아웃 여부 판단 (50% 이상 실패 시 중단)"""
        total = self.metrics["success"] + self.metrics["failure"]
        if total < 100:  # 최소 100개 샘플 확보
            return True
        
        failure_rate = self.metrics["failure"] / total
        return failure_rate < 0.5  # 50% 실패율 초과 시 중단
    
    def get_average_latency(self) -> float:
        """평균 지연 시간 계산"""
        if not self.metrics["latency"]:
            return 0.0
        return sum(self.metrics["latency"]) / len(self.metrics["latency"])
    
    def execute_with_canary(
        self, 
        old_func: Callable, 
        new_func: Callable, 
        *args, **kwargs
    ) -> Any:
        """카나리아 배포와 함께 함수 실행"""
        if self.should_use_new_endpoint():
            start = time.time()
            try:
                result = new_func(*args, **kwargs)
                latency = (time.time() - start) * 1000
                self.record_success(latency)
                return result
            except Exception as e:
                self.record_failure(str(e))
                # 카나리아 실패 시 기존 엔드포인트로 폴백
                return old_func(*args, **kwargs)
        return old_func(*args, **kwargs)

사용 예시

deployment = CanaryDeployment(DeploymentConfig(canary_percentage=0.1)) def old_gpt_completion(messages): # 기존 API 호출 return {"model": "gpt-4.1", "legacy": True} def new_holy_sheep_completion(messages): gateway = HolySheepGateway(api_key="YOUR_HOLYSHEEP_API_KEY") return gateway.chat_completions(model="gpt-4.1", messages=messages)

카나리아 실행

result = deployment.execute_with_canary( old_gpt_completion, new_holy_sheep_completion, messages=[{"role": "user", "content": "테스트"}] )

마이그레이션 후 30일 실측치

지표마이그레이션 전마이그레이션 후개선율
평균 응답 지연420ms180ms57% 감소
월 청구액$4,200$68084% 절감
모델 전환 시간2-3시간5분96% 감소
API 연동 코드 라인3,200줄850줄73% 감소

MCP Server 아키텍처 설계

핵심 구성 요소

"""
MCP Server 기본 구조
HolySheep AI 게이트웨이 연동을 위한 표준화된 MCP 프로토콜 구현
"""

from abc import ABC, abstractmethod
from typing import Any, Dict, List, Optional
from enum import Enum
import json
import asyncio

class MCPMessageType(Enum):
    TOOL_REQUEST = "tool_request"
    TOOL_RESPONSE = "tool_response"
    CONTEXT_UPDATE = "context_update"
    ERROR = "error"

class MCPTool:
    """MCP 도구 정의 기본 클래스"""
    
    def __init__(
        self,
        name: str,
        description: str,
        input_schema: Dict[str, Any],
        output_schema: Dict[str, Any]
    ):
        self.name = name
        self.description = description
        self.input_schema = input_schema
        self.output_schema = output_schema
    
    def to_manifest(self) -> Dict[str, Any]:
        """도구 매니페스트 생성"""
        return {
            "name": self.name,
            "description": self.description,
            "inputSchema": self.input_schema,
            "outputSchema": self.output_schema
        }

class MCPServer:
    """HolySheep AI 게이트웨이 기반 MCP Server"""
    
    def __init__(self, gateway_url: str, api_key: str):
        self.gateway_url = gateway_url
        self.api_key = api_key
        self.tools: Dict[str, MCPTool] = {}
        self.context: Dict[str, Any] = {}
    
    def register_tool(self, tool: MCPTool):
        """도구 등록"""
        self.tools[tool.name] = tool
        print(f"[MCP] 도구 등록 완료: {tool.name}")
    
    async def execute_tool(
        self, 
        tool_name: str, 
        parameters: Dict[str, Any]
    ) -> Dict[str, Any]:
        """도구 실행"""
        if tool_name not in self.tools:
            return {
                "status": "error",
                "message": f"도구를 찾을 수 없습니다: {tool_name}"
            }
        
        tool = self.tools[tool_name]
        
        try:
            # 컨텍스트를 프롬프트에 포함
            enhanced_prompt = self._build_enhanced_prompt(
                tool.description,
                parameters
            )
            
            # HolySheep AI 게이트웨이 호출
            response = await self._call_gateway(enhanced_prompt)
            
            return {
                "status": "success",
                "tool": tool_name,
                "result": response,
                "context_snapshot": self.context.copy()
            }
        except Exception as e:
            return {
                "status": "error",
                "tool": tool_name,
                "error": str(e)
            }
    
    def _build_enhanced_prompt(
        self, 
        description: str, 
        parameters: Dict[str, Any]
    ) -> str:
        """增强されたプロンプト构建"""
        param_str = json.dumps(parameters, ensure_ascii=False, indent=2)
        context_str = json.dumps(self.context, ensure_ascii=False, indent=2)
        
        return f"""
[도구 설명]
{description}

[입력 매개변수]
{param_str}

[현재 컨텍스트]
{context_str}

위 정보를 바탕으로 도구를 실행하고 결과를 반환하세요.
"""
    
    async def _call_gateway(self, prompt: str) -> str:
        """HolySheep AI 게이트웨이 호출"""
        # 실제 구현에서는 requests/asyncio 사용
        pass
    
    def update_context(self, key: str, value: Any):
        """컨텍스트 업데이트"""
        self.context[key] = value
    
    def get_manifest(self) -> Dict[str, Any]:
        """서버 매니페스트 반환"""
        return {
            "server": "HolySheep-MCP-Server",
            "version": "1.0.0",
            "gateway": self.gateway_url,
            "tools": [tool.to_manifest() for tool in self.tools.values()]
        }

사용 예시

server = MCPServer( gateway_url="https://api.holysheep.ai/v1", api_key="YOUR_HOLYSHEEP_API_KEY" )

도구 등록

search_tool = MCPTool( name="web_search", description="웹 검색을 수행합니다", input_schema={ "type": "object", "properties": { "query": {"type": "string", "description": "검색어"}, "limit": {"type": "integer", "description": "결과 개수", "default": 10} }, "required": ["query"] }, output_schema={ "type": "object", "properties": { "results": {"type": "array"} } } ) server.register_tool(search_tool) print(json.dumps(server.get_manifest(), ensure_ascii=False, indent=2))

MCP Server와 HolySheep AI 연동 구현

"""
HolySheep AI 게이트웨이용 MCP Server 완전 구현
다중 모델 라우팅 및 스마트 failover 포함
"""

import aiohttp
import asyncio
from typing import Dict, List, Optional, Any
from dataclasses import dataclass, field
from datetime import datetime
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("HolySheep-MCP")

@dataclass
class ModelConfig:
    """모델별 설정"""
    name: str
    provider: str  # openai, anthropic, google, deepseek
    max_tokens: int
    temperature: float = 0.7
    fallback_models: List[str] = field(default_factory=list)

@dataclass
class RoutingRule:
    """라우팅 규칙"""
    condition: str  # prompt_prefix, context_key, custom
    value: str
    target_model: str
    priority: int = 0

class HolySheepMCP:
    """HolySheep AI 게이트웨이 기반 MCP Server"""
    
    BASE_URL = "https://api.holysheep.ai/v1"
    
    def __init__(self, api_key: str):
        self.api_key = api_key
        self.models: Dict[str, ModelConfig] = {}
        self.routing_rules: List[RoutingRule] = []
        self._session: Optional[aiohttp.ClientSession] = None
    
    async def __aenter__(self):
        self._session = aiohttp.ClientSession(
            headers={
                "Authorization": f"Bearer {self.api_key}",
                "Content-Type": "application/json"
            }
        )
        return self
    
    async def __aexit__(self, *args):
        if self._session:
            await self._session.close()
    
    def register_model(self, config: ModelConfig):
        """모델 등록"""
        self.models[config.name] = config
        logger.info(f"모델 등록: {config.name} ({config.provider})")
    
    def add_routing_rule(self, rule: RoutingRule):
        """라우팅 규칙 추가"""
        self.routing_rules.append(rule)
        self.routing_rules.sort(key=lambda x: x.priority, reverse=True)
    
    def route_model(self, prompt: str, context: Dict[str, Any]) -> str:
        """스마트 모델 라우팅"""
        for rule in self.routing_rules:
            if rule.condition == "prompt_prefix":
                if prompt.startswith(rule.value):
                    return rule.target_model
            elif rule.condition == "context_key":
                if context.get(rule.value):
                    return rule.target_model
        
        # 기본값: 비용 효율적인 모델
        return "deepseek-v3.2"
    
    async def complete(
        self,
        prompt: str,
        context: Optional[Dict[str, Any]] = None,
        model: Optional[str] = None,
        **kwargs
    ) -> Dict[str, Any]:
        """완성 요청 실행"""
        context = context or {}
        
        # 모델 선택
        if not model:
            model = self.route_model(prompt, context)
        
        config = self.models.get(model)
        if not config:
            raise ValueError(f"등록되지 않은 모델: {model}")
        
        # HolySheep AI 게이트웨이 호출
        payload = {
            "model": model,
            "messages": [
                {"role": "system", "content": "당신은 유용한 AI 어시스턴트입니다."},
                {"role": "user", "content": prompt}
            ],
            "temperature": kwargs.get("temperature", config.temperature),
            "max_tokens": kwargs.get("max_tokens", config.max_tokens)
        }
        
        start_time = datetime.now()
        
        try:
            async with self._session.post(
                f"{self.BASE_URL}/chat/completions",
                json=payload
            ) as response:
                result = await response.json()
                latency = (datetime.now() - start_time).total_seconds() * 1000
                
                return {
                    "success": True,
                    "model": model,
                    "content": result.get("choices", [{}])[0].get("message", {}).get("content"),
                    "latency_ms": round(latency, 2),
                    "usage": result.get("usage", {})
                }
        except Exception as e:
            # Fallback 모델 시도
            if config.fallback_models:
                logger.warning(f"기본 모델 실패, 폴백 시도: {model} -> {config.fallback_models[0]}")
                return await self.complete(
                    prompt, context, config.fallback_models[0], **kwargs
                )
            raise
    
    async def batch_complete(
        self,
        requests: List[Dict[str, Any]],
        concurrency: int = 5
    ) -> List[Dict[str, Any]]:
        """배치 완성 요청"""
        semaphore = asyncio.Semaphore(concurrency)
        
        async def bounded_complete(req):
            async with semaphore:
                return await self.complete(**req)
        
        tasks = [bounded_complete(req) for req in requests]
        return await asyncio.gather(*tasks, return_exceptions=True)

실제 사용 예시

async def main(): async with HolySheepMCP(api_key="YOUR_HOLYSHEEP_API_KEY") as mcp: # 모델 등록 mcp.register_model(ModelConfig( name="gpt-4.1", provider="openai", max_tokens=4096, temperature=0.7, fallback_models=["claude-sonnet-4.5"] )) mcp.register_model(ModelConfig( name="deepseek-v3.2", provider="deepseek", max_tokens=8192, temperature=0.5 )) # 라우팅 규칙 추가 mcp.add_routing_rule(RoutingRule( condition="prompt_prefix", value="/code", target_model="gpt-4.1", priority=10 )) mcp.add_routing_rule(RoutingRule( condition="context_key", value="requires_reasoning", target_model="deepseek-v3.2", priority=5 )) # 단일 요청 result = await mcp.complete( prompt="서울의 날씨를 알려주세요", context={"location": "seoul"} ) print(f"결과: {result}") # 배치 요청 batch_results = await mcp.batch_complete([ {"prompt": "질문 1", "context": {}}, {"prompt": "질문 2", "context": {}}, {"prompt": "질문 3", "context": {}}, ]) print(f"배치 결과: {batch_results}") if __name__ == "__main__": asyncio.run(main())

MCP Server 구축 모범 사례

1. 표준화된 도구 스키마 설계

MCP 도구를 설계할 때 다음 원칙을 준수하세요:

2. HolySheep AI 모델 선택 가이드

사용 사례권장 모델가격 ($/MTok)특징
대화 생성GPT-4.1$8.00최고 품질
복잡한 추론Claude Sonnet 4.5$15.00긴 컨텍스트
빠른 응답Gemini 2.5 Flash$2.50저지연
대량 텍스트 처리DeepSeek V3.2$0.42비용 효율

3. 비용 최적화 전략

"""
HolySheep AI 비용 최적화 미들웨어
"""

class CostOptimizer:
    """API 호출 비용 최적화"""
    
    def __init__(self, mcp_server: HolySheepMCP):
        self.mcp = mcp_server
        self.cost_tracking = {}
    
    async def optimized_complete(
        self,
        prompt: str,
        complexity: str = "medium"
    ) -> Dict[str, Any]:
        """
        복잡도에 따른 최적 모델 선택
        
        - low: DeepSeek V3.2 ($0.42/MTok)
        - medium: Gemini 2.5 Flash ($2.50/MTok)
        - high: GPT-4.1 ($8.00/MTok)
        """
        model_map = {
            "low": "deepseek-v3.2",
            "medium": "gemini-2.5-flash",
            "high": "gpt-4.1"
        }
        
        model = model_map.get(complexity, "gemini-2.5-flash")
        
        # 프롬프트 압축으로 토큰 수 절감
        compressed_prompt = self._compress_prompt(prompt)
        
        result = await self.mcp.complete(
            prompt=compressed_prompt,
            model=model
        )
        
        # 비용 추적
        self._track_cost(model, result.get("usage", {}))
        
        return result
    
    def _compress_prompt(self, prompt: str) -> str:
        """프롬프트 압축 (불필요한 공백 및 반복 제거)"""
        import re
        compressed = re.sub(r'\s+', ' ', prompt).strip()
        return compressed
    
    def _track_cost(self, model: str, usage: Dict[str, Any]):
        """비용 추적"""
        pricing = {
            "gpt-4.1": 8.0,
            "claude-sonnet-4.5": 15.0,
            "gemini-2.5-flash": 2.5,
            "deepseek-v3.2": 0.42
        }
        
        tokens = usage.get("total_tokens", 0)
        cost = (tokens / 1_000_000) * pricing.get(model, 0)
        
        if model not in self.cost_tracking:
            self.cost_tracking[model] = {"tokens": 0, "cost": 0.0}
        
        self.cost_tracking[model]["tokens"] += tokens
        self.cost_tracking[model]["cost"] += cost
    
    def get_cost_report(self) -> Dict[str, Any]:
        """비용 보고서 생성"""
        total_cost = sum(m["cost"] for m in self.cost_tracking.values())
        return {
            "by_model": self.cost_tracking,
            "total_cost_usd": round(total_cost, 4)
        }

자주 발생하는 오류와 해결

오류 1: API 키 인증 실패 (401 Unauthorized)

# 오류 메시지

{"error": {"message": "Invalid API key provided", "type": "invalid_request_error"}}

원인: API 키가 올바르지 않거나 만료된 경우

해결: HolySheep AI 대시보드에서 새 API 키 생성

from holy_sheep_mcp import HolySheepMCP

올바른 키 형식 확인

def create_secure_client(): import os api_key = os.environ.get("HOLYSHEEP_API_KEY") if not api_key: raise ValueError("HOLYSHEEP_API_KEY 환경 변수가 설정되지 않았습니다") if not api_key.startswith("hsa-"): raise ValueError("유효하지 않은 API 키 형식입니다. 'hsa-'로 시작해야 합니다") return HolySheepMCP(api_key=api_key)

키 유효성 검증

async def validate_key(): async with HolySheepMCP(api_key="YOUR_HOLYSHEEP_API_KEY") as client: try: result = await client.complete(prompt="테스트") print("키 유효성 검증 성공") return True except Exception as e: print(f"검증 실패: {e}") return False

오류 2: Rate Limit 초과 (429 Too Many Requests)

# 오류 메시지

{"error": {"message": "Rate limit exceeded", "type": "rate_limit_error", "param": null}}

원인: 요청 빈도가太高하여 Rate Limit 도달

해결: 지수 백오프와 요청 큐 구현

import asyncio import random from datetime import datetime, timedelta class RateLimitHandler: """Rate Limit 처리 및 재시도 로직""" def __init__(self, max_retries: int = 5): self.max_retries = max_retries self.request_times = [] self.window_size = 60 # 60초 창 async def execute_with_retry( self, func, *args, **kwargs ): """재시도 로직이 포함된 함수 실행""" last_exception = None for attempt in range(self.max_retries): try: # 속도 제한 체크 await self._check_rate_limit() # 함수 실행 result = await func(*args, **kwargs) self.request_times.append(datetime.now()) return result except Exception as e: if "rate limit" in str(e).lower(): # 지수 백오프 계산 wait_time = min(2 ** attempt + random.uniform(0, 1), 60) print(f"[Rate Limit] {wait_time:.2f}초 후 재시도... ({attempt + 1}/{self.max_retries})") await asyncio.sleep(wait_time) last_exception = e else: raise raise last_exception or Exception("최대 재시도 횟수 초과") async def _check_rate_limit(self): """속도 제한 체크 및 대기""" now = datetime.now() cutoff = now - timedelta(seconds=self.window_size) # 창 내 요청 필터링 self.request_times = [t for t in self.request_times if t > cutoff] # 요청 수 제한 (예: 60초에 100회) if len(self.request_times) >= 100: oldest = min(self.request_times) wait_time = (oldest - cutoff).total_seconds() if wait_time > 0: await asyncio.sleep(wait_time)

사용 예시

handler = RateLimitHandler(max_retries=5) async def safe_complete(client, prompt): return await handler.execute_with_retry( client.complete, prompt=prompt )

오류 3: 모델 지원되지 않음 (400 Bad Request)

# 오류 메시지

{"error": {"message": "Model not supported", "type": "invalid_request_error"}}

원인: HolySheep AI 게이트웨이에서 지원하지 않는 모델명 사용

해결: 지원 모델 목록 확인 및 매핑

SUPPORTED_MODELS = { # OpenAI 호환 "gpt-4": "gpt-4.1", "gpt-4-turbo": "gpt-4.1", "gpt-3.5-turbo": "gpt-3.5-turbo", # Anthropic 호환 "claude-3-opus": "claude-sonnet-4.5", "claude-3-sonnet": "claude-sonnet-4.5", "claude-3-haiku": "claude-haiku-3.5", # Google 호환 "gemini-pro": "gemini-2.5-flash", "gemini-1.5-pro": "gemini-2.5-flash", # DeepSeek "deepseek-chat": "deepseek-v3.2", "deepseek-coder": "deepseek-coder-v2" } def normalize_model_name(model: str) -> str: """모델명을 HolySheep AI 지원 형식으로 정규화""" # 별칭 매핑 if model in SUPPORTED_MODELS: normalized = SUPPORTED_MODELS[model] print(f"[모델 정규화] {model} -> {normalized}") return normalized # 직접 지원 확인 supported = [ "gpt-4.1", "gpt-3.5-turbo", "claude-sonnet-4.5", "claude-haiku-3.5", "gemini-2.5-flash", "deepseek-v3.2", "deepseek-coder-v2" ] if model in supported: return model raise ValueError( f"지원되지 않는 모델: {model}\n" f"지원 모델 목록: {', '.join(supported)}" )

사용

normalized = normalize_model_name("gpt-4-turbo")

출력: [모델 정규화] gpt-4-turbo -> gpt-4.1

오류 4: 컨텍스트 윈도우 초과

# 오류 메시지

{"error": {"message": "Maximum context length exceeded", "type": "invalid_request_error"}}

원인: 입력 토큰이 모델의 컨텍스트 윈도우 초과

해결: 컨텍스트 요약 및 청크 분할

class ContextManager: """긴 컨텍스트 처리 관리자""" def __init__(self, max_tokens: int, model: str): self.max_tokens = max_tokens self.model = model self.token_counts = { "gpt-4.1": 128000, "claude-sonnet-4.5": 200000, "gemini-2.5-flash": 1000000, "deepseek-v3.2": 64000 } def estimate_tokens(self, text: str) -> int: """토큰 수 추정 (한국어: 1토큰 ≈ 1.5글자)""" return int(len(text) / 1.5) def truncate_context( self, messages: list, max_history: int = 10 ) -> list: """컨텍스트 자르기 (최근 N개 메시지만 유지)""" total_tokens = 0 truncated = [] # 최신 메시지부터 추가 for msg in reversed(messages[-max_history:]): msg_tokens = self.estimate_tokens(str(msg)) if total_tokens + msg_tokens <= self.max_tokens: truncated.insert(0, msg) total_tokens += msg_tokens else: break return truncated def summarize_old_messages( self, messages: list, summary_prompt: str = "이 대화를 100단어 이내로 요약하세요" ) -> list: """이전 대화 요약""" if len(messages) <= 5: return messages # 오래된 메시지 그룹화 old_messages = messages[:-5] recent_messages = messages[-5:] # 요약 생성 (별도 API 호출 필요) old_content = "\n".join([ f"{m.get('role', 'user')}: {m.get('content', '')}" for m in old_messages ]) summary = f"[이전 대화 요약] {len(old_messages)}개의 메시지 ({self.estimate_tokens(old_content)} 토큰)" return [ {"role": "system", "content": summary} ] + recent_messages

사용

manager = ContextManager(max_tokens=4000, model="gpt-4.1")

긴 대화 처리

long_messages = [ {"role": "user", "content": "안녕하세요"}, {"role": "assistant", "content": "안녕하세요! 무엇을 도와드릴까요?"}, # ... 100개 이상의 메시