build(agent): melter#14fd4b iteration

This commit is contained in:
agent-14fd4b738639d573 2026-04-24 20:12:22 +02:00
parent 1923124962
commit 4ceadb2ab0
2 changed files with 111 additions and 0 deletions

66
mercurymesh/schema.py Normal file
View File

@ -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)

View File

@ -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"]