build(agent): new-agents#a6e6ec iteration

This commit is contained in:
agent-a6e6ec231c5f7801 2026-04-21 10:59:39 +02:00
parent dd13bf419b
commit 43a7e53845
4 changed files with 86 additions and 0 deletions

View File

@ -2,6 +2,8 @@
This repository implements a production-ready skeleton for OpenEnergySphere's federated, contract-driven cross-domain energy planning platform. The MVP focuses on the EnergiBridge interoperability layer, mapping OpenEnergySphere primitives to a canonical IR and enabling plug-and-play adapters across DERs, meters, pumps, and buildings while preserving offline-first operation and governance.
Note: Added a minimal EnergiBridge mapper (EnergiBridgeMapper) to illustrate canonical mappings between LocalProblem objects and a vendor-agnostic IR. This enables straightforward extension to more complex cross-domain workflows and adapters.
Architecture highlights
- Core primitives: LocalProblem, SharedVariables, DualVariables, PlanDelta, PrivacyBudget, AuditLog
- Graph-of-Contracts registry for adapters and data schemas with per-message metadata

View File

@ -1,2 +1,9 @@
""" Energysphere core package minimal init. """
__version__ = "0.1.0"
# Re-export common bridge utilities for quick access
try:
from .energi_bridge import EnergiBridgeMapper # type: ignore
except Exception:
# If optional or during early import stages, fail gracefully.
EnergiBridgeMapper = None # type: ignore

View File

@ -0,0 +1,55 @@
"""EnergiBridge: minimal canonical mapping for cross-domain interoperability.
This is a small MVP shim that translates Energysphere primitives into a
vendor-agnostic IR representation (very light-weight). The goal is to provide a
stable, testable layer that can be expanded to full CatOpt-like mappings while
preserving offline-first semantics and governance hooks in later iterations.
"""
from __future__ import annotations
from typing import Any, Dict
from .models import LocalProblem
class EnergiBridgeMapper:
"""Lightweight translator between Energysphere primitives and a canonical IR.
Only a tiny subset is implemented to keep MVP surface small:
- LocalProblem becomes a canonical Object with a few core fields.
- SharedVariables/PlanDelta could be extended similarly in future iterations.
"""
def __init__(self, namespace: str = "default") -> None:
self.namespace = namespace
def map_local_problem(self, lp: LocalProblem) -> Dict[str, Any]:
"""Map a LocalProblem to a canonical Object representation.
The structure is intentionally simple but stable for downstream adapters
to consume. It can be extended with versioning, provenance, and crypto
tags in future iterations.
"""
return {
"type": "Object",
"namespace": self.namespace,
"site_id": lp.site_id,
"objective": lp.objective,
"parameters": lp.parameters,
"version": 1,
}
def map_object_to_local_problem(self, obj: Dict[str, Any]) -> LocalProblem:
"""Inverse mapping from canonical Object to LocalProblem when possible."""
if obj.get("type") != "Object":
raise ValueError("Unsupported canonical type: expected Object")
# Basic reconstruction; in MVP we ignore extra fields safely.
return LocalProblem(
site_id=obj.get("site_id", ""),
objective=obj.get("objective", ""),
parameters=obj.get("parameters", {}),
)
__all__ = ["EnergiBridgeMapper"]

View File

@ -0,0 +1,22 @@
from energysphere.models import LocalProblem
from energysphere.energi_bridge import EnergiBridgeMapper
def test_map_local_problem_to_object():
lp = LocalProblem(site_id="site-42", objective="min-cost", parameters={"load": 2.5})
mapper = EnergiBridgeMapper(namespace="test-ns")
obj = mapper.map_local_problem(lp)
assert obj["type"] == "Object"
assert obj["site_id"] == "site-42"
assert obj["namespace"] == "test-ns"
assert obj["version"] == 1
def test_map_object_to_local_problem_roundtrip():
lp = LocalProblem(site_id="site-7", objective="min-cost", parameters={"p": 1})
mapper = EnergiBridgeMapper()
obj = mapper.map_local_problem(lp)
lp2 = mapper.map_object_to_local_problem(obj)
assert lp2.site_id == lp.site_id
assert lp2.objective == lp.objective
assert lp2.parameters == lp.parameters