main.py 2.4 KB

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