52 lines
1.6 KiB
Python
52 lines
1.6 KiB
Python
"""FastAPI 应用入口"""
|
|
|
|
import asyncio
|
|
from contextlib import asynccontextmanager
|
|
|
|
from fastapi import FastAPI
|
|
from loguru import logger
|
|
|
|
from app.api.agent import router
|
|
from app.api.conversations import router as conversation_router
|
|
from app.core.exceptions import register_exception_handlers
|
|
from app.core.logging import setup_logging
|
|
|
|
|
|
@asynccontextmanager
|
|
async def lifespan(application: FastAPI):
|
|
setup_logging()
|
|
from app.clients.decision import close_decision_engine
|
|
from app.observability.tracing import flush_tracing
|
|
from app.processor.graph import build_graph
|
|
from app.services.agent import AgentService
|
|
|
|
from app.services.conversation import InMemoryConversationStore
|
|
|
|
# TODO 接入 MongoDB 后替换为持久化实现,并同步替换图的 checkpointer
|
|
store = InMemoryConversationStore()
|
|
application.state.conversation_store = store
|
|
application.state.agent_service = AgentService(build_graph(), store)
|
|
try:
|
|
yield
|
|
finally:
|
|
# 共享客户端只在应用退出时关闭,追踪刷新放到线程避免阻塞事件循环
|
|
try:
|
|
await close_decision_engine()
|
|
finally:
|
|
try:
|
|
await asyncio.to_thread(flush_tracing)
|
|
finally:
|
|
await logger.complete()
|
|
|
|
|
|
def create_app() -> FastAPI:
|
|
application = FastAPI(title="Screen Agent API", lifespan=lifespan)
|
|
# 统一处理请求校验、HTTP 错误和未捕获异常
|
|
register_exception_handlers(application)
|
|
application.include_router(router)
|
|
application.include_router(conversation_router)
|
|
return application
|
|
|
|
|
|
app = create_app()
|