main.py 2.4 KB

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