zai2api-py / main.py
keungliang's picture
Upload 31 files
fd21f34 verified
#!/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)
@asynccontextmanager
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)
@app.options("/")
async def handle_options():
"""Handle OPTIONS requests"""
return Response(status_code=200)
@app.get("/")
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()