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()