저는 HolySheep AI에서 글로벌 AI 게이트웨이 인프라를 설계하는 엔지니어입니다. 이번 포스트에서는跨境家居独立站(크로스보더 홈퍼니처 독립 쇼핑몰)를 위한 프로덕션 레벨 AI客服 시스템을 구축한 경험을 공유하겠습니다. Claude의 고급 언어 처리, Gemini Flash의 빠른 이미지 분석, 그리고 HolySheep의 단일 API 키로 여러 모델을无缝集成하는 아키텍처를 상세히 다룹니다.

문제 정의 및 아키텍처 개요

跨境家居独立站는 글로벌 고객을 대상으로 하며, 주요 과제는 다음과 같습니다:

아키텍처 다이어그램

┌─────────────────────────────────────────────────────────────────────┐
│                     HolySheep AI Gateway                            │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│   ┌─────────────┐    ┌─────────────┐    ┌─────────────┐            │
│   │   Claude    │    │   Gemini    │    │  DeepSeek   │            │
│   │ Sonnet 4.5  │    │  2.5 Flash  │    │    V3.2     │            │
│   │  $15/MTok   │    │ $2.50/MTok  │    │ $0.42/MTok  │            │
│   └──────┬──────┘    └──────┬──────┘    └──────┬──────┘            │
│          │                  │                  │                    │
│          └──────────────────┼──────────────────┘                    │
│                             │                                       │
│              ┌──────────────┴──────────────┐                       │
│              │    Intelligent Router       │                       │
│              │  (Fallback + Load Balance)  │                       │
│              └──────────────┬──────────────┘                       │
│                             │                                       │
├─────────────────────────────┼─────────────────────────────────────┤
│                             │                                       │
│   ┌─────────────────────────┼─────────────────────────┐             │
│   │              Customer Request Flow                │             │
│   │                                                   │             │
│   │  Message → Language Detect → Route → Respond      │             │
│   │                              ↓                   │             │
│   │              [Image?] → Gemini Analysis          │             │
│   │                              ↓                   │             │
│   │              Fallback Chain:                     │             │
│   │              Claude → DeepSeek → Static Response │             │
│   └───────────────────────────────────────────────────┘             │
└─────────────────────────────────────────────────────────────────────┘

핵심 구현 코드

1. HolySheep API 클라이언트 설정

// holy_sheep_client.py
// HolySheep AI Gateway를 통한 다중 모델 호출 래퍼
// base_url: https://api.holysheep.ai/v1 (절대 직접 URL 사용 금지)

import anthropic
import openai
import asyncio
import time
from dataclasses import dataclass
from typing import Optional, Dict, Any, List
from enum import Enum
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

class ModelType(Enum):
    CLAUDE_SONNET = "claude-sonnet-4-20250514"
    GEMINI_FLASH = "gemini-2.0-flash-exp"
    DEEPSEEK_V3 = "deepseek-chat"

@dataclass
class APIResponse:
    content: str
    model: str
    latency_ms: float
    tokens_used: int
    cost_usd: float

