Spaces:
Sleeping
Sleeping
| """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() | |