65 lines
1.6 KiB
Python
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
|