import pandas as pd, numpy as np, matplotlib matplotlib.use("Agg"); import matplotlib.pyplot as plt, matplotlib.dates as mdates E="epoch/" B={ # name: (file, score col) "SWE-bench Verified (Epoch runs)":("swe_bench_verified.csv","Best score (across scorers)"), "Aider Polyglot":("aider_polyglot_external.csv","Percent correct"), "Terminal-Bench":("terminalbench_external.csv","Accuracy mean"), "OSWorld":("os_world_external.csv","Score"), "Cybench":("cybench_external.csv","Unguided % Solved"), "TheAgentCompany":("the_agent_company_external.csv","% Score"), } rows=[] for n,(f,c) in B.items(): d=pd.read_csv(E+f); d=d[["Model version","Release date",c]].dropna() d["date"]=pd.to_datetime(d["Release date"],errors="coerce"); d=d.dropna(subset=["date"]) s=d[c].astype(float); if s.max()<=1.0: s=s*100 d["score"]=s; d["benchmark"]=n rows.append(d[["benchmark","Model version","date","score"]]) raw=pd.concat(rows); raw.to_csv("benchmark-raw.csv",index=False) months=pd.date_range("2023-01-01","2026-10-01",freq="MS") fr={} for n,g in raw.groupby("benchmark"): g=g.sort_values("date"); ser=[] for m in months: h=g[g.date10 else d d=d.sort_values("date"); d["sota"]=d["Time horizon"].cummax(); d.to_csv("metr-data.csv",index=False) fig,ax=plt.subplots(figsize=(19.2,10.8),dpi=100) ax.scatter(d.date,d["Time horizon"],s=90,color="#1f77b4",alpha=.4,label="Each model") ax.step(d.date,d.sota,where="post",color="black",lw=6,label="Best to date") ax.set_yscale("log"); ticks=[1,4,15,60,240,960]; ax.set_ylim(1,1500); ax.set_yticks(ticks); ax.set_yticklabels(["1 min","4 min","15 min","1 hr","4 hr","16 hr"]) ax.set_title("AI agents can finish ever-longer software tasks",fontsize=40,weight="bold",pad=25) ax.xaxis.set_major_locator(mdates.MonthLocator(bymonth=[1,7])); ax.xaxis.set_major_formatter(mdates.DateFormatter("%b %Y")) ax.set_ylabel("Task length at 50% success\n(human expert time, log scale)",fontsize=24) for sp in ["top","right"]: ax.spines[sp].set_visible(False) ax.grid(alpha=.3); ax.legend(loc="upper left",frameon=False) fig.text(.01,.015,"Data: METR Time Horizon (metr.org/time-horizons) via Epoch AI Benchmarking Hub. METR notes measurements above 16 hrs are unreliable.",fontsize=13,color="#555") fig.tight_layout(rect=(0,.03,1,1)); fig.savefig("metr-time-horizon.png",facecolor="white") print(raw.groupby("benchmark").agg(n=("score","size"),start=("date","min"),end=("date","max"),max=("score","max"))) print(d["METR version"].unique(), d.date.min(), d.date.max(), d.sota.max()) print(F[["median","smoothed","n"]].dropna().iloc[[0,-1]])