feat(api): 轻量 FastAPI 5 路由(无 JWT/WS/前端)
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
"""
|
||||
FastAPI routes for Sanguo Quant API
|
||||
"""
|
||||
from fastapi import APIRouter, HTTPException
|
||||
from .schemas import CtaBacktestRequest, OptimizeRequest, FactorAnalysisRequest
|
||||
|
||||
|
||||
router = APIRouter()
|
||||
_orchestrator = None
|
||||
|
||||
|
||||
def set_orchestrator(orch):
|
||||
"""Set the global orchestrator instance"""
|
||||
global _orchestrator
|
||||
_orchestrator = orch
|
||||
|
||||
|
||||
def get_orchestrator():
|
||||
"""Get the global orchestrator instance"""
|
||||
return _orchestrator
|
||||
|
||||
|
||||
@router.post("/backtest/cta")
|
||||
def submit_cta(req: CtaBacktestRequest):
|
||||
"""Submit CTA backtest task"""
|
||||
tid = get_orchestrator().submit_cta(
|
||||
strategy_class=req.strategy,
|
||||
symbol=req.symbol,
|
||||
params=req.params,
|
||||
start=req.start,
|
||||
end=req.end,
|
||||
cfg=None
|
||||
)
|
||||
return {"task_id": tid}
|
||||
|
||||
|
||||
@router.post("/backtest/optimize")
|
||||
def submit_optimize(req: OptimizeRequest):
|
||||
"""Submit optimization task (placeholder)"""
|
||||
# TODO: Implement optimize submission in Phase 3
|
||||
return {"task_id": "pending_impl"}
|
||||
|
||||
|
||||
@router.post("/factor/analyze")
|
||||
def submit_factor(req: FactorAnalysisRequest):
|
||||
"""Submit factor analysis task (placeholder)"""
|
||||
# TODO: Implement factor analysis submission in Phase 3
|
||||
return {"task_id": "pending_impl"}
|
||||
|
||||
|
||||
@router.get("/task/{task_id}")
|
||||
def get_status(task_id: str):
|
||||
"""Get task status"""
|
||||
status = get_orchestrator().get_status(task_id)
|
||||
if status is None:
|
||||
raise HTTPException(status_code=404, detail="task not found")
|
||||
return {
|
||||
"task_id": task_id,
|
||||
"status": status.value if hasattr(status, "value") else str(status)
|
||||
}
|
||||
|
||||
|
||||
@router.get("/task/{task_id}/result")
|
||||
def get_result(task_id: str):
|
||||
"""Get task result"""
|
||||
result = get_orchestrator().get_result(task_id)
|
||||
if result is None:
|
||||
raise HTTPException(status_code=404, detail="result not ready")
|
||||
return {
|
||||
"task_id": task_id,
|
||||
"statistics": result.statistics
|
||||
}
|
||||
Reference in New Issue
Block a user