main.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import os
  2. import time
  3. import asyncio
  4. import logging
  5. from fastapi import FastAPI, Request
  6. from starlette.middleware.base import BaseHTTPMiddleware
  7. from app.api import health, recommend, chat, analyze, tongue, adapter, report_parse, meal, logs, audio
  8. from app import monitoring
  9. from src.app import router as questionnaire_router
  10. from app.middleware import request_log_middleware
  11. logger = logging.getLogger(__name__)
  12. app = FastAPI(title="cfc-langgraph", version="0.3.0")
  13. # 注册请求日志中间件(必须在其他路由之前)
  14. app.add_middleware(BaseHTTPMiddleware, dispatch=request_log_middleware)
  15. app.include_router(health.router)
  16. app.include_router(recommend.router)
  17. app.include_router(chat.router)
  18. app.include_router(analyze.router)
  19. app.include_router(tongue.router)
  20. app.include_router(adapter.router)
  21. app.include_router(monitoring.router)
  22. app.include_router(questionnaire_router)
  23. app.include_router(report_parse.router)
  24. app.include_router(meal.router)
  25. app.include_router(audio.router)
  26. app.include_router(logs.router)
  27. @app.on_event("startup")
  28. async def startup():
  29. from app.config import settings
  30. from app.log_config import setup_logging
  31. json_logs = os.getenv("JSON_LOGS", "false").lower() == "true"
  32. setup_logging(level=settings.log_level, json_format=json_logs)
  33. # 初始化 faster-whisper STT 模型
  34. from app.audio.transcriber import init_model
  35. init_model()
  36. if os.getenv("LANGCHAIN_TRACING_V2", "").lower() == "true":
  37. logger.info(
  38. "LangSmith 已启用: project=%s, api_key=%s...",
  39. settings.langchain_project,
  40. settings.langchain_api_key[:8] if settings.langchain_api_key else "none",
  41. )
  42. from app.rag.retriever import RagRetriever
  43. retriever = RagRetriever()
  44. await retriever.initialize()
  45. async def schedule_kb_sync():
  46. while True:
  47. try:
  48. from app.tasks.knowledge_sync import sync_knowledge_base
  49. await sync_knowledge_base()
  50. except Exception as e:
  51. logger.warning("知识库同步失败: %s", e)
  52. await asyncio.sleep(3600)
  53. asyncio.create_task(schedule_kb_sync())
  54. logger.info("知识库定时同步已启动 (间隔: 3600s)")
  55. @app.on_event("shutdown")
  56. async def shutdown():
  57. from app.tools.java_client import JavaClient
  58. client = JavaClient()
  59. await client.close()