import argparse import logging import sys import uuid import uvicorn from fastapi import FastAPI import config # 导入 API 路由模块 from api import glm, mthreads, qwen from config import DEFAULT_LISTEN_HOST, DEFAULT_LISTEN_PORT def setup_logging(debug: bool): """ 配置日志系统,设置 proxy 专用日志记录器,避免与 uvicorn 等第三方库的日志冲突 """ # 将记录器设置为最低级别(DEBUG),以便将所有消息传递给其处理器 app_logger = logging.getLogger("proxy") app_logger.setLevel(logging.DEBUG) app_logger.propagate = False # 防止日志消息传播到根记录器,避免重复记录 # 清除现有处理器,确保配置唯一性 app_logger.handlers.clear() # 定义所有日志共享的格式 formatter = logging.Formatter( "%(asctime)s - %(name)s - %(levelname)s - %(message)s" ) # 在控制台显示 INFO 及以上级别的日志,保证控制台不会被 DEBUG 信息淹没 console_handler = logging.StreamHandler(sys.stdout) console_handler.setLevel(logging.INFO) console_handler.setFormatter(formatter) app_logger.addHandler(console_handler) if debug: # 在调试模式下,将 DEBUG 及以上级别的日志写入文件 file_handler = logging.FileHandler("debug.log", mode="w", encoding="utf-8") file_handler.setLevel(logging.DEBUG) file_handler.setFormatter(formatter) app_logger.addHandler(file_handler) # 命令行参数解析 parser = argparse.ArgumentParser(description="LLM API Proxy Server") parser.add_argument( "-p", "--port", type=int, default=DEFAULT_LISTEN_PORT, help=f"Port to run the server on (default: {DEFAULT_LISTEN_PORT})", ) parser.add_argument( "-d", "--debug", action="store_true", help="Enable debug mode, writing detailed logs to debug.log", ) args = parser.parse_args() listen_port = args.port config.DEBUG = args.debug # 配置日志系统 setup_logging(config.DEBUG) # 获取配置好的专用日志记录器 logger = logging.getLogger("proxy") app = FastAPI( title="LLM Chat API Proxy", description="A proxy for LLM APIs, supporting GLM, Qwen, and MThreads Playground.", version="1.0.3", ) # 包含来自各个 API 模块的路由 app.include_router(mthreads.router, prefix="/api") app.include_router(qwen.router, prefix="/api") app.include_router(glm.router, prefix="/api") if __name__ == "__main__": logger.info( f"Starting LLM API Proxy v1.0.3 on http://{DEFAULT_LISTEN_HOST}:{listen_port}" ) if config.DEBUG: logger.info("Debug mode is enabled. Logging to debug.log") uvicorn.run( "main:app", host=DEFAULT_LISTEN_HOST, port=listen_port, reload=True, reload_delay=1.0, )