import json,statistics as st,re R=[json.loads(l) for l in open("results.jsonl")] def d(s): return re.sub(r"\D","",str(s)) PH={"angry_caller":"07900900456","phone_capture":"07700900123"} out={} for sc in dict.fromkeys(r["scenario"] for r in R): rs=[r for r in R if r["scenario"]==sc] t1=[r["turns"][0]["ttfb_s"] for r in rs]; allt=[t["ttfb_s"] for r in rs for t in r["turns"]]; tot=[t["total_s"] for r in rs for t in r["turns"]] o=dict(runs=len(rs),resolved=sum(r["resolved"] for r in rs),resolved_by_turn2=sum(bool(r["resolved_by_turn2"]) for r in rs),used_followup=sum(r["used_followup"] for r in rs), asked_before_acting=(sum(bool(r["asked_before_acting"]) for r in rs) if rs[0]["asked_before_acting"] is not None else None), ttfb_median_s=round(st.median(allt),3),ttfb_first_turn_median_s=round(st.median(t1),3),ttfb_max_s=max(allt),turn_total_median_s=round(st.median(tot),3), cost_per_call_upper=round(st.mean(r["cost_upper_wall"] for r in rs),4),cost_per_call_audio_min=round(st.mean(r["cost_audio_minutes"] for r in rs),4)) if sc in PH: tm=[c for r in rs for c in r["calls"] if c["name"]=="take_message"] o["phone_digits_correct"]=sum(any(d(c["args"].get("phone"))==PH[sc] for c in r["calls"]) for r in rs) o["tool_turn1_before_confirmation"]=sum(any(c["turn"]==1 for c in r["calls"]) for r in rs) out[sc]=o allt=[t["ttfb_s"] for r in R for t in r["turns"]] out["_overall"]=dict(calls=len(R),turns=len(allt),ttfb_median_s=round(st.median(allt),3),ttfb_p90_s=round(sorted(allt)[int(.9*len(allt))],3),ttfb_under_1s=sum(x<1 for x in allt), resolved=sum(r["resolved"] for r in R),cost_total_upper=round(sum(r["cost_upper_wall"] for r in R),4),cost_total_audio_min=round(sum(r["cost_audio_minutes"] for r in R),4)) json.dump(out,open("summary.json","w"),indent=1); print(json.dumps(out,indent=1))