exoroute-cross-venue-order-.../exoroute/api.py

65 lines
1.6 KiB
Python

from __future__ import annotations
import time
from typing import Dict, Any
from fastapi import FastAPI
from pydantic import BaseModel
from .delta_store import DeltaStore
from .core import LocalProblem, SharedVariables, PlanDelta
from .planner import naive_admm_lite_plan
from .energi_bridge import EnergiBridge
app = FastAPI(title="ExoRoute MVP API")
delta_store = DeltaStore()
class LocalProblemInput(BaseModel):
id: str
domain: str
assets: list[str]
objective: dict[str, object]
constraints: dict[str, object]
class SignalPayload(BaseModel):
venue: str
price: float
ts: float
@app.get("/")
def read_root():
return {"status": "ok", "time": time.time()}
@app.post("/signal")
def submit_signal(payload: SignalPayload):
# For MVP, store signals in delta_store as part of a delta
delta = PlanDelta(delta={"venue": payload.venue, "price": payload.price, "ts": payload.ts})
delta_store.append_delta(delta)
return {"stored": True}
@app.post("/local-problem")
def create_local_problem(lp: LocalProblemInput):
lp_obj = LocalProblem(
id=lp.id,
domain=lp.domain,
assets=lp.assets,
objective=lp.objective,
constraints=lp.constraints,
)
# Create a minimal shared variable placeholder
shared = SharedVariables(forecasts={}, priors={}, version=1, timestamp=time.time())
delta = naive_admm_lite_plan({lp.id: {"price": 0.0}}, lp_obj, shared)
delta_store.append_delta(delta)
return delta.delta
@app.get("/plan")
def get_latest_plan():
deltas = delta_store.read_deltas()
return {"deltas": deltas[-5:]} # last few for visibility