"""Live seat (A), gateway and cross-site passes, paired against the GPU-3 arms on identical trimmed input. A-live: fv-ml1 loopback to :8300, rounds 0-1. A-gateway: nh3-dev -> LiteLLM ext-stt (ana-docker) -> :8300, round 0. A-nh3direct: nh3-dev -> :8300, round 0. 1-20 s bins only (the live seat never got 20-60 s clips). usage: gw_analysis.py RAW_DIR""" import json import sys import numpy as np RAW = sys.argv[1] rows = [json.loads(l) for f in ("lat-live.jsonl", "lat-gw.jsonl", "lat.jsonl") for l in open(f"{RAW}/{f}")] rows = [r for r in rows if r.get("mode") == "lat" and r["status"] == 200] by = {} for r in rows: by.setdefault(r["arm"], {})[(r["round"], r["id"])] = r rng = np.random.default_rng(7) def ci(d): d = np.asarray(d) b = [np.median(d[rng.integers(0, len(d), len(d))]) for _ in range(2000)] return np.percentile(b, [2.5, 97.5]) BINS = ("b1_3", "b3_8", "b8_20") for arm in ("A-live", "A-gateway", "A-nh3direct"): for b in BINS: x = [r["e2e_ms"] for r in by[arm].values() if r["bin"] == b] print(f"{arm:12s} {b:6s} n={len(x):3d} e2e p50 {np.median(x):7.1f} p90 {np.percentile(x, 90):7.1f} max {max(x):7.1f}") print("paired: median diff [95% CI]") for a, ref in (("A-live", "ab-a1"), ("A-gateway", "A-live"), ("A-nh3direct", "A-live"), ("A-gateway", "A-nh3direct"), ("A-gateway", "ab-b32"), ("A-live", "ab-b32")): for b in BINS: ks = [k for k in by[a] if k in by[ref] and by[a][k]["bin"] == b] assert all(by[a][k].get("trim_ms") == by[ref][k].get("trim_ms") for k in ks) d = [by[a][k]["e2e_ms"] - by[ref][k]["e2e_ms"] for k in ks] lo, hi = ci(d) print(f"{a:12s} - {ref:12s} {b:6s} pairs={len(ks):3d} {np.median(d):+8.1f} [{lo:+7.1f},{hi:+7.1f}]") ks = [k for k in by["A-live"] if k in by["ab-a1"]] print("A-live vs ab-a1 identical text:", sum(by["A-live"][k]["text"] == by["ab-a1"][k]["text"] for k in ks), "/", len(ks)) ks = [k for k in by["A-gateway"] if k in by["A-live"]] print("A-gateway vs A-live identical text:", sum(by["A-gateway"][k]["text"] == by["A-live"][k]["text"] for k in ks), "/", len(ks))