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