66 lines
2.0 KiB
Python

from __future__ import annotations
from contextlib import asynccontextmanager
from fastapi import FastAPI, HTTPException, Request
from fastapi.responses import JSONResponse
from app.api.agent.tasks import router as task_router
from app.api.demo.approval import router as demo_approval_router
from app.api.demo.identity import router as demo_identity_router
from app.api.demo.software_a import router as demo_software_a_router
from app.api.edge.tasks import router as edge_router
from app.core.config import ensure_runtime_directories, get_settings
from app.core.time import format_now
from app.db.base import Base
from app.db.session import engine
from app.models.approval import ApprovalRequest
from app.models.audit_log import AuditLog
from app.models.edge_node import EdgeNode
from app.models.edge_task import EdgeTask
from app.models.task import Task
from app.models.tool_call import ToolCall
settings = get_settings()
@asynccontextmanager
async def lifespan(_: FastAPI):
ensure_runtime_directories()
Base.metadata.create_all(bind=engine)
yield
app = FastAPI(
title="智能化部署 Agent Demo Backend",
version="0.1.0",
lifespan=lifespan,
)
@app.exception_handler(HTTPException)
async def http_exception_handler(_: Request, exc: HTTPException) -> JSONResponse:
detail = exc.detail if isinstance(exc.detail, dict) else {"code": "INTERNAL_ERROR", "message": str(exc.detail)}
return JSONResponse(
status_code=exc.status_code,
content={
"request_id": "req-exception",
"success": False,
"code": detail.get("code", "INTERNAL_ERROR"),
"message": detail.get("message", "request failed"),
"data": {},
"timestamp": format_now(settings.default_timezone),
},
)
@app.get("/healthz")
def healthz() -> dict[str, str]:
return {"status": "ok"}
app.include_router(task_router)
app.include_router(demo_identity_router)
app.include_router(demo_approval_router)
app.include_router(demo_software_a_router)
app.include_router(edge_router)