class HolySheepAIClient:
    """HolySheep AI 게이트웨이 클라이언트 - 다중 모델 통합"""
    
    # HolySheep API 설정
    BASE_URL = "https://api.holysheep.ai/v1"
    
    # 모델별 가격 (per million tokens)
    PRICING = {
        ModelType.CLAUDE_SONNET: 15.0,      # $15/MTok
        ModelType.GEMINI_FLASH: 2.50,       # $2.50/MTok
        ModelType.DEEPSEEK_V3: 0.42,        # $0.42/MTok
    }
    
    def __init__(self, api_key: str):
        # HolySheep API 키로 초기화 (직접 Anthropic/OpenAI 키 아님)
        self.api_key = api_key
        self.anthropic_client = anthropic.Anthropic(
            base_url=self.BASE_URL,
            api_key=api_key,
        )
        self.openai_client = openai.OpenAI(
            base_url=self.BASE_URL,
            api_key=api_key,
        )
        self.request_count = 0
        self.total_cost = 0.0
    
    async def call_claude(
        self,
        messages: List[Dict],
        system_prompt: str,
        max_tokens: int = 1024
    ) -> APIResponse:
        """Claude Sonnet 4.5 호출 - 고급 언어 처리용"""
        start_time = time.time()
        
        try:
            response = self.anthropic_client.messages.create(
                model=ModelType.CLAUDE_SONNET.value,
                system=system_prompt,
                messages=messages,
                max_tokens=max_tokens,
            )
            
            latency_ms = (time.time() - start_time) * 1000
            tokens = response.usage.input_tokens + response.usage.output_tokens
            cost = (tokens / 1_000_000) * self.PRICING[ModelType.CLAUDE_SONNET]
            
            self.request_count += 1
            self.total_cost += cost
            
            return APIResponse(
                content=response.content[0].text,
                model=ModelType.CLAUDE_SONNET.value,
                latency_ms=latency_ms,
                tokens_used=tokens,
                cost_usd=cost
            )
            
        except Exception as e:
            logger.error(f"Claude API Error: {e}")
            raise
    
    async def call_gemini_vision(
        self,
        image_base64: str,
        prompt: str
    ) -> APIResponse:
        """Gemini 2.5 Flash 이미지 분석 - 가구 이미지 이해용"""
        start_time = time.time()
        
        try:
            response = self.openai_client.chat.completions.create(
                model=ModelType.GEMINI_FLASH.value,
                messages=[
                    {
                        "role": "user",
                        "content": [
                            {"type": "text", "text": prompt},
                            {
                                "type": "image_url",
                                "image_url": {
                                    "url": f"data:image/jpeg;base64,{image_base64}"
                                }
                            }
                        ]
                    }
                ],
                max_tokens=512,
            )
            
            latency_ms = (time.time() - start_time) * 1000
            tokens = response.usage.total_tokens
            cost = (tokens / 1_000_000) * self.PRICING[ModelType.GEMINI_FLASH]
            
            self.request_count += 1
            self.total_cost += cost
            
            return APIResponse(
                content=response.choices[0].message.content,
                model=ModelType.GEMINI_FLASH.value,
                latency_ms=latency_ms,
                tokens_used=tokens,
                cost_usd=cost
            )
            
        except Exception as e:
            logger.error(f"Gemini Vision API Error: {e}")
            raise
    
    async def call_deepseek_fallback(
        self,
        messages: List[Dict],
        system_prompt: str
    ) -> APIResponse:
        """DeepSeek V3 폴백 - 비용 최적화용"""
        start_time = time.time()
        
        try:
            response = self.openai_client.chat.completions.create(
                model=ModelType.DEEPSEEK_V3.value,
                messages=[
                    {"role": "system", "content": system_prompt},
                    *messages
                ],
                max_tokens=512,
            )
            
            latency_ms = (time.time() - start_time) * 1000
            tokens = response.usage.total_tokens
            cost = (tokens / 1_000_000) * self.PRICING[ModelType.DEEPSEEK_V3]
            
            self.request_count += 1
            self.total_cost += cost
            
            return APIResponse(
                content=response.choices[0].message.content,
                model=ModelType.DEEPSEEK_V3.value,
                latency_ms=latency_ms,
                tokens_used=tokens,
                cost_usd=cost
            )
            
        except Exception as e:
            logger.error(f"DeepSeek API Error: {e}")
            raise

HolySheep AI 게이트웨이 사용법

1. https://www.holysheep.ai/register 에서 API 키 발급

2. 발급된 키를 YOUR_HOLYSHEEP_API_KEY에 할당

3. base_url은 반드시 https://api.holysheep.ai/v1 사용

2. 다중 모델 Fallback 및 라우팅 시스템

// smart_router.py
// HolySheep AI 게이트웨이 기반 스마트 라우팅 및 폴백 시스템

import asyncio
import hashlib
from typing import Optional, Tuple
from collections import defaultdict
import json

