fix(validator): connect audit commitments to request flow
Record completed tracker requests into the validation log with ordinary route metadata, then have the validator fetch missing hop TOPLOC commitments on demand only after sampling. This closes the remaining alpha review gap where bisection worked only for synthetic events. Verification: .venv/bin/python -m compileall -q packages tests; pytest tests/test_hop_bisection.py tests/test_billing_ledger.py tests/test_toploc_audit.py -q (31 passed); full pytest: 316 passed, 3 skipped, 1 env failure from meshnet-node pid 1263451 occupying port 7000.
This commit is contained in:
@@ -583,6 +583,79 @@ def test_proxy_chat_rejects_request_above_spend_cap_before_routing():
|
||||
tracker.stop()
|
||||
|
||||
|
||||
def test_proxy_chat_records_validation_event_with_plain_route_metadata():
|
||||
class FakeRegistry:
|
||||
def get_wallet(self, wallet_address):
|
||||
return type("Wallet", (), {"banned": False})()
|
||||
|
||||
class FakeValidation:
|
||||
def __init__(self):
|
||||
self.events = []
|
||||
|
||||
def record_completed_inference(self, **kwargs):
|
||||
self.events.append(kwargs)
|
||||
return kwargs
|
||||
|
||||
class FakeContracts:
|
||||
def __init__(self):
|
||||
self.registry = FakeRegistry()
|
||||
self.validation = FakeValidation()
|
||||
|
||||
contracts = FakeContracts()
|
||||
tracker = TrackerServer(
|
||||
model_presets={
|
||||
MODEL: {
|
||||
"layers_start": 0,
|
||||
"layers_end": 11,
|
||||
"bytes_per_layer": {"bfloat16": 30 * 1024 * 1024},
|
||||
}
|
||||
},
|
||||
contracts=contracts,
|
||||
)
|
||||
port = tracker.start()
|
||||
tracker_url = f"http://127.0.0.1:{port}"
|
||||
stub = _UsageStubNode(total_tokens=1000)
|
||||
stub_port = stub.start()
|
||||
try:
|
||||
reg = json.dumps({
|
||||
"endpoint": f"http://127.0.0.1:{stub_port}",
|
||||
"shard_start": 0,
|
||||
"shard_end": 11,
|
||||
"model": MODEL,
|
||||
"hardware_profile": {},
|
||||
"score": 1.0,
|
||||
"tracker_mode": True,
|
||||
"wallet_address": "wallet-head",
|
||||
}).encode()
|
||||
req = urllib.request.Request(
|
||||
f"{tracker_url}/v1/nodes/register",
|
||||
data=reg,
|
||||
headers={"Content-Type": "application/json"},
|
||||
method="POST",
|
||||
)
|
||||
with urllib.request.urlopen(req) as r:
|
||||
r.read()
|
||||
|
||||
_chat(tracker_url, api_key=None)
|
||||
|
||||
assert len(contracts.validation.events) == 1
|
||||
event = contracts.validation.events[0]
|
||||
assert event["model"] == MODEL
|
||||
assert event["messages"] == [{"role": "user", "content": "hi"}]
|
||||
assert event["observed_output"] == "ok"
|
||||
assert event["route_nodes"] == [{
|
||||
"node_id": next(iter(tracker._registry)),
|
||||
"endpoint": f"http://127.0.0.1:{stub_port}",
|
||||
"wallet_address": "wallet-head",
|
||||
"shard_start": 0,
|
||||
"shard_end": 11,
|
||||
}]
|
||||
assert "toploc_proof" not in event["route_nodes"][0]
|
||||
finally:
|
||||
stub.stop()
|
||||
tracker.stop()
|
||||
|
||||
|
||||
def test_billing_gossip_endpoint_applies_events(billed_tracker):
|
||||
tracker_url, ledger, _ = billed_tracker
|
||||
peer = BillingLedger(starting_credit=0.03, default_price_per_1k=0.02)
|
||||
|
||||
Reference in New Issue
Block a user