| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- import os
- import time
- import asyncio
- import logging
- from fastapi import FastAPI, Request
- from app.api import health, recommend, chat, analyze, tongue, adapter, report_parse, meal, logs, audio, innate_portrait, self_check
- from app import monitoring
- from src.app import router as questionnaire_router
- from app.middleware import RequestLogMiddleware
- logger = logging.getLogger(__name__)
- app = FastAPI(title="cfc-langgraph", version="0.3.0")
- # 注册请求日志中间件(纯 ASGI,避免 BaseHTTPMiddleware 消费 body 导致单 worker 死锁)
- app.add_middleware(RequestLogMiddleware)
- app.include_router(health.router)
- app.include_router(recommend.router)
- app.include_router(chat.router)
- app.include_router(analyze.router)
- app.include_router(tongue.router)
- app.include_router(adapter.router)
- app.include_router(monitoring.router)
- app.include_router(questionnaire_router)
- app.include_router(report_parse.router)
- app.include_router(meal.router)
- app.include_router(audio.router)
- app.include_router(logs.router)
- app.include_router(innate_portrait.router)
- app.include_router(self_check.router)
- @app.on_event("startup")
- async def startup():
- from app.config import settings
- from app.log_config import setup_logging
- json_logs = os.getenv("JSON_LOGS", "false").lower() == "true"
- setup_logging(level=settings.log_level, json_format=json_logs)
- # 初始化 faster-whisper STT 模型
- from app.audio.transcriber import init_model
- init_model()
- if os.getenv("LANGCHAIN_TRACING_V2", "").lower() == "true":
- logger.info(
- "LangSmith 已启用: project=%s, api_key=%s...",
- settings.langchain_project,
- settings.langchain_api_key[:8] if settings.langchain_api_key else "none",
- )
- from app.rag.retriever import RagRetriever
- retriever = RagRetriever()
- await retriever.initialize()
- async def schedule_kb_sync():
- # 首次同步延迟 120s,让 healthcheck 先通过,避免 worker 刚启动就被阻塞
- await asyncio.sleep(120)
- while True:
- try:
- from app.tasks.knowledge_sync import sync_knowledge_base
- await sync_knowledge_base()
- except Exception as e:
- logger.warning("知识库同步失败: %s", e)
- await asyncio.sleep(3600)
- asyncio.create_task(schedule_kb_sync())
- logger.info("知识库定时同步已启动 (首次延迟 120s,间隔 3600s)")
- @app.on_event("shutdown")
- async def shutdown():
- from app.tools.java_client import JavaClient
- client = JavaClient()
- await client.close()
|