main.py 2.2 KB

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