#!/usr/bin/env python3 """ Hugging Face Spaces용 Lily LLM API 서버 진입점 """ import os import sys import logging import asyncio import uvicorn from pathlib import Path # 프로젝트 루트를 Python path에 추가 project_root = Path(__file__).parent sys.path.insert(0, str(project_root)) # 환경 변수 설정 os.environ.setdefault("PYTHONPATH", str(project_root)) os.environ.setdefault("HOST", "0.0.0.0") os.environ.setdefault("PORT", "7860") # 로깅 설정 logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) logger = logging.getLogger(__name__) def setup_huggingface_environment(): """Hugging Face Spaces 환경 설정""" # 필요한 디렉토리 생성 directories = [ "data", "logs", "models", "uploads", "vector_stores", "temp", "cache", "cache/transformers", "cache/huggingface", "cache/easyocr", "cache/ocr_models" ] for dir_name in directories: dir_path = project_root / dir_name dir_path.mkdir(exist_ok=True, parents=True) logger.info(f"📁 디렉토리 생성: {dir_path}") # 환경 변수 설정 env_vars = { "TRANSFORMERS_CACHE": str(project_root / "cache" / "transformers"), "HF_HOME": str(project_root / "cache" / "huggingface"), "TORCH_HOME": str(project_root / "cache" / "torch"), "EASYOCR_MODULE_PATH": str(project_root / "cache" / "easyocr"), "OCR_MODELS_PATH": str(project_root / "cache" / "ocr_models"), "TOKENIZERS_PARALLELISM": "false", "OMP_NUM_THREADS": "1", "MKL_NUM_THREADS": "1" } for key, value in env_vars.items(): os.environ[key] = value logger.info(f"🔧 환경변수 설정: {key}={value}") async def main(): """메인 실행 함수""" logger.info("🚀 Hugging Face Spaces용 Lily LLM API 서버 시작") # 환경 설정 setup_huggingface_environment() try: # FastAPI 앱 import from lily_llm_api.app_v2 import app # 서버 설정 host = os.getenv("HOST", "0.0.0.0") port = int(os.getenv("PORT", "7860")) logger.info(f"🌐 서버 시작: {host}:{port}") # Uvicorn 서버 실행 config = uvicorn.Config( app=app, host=host, port=port, log_level="info", access_log=True, loop="asyncio" ) server = uvicorn.Server(config) await server.serve() except Exception as e: logger.error(f"❌ 서버 시작 오류: {e}") import traceback logger.error(f"🔍 상세 오류:\n{traceback.format_exc()}") sys.exit(1) if __name__ == "__main__": # Python 3.7+ 호환성을 위한 asyncio 실행 try: asyncio.run(main()) except KeyboardInterrupt: logger.info("👋 서버 종료") except Exception as e: logger.error(f"❌ 실행 오류: {e}") sys.exit(1) logger.error(f"❌ 실행 오류: {e}") sys.exit(1)