main.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import asyncio
  2. from pathlib import Path
  3. import sys
  4. # 为了避免耦合,微服务,可能确实要将上级的上级目录作为一个单独的进程来处理,此目录作为一个单独的UI项目
  5. sys.path.append(str(Path(__file__).parent))
  6. from fastapi import FastAPI
  7. from routers.proxy import router,sub_mgr
  8. from routers.file import router as file_router
  9. from routers.worker import router as worker_router
  10. from fastapi.middleware.cors import CORSMiddleware
  11. from contextlib import asynccontextmanager
  12. from utils.process_mgr import process_manager
  13. from utils.config import config,WORKER_DIR_BASE
  14. from src.services.celery_worker import CeleryWorker,celery_worker
  15. from utils.logu import get_logger,logger
  16. async def startup():
  17. """应用启动时执行的操作"""
  18. global process_manager,config
  19. tasks = []
  20. logger.info(f"startup")
  21. tasks.append(asyncio.create_task(celery_worker.run()))
  22. tasks.append(asyncio.create_task(sub_mgr.startup()))
  23. return tasks # 确保返回任务列表
  24. @asynccontextmanager
  25. async def lifespan(app: FastAPI):
  26. """应用生命周期管理"""
  27. tasks = await startup()
  28. yield
  29. logger.info(f"quite {tasks}")
  30. for name,model in celery_worker.workers_model.items():
  31. await celery_worker.stop_worker(name)
  32. # 创建 FastAPI 应用实例
  33. app = FastAPI(
  34. description="",
  35. version="1.0.0",
  36. lifespan=lifespan
  37. )
  38. app.add_middleware(
  39. CORSMiddleware,
  40. allow_origins=["*"], # 允许所有域名访问
  41. allow_credentials=True,
  42. allow_methods=["*"], # 允许所有方法(GET, POST, PUT, DELETE 等)
  43. allow_headers=["*"], # 允许所有头部
  44. )
  45. # 将 gpt_router 挂载到应用中
  46. app.include_router(router, prefix="/api/proxy", tags=["chat"])
  47. app.include_router(worker_router, prefix="/api/worker", tags=["worker"])
  48. if __name__ == "__main__":
  49. import uvicorn
  50. # 注意: 由于涉及到多进程管理机制,因此不能使用 reload 。例如 uvicorn main:app --port 5835 --reload
  51. uvicorn.run(app, host=config.backend.host, port=config.backend.port)