""" FastAPI主应用 """ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.staticfiles import StaticFiles from fastapi.responses import FileResponse from contextlib import asynccontextmanager from app.config import get_settings from app.utils.logger import logger from app.api import chat, stock, skills, llm, auth, admin import os @asynccontextmanager async def lifespan(app: FastAPI): """应用生命周期管理""" # 启动时执行 logger.info("应用启动") yield # 关闭时执行 logger.info("应用关闭") # 创建FastAPI应用 app = FastAPI( title="A股AI分析Agent系统", description="基于AI Agent的股票智能分析系统", version="1.0.0", lifespan=lifespan ) # 配置CORS settings = get_settings() app.add_middleware( CORSMiddleware, allow_origins=settings.cors_origins.split(","), allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # 注册路由 app.include_router(auth.router, tags=["认证"]) app.include_router(admin.router, tags=["后台管理"]) app.include_router(chat.router, prefix="/api/chat", tags=["对话"]) app.include_router(stock.router, prefix="/api/stock", tags=["股票数据"]) app.include_router(skills.router, prefix="/api/skills", tags=["技能管理"]) app.include_router(llm.router, tags=["LLM模型"]) # 挂载静态文件 frontend_path = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), "frontend") if os.path.exists(frontend_path): app.mount("/static", StaticFiles(directory=frontend_path), name="static") @app.get("/") async def root(): """根路径,重定向到登录页""" from fastapi.responses import RedirectResponse return RedirectResponse(url="/static/login.html") @app.get("/app") async def app_page(): """主应用页面""" index_path = os.path.join(frontend_path, "index.html") if os.path.exists(index_path): return FileResponse(index_path) return {"message": "页面不存在"} @app.get("/health") async def health_check(): """健康检查""" return {"status": "healthy"} if __name__ == "__main__": import uvicorn uvicorn.run( "app.main:app", host=settings.api_host, port=settings.api_port, reload=settings.debug )