Spaces:
Paused
Paused
| #!/usr/bin/env python | |
| # -*- coding: utf-8 -*- | |
| import os | |
| import sys | |
| import psutil | |
| from contextlib import asynccontextmanager | |
| from fastapi import FastAPI, Response | |
| from fastapi.middleware.cors import CORSMiddleware | |
| from app.core.config import settings | |
| from app.core import openai | |
| from app.utils.reload_config import RELOAD_CONFIG | |
| from app.utils.logger import setup_logger | |
| from app.utils.token_pool import initialize_token_pool | |
| from app.providers import initialize_providers | |
| from granian import Granian | |
| # Setup logger | |
| logger = setup_logger(log_dir="logs", debug_mode=settings.DEBUG_LOGGING) | |
| async def lifespan(app: FastAPI): | |
| # 初始化提供商系统 | |
| initialize_providers() | |
| # 初始化 token 池 | |
| token_list = settings.auth_token_list | |
| if token_list: | |
| token_pool = initialize_token_pool( | |
| tokens=token_list, | |
| failure_threshold=settings.TOKEN_FAILURE_THRESHOLD, | |
| recovery_timeout=settings.TOKEN_RECOVERY_TIMEOUT | |
| ) | |
| yield | |
| logger.info("🔄 应用正在关闭...") | |
| # Create FastAPI app with lifespan | |
| app = FastAPI(lifespan=lifespan) | |
| # Add CORS middleware | |
| app.add_middleware( | |
| CORSMiddleware, | |
| allow_origins=["*"], | |
| allow_credentials=True, | |
| allow_methods=["GET", "POST", "PUT", "DELETE", "OPTIONS"], | |
| allow_headers=["Content-Type", "Authorization"], | |
| ) | |
| # Include API routers | |
| app.include_router(openai.router) | |
| async def handle_options(): | |
| """Handle OPTIONS requests""" | |
| return Response(status_code=200) | |
| async def root(): | |
| """Root endpoint""" | |
| return {"message": "OpenAI Compatible API Server"} | |
| def run_server(): | |
| service_name = settings.SERVICE_NAME | |
| logger.info(f"🚀 启动 {service_name} 服务...") | |
| logger.info(f"📡 监听地址: 0.0.0.0:{settings.LISTEN_PORT}") | |
| logger.info(f"🔧 调试模式: {'开启' if settings.DEBUG_LOGGING else '关闭'}") | |
| logger.info(f"🔐 匿名模式: {'开启' if settings.ANONYMOUS_MODE else '关闭'}") | |
| try: | |
| Granian( | |
| "main:app", | |
| interface="asgi", | |
| address="0.0.0.0", | |
| port=settings.LISTEN_PORT, | |
| reload=False, # 生产环境请关闭热重载 | |
| process_name=service_name, # 设置进程名称 | |
| **RELOAD_CONFIG, # 热重载配置 | |
| ).serve() | |
| except KeyboardInterrupt: | |
| logger.info("🛑 收到中断信号,正在关闭服务...") | |
| except Exception as e: | |
| logger.error(f"❌ 服务启动失败: {e}") | |
| sys.exit(1) | |
| if __name__ == "__main__": | |
| run_server() | |