Files
AlphaPulse/backend/src/alphapulse/api/main.py
T
eezd 4f43ca8b57 Add AI news risk analysis and dashboard
Analyze news revisions with independent model settings, evidence-backed risk ratings, event grouping, and rolling market outlooks. Add a default homepage, archival history, pending-result refresh, and isolated regression coverage.

Keep analysis disabled until explicitly enabled. Require a separately authorized schema migration before deployment and preserve compatibility with the previous six-service instance.
2026-10-30 18:35:49 +08:00

49 lines
1.8 KiB
Python

import os
from fastapi import Depends, FastAPI
from fastapi.exceptions import RequestValidationError
from fastapi.responses import RedirectResponse
from starlette.exceptions import HTTPException
from alphapulse.api import auth, calendar, chat, crawler, market, news, settings, skills, trading, risk
from alphapulse.api.response import (
ApiResponse, ValidationErrors, http_error, internal_error, success, validation_error,
)
from alphapulse.core.auth import require_admin
# 关闭默认文档路由,改为登录后才能访问
app = FastAPI(
title="AlphaPulse", docs_url=None, redoc_url=None, openapi_url=None,
responses={422: {"model": ApiResponse[ValidationErrors], "description": "请求参数无效"}},
)
app.add_exception_handler(HTTPException, http_error)
app.add_exception_handler(RequestValidationError, validation_error)
app.add_exception_handler(Exception, internal_error)
app.include_router(auth.router)
app.include_router(news.router)
app.include_router(crawler.router)
app.include_router(market.router)
app.include_router(market.ws_router)
app.include_router(settings.router)
app.include_router(skills.router)
app.include_router(chat.router)
app.include_router(trading.router)
app.include_router(calendar.router)
app.include_router(risk.router)
@app.get("/api/health", include_in_schema=False)
async def health() -> ApiResponse[dict[str, str]]:
return success({"status": "ok", "version": os.environ.get("APP_VERSION", "source"),
"commit": os.environ.get("APP_COMMIT", "unknown")})
@app.get("/api/openapi.json", include_in_schema=False, dependencies=[Depends(require_admin)])
async def openapi() -> dict:
return app.openapi()
@app.get("/api/docs", include_in_schema=False)
async def docs() -> RedirectResponse:
return RedirectResponse("/docs")