Files
sanguo_vnpy_v2/sanguo_api/app.py
T

80 lines
3.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
FastAPI application factory for Sanguo Quant API
"""
from fastapi import FastAPI
from .routes import router, set_orchestrator, set_auth_config
from .routes_paper import router as paper_router, set_db_path as set_paper_db_path
from .routes_live import router as live_router, set_db_path as set_live_db_path
from .routes_portfolio import router as portfolio_router
from .routes_strategy import router as strategy_router
from .routes_factor import router as factor_eval_router, set_eval_db_path as set_factor_eval_db_path
from .routes_pipeline import router as pipeline_router, set_pipeline_eval_db_path
from .routes_alerts import router as alerts_router, set_alerts_db_path
from .auth import set_jwt_config
from .ws import manager
from sanguo_orchestrator.runner import Orchestrator, resolve_eval_db
def create_app(db_path: str, file_dir=None, auth_config=None, max_workers: int = 2) -> FastAPI:
"""Create FastAPI application with orchestrator and optional authentication"""
app = FastAPI(title="Sanguo Quant API")
# Initialize orchestrator
orch = Orchestrator(db_path=db_path, file_dir=file_dir, max_workers=max_workers)
# Set up WebSocket stage callback
async def _on_stage(task_id, stage):
"""Broadcast stage updates to WebSocket subscribers"""
await manager.broadcast(task_id, {"task_id": task_id, "stage": stage})
orch.set_on_stage(_on_stage)
set_orchestrator(orch)
# Configure authentication if provided
if auth_config:
set_auth_config(auth_config)
set_jwt_config(
auth_config.get("jwt_secret", "x"),
auth_config.get("expire_minutes", 60)
)
# Include routes
app.include_router(router, prefix="/api/v1")
app.include_router(paper_router, prefix="/api/v1")
app.include_router(live_router, prefix="/api/v1")
app.include_router(portfolio_router, prefix="/api/v1")
app.include_router(strategy_router, prefix="/api/v1")
app.include_router(factor_eval_router, prefix="/api/v1")
app.include_router(pipeline_router, prefix="/api/v1")
app.include_router(alerts_router, prefix="/api/v1")
set_paper_db_path(db_path)
set_live_db_path(db_path)
set_factor_eval_db_path(resolve_eval_db(db_path))
set_pipeline_eval_db_path(resolve_eval_db(db_path))
set_alerts_db_path(None) # None=env SANGUO_ALERTS_DB > 各机缺省 data/alerts.db
@app.on_event("startup")
def _register_live_step():
"""容器启动:注册每日 20:30 全局实走 step job(C-S3,遍历 live accounts)。"""
try:
from sanguo_trader.scheduler import register_live_step_job
register_live_step_job(db_path)
except Exception as e: # noqa: BLE001 本机无 apscheduler 时跳过
import logging
logging.getLogger(__name__).warning("register_live_step_job 失败: %s", e)
try:
from sanguo_trader.scheduler import register_pipeline_weekly_job
register_pipeline_weekly_job(db_path)
except Exception as exc: # noqa: BLE001
import logging
logging.getLogger(__name__).warning(
"pipeline weekly job 注册失败(不影响 api): %s", exc)
try:
from sanguo_trader.scheduler import register_ishortfall_daily_job
register_ishortfall_daily_job(db_path)
except Exception as exc: # noqa: BLE001
import logging
logging.getLogger(__name__).warning(
"ishortfall daily job 注册失败(不影响 api): %s", exc)
return app