langchain-learning-kit/app/main.py

111 lines
2.5 KiB
Python

"""
LangChain Learning Kit - FastAPI 应用程序入口
"""
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from contextlib import asynccontextmanager
from app.config import get_settings
from app.db.session import init_db_manager
from app.api import models, kb, conv, agent
from app.utils.logger import get_logger
logger = get_logger(__name__)
@asynccontextmanager
async def lifespan(app: FastAPI):
"""
应用程序生命周期管理器。
处理启动和关闭事件。
"""
# 启动
logger.info("application_starting")
try:
settings = get_settings()
# 初始化数据库管理器
db_manager = init_db_manager(settings)
logger.info("database_manager_initialized")
# 如果表不存在则创建
db_manager.create_all_tables()
logger.info("database_tables_verified")
logger.info(
"application_started",
environment=settings.environment,
debug=settings.debug,
)
except Exception as e:
logger.error("application_startup_failed", error=str(e))
raise
yield
# 关闭
logger.info("application_shutting_down")
# 创建 FastAPI 应用程序
app = FastAPI(
title="LangChain Learning Kit",
description="Enterprise-grade LangChain learning platform with RAG, multi-turn conversations, and agent orchestration",
version="1.0.0",
lifespan=lifespan,
)
# CORS 中间件
settings = get_settings()
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # 在生产环境中,请指定实际的源
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# 包含路由
app.include_router(models.router, prefix="/api/v1")
app.include_router(kb.router, prefix="/api/v1")
app.include_router(conv.router, prefix="/api/v1")
app.include_router(agent.router, prefix="/api/v1")
@app.get("/")
def root():
"""根端点。"""
return {
"message": "Welcome to LangChain Learning Kit API",
"version": "1.0.0",
"docs": "/docs",
"health": "/health",
}
@app.get("/health")
def health_check():
"""健康检查端点。"""
return {
"status": "healthy",
"environment": settings.environment,
}
if __name__ == "__main__":
import uvicorn
logger.info("starting_uvicorn_server")
uvicorn.run(
"app.main:app",
host=settings.host,
port=settings.port,
reload=settings.debug,
log_level="info",
)