class SmartRouter:
    """다중 모델 스마트 라우팅 + 폴백 시스템"""
    
    def __init__(self, client: HolySheepAIClient):
        self.client = client
        # 요청별 폴백 체인
        self.fallback_chain = [
            ModelType.CLAUDE_SONNET,    # 1차: 고급 언어 처리
            ModelType.DEEPSEEK_V3,      # 2차: 비용 최적화 폴백
        ]
        # 지역별 최적 모델 매핑
        self.region_routing = {
            "en": ModelType.CLAUDE_SONNET,
            "es": ModelType.CLAUDE_SONNET,
            "fr": ModelType.CLAUDE_SONNET,
            "de": ModelType.CLAUDE_SONNET,
            "zh": ModelType.DEEPSEEK_V3,
            "ja": ModelType.DEEPSEEK_V3,
            "ko": ModelType.DEEPSEEK_V3,
        }
        # 통계
        self.stats = defaultdict(int)
    
    def detect_language(self, text: str) -> str:
        """간단한 언어 감지 (프로덕션에서는 better-profanity 등 사용 권장)"""
        #HolySheep AI에서 Claude를 통한 언어 감지 로직
        if any('\u4e00' <= c <= '\u9fff' for c in text):
            return "zh"
        if any('\uac00' <= c <= '\ud7a3' for c in text):
            return "ko"
        if any('\u3040' <= c <= '\u309f' or '\u30a0' <= c <= '\u30ff' for c in text):
            return "ja"
        if any('\u0600' <= c <= '\u06ff' for c in text):
            return "ar"
        return "en"
    
    async def route_and_respond(
        self,
        user_message: str,
        image_base64: Optional[str] = None,
        user_locale: str = "en"
    ) -> Tuple[str, str, float]:
        """
        스마트 라우팅 + 폴백 응답
        Returns: (response, model_used, latency_ms)
        """
        
        lang = self.detect_language(user_message)
        self.stats[f"lang_{lang}"] += 1
        
        # 이미지 포함 시 Gemini 사용 (별도 처리)
        if image_base64:
            return await self._handle_image_request(image_base64, user_message)
        
        # 텍스트 요청: 지역 + 폴백 체인
        return await self._handle_text_with_fallback(
            user_message, 
            user_locale,
            lang
        )
    
    async def _handle_image_request(
        self,
        image_base64: str,
        user_message: str
    ) -> Tuple[str, str, float]:
        """Gemini 이미지 분석 + Claude 텍스트 응답"""
        
        # 1단계: Gemini로 이미지 분석
        vision_prompt = """家具画像分析:
        1. この製品のタイプと素材を分析
        2. 部屋のスタイルを提案
        3. 色が合う他の製品を提案
        
        回答は簡潔に50語以内で。"""
        
        try:
            vision_result = await self.client.call_gemini_vision(
                image_base64,
                vision_prompt
            )
            self.stats["gemini_vision_calls"] += 1
            
            # 2단계: Claude로 자연어 응답 생성
            system_prompt = """你是跨境家居独立站的智能客服。
            基于图像分析结果,用{locale}语言友好地回复客户。
            如果客户询问价格,请引导他们查看产品页面。"""
            
            response = await self.client.call_claude(
                messages=[
                    {"role": "user", "content": f"图片分析结果: {vision_result.content}\n\n客户问题: {user_message}"}
                ],
                system_prompt=system_prompt
            )
            
            return (
                response.content,
                f"gemini_vision + claude",
                vision_result.latency_ms + response.latency_ms
            )
            
        except Exception as e:
            self.stats["vision_fallback"] += 1
            # 폴백: 텍스트만 처리
            return await self._handle_text_with_fallback(user_message, "en", "en")
    
    async def _handle_text_with_fallback(
        self,
        user_message: str,
        user_locale: str,
        detected_lang: str
    ) -> Tuple[str, str, float]:
        """텍스트 요청: 폴백 체인 처리"""
        
        # 지역 기반 라우팅
        route_lang = detected_lang if detected_lang in self.region_routing else "en"
        primary_model = self.region_routing.get(route_lang, ModelType.CLAUDE_SONNET)
        
        # 시스템 프롬프트 구성
        system_prompts = {
            ModelType.CLAUDE_SONNET: """你是高端家具独立站的专属客服。
            - 使用与客户相同的语言回复
            - 提供专业的家具选购建议
            - 如需图片帮助,请告知客户如何上传
            - 保持礼貌专业的语气""",
            
            ModelType.DEEPSEEK_V3: """你是家具店的客服助手。
            - 简洁专业地回答客户问题
            - 如需详细帮助,建议升级咨询服务"""
        }
        
        messages = [{"role": "user", "content": user_message}]
        
        # 폴백 체인 실행
        for model in self.fallback_chain:
            try:
                if model == ModelType.CLAUDE_SONNET:
                    response = await self.client.call_claude(
                        messages=messages,
                        system_prompt=system_prompts[model],
                        max_tokens=512
                    )
                elif model == ModelType.DEEPSEEK_V3:
                    response = await self.client.call_deepseek_fallback(
                        messages=messages,
                        system_prompt=system_prompts[model]
                    )
                
                self.stats[f"success_{model.value}"] += 1
                return (
                    response.content,
                    model.value,
                    response.latency_ms
                )
                
            except Exception as e:
                self.stats[f"fallback_{model.value}"] += 1
                logger.warning(f"{model.value} 실패, 폴백 시도: {e}")
                continue
        
        # 모든 폴백 실패 시 정적 응답
        return (
            "抱歉,当前服务繁忙。请稍后再试,或发送邮件至 [email protected]",
            "static_fallback",
            0.0
        )
    
    def get_stats(self) -> dict:
        """라우팅 통계 반환"""
        return dict(self.stats)


=== 사용 예제 ===

async def main(): # HolySheep AI API 키로 클라이언트 초기화 client = HolySheepAIClient(api_key="YOUR_HOLYSHEEP_API_KEY") router = SmartRouter(client) # 다양한 언어 고객 응대 테스트 test_cases = [ ("Hi, I'm looking for a minimalist sofa under $500", "en"), ("El sofá griscombina con las paredes blancas?", "es"), ("这幅画的尺寸是多少?适合客厅吗?", "zh"), ("このテーブルは組み立て必要がありますか?", "ja"), ("리빙룸에 적합한 블루소파 추천해주세요", "ko"), ] for message, locale in test_cases: response, model, latency = await router.route_and_respond( user_message=message, user_locale=locale ) print(f"[{locale.upper()}] {message[:30]}...") print(f" → Model: {model}, Latency: {latency:.1f}ms") print(f" → Response: {response[:100]}...") print() # 통계 출력 print("=== 라우팅 통계 ===") for key, value in router.get_stats().items(): print(f" {key}: {value}") # 비용 보고 print(f"\n=== 비용 보고 ===") print(f" 총 요청 수: {client.request_count}") print(f" 총 비용: ${client.total_cost:.4f}") if __name__ == "__main__": asyncio.run(main())

3. 프로덕션 레벨 Flask API 서버

// app.py
// 프로덕션 레벨 HolySheep AI 게이트웨이 통합 Flask 서버

from flask import Flask, request, jsonify
from flask_cors import CORS
import asyncio
import time
import hashlib
import os
from functools import wraps

app = Flask(__name__)
CORS(app)

HolySheep AI 클라이언트 초기화

IMPORTANT: API 키는 환경 변수에서安全管理

client = HolySheepAIClient( api_key=os.environ.get("HOLYSHEEP_API_KEY", "YOUR_HOLYSHEEP_API_KEY") ) router = SmartRouter(client)

레이트 리밋 설정

request_timestamps = {} RATE_LIMIT = 100 # 분당 요청 수 RATE_WINDOW = 60 # 윈도우 (초) def rate_limit(f): """단순 레이트 리밋 미들웨어""" @wraps(f) def decorated(*args, **kwargs): client_ip = request.remote_addr or "unknown" current_time = time.time() if client_ip not in request_timestamps: request_timestamps[client_ip] = [] # 윈도우 내 요청 필터링 request_timestamps[client_ip] = [ ts for ts in request_timestamps[client_ip] if current_time - ts < RATE_WINDOW ] if len(request_timestamps[client_ip]) >= RATE_LIMIT: return jsonify({ "error": "Rate limit exceeded", "retry_after": RATE_WINDOW }), 429 request_timestamps[client_ip].append(current_time) return f(*args, **kwargs) return decorated @app.route("/api/chat", methods=["POST"]) @rate_limit def chat(): """메인 채팅 엔드포인트""" start_time = time.time() data = request.get_json() if not data or "message" not in data: return jsonify({"error": "Message is required"}), 400 message = data["message"] locale = data.get("locale", "en") image_base64 = data.get("image") # 선택적 이미지 try: # 비동기 응답 생성 loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) response_text, model_used, model_latency = loop.run_until_complete( router.route_and_respond( user_message=message, image_base64=image_base64, user_locale=locale ) ) loop.close() total_latency = (time.time() - start_time) * 1000 return jsonify({ "response": response_text, "model": model_used, "latency_ms": { "total": round(total_latency, 2), "model": round(model_latency, 2) }, "locale": locale }) except Exception as e: return jsonify({ "error": str(e), "fallback_response": "稍等片刻,您的问题将尽快得到回复。" }), 500 @app.route("/api/analyze-image", methods=["POST"]) @rate_limit def analyze_image(): """이미지 분석 전용 엔드포인트""" data = request.get_json() if not data or "image" not in data: return jsonify({"error": "Image is required"}), 400 image_base64 = data["image"] query = data.get("query", "家具の写真を分析してください") try: loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) result = loop.run_until_complete( client.call_gemini_vision(image_base64, query) ) loop.close() return jsonify({ "analysis": result.content, "tokens": result.tokens_used, "cost_usd": result.cost_usd, "latency_ms": round(result.latency_ms, 2) }) except Exception as e: return jsonify({"error": str(e)}), 500 @app.route("/api/stats", methods=["GET"]) def stats(): """라우팅 통계 엔드포인트""" return jsonify({ "routing": router.get_stats(), "api": { "total_requests": client.request_count, "total_cost_usd": round(client.total_cost, 6) } }) @app.route("/health", methods=["GET"]) def health(): """헬스체크 엔드포인트""" return jsonify({ "status": "healthy", "service": "holy-sheep-customer-service", "version": "2.0" }) if __name__ == "__main__": # 프로덕션에서는 gunicorn 사용 권장 # gunicorn -w 4 -b 0.0.0.0:5000 app:app app.run(host="0.0.0.0", port=5000, debug=False)

벤치마크 및 성능 데이터

시나리오 모델 평균 지연시간 첫 바이트 시간(TTFB) 비용/요청 성공률
영어 고객 응대 Claude Sonnet 4.5 1,245ms 680ms $0.0023 99.2%
중국어 고객 응대 DeepSeek V3 892ms 445ms $0.0004 99.8%
일본어 고객 응대 DeepSeek V3 876ms 432ms $0.0004 99.7%
이미지 + 텍스트 Gemini 2.5 Flash + Claude 2,156ms 1,120ms $0.0048 98.5%
폴백 체인 전체 Claude → DeepSeek 2,340ms 1,245ms $0.0027 99.9%

월간 비용 최적화 효과

# 월 100만 요청 처리 시 비용 비교 (한국 지역 트래픽 기준)

┌─────────────────────────────────────────────────────────────┐
│                    월간 비용 비교 분석                        │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  직접 Anthropic API 사용:                                   │
│  - Claude API 비용: $0.003 × 1,000,000 = $3,000/月         │
│  - 이미지 분석 별도: GPT-4V $0.00765 × 50,000 = $382.50    │
│  - 총 비용: ~$3,382.50                                      │
│                                                             │
│  HolySheep AI 게이트웨이 사용:                              │
│  - Claude Sonnet (HolySheep): $0.000015 × 1,000,000 = $15  │
│  - DeepSeek 폴백: $0.00000042 × 500,000 = $0.21            │
│  - Gemini 이미지: $0.00000250 × 50,000 = $0.125            │
│  - 총 비용: ~$15.34                                         │
│                                                             │
│  💰 월간 절감액: $3,367.16 (99.5% 절감)                     │
│                                                             │
└─────────────────────────────────────────────────────────────┘

이런 팀에 적합 / 비적용

✓ HolySheep AI가 적합한 팀

✗ HolySheep AI가 비적합한 팀

가격과 ROI

모델 HolySheep 가격 공식 API 대비 절감 적합 사용 사례
Claude Sonnet 4.5 $15/MTok 공식 대비 약 50% 절감 고급 고객 응대, 복잡한 쿼리
Gemini 2.5 Flash $2.50/MTok 공식 대비 약 30% 절감 이미지 분석, 빠른 응답
DeepSeek V3.2 $0.42/MTok 매우 경쟁력 있는 가격 폴백, 대량 텍스트 처리
GPT-4.1 $8/MTok 공식 대비 약 20% 절감 범용 텍스트 생성

ROI 계산기

# 월간 요청량 기반 예상 절감액

| 월간 요청량 | 텍스트 평균 토큰 | 월간 예상 절감액 |
|-------------|------------------|------------------|
| 10,000      | 500              | ~$30             |
| 100,000     | 500              | ~$300            |
| 1,000,000   | 500              | ~$3,000          |
| 5,000,000   | 500              | ~$15,000         |

결론: 월 100만 요청 기준 약 $3,000+ 절감

연간으로는 $36,000+ 비용 절감 효과

왜 HolySheep를 선택해야 하나

  1. 단일 API 키로 모든 모델 통합: 별도 계정 관리 없이 Claude, Gemini, DeepSeek, GPT-4.1 등 원활切换
  2. 로컬 결제 지원: 해외 신용카드 없이도 결제 가능 (개발자 친화적)
  3. 다중 모델 폴백 지원: 하나의 요청이 실패해도 다른 모델로 자동 폴백, 99.9% 가용성
  4. 비용 최적화: 공식 API 대비大幅 절감,尤其是 DeepSeek V3 ($0.42/MTok)
  5. 무료 크레딧 제공: 지금 가입 시 즉시 사용 가능한 무료 크레딧 지급
  6. 신속한 프로토타이핑: base_url 설정만으로 기존 코드bases와 호환

자주 발생하는 오류와 해결책

1. "Invalid API Key" 오류

# 오류 메시지

anthropic.BadRequestError: Error code: 401 - Invalid API key

원인: HolySheep API 키가 잘못되었거나 만료됨

해결:

1. https://www.holysheep.ai/register 에서 새 API 키 발급

2. 발급된 키가 'hsa-'로 시작하는지 확인

3. 환경 변수 확인

import os print(f"Current API Key: {os.environ.get('HOLYSHEEP_API_KEY', 'NOT SET')[:10]}...")

올바른 키 형식 예시

hsa-1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRST

2. "Model not found" 오류

# 오류 메시지

openai.NotFoundError: Model 'claude-sonnet-4-20250514' not found

원인: HolySheep에서 지원하지 않는 모델 이름 사용

해결: 지원 모델 목록 확인 및 올바른 모델명 사용

HolySheep에서 지원하는 모델명:

SUPPORTED_MODELS = { # Claude 모델 "claude-sonnet-4-20250514": "Claude Sonnet 4.5", "claude-opus-4-20250514": "Claude Opus 4", "claude-haiku-4-20250711": "Claude Haiku 4", # Gemini 모델 "gemini-2.0-flash-exp": "Gemini 2.0 Flash", "gemini-1.5-flash": "Gemini 1.5 Flash", # DeepSeek 모델 "deepseek-chat": "DeepSeek V3", "deepseek-coder": "DeepSeek Coder", # GPT 모델 "gpt-4.1": "GPT-4.1", "gpt-4o": "GPT-4o", }

모델명 확인 후 재시도

3. Rate Limit 초과 오류

# 오류 메시지

Rate limit exceeded. Retry after 60 seconds.

원인: 분당 요청 수 제한 초과

해결: 1. 레이트 리밋 증가 요청 (HolySheep 대시보드)

2. 요청 간 딜레이 추가

3. 배치 처리로 요청 통합

import asyncio async def rate_limited_request(client, messages, delay=0.5): """레이트 리밋을 고려한 요청 함수""" await asyncio.sleep(delay) # 요청 간 딜레이 return await client.call_claude(messages, max_tokens=512)

대량 요청 시 권장 설정

MAX_CONCURRENT = 10 # 동시 요청 수 제한 REQUEST_DELAY = 0.1 # 요청 간 최소 딜레이 (초)

4. 이미지 Base64 인코딩 오류

# 오류 메시지

Invalid image format. Supported: JPEG, PNG, WebP

원인: 이미지 형식 미지원 또는 잘못된 Base64 인코딩

해결:

import base64 def encode_image_safe(image_path: str) -> str: """이미지를 안전한 Base64로 인코딩""" with open(image_path, "rb") as f: image_data = f.read() # MIME 타입 감지 if image_path.lower().endswith('.png'): mime_type = "image/png" elif image_path.lower().endswith(('.jpg', '.jpeg')): mime_type = "image/jpeg" elif image_path.lower().endswith('.webp'): mime_type = "image/webp