"""Vcore AI Proxy 入口""" import asyncio import uvicorn from src.core import ( load_config, merge_default_config_file, PORT_API, ) from src.api import VcoreAIClient, create_app from src.core.auth import api_key_manager from src.utils.logger import get_logger, configure_logging, set_request_id # 初始化日志系统 logger = get_logger(__name__) async def main() -> None: """启动服务器""" # 设置请求ID用于日志追踪 set_request_id("startup") # Docker 挂载卷里可能是旧 config.json;启动时补齐新版本新增配置项,保留用户已有值。 merge_default_config_file() config = load_config() debug_mode = config.get("debug", False) logger.info("=" * 60) logger.info("🚀 Vcore AI Proxy 启动中...") logger.info("📋 模式: Anonymous HTTP") logger.info(f"🔧 调试模式: {'开启' if debug_mode else '关闭'}") logger.info(f"🌐 API 端口: {PORT_API}") # 初始化API密钥管理器 logger.debug("初始化 API 密钥管理器") api_key_manager.load_keys() # 初始化管理员密码(首次启动会生成并打印到日志) from src.api.admin import ensure_admin_password ensure_admin_password() logger.debug("创建 Vcore AI 客户端") vcore_client = VcoreAIClient() logger.debug("创建 FastAPI 应用") app = create_app(vcore_client) logger.info(f"启动 HTTP API 服务器 (端口: {PORT_API})") uvicorn_config = uvicorn.Config( app, host="0.0.0.0", port=PORT_API, log_level="info", access_log=False, log_config=None # 禁用 uvicorn 的默认日志配置,避免覆盖我们的 root logger ) server = uvicorn.Server(uvicorn_config) logger.success("✅ 服务启动完成,系统运行中...") logger.info("=" * 60) try: await server.serve() except asyncio.CancelledError: logger.info("收到取消信号,开始关闭服务...") except KeyboardInterrupt: logger.info("收到中断信号 (Ctrl+C),开始关闭服务...") finally: logger.info("🛑 开始清理资源...") if hasattr(server, 'force_exit'): server.force_exit = True logger.debug("关闭 Vcore AI 客户端") await vcore_client.close() # 关闭 worker 子进程 try: from src.transport.worker import worker worker.stop() except Exception: pass logger.success("✅ 资源清理完成,服务已安全关闭") def main_sync() -> None: from src.core.config import load_config, merge_default_config_file merge_default_config_file() config = load_config() configure_logging(debug=config.get("debug", False), log_dir=config.get("log_dir", "logs")) try: asyncio.run(main()) except KeyboardInterrupt: pass if __name__ == "__main__": main_sync()