v1.1 autonomous upgrade: continuous curation, risk engine, scheduler hardening, systemd service

This commit is contained in:
2026-02-25 19:09:05 -08:00
parent cce199d73a
commit 4d17bf8018
14 changed files with 209 additions and 59 deletions

13
app.py
View File

@@ -3,8 +3,8 @@ from fastapi.responses import JSONResponse
from fastapi.templating import Jinja2Templates
from sqlalchemy import func
from datetime import datetime, timedelta
from db import init_db, SessionLocal, BotDecision, TradeExecution
from bot import start_scheduler, run_cycle
from db import init_db, SessionLocal, BotDecision, TradeExecution, CuratedInsight
from bot import start_scheduler, run_cycle, curate_cycle
from services import account_snapshot
app = FastAPI(title="alpaca-llm-bot-v1")
@@ -24,6 +24,11 @@ def run_now():
run_cycle()
return {"ok": True, "ran": True}
@app.post("/curate-now")
def curate_now():
curate_cycle()
return {"ok": True, "curated": True}
@app.get("/api/account")
def api_account():
return JSONResponse(account_snapshot())
@@ -35,12 +40,14 @@ def home(request: Request):
since = datetime.utcnow() - timedelta(hours=24)
decisions = db.query(BotDecision).order_by(BotDecision.ts.desc()).limit(120).all()
trades = db.query(TradeExecution).order_by(TradeExecution.ts.desc()).limit(120).all()
insights = db.query(CuratedInsight).order_by(CuratedInsight.ts.desc()).limit(30).all()
stats = {
"decisions": db.query(func.count(BotDecision.id)).filter(BotDecision.ts >= since).scalar() or 0,
"trades": db.query(func.count(TradeExecution.id)).filter(TradeExecution.ts >= since).scalar() or 0,
"executed": db.query(func.count(BotDecision.id)).filter(BotDecision.ts >= since, BotDecision.status == "executed").scalar() or 0,
"failed": db.query(func.count(BotDecision.id)).filter(BotDecision.ts >= since, BotDecision.status == "failed").scalar() or 0,
"insights": db.query(func.count(CuratedInsight.id)).filter(CuratedInsight.ts >= since).scalar() or 0,
}
return templates.TemplateResponse("index.html", {"request": request, "decisions": decisions, "trades": trades, "stats": stats})
return templates.TemplateResponse("index.html", {"request": request, "decisions": decisions, "trades": trades, "insights": insights, "stats": stats})
finally:
db.close()