main.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import os
  2. import time
  3. import asyncio
  4. import logging
  5. from fastapi import FastAPI, Request
  6. from app.api import health
  7. # 以下模块文件被 f18dd86e 清空(0字节),恢复前注释避免 import 失败
  8. # from app.api import recommend, chat, analyze, tongue, adapter, report_parse, meal
  9. from app import monitoring
  10. from src.app import router as questionnaire_router
  11. logger = logging.getLogger(__name__)
  12. app = FastAPI(title="cfc-langgraph", version="0.3.0")
  13. app.include_router(health.router)
  14. # app.include_router(recommend.router)
  15. # app.include_router(chat.router)
  16. # app.include_router(analyze.router)
  17. # app.include_router(tongue.router)
  18. # app.include_router(adapter.router)
  19. app.include_router(monitoring.router)
  20. app.include_router(questionnaire_router)
  21. # app.include_router(report_parse.router)
  22. # app.include_router(meal.router)
  23. @app.middleware("http")
  24. async def timing_middleware(request: Request, call_next):
  25. start = time.perf_counter()
  26. response = await call_next(request)
  27. elapsed = time.perf_counter() - start
  28. if elapsed > 5:
  29. logger.warning("SLOW_REQUEST: %s %s took %.2fs",
  30. request.method, request.url.path, elapsed)
  31. else:
  32. logger.debug("REQUEST: %s %s took %.2fs",
  33. request.method, request.url.path, elapsed)
  34. response.headers["X-Response-Time"] = f"{elapsed:.3f}s"
  35. return response
  36. @app.on_event("startup")
  37. async def startup():
  38. from app.config import settings
  39. from app.log_config import setup_logging
  40. json_logs = os.getenv("JSON_LOGS", "false").lower() == "true"
  41. setup_logging(level=settings.log_level, json_format=json_logs)
  42. if os.getenv("LANGCHAIN_TRACING_V2", "").lower() == "true":
  43. logger.info(
  44. "LangSmith 已启用: project=%s, api_key=%s...",
  45. settings.langchain_project,
  46. settings.langchain_api_key[:8] if settings.langchain_api_key else "none",
  47. )
  48. from app.rag.retriever import RagRetriever
  49. retriever = RagRetriever()
  50. await retriever.initialize()
  51. async def schedule_kb_sync():
  52. while True:
  53. try:
  54. from app.tasks.knowledge_sync import sync_knowledge_base
  55. await sync_knowledge_base()
  56. except Exception as e:
  57. logger.warning("知识库同步失败: %s", e)
  58. await asyncio.sleep(3600)
  59. asyncio.create_task(schedule_kb_sync())
  60. logger.info("知识库定时同步已启动 (间隔: 3600s)")
  61. @app.on_event("shutdown")
  62. async def shutdown():
  63. from app.tools.java_client import JavaClient
  64. client = JavaClient()
  65. await client.close()