build(agent): melter#14fd4b iteration
This commit is contained in:
parent
1923124962
commit
4ceadb2ab0
|
|
@ -0,0 +1,66 @@
|
|||
"""IR schema exporter and sample payloads for conformance tests.
|
||||
|
||||
Provides small helpers to extract Pydantic JSON schemas for the
|
||||
EnergiBridge-style IR models and to produce small example payloads.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import Dict, Any
|
||||
import json
|
||||
|
||||
from . import ir
|
||||
|
||||
|
||||
def get_ir_schemas() -> Dict[str, Any]:
|
||||
"""Return a mapping of IR model names to their JSON schema (as dicts)."""
|
||||
schemas: Dict[str, Any] = {}
|
||||
# Intentionally export a small, curated set of models used in the
|
||||
# interoperability layer.
|
||||
models = [
|
||||
ir.LocalMarketContext,
|
||||
ir.AggregatedSignalIR,
|
||||
ir.PlanDeltaIR,
|
||||
ir.DualVariables,
|
||||
ir.PrivacyBudgetEntry,
|
||||
ir.AuditLogEntry,
|
||||
ir.TimeRound,
|
||||
ir.GoCRegistryEntry,
|
||||
]
|
||||
for m in models:
|
||||
# pydantic BaseModel has .schema()
|
||||
schemas[m.__name__] = m.schema()
|
||||
return schemas
|
||||
|
||||
|
||||
def sample_payloads() -> Dict[str, Any]:
|
||||
"""Return small example payloads for a few IR types.
|
||||
|
||||
These are useful for documentation and quick conformance testing.
|
||||
"""
|
||||
now = "2020-01-01T00:00:00Z"
|
||||
return {
|
||||
"LocalMarketContext": {
|
||||
"venue_id": "venue-a",
|
||||
"symbol": "ABC",
|
||||
"timeframe": "1m",
|
||||
"objective": "liquidity",
|
||||
"timestamp": now,
|
||||
},
|
||||
"AggregatedSignalIR": {
|
||||
"version": "v1",
|
||||
"venues": ["venue-a", "venue-b"],
|
||||
"feature_vector": {"liquidity_proxy": 0.75},
|
||||
"privacy_budget": 0.1,
|
||||
},
|
||||
"PlanDeltaIR": {
|
||||
"contract_id": "c1",
|
||||
"author": "agent-1",
|
||||
"timestamp": now,
|
||||
"actions": {"adjust": "scale", "scale": 0.5},
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
def schemas_json() -> str:
|
||||
"""Return the IR schemas as a pretty-printed JSON string."""
|
||||
return json.dumps(get_ir_schemas(), indent=2, sort_keys=True)
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
from mercurymesh.schema import get_ir_schemas, sample_payloads
|
||||
from mercurymesh.bridge_ir import to_ir_market_signal, to_ir_aggregated_signal
|
||||
from mercurymesh.adapters.venue_a import VenueAAdapter
|
||||
from mercurymesh.adapters.venue_b import VenueBAdapter
|
||||
|
||||
|
||||
def test_ir_schemas_present():
|
||||
schemas = get_ir_schemas()
|
||||
# Basic smoke checks for a few required IR models
|
||||
assert "LocalMarketContext" in schemas
|
||||
assert "AggregatedSignalIR" in schemas
|
||||
assert "PlanDeltaIR" in schemas
|
||||
|
||||
|
||||
def test_sample_payloads_shape():
|
||||
samples = sample_payloads()
|
||||
assert "LocalMarketContext" in samples
|
||||
assert "AggregatedSignalIR" in samples
|
||||
|
||||
|
||||
def test_adapter_to_ir_translation():
|
||||
a = VenueAAdapter()
|
||||
b = VenueBAdapter()
|
||||
msa = a.extract_signal()
|
||||
msb = b.extract_signal()
|
||||
|
||||
ira = to_ir_market_signal(msa)
|
||||
irb = to_ir_market_signal(msb)
|
||||
# Ensure canonical wrapper keys exist
|
||||
assert "local_context" in ira
|
||||
assert "local_context" in irb
|
||||
|
||||
# Build a simple AggregatedSignal-like dict for translation function
|
||||
agg = {
|
||||
"venues": [msa.venue_id, msb.venue_id],
|
||||
"feature_vector": {**msa.features, **msb.features},
|
||||
"privacy_budget_used": 0.05,
|
||||
"nonce": "n-1",
|
||||
"merkle_proof": None,
|
||||
}
|
||||
|
||||
# Convert using the helper; ensure keys are present
|
||||
out = to_ir_aggregated_signal(type("Agg", (), agg)())
|
||||
assert "aggregated" in out
|
||||
assert "feature_vector" in out["aggregated"]
|
||||
Loading…
Reference in New Issue