main.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import logging
  2. from contextlib import asynccontextmanager
  3. from fastapi import FastAPI
  4. from app.config import settings
  5. from app.controller.flow_controller import (
  6. init_controller,
  7. router,
  8. shutdown_controller,
  9. )
  10. from app.middleware.api_key import ApiKeyMiddleware
  11. from app.repository.local_store import LocalRecordStore
  12. from app.repository.redis_store import RedisRecordStore
  13. from app.service.template.template_service import TemplateService
  14. _LOG_FORMAT = "%(asctime)s %(levelname)-5s [%(name)s] %(message)s"
  15. _LOG_DATEFMT = "%Y-%m-%d %H:%M:%S"
  16. logger = logging.getLogger(__name__)
  17. def setup_logging() -> None:
  18. """配置根日志。使用 force=True 确保在 uvicorn dictConfig 之后仍能生效。"""
  19. level = getattr(logging, settings.log_level.upper(), logging.INFO)
  20. logging.basicConfig(
  21. level=level,
  22. format=_LOG_FORMAT,
  23. datefmt=_LOG_DATEFMT,
  24. force=True,
  25. )
  26. @asynccontextmanager
  27. async def lifespan(app: FastAPI):
  28. setup_logging()
  29. logger.info("========================================")
  30. logger.info("Starting %s ...", settings.app_name)
  31. logger.info("Log level : %s", settings.log_level.upper())
  32. logger.info("Store backend : %s", settings.store_backend)
  33. logger.info("Executor pool : %d", settings.executor_pool_size)
  34. logger.info("========================================")
  35. if settings.store_backend == "redis":
  36. store = RedisRecordStore()
  37. logger.info("Redis record store initialized (host=%s, port=%d)",
  38. settings.redis_host, settings.redis_port)
  39. else:
  40. store = LocalRecordStore()
  41. logger.info("Local record store initialized")
  42. template_service = TemplateService()
  43. init_controller(store, template_service)
  44. logger.info("%s is ready to accept requests", settings.app_name)
  45. yield
  46. shutdown_controller()
  47. logger.info("%s stopped.", settings.app_name)
  48. app = FastAPI(title="AI Flow", lifespan=lifespan)
  49. app.add_middleware(ApiKeyMiddleware)
  50. app.include_router(router)