Olivier commited on
Commit
29f893d
·
verified ·
1 Parent(s): e6e77fb

Upload 7 files

Browse files
Dockerfile ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.12-slim
2
+
3
+ WORKDIR /app
4
+
5
+ ENV PYTHONDONTWRITEBYTECODE=1 \
6
+ PYTHONUNBUFFERED=1 \
7
+ PIP_NO_CACHE_DIR=1
8
+
9
+ COPY requirements.txt .
10
+ RUN pip install --no-cache-dir -r requirements.txt
11
+
12
+ COPY . .
13
+
14
+ EXPOSE 7860
15
+
16
+ CMD ["streamlit", "run", "app.py", "--server.port=7860", "--server.address=0.0.0.0", "--server.headless=true"]
README.md CHANGED
@@ -1,12 +1,43 @@
1
  ---
2
- title: Llm Arithmetic Explorer
3
- emoji: 🌍
4
- colorFrom: yellow
5
- colorTo: red
6
  sdk: docker
7
  pinned: false
8
- license: apache-2.0
9
- short_description: Exploration of LLM and arithmetic datasets
10
  ---
11
 
12
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: LLM & Arithmetic
3
+ emoji: 🔢
4
+ colorFrom: blue
5
+ colorTo: green
6
  sdk: docker
7
  pinned: false
8
+ short_description: Explore LLM arithmetic and next-prime datasets.
 
9
  ---
10
 
11
+ # LLM & Arithmetic
12
+
13
+ Explore LLM arithmetic and next-prime experiments across raw, prompted, and tool modes.
14
+
15
+ Streamlit explorer for two public Hugging Face datasets:
16
+
17
+ - [`hoololi/llm-calculations`](https://huggingface.co/datasets/hoololi/llm-calculations)
18
+ - [`hoololi/llm-next-prime`](https://huggingface.co/datasets/hoololi/llm-next-prime)
19
+
20
+ The app compares how LLMs behave on arithmetic-like tasks across three modes:
21
+
22
+ - **raw**: direct answer;
23
+ - **prompted**: task-oriented system prompt;
24
+ - **tool**: external deterministic tool available to the model.
25
+
26
+ ## Features
27
+
28
+ - top-level tabs for **Calculations** and **Next Prime**;
29
+ - nested **Statistics** and **Detailed results** views for each dataset;
30
+ - model comparison across raw, prompted, and tool modes;
31
+ - charts for accuracy, latency, cost, tokens, and category/magnitude breakdowns;
32
+ - tool-pipeline summaries where relevant;
33
+ - side-by-side inspection of two model × mode results for the same task;
34
+ - quick filters for wrong answers, run failures, tool issues, long answers, slowest answers, fastest answers, and high-cost rows;
35
+ - OpenRouter model metadata snapshot display when available.
36
+
37
+ The app loads the datasets directly from Hugging Face and is containerized with Docker.
38
+
39
+ To refresh OpenRouter metadata, update `model_families.json` if needed and run:
40
+
41
+ ```bash
42
+ python fetch_openrouter_model_info.py
43
+ ```
app.py ADDED
@@ -0,0 +1,701 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import re
3
+ from dataclasses import dataclass
4
+ from pathlib import Path
5
+ from typing import Any, Dict, List, Optional
6
+
7
+ import pandas as pd
8
+ import plotly.express as px
9
+ import plotly.graph_objects as go
10
+ import streamlit as st
11
+ from datasets import load_dataset
12
+
13
+ CALCULATIONS_DATASET_ID = "hoololi/llm-calculations"
14
+ NEXT_PRIME_DATASET_ID = "hoololi/llm-next-prime"
15
+ MODEL_INFO_PATH = Path("model_info_snapshot.json")
16
+
17
+ MODE_ORDER = ["raw", "prompted", "tool"]
18
+ MODE_COLORS = {"raw": "#6EA8FE", "prompted": "#FFB86B", "tool": "#69DB7C"}
19
+
20
+ st.set_page_config(page_title="LLM & Arithmetic", page_icon="🔢", layout="wide")
21
+
22
+
23
+ @dataclass(frozen=True)
24
+ class DatasetConfig:
25
+ key: str
26
+ title: str
27
+ dataset_id: str
28
+ description: str
29
+ default_stat_view: str
30
+ category_label: str
31
+ category_col: str
32
+ task_label: str = "Task"
33
+
34
+
35
+ DATASETS = {
36
+ "calculations": DatasetConfig(
37
+ key="calculations",
38
+ title="Calculations",
39
+ dataset_id=CALCULATIONS_DATASET_ID,
40
+ description=(
41
+ "This experiment asks LLMs to solve arithmetic operations such as `45 × 23` "
42
+ "under raw, prompted, and calculator-tool modes. Each row is one operation, "
43
+ "one model, and one mode."
44
+ ),
45
+ default_stat_view="Accuracy by category",
46
+ category_label="Operation categories",
47
+ category_col="operation_category",
48
+ task_label="Operation",
49
+ ),
50
+ "next_prime": DatasetConfig(
51
+ key="next_prime",
52
+ title="Next Prime",
53
+ dataset_id=NEXT_PRIME_DATASET_ID,
54
+ description=(
55
+ "This experiment asks LLMs to answer questions of the form: "
56
+ "`What is the smallest prime number that is strictly greater than n?` "
57
+ "Inputs are sampled across magnitude ranges and tested in raw, prompted, "
58
+ "and next-prime-tool modes."
59
+ ),
60
+ default_stat_view="Accuracy by magnitude",
61
+ category_label="Magnitude groups",
62
+ category_col="magnitude_group",
63
+ task_label="Input number",
64
+ ),
65
+ }
66
+
67
+
68
+ @st.cache_data(show_spinner=False)
69
+ def load_hf_dataset(dataset_id: str) -> pd.DataFrame:
70
+ ds = load_dataset(dataset_id, split="train")
71
+ df = ds.to_pandas()
72
+ return normalize_frame(df)
73
+
74
+
75
+ @st.cache_data(show_spinner=False)
76
+ def load_model_info() -> Dict[str, Any]:
77
+ if not MODEL_INFO_PATH.exists():
78
+ return {}
79
+ return json.loads(MODEL_INFO_PATH.read_text(encoding="utf-8"))
80
+
81
+
82
+ def normalize_frame(df: pd.DataFrame) -> pd.DataFrame:
83
+ df = df.copy()
84
+ if "operation" not in df.columns and "question" in df.columns:
85
+ df["operation"] = df["question"]
86
+ if "operation_id" not in df.columns and "case_id" in df.columns:
87
+ df["operation_id"] = df["case_id"]
88
+ if "operation_category" not in df.columns and "category" in df.columns:
89
+ df["operation_category"] = df["category"]
90
+ if "correct_result_str" not in df.columns and "correct_result" in df.columns:
91
+ df["correct_result_str"] = df["correct_result"].astype("string")
92
+ if "extracted_answer_str" not in df.columns and "extracted_answer" in df.columns:
93
+ df["extracted_answer_str"] = df["extracted_answer"].astype("string")
94
+
95
+ for col in ["cost", "latency_seconds", "total_tokens", "input_tokens", "output_tokens"]:
96
+ if col in df.columns:
97
+ df[col] = pd.to_numeric(df[col], errors="coerce")
98
+ if "mode" in df.columns:
99
+ df["mode"] = pd.Categorical(df["mode"].astype(str), categories=MODE_ORDER, ordered=True)
100
+ return df
101
+
102
+
103
+ def sanitize_text(value: Any) -> str:
104
+ if value is None or pd.isna(value):
105
+ return ""
106
+ text = str(value)
107
+ text = re.sub(r"'user_id':\s*'[^']+'", "'user_id': '<redacted>'", text)
108
+ text = re.sub(r'"user_id"\s*:\s*"[^"]+"', '"user_id": "<redacted>"', text)
109
+ text = re.sub(r"user_[A-Za-z0-9]+", "user_<redacted>", text)
110
+ return text
111
+
112
+
113
+ def bool_mean_pct(s: pd.Series) -> float:
114
+ return float(s.eq(True).mean() * 100)
115
+
116
+
117
+ def selected_models(model_a: str, model_b: str) -> List[str]:
118
+ models = [model_a]
119
+ if model_b and model_b != model_a:
120
+ models.append(model_b)
121
+ return models
122
+
123
+
124
+ def sort_magnitude(values: List[Any]) -> List[str]:
125
+ def key(v: Any) -> int:
126
+ match = re.search(r"10\^(\d+)", str(v))
127
+ return int(match.group(1)) if match else 999
128
+
129
+ return sorted([str(v) for v in values if pd.notna(v)], key=key)
130
+
131
+
132
+ def summarize(df: pd.DataFrame, model_order: Optional[List[str]] = None) -> pd.DataFrame:
133
+ if df.empty:
134
+ return pd.DataFrame()
135
+ summary = (
136
+ df.groupby(["model", "mode"], observed=True)
137
+ .agg(
138
+ rows=("mode", "size"),
139
+ accuracy_pct=("final_result_correct", bool_mean_pct),
140
+ run_success_pct=("run_success", bool_mean_pct),
141
+ avg_total_tokens=("total_tokens", "mean"),
142
+ avg_cost=("cost", "mean"),
143
+ total_cost=("cost", "sum"),
144
+ avg_latency_seconds=("latency_seconds", "mean"),
145
+ median_latency_seconds=("latency_seconds", "median"),
146
+ )
147
+ .reset_index()
148
+ )
149
+ summary["mode"] = pd.Categorical(summary["mode"].astype(str), categories=MODE_ORDER, ordered=True)
150
+ if model_order:
151
+ summary["model"] = pd.Categorical(summary["model"], categories=model_order, ordered=True)
152
+ summary = summary.sort_values(["model", "mode"])
153
+ summary["model"] = summary["model"].astype(str)
154
+ summary["mode"] = summary["mode"].astype(str)
155
+ return summary.round(4)
156
+
157
+
158
+ def metric_chart(summary: pd.DataFrame, metric: str, yaxis_title: str, percent: bool = False) -> go.Figure:
159
+ fig = go.Figure()
160
+ if summary.empty or metric not in summary.columns:
161
+ return fig
162
+ model_order = summary["model"].drop_duplicates().tolist()
163
+ for mode in MODE_ORDER:
164
+ part = summary[summary["mode"] == mode]
165
+ fig.add_bar(
166
+ x=part["model"],
167
+ y=part[metric],
168
+ name=mode,
169
+ marker_color=MODE_COLORS[mode],
170
+ hovertemplate=f"{yaxis_title}: %{{y:.4g}}<extra>{mode}</extra>",
171
+ )
172
+ fig.update_layout(
173
+ template="plotly_dark",
174
+ barmode="group",
175
+ height=300,
176
+ margin=dict(l=35, r=10, t=20, b=45),
177
+ legend=dict(orientation="h", yanchor="top", y=0.99, xanchor="right", x=0.99),
178
+ paper_bgcolor="rgba(0,0,0,0)",
179
+ plot_bgcolor="rgba(255,255,255,0.035)",
180
+ yaxis_title=yaxis_title,
181
+ xaxis_title=None,
182
+ )
183
+ fig.update_xaxes(categoryorder="array", categoryarray=model_order, tickangle=0)
184
+ fig.update_yaxes(gridcolor="rgba(255,255,255,0.12)")
185
+ if percent:
186
+ fig.update_yaxes(range=[0, 100], tickvals=[0, 20, 40, 60, 80, 100])
187
+ return fig
188
+
189
+
190
+ def grouped_accuracy_chart(df: pd.DataFrame, group_col: str, title: str, group_order: Optional[List[str]] = None) -> go.Figure:
191
+ if df.empty or group_col not in df.columns:
192
+ return go.Figure()
193
+ grouped = (
194
+ df.groupby(["model", group_col, "mode"], observed=True)
195
+ .agg(rows=("mode", "size"), accuracy_pct=("final_result_correct", bool_mean_pct))
196
+ .reset_index()
197
+ )
198
+ grouped[group_col] = grouped[group_col].astype(str)
199
+ model_count = grouped["model"].nunique()
200
+ if group_order is None:
201
+ group_order = sorted(grouped[group_col].dropna().astype(str).unique().tolist())
202
+
203
+ fig = px.bar(
204
+ grouped,
205
+ x=group_col,
206
+ y="accuracy_pct",
207
+ color="mode",
208
+ facet_col="model" if model_count > 1 else None,
209
+ barmode="group",
210
+ category_orders={group_col: group_order, "mode": MODE_ORDER},
211
+ color_discrete_map=MODE_COLORS,
212
+ hover_data={"rows": True, "accuracy_pct": ":.2f"},
213
+ labels={"accuracy_pct": "Accuracy (%)", group_col: ""},
214
+ title=title,
215
+ )
216
+ fig.update_layout(
217
+ template="plotly_dark",
218
+ height=420 if model_count > 1 else 380,
219
+ margin=dict(l=35, r=10, t=45, b=55),
220
+ legend=dict(orientation="h", yanchor="top", y=0.98, xanchor="right", x=0.99),
221
+ paper_bgcolor="rgba(0,0,0,0)",
222
+ plot_bgcolor="rgba(255,255,255,0.035)",
223
+ yaxis_title="Accuracy (%)",
224
+ )
225
+ fig.update_xaxes(categoryorder="array", categoryarray=group_order)
226
+ fig.update_yaxes(range=[0, 100], gridcolor="rgba(255,255,255,0.12)")
227
+ fig.for_each_annotation(lambda a: a.update(text=a.text.replace("model=", "")))
228
+ return fig
229
+
230
+
231
+ def tool_pipeline_summary(df: pd.DataFrame) -> pd.DataFrame:
232
+ tool = df[df["mode"].astype(str) == "tool"].copy()
233
+ if tool.empty:
234
+ return pd.DataFrame()
235
+ tool["final_correct_bool"] = tool["final_result_correct"].eq(True)
236
+ tool["tool_correct_bool"] = tool.get("tool_result_correct", pd.Series(False, index=tool.index)).eq(True)
237
+ tool["final_or_tool_correct"] = tool["final_correct_bool"] | tool["tool_correct_bool"]
238
+ return (
239
+ tool.groupby(["model_family", "model"], observed=True)
240
+ .agg(
241
+ rows=("mode", "size"),
242
+ final_answer_accuracy_pct=("final_correct_bool", lambda s: s.mean() * 100),
243
+ tool_output_accuracy_pct=("tool_correct_bool", lambda s: s.mean() * 100),
244
+ final_or_tool_accuracy_pct=("final_or_tool_correct", lambda s: s.mean() * 100),
245
+ run_success_pct=("run_success", bool_mean_pct),
246
+ )
247
+ .reset_index()
248
+ .sort_values(["final_or_tool_accuracy_pct", "final_answer_accuracy_pct"], ascending=False)
249
+ .round(3)
250
+ )
251
+
252
+
253
+ def tradeoff_chart(df: pd.DataFrame) -> go.Figure:
254
+ if df.empty:
255
+ return go.Figure()
256
+ tradeoff = (
257
+ df.groupby(["model_family", "model", "mode"], observed=True)
258
+ .agg(
259
+ accuracy_pct=("final_result_correct", bool_mean_pct),
260
+ success_rate_pct=("run_success", bool_mean_pct),
261
+ median_latency=("latency_seconds", "median"),
262
+ avg_cost=("cost", "mean"),
263
+ )
264
+ .reset_index()
265
+ .dropna(subset=["avg_cost", "median_latency", "accuracy_pct"])
266
+ )
267
+ if tradeoff.empty:
268
+ return go.Figure()
269
+ tradeoff["viable"] = (tradeoff["accuracy_pct"] >= 95) & (tradeoff["success_rate_pct"] >= 95)
270
+ tradeoff["label"] = tradeoff["model"].str.split("/").str[-1] + " (" + tradeoff["mode"].astype(str) + ")"
271
+ min_positive_cost = tradeoff.loc[tradeoff["avg_cost"] > 0, "avg_cost"].min()
272
+ zero_cost_display = (min_positive_cost / 10) if pd.notna(min_positive_cost) else 1e-9
273
+ tradeoff["avg_cost_display"] = tradeoff["avg_cost"].where(tradeoff["avg_cost"] > 0, zero_cost_display)
274
+ fig = px.scatter(
275
+ tradeoff,
276
+ x="avg_cost_display",
277
+ y="median_latency",
278
+ color="accuracy_pct",
279
+ symbol="mode",
280
+ size="success_rate_pct",
281
+ hover_name="label",
282
+ hover_data={"model_family": True, "avg_cost": ":.6f", "avg_cost_display": False, "median_latency": ":.3f", "accuracy_pct": ":.2f", "success_rate_pct": ":.2f"},
283
+ color_continuous_scale=[[0, "#D73027"], [0.5, "#FEE08B"], [1, "#1A9850"]],
284
+ range_color=[50, 100],
285
+ symbol_map={"raw": "circle", "prompted": "x", "tool": "square"},
286
+ )
287
+ viable = tradeoff[tradeoff["viable"]]
288
+ fig.add_trace(
289
+ go.Scatter(
290
+ x=viable["avg_cost_display"],
291
+ y=viable["median_latency"],
292
+ mode="markers",
293
+ marker=dict(symbol="circle-open", size=18, color="white", line=dict(color="black", width=2)),
294
+ name="viable ≥95% accuracy/success",
295
+ hoverinfo="skip",
296
+ )
297
+ )
298
+ fig.update_xaxes(type="log", title="Average cost per call, USD (zero-cost points shown near axis minimum)", gridcolor="rgba(255,255,255,0.12)")
299
+ fig.update_yaxes(type="log", title="Median latency, seconds", gridcolor="rgba(255,255,255,0.12)")
300
+ fig.update_layout(
301
+ template="plotly_dark",
302
+ height=520,
303
+ margin=dict(l=35, r=10, t=35, b=45),
304
+ title="Cost / latency trade-off, colored by accuracy",
305
+ paper_bgcolor="rgba(0,0,0,0)",
306
+ plot_bgcolor="rgba(255,255,255,0.035)",
307
+ legend=dict(orientation="h", yanchor="bottom", y=-0.28, xanchor="center", x=0.5),
308
+ )
309
+ return fig
310
+
311
+
312
+ def price_per_million(value: Any) -> str:
313
+ if value in (None, ""):
314
+ return "n/a"
315
+ try:
316
+ return f"${float(value) * 1_000_000:.2f}/1M tokens"
317
+ except (TypeError, ValueError):
318
+ return str(value)
319
+
320
+
321
+ def model_card(model: str, model_info: Dict[str, Any]) -> None:
322
+ info = model_info.get(model, {})
323
+ if not info:
324
+ st.caption(f"No OpenRouter snapshot information available for `{model}`.")
325
+ return
326
+ pricing = info.get("pricing", {}) if isinstance(info.get("pricing", {}), dict) else {}
327
+ architecture = info.get("architecture", {}) if isinstance(info.get("architecture", {}), dict) else {}
328
+ provider = info.get("top_provider", {}) if isinstance(info.get("top_provider", {}), dict) else {}
329
+ supported = info.get("supported_parameters", []) or []
330
+ description = (info.get("description") or "").strip().replace("\n", " ")
331
+ if len(description) > 260:
332
+ description = description[:260].rstrip() + "…"
333
+ st.markdown(f"#### {info.get('name') or model}")
334
+ st.code(model, language=None)
335
+ st.markdown(
336
+ f"""
337
+ - **Context length:** {info.get('context_length') or provider.get('context_length') or 'n/a'}
338
+ - **Max completion tokens:** {provider.get('max_completion_tokens') or 'n/a'}
339
+ - **Input price:** {price_per_million(pricing.get('prompt') or pricing.get('input'))}
340
+ - **Output price:** {price_per_million(pricing.get('completion') or pricing.get('output'))}
341
+ - **Tokenizer:** {architecture.get('tokenizer') or 'n/a'}
342
+ - **Supported parameters:** {', '.join(supported[:7]) if supported else 'n/a'}{'…' if len(supported) > 7 else ''}
343
+ """
344
+ )
345
+ if description:
346
+ st.caption(description)
347
+
348
+
349
+ def apply_global_filters(df: pd.DataFrame, config: DatasetConfig, key_prefix: str) -> tuple[pd.DataFrame, List[str]]:
350
+ models = sorted(df["model"].dropna().unique().tolist())
351
+ categories = sorted(df[config.category_col].dropna().astype(str).unique().tolist()) if config.category_col in df.columns else []
352
+ if config.category_col == "magnitude_group":
353
+ categories = sort_magnitude(categories)
354
+
355
+ with st.container(border=True):
356
+ c1, c2, c3, c4 = st.columns([1.15, 1.15, 1.45, 1])
357
+ with c1:
358
+ model_a = st.selectbox("Model A / primary", models, index=0, key=f"{key_prefix}_model_a")
359
+ with c2:
360
+ model_b = st.selectbox("Model B / compare optional", [""] + models, index=0, key=f"{key_prefix}_model_b")
361
+ with c3:
362
+ selected_categories = st.multiselect(
363
+ config.category_label,
364
+ categories,
365
+ default=categories,
366
+ key=f"{key_prefix}_categories",
367
+ )
368
+ with c4:
369
+ run_error_policy = st.selectbox(
370
+ "Run errors in metrics",
371
+ ["Count as failures", "Exclude from metrics"],
372
+ index=0,
373
+ key=f"{key_prefix}_run_errors",
374
+ )
375
+
376
+ st.caption("Charts use the selected model names directly. If two models are selected, category/magnitude charts are split by model.")
377
+
378
+ chosen = selected_models(model_a, model_b)
379
+ view = df[df["model"].isin(chosen)].copy()
380
+ if selected_categories and config.category_col in view.columns:
381
+ view = view[view[config.category_col].astype(str).isin(selected_categories)]
382
+ if run_error_policy == "Exclude from metrics" and "run_success" in view.columns:
383
+ view = view[view["run_success"].eq(True)]
384
+ return view, chosen
385
+
386
+
387
+ def render_dataset_intro(df: pd.DataFrame, config: DatasetConfig) -> None:
388
+ st.markdown(f"### {config.title}")
389
+ st.markdown(config.description)
390
+ st.markdown(f"Dataset: [`{config.dataset_id}`](https://huggingface.co/datasets/{config.dataset_id})")
391
+ c1, c2, c3, c4 = st.columns(4)
392
+ c1.metric("Rows", f"{len(df):,}")
393
+ c2.metric("Tasks", f"{df['operation_id'].nunique():,}" if "operation_id" in df.columns else "n/a")
394
+ c3.metric("Models", f"{df['model'].nunique():,}" if "model" in df.columns else "n/a")
395
+ c4.metric("Modes", f"{df['mode'].nunique():,}" if "mode" in df.columns else "n/a")
396
+
397
+
398
+ def render_statistics(df: pd.DataFrame, config: DatasetConfig, model_info: Dict[str, Any], key_prefix: str) -> None:
399
+ st.caption("Explore aggregate statistics and compare models across raw, prompted, and tool modes.")
400
+ view, chosen = apply_global_filters(df, config, key_prefix + "_stats")
401
+ summary = summarize(view, chosen)
402
+
403
+ stat_views = ["Accuracy by category", "Accuracy", "Latency", "Cost", "Tokens", "Tool pipeline", "Cost/latency trade-off"]
404
+ if config.key == "next_prime":
405
+ stat_views[0] = "Accuracy by magnitude"
406
+ default_index = stat_views.index(config.default_stat_view) if config.default_stat_view in stat_views else 0
407
+ stat_view = st.selectbox("Statistic view", stat_views, index=default_index, key=f"{key_prefix}_stat_view")
408
+
409
+ if stat_view in ["Accuracy by category", "Accuracy by magnitude"]:
410
+ order = None
411
+ if config.category_col == "magnitude_group" and config.category_col in view.columns:
412
+ order = sort_magnitude(view[config.category_col].dropna().unique().tolist())
413
+ st.plotly_chart(
414
+ grouped_accuracy_chart(view, config.category_col, stat_view, order),
415
+ width="stretch",
416
+ )
417
+ elif stat_view == "Accuracy":
418
+ st.plotly_chart(metric_chart(summary, "accuracy_pct", "Accuracy (%)", True), width="stretch")
419
+ elif stat_view == "Latency":
420
+ st.plotly_chart(metric_chart(summary, "avg_latency_seconds", "Average latency, seconds"), width="stretch")
421
+ elif stat_view == "Cost":
422
+ st.plotly_chart(metric_chart(summary, "avg_cost", "Average cost, USD"), width="stretch")
423
+ elif stat_view == "Tokens":
424
+ st.plotly_chart(metric_chart(summary, "avg_total_tokens", "Average total tokens"), width="stretch")
425
+ elif stat_view == "Tool pipeline":
426
+ st.dataframe(tool_pipeline_summary(view), width="stretch", hide_index=True)
427
+ elif stat_view == "Cost/latency trade-off":
428
+ st.plotly_chart(tradeoff_chart(view), width="stretch")
429
+
430
+ st.markdown("#### Summary table")
431
+ st.dataframe(summary, width="stretch", hide_index=True)
432
+
433
+ with st.expander("Selected model details from OpenRouter snapshot", expanded=False):
434
+ info_cols = st.columns(max(1, len(chosen)))
435
+ for col, model in zip(info_cols, chosen):
436
+ with col:
437
+ model_card(model, model_info)
438
+
439
+
440
+ def quick_filter(df: pd.DataFrame, filter_name: str, config: DatasetConfig) -> pd.DataFrame:
441
+ out = df.copy()
442
+ if filter_name == "Wrong answers":
443
+ out = out[out["final_result_correct"].ne(True)]
444
+ elif filter_name == "Correct answers":
445
+ out = out[out["final_result_correct"].eq(True)]
446
+ elif filter_name == "Run failures":
447
+ out = out[out["run_success"].ne(True)]
448
+ elif filter_name == "Tool issues":
449
+ out = out[
450
+ (out["mode"].astype(str) == "tool")
451
+ & (
452
+ out.get("tool_called", pd.Series(False, index=out.index)).ne(True)
453
+ | out.get("tool_result_correct", pd.Series(True, index=out.index)).ne(True)
454
+ | out.get("tool_error_type", pd.Series("none", index=out.index)).fillna("none").ne("none")
455
+ )
456
+ ]
457
+ elif filter_name == "Tool correct, final failed":
458
+ out = out[(out["mode"].astype(str) == "tool") & out.get("tool_result_correct", pd.Series(False, index=out.index)).eq(True) & out["final_result_correct"].ne(True)]
459
+ elif filter_name == "Long answers":
460
+ lengths = out["answer_text"].fillna("").astype(str).str.len()
461
+ out = out[lengths >= lengths.quantile(0.90)]
462
+ elif filter_name == "Slowest answers":
463
+ out = out[out["latency_seconds"] >= out["latency_seconds"].quantile(0.90)]
464
+ elif filter_name == "Fastest answers":
465
+ out = out[out["latency_seconds"] <= out["latency_seconds"].quantile(0.10)]
466
+ elif filter_name == "Highest cost":
467
+ if out["cost"].notna().any():
468
+ out = out[out["cost"] >= out["cost"].quantile(0.90)]
469
+ elif filter_name == "High magnitude" and config.key == "next_prime":
470
+ out = out[out.get("magnitude_group", pd.Series("", index=out.index)).astype(str).isin(["10^4", "10^5"])]
471
+ elif filter_name == "Large prime gap" and config.key == "next_prime":
472
+ out = out[out.get("distance_to_next_prime", pd.Series(0, index=out.index)) >= out.get("distance_to_next_prime", pd.Series(0, index=out.index)).quantile(0.90)]
473
+ return out
474
+
475
+
476
+ def record_label(row: pd.Series) -> str:
477
+ status = "✅" if row.get("final_result_correct") == True else "❌"
478
+ return f"{status} {row.get('model')} | {row.get('mode')}"
479
+
480
+
481
+ def display_result_panel(row: Optional[pd.Series], title: str) -> None:
482
+ st.markdown(f"#### {title}")
483
+ if row is None:
484
+ st.info("No matching result.")
485
+ return
486
+ status = "✅ correct" if row.get("final_result_correct") == True else "❌ not correct"
487
+ st.markdown(f"**{row.get('model')}** · `{row.get('mode')}` · {status}")
488
+ m1, m2, m3 = st.columns(3)
489
+ m1.metric("Extracted", str(row.get("extracted_answer_str", row.get("extracted_answer"))))
490
+ m2.metric("Latency", f"{row.get('latency_seconds'):.3g}s" if pd.notna(row.get("latency_seconds")) else "n/a")
491
+ m3.metric("Cost", f"${row.get('cost'):.6f}" if pd.notna(row.get("cost")) else "n/a")
492
+ with st.expander("Diagnostics", expanded=False):
493
+ st.json(
494
+ {
495
+ "run_success": bool(row.get("run_success")) if pd.notna(row.get("run_success")) else None,
496
+ "run_error": sanitize_text(row.get("run_error")),
497
+ "extraction_error_type": row.get("extraction_error_type"),
498
+ "tool_called": row.get("tool_called"),
499
+ "tool_result": row.get("tool_result_str", row.get("tool_result")),
500
+ "tool_result_correct": row.get("tool_result_correct"),
501
+ "tool_error_type": row.get("tool_error_type"),
502
+ }
503
+ )
504
+ st.markdown("**Model answer**")
505
+ st.code(sanitize_text(row.get("answer_text")), language=None)
506
+ if str(row.get("mode")) == "tool":
507
+ with st.expander("Tool details", expanded=False):
508
+ st.json(
509
+ {
510
+ "tool_expression": row.get("tool_expression"),
511
+ "tool_result": row.get("tool_result_str", row.get("tool_result")),
512
+ "tool_error": sanitize_text(row.get("tool_error")),
513
+ "tool_calls": row.get("tool_calls"),
514
+ }
515
+ )
516
+
517
+
518
+ def render_task_details(case_rows: pd.DataFrame, config: DatasetConfig, key_prefix: str) -> None:
519
+ if case_rows.empty:
520
+ st.info("No rows for this task.")
521
+ return
522
+ first = case_rows.iloc[0]
523
+ with st.container(border=True):
524
+ st.markdown(f"#### {config.task_label}")
525
+ st.write(first.get("operation"))
526
+ meta = {
527
+ "operation_id": first.get("operation_id"),
528
+ "category": first.get("operation_category"),
529
+ "correct_result": first.get("correct_result_str", first.get("correct_result")),
530
+ }
531
+ for col in ["input_number", "magnitude_group", "distance_to_next_prime", "input_is_prime"]:
532
+ if col in case_rows.columns:
533
+ meta[col] = first.get(col)
534
+ st.json(meta)
535
+
536
+ available = case_rows.sort_values(["model", "mode"]).reset_index(drop=True)
537
+ labels = available.apply(record_label, axis=1).tolist()
538
+ task_id_for_key = str(first.get("operation_id"))
539
+ c1, c2 = st.columns(2)
540
+ with c1:
541
+ left_label = st.selectbox("Left result", labels, index=0, key=f"{key_prefix}_{task_id_for_key}_left_result")
542
+ with c2:
543
+ right_index = min(1, len(labels) - 1)
544
+ right_label = st.selectbox("Right result", labels, index=right_index, key=f"{key_prefix}_{task_id_for_key}_right_result")
545
+ left_row = available.iloc[labels.index(left_label)] if labels else None
546
+ right_row = available.iloc[labels.index(right_label)] if labels else None
547
+
548
+ r1, r2 = st.columns(2)
549
+ with r1:
550
+ display_result_panel(left_row, "Result A")
551
+ with r2:
552
+ display_result_panel(right_row, "Result B")
553
+
554
+
555
+ def render_details(df: pd.DataFrame, config: DatasetConfig, key_prefix: str) -> None:
556
+ st.caption("Pick a task, then compare two model × mode results side by side.")
557
+ filters = [
558
+ "All",
559
+ "Wrong answers",
560
+ "Correct answers",
561
+ "Run failures",
562
+ "Tool issues",
563
+ "Tool correct, final failed",
564
+ "Long answers",
565
+ "Slowest answers",
566
+ "Fastest answers",
567
+ "Highest cost",
568
+ ]
569
+ if config.key == "next_prime":
570
+ filters += ["High magnitude", "Large prime gap"]
571
+
572
+ c1, c2, c3 = st.columns([1.1, 1.1, 1.8])
573
+ previous_filter = st.session_state.get(f"{key_prefix}_active_filter")
574
+ with c1:
575
+ filter_name = st.selectbox("Quick filter", filters, index=0, key=f"{key_prefix}_quick_filter")
576
+ selected_task_key = f"{key_prefix}_selected_task_id"
577
+ if previous_filter != filter_name:
578
+ st.session_state[f"{key_prefix}_active_filter"] = filter_name
579
+ st.session_state.pop(selected_task_key, None)
580
+ with c2:
581
+ modes = st.multiselect("Modes included", MODE_ORDER, default=MODE_ORDER, key=f"{key_prefix}_detail_modes")
582
+ with c3:
583
+ search_text = st.text_input("Search task or answer", value="", key=f"{key_prefix}_search")
584
+
585
+ filtered = quick_filter(df, filter_name, config)
586
+ if modes:
587
+ filtered = filtered[filtered["mode"].astype(str).isin(modes)]
588
+ if search_text.strip():
589
+ needle = search_text.strip().lower()
590
+ filtered = filtered[
591
+ filtered["operation"].fillna("").str.lower().str.contains(needle, regex=False)
592
+ | filtered["answer_text"].fillna("").str.lower().str.contains(needle, regex=False)
593
+ | filtered["model"].fillna("").str.lower().str.contains(needle, regex=False)
594
+ ]
595
+
596
+ st.caption(
597
+ f"Quick filter matches {len(filtered):,} rows across "
598
+ f"{filtered['operation_id'].nunique() if 'operation_id' in filtered.columns else 0:,} tasks. "
599
+ "The comparison area below uses only rows matching the current filter/mode/search selection."
600
+ )
601
+
602
+ if filter_name == "Long answers":
603
+ filtered = filtered.assign(_answer_length=filtered["answer_text"].fillna("").astype(str).str.len())
604
+ task_ids = (
605
+ filtered.groupby("operation_id", observed=True)["_answer_length"]
606
+ .max()
607
+ .sort_values(ascending=False)
608
+ .index.astype(str)
609
+ .tolist()
610
+ )
611
+ elif filter_name == "Slowest answers":
612
+ task_ids = (
613
+ filtered.groupby("operation_id", observed=True)["latency_seconds"]
614
+ .max()
615
+ .sort_values(ascending=False)
616
+ .index.astype(str)
617
+ .tolist()
618
+ )
619
+ elif filter_name == "Fastest answers":
620
+ task_ids = (
621
+ filtered.groupby("operation_id", observed=True)["latency_seconds"]
622
+ .min()
623
+ .sort_values(ascending=True)
624
+ .index.astype(str)
625
+ .tolist()
626
+ )
627
+ else:
628
+ task_ids = filtered["operation_id"].dropna().astype(str).drop_duplicates().sort_values().tolist()
629
+ if not task_ids:
630
+ st.info("No tasks match the current filters.")
631
+ return
632
+
633
+ if st.session_state.get(selected_task_key) not in task_ids:
634
+ st.session_state[selected_task_key] = task_ids[0]
635
+
636
+ current_index = task_ids.index(st.session_state[selected_task_key])
637
+ n1, n2, n3 = st.columns([0.7, 2.6, 0.7])
638
+ with n1:
639
+ if st.button("◀ Previous", key=f"{key_prefix}_prev", disabled=current_index == 0):
640
+ st.session_state[selected_task_key] = task_ids[current_index - 1]
641
+ with n3:
642
+ if st.button("Next ▶", key=f"{key_prefix}_next", disabled=current_index == len(task_ids) - 1):
643
+ st.session_state[selected_task_key] = task_ids[current_index + 1]
644
+
645
+ current_index = task_ids.index(st.session_state[selected_task_key])
646
+ with n2:
647
+ selected_id = st.selectbox(
648
+ "Task",
649
+ task_ids,
650
+ index=current_index,
651
+ key=selected_task_key,
652
+ )
653
+
654
+ case_rows = filtered[filtered["operation_id"].astype(str) == selected_id].copy()
655
+ render_task_details(case_rows, config, key_prefix)
656
+
657
+ with st.expander("Rows matching current quick filter", expanded=False):
658
+ display_cols = [
659
+ "operation_id",
660
+ "operation_category",
661
+ "model",
662
+ "mode",
663
+ "operation",
664
+ "correct_result_str",
665
+ "extracted_answer_str",
666
+ "final_result_correct",
667
+ "run_success",
668
+ "latency_seconds",
669
+ "cost",
670
+ "tool_error_type",
671
+ ]
672
+ display_cols = [c for c in display_cols if c in filtered.columns]
673
+ st.dataframe(filtered[display_cols].head(500), width="stretch", hide_index=True, height=260)
674
+
675
+
676
+ def render_dataset_tab(df: pd.DataFrame, config: DatasetConfig, model_info: Dict[str, Any]) -> None:
677
+ render_dataset_intro(df, config)
678
+ st.divider()
679
+ stats_tab, details_tab = st.tabs(["Statistics", "Detailed results"])
680
+ with stats_tab:
681
+ render_statistics(df, config, model_info, config.key)
682
+ with details_tab:
683
+ render_details(df, config, config.key)
684
+
685
+
686
+ st.title("🔢 LLM & Arithmetic")
687
+ st.markdown(
688
+ "Explore two small, public Hugging Face datasets about LLM behavior on arithmetic-like tasks: "
689
+ "standard calculations and next-prime search."
690
+ )
691
+
692
+ with st.spinner("Loading Hugging Face datasets..."):
693
+ calculations_df = load_hf_dataset(CALCULATIONS_DATASET_ID)
694
+ next_prime_df = load_hf_dataset(NEXT_PRIME_DATASET_ID)
695
+ model_info_snapshot = load_model_info()
696
+
697
+ calc_tab, prime_tab = st.tabs(["Calculations", "Next Prime"])
698
+ with calc_tab:
699
+ render_dataset_tab(calculations_df, DATASETS["calculations"], model_info_snapshot)
700
+ with prime_tab:
701
+ render_dataset_tab(next_prime_df, DATASETS["next_prime"], model_info_snapshot)
fetch_openrouter_model_info.py ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Fetch an OpenRouter model metadata snapshot for the Space.
2
+
3
+ Run when you want to refresh model_info_snapshot.json:
4
+
5
+ python fetch_openrouter_model_info.py
6
+
7
+ No API key is required for the public /models endpoint at the time of writing.
8
+ """
9
+
10
+ import json
11
+ from pathlib import Path
12
+
13
+ import requests
14
+
15
+ MODEL_FAMILIES_PATH = Path("model_families.json")
16
+ OUTPUT = Path("model_info_snapshot.json")
17
+ OPENROUTER_MODELS_URL = "https://openrouter.ai/api/v1/models"
18
+
19
+
20
+ def load_model_families() -> dict:
21
+ return json.loads(MODEL_FAMILIES_PATH.read_text(encoding="utf-8"))
22
+
23
+
24
+ def main() -> None:
25
+ model_families = load_model_families()
26
+ wanted = {model for models in model_families.values() for model in models}
27
+ response = requests.get(OPENROUTER_MODELS_URL, timeout=30)
28
+ response.raise_for_status()
29
+ data = response.json().get("data", [])
30
+ by_id = {item.get("id"): item for item in data}
31
+
32
+ snapshot = {}
33
+ for family, models in model_families.items():
34
+ for model in models:
35
+ item = by_id.get(model, {"id": model, "name": model})
36
+ item = dict(item)
37
+ item["model_family"] = family
38
+ snapshot[model] = item
39
+
40
+ missing = sorted(wanted - set(by_id))
41
+ OUTPUT.write_text(json.dumps(snapshot, ensure_ascii=False, indent=2), encoding="utf-8")
42
+ print(f"Wrote {len(snapshot)} models to {OUTPUT}")
43
+ if missing:
44
+ print("Missing from OpenRouter response:")
45
+ for model in missing:
46
+ print(f"- {model}")
47
+
48
+
49
+ if __name__ == "__main__":
50
+ main()
model_families.json ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "openai": [
3
+ "openai/gpt-3.5-turbo",
4
+ "openai/gpt-4",
5
+ "openai/gpt-4o-mini",
6
+ "openai/gpt-oss-120b",
7
+ "openai/gpt-5.5"
8
+ ],
9
+ "qwen": [
10
+ "qwen/qwen-2.5-72b-instruct",
11
+ "qwen/qwen3-30b-a3b-thinking-2507",
12
+ "qwen/qwen3.5-flash-02-23",
13
+ "qwen/qwen3.7-plus"
14
+ ],
15
+ "deepseek": [
16
+ "deepseek/deepseek-v3.2",
17
+ "deepseek/deepseek-v4-flash",
18
+ "deepseek/deepseek-v4-pro"
19
+ ],
20
+ "google": [
21
+ "google/gemini-3-flash-preview",
22
+ "google/gemini-2.5-flash-lite",
23
+ "google/gemma-4-31b-it",
24
+ "google/gemini-3.5-flash"
25
+ ],
26
+ "others": [
27
+ "cohere/north-mini-code:free",
28
+ "mistralai/mistral-nemo",
29
+ "poolside/laguna-m.1",
30
+ "xiaomi/mimo-v2.5",
31
+ "minimax/minimax-m3",
32
+ "z-ai/glm-5.2"
33
+ ]
34
+ }
model_info_snapshot.json ADDED
@@ -0,0 +1,2399 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "openai/gpt-3.5-turbo": {
3
+ "id": "openai/gpt-3.5-turbo",
4
+ "canonical_slug": "openai/gpt-3.5-turbo",
5
+ "hugging_face_id": null,
6
+ "name": "OpenAI: GPT-3.5 Turbo",
7
+ "created": 1685232000,
8
+ "description": "GPT-3.5 Turbo is OpenAI's fastest model. It can understand and generate natural language or code, and is optimized for chat and traditional completion tasks.\n\nTraining data up to Sep 2021.",
9
+ "context_length": 16385,
10
+ "architecture": {
11
+ "modality": "text->text",
12
+ "input_modalities": [
13
+ "text"
14
+ ],
15
+ "output_modalities": [
16
+ "text"
17
+ ],
18
+ "tokenizer": "GPT",
19
+ "instruct_type": null
20
+ },
21
+ "pricing": {
22
+ "prompt": "0.0000005",
23
+ "completion": "0.0000015"
24
+ },
25
+ "top_provider": {
26
+ "context_length": 16385,
27
+ "max_completion_tokens": 4096,
28
+ "is_moderated": true
29
+ },
30
+ "per_request_limits": null,
31
+ "supported_parameters": [
32
+ "frequency_penalty",
33
+ "logit_bias",
34
+ "logprobs",
35
+ "max_tokens",
36
+ "presence_penalty",
37
+ "response_format",
38
+ "seed",
39
+ "stop",
40
+ "structured_outputs",
41
+ "temperature",
42
+ "tool_choice",
43
+ "tools",
44
+ "top_logprobs",
45
+ "top_p"
46
+ ],
47
+ "default_parameters": {},
48
+ "supported_voices": null,
49
+ "knowledge_cutoff": "2021-09-30",
50
+ "expiration_date": null,
51
+ "links": {
52
+ "details": "/api/v1/models/openai/gpt-3.5-turbo/endpoints"
53
+ },
54
+ "benchmarks": {
55
+ "design_arena": [],
56
+ "artificial_analysis": {
57
+ "intelligence_index": null,
58
+ "coding_index": 10.7,
59
+ "agentic_index": null
60
+ }
61
+ },
62
+ "model_family": "openai"
63
+ },
64
+ "openai/gpt-4": {
65
+ "id": "openai/gpt-4",
66
+ "canonical_slug": "openai/gpt-4",
67
+ "hugging_face_id": null,
68
+ "name": "OpenAI: GPT-4",
69
+ "created": 1685232000,
70
+ "description": "OpenAI's flagship model, GPT-4 is a large-scale multimodal language model capable of solving difficult problems with greater accuracy than previous models due to its broader general knowledge and advanced reasoning...",
71
+ "context_length": 8191,
72
+ "architecture": {
73
+ "modality": "text->text",
74
+ "input_modalities": [
75
+ "text"
76
+ ],
77
+ "output_modalities": [
78
+ "text"
79
+ ],
80
+ "tokenizer": "GPT",
81
+ "instruct_type": null
82
+ },
83
+ "pricing": {
84
+ "prompt": "0.00003",
85
+ "completion": "0.00006"
86
+ },
87
+ "top_provider": {
88
+ "context_length": 8191,
89
+ "max_completion_tokens": 4096,
90
+ "is_moderated": true
91
+ },
92
+ "per_request_limits": null,
93
+ "supported_parameters": [
94
+ "frequency_penalty",
95
+ "logit_bias",
96
+ "logprobs",
97
+ "max_completion_tokens",
98
+ "max_tokens",
99
+ "presence_penalty",
100
+ "response_format",
101
+ "seed",
102
+ "stop",
103
+ "structured_outputs",
104
+ "temperature",
105
+ "tool_choice",
106
+ "tools",
107
+ "top_logprobs",
108
+ "top_p"
109
+ ],
110
+ "default_parameters": {},
111
+ "supported_voices": null,
112
+ "knowledge_cutoff": "2021-09-30",
113
+ "expiration_date": null,
114
+ "links": {
115
+ "details": "/api/v1/models/openai/gpt-4/endpoints"
116
+ },
117
+ "benchmarks": {
118
+ "design_arena": [],
119
+ "artificial_analysis": {
120
+ "intelligence_index": null,
121
+ "coding_index": 13.1,
122
+ "agentic_index": null
123
+ }
124
+ },
125
+ "model_family": "openai"
126
+ },
127
+ "openai/gpt-4o-mini": {
128
+ "id": "openai/gpt-4o-mini",
129
+ "canonical_slug": "openai/gpt-4o-mini",
130
+ "hugging_face_id": null,
131
+ "name": "OpenAI: GPT-4o-mini",
132
+ "created": 1721260800,
133
+ "description": "GPT-4o mini is OpenAI's newest model after [GPT-4 Omni](/models/openai/gpt-4o), supporting both text and image inputs with text outputs. As their most advanced small model, it is many multiples more affordable...",
134
+ "context_length": 128000,
135
+ "architecture": {
136
+ "modality": "text+image+file->text",
137
+ "input_modalities": [
138
+ "text",
139
+ "image",
140
+ "file"
141
+ ],
142
+ "output_modalities": [
143
+ "text"
144
+ ],
145
+ "tokenizer": "GPT",
146
+ "instruct_type": null
147
+ },
148
+ "pricing": {
149
+ "prompt": "0.00000015",
150
+ "completion": "0.0000006",
151
+ "input_cache_read": "0.000000075"
152
+ },
153
+ "top_provider": {
154
+ "context_length": 128000,
155
+ "max_completion_tokens": 16384,
156
+ "is_moderated": false
157
+ },
158
+ "per_request_limits": null,
159
+ "supported_parameters": [
160
+ "frequency_penalty",
161
+ "logit_bias",
162
+ "logprobs",
163
+ "max_completion_tokens",
164
+ "max_tokens",
165
+ "presence_penalty",
166
+ "response_format",
167
+ "seed",
168
+ "stop",
169
+ "structured_outputs",
170
+ "temperature",
171
+ "tool_choice",
172
+ "tools",
173
+ "top_logprobs",
174
+ "top_p",
175
+ "web_search_options"
176
+ ],
177
+ "default_parameters": {},
178
+ "supported_voices": null,
179
+ "knowledge_cutoff": "2023-10-31",
180
+ "expiration_date": null,
181
+ "links": {
182
+ "details": "/api/v1/models/openai/gpt-4o-mini/endpoints"
183
+ },
184
+ "benchmarks": {
185
+ "design_arena": [],
186
+ "artificial_analysis": {
187
+ "intelligence_index": null,
188
+ "coding_index": 11.4,
189
+ "agentic_index": 1
190
+ }
191
+ },
192
+ "model_family": "openai"
193
+ },
194
+ "openai/gpt-oss-120b": {
195
+ "id": "openai/gpt-oss-120b",
196
+ "canonical_slug": "openai/gpt-oss-120b",
197
+ "hugging_face_id": "openai/gpt-oss-120b",
198
+ "name": "OpenAI: gpt-oss-120b",
199
+ "created": 1754414231,
200
+ "description": "gpt-oss-120b is an open-weight, 117B-parameter Mixture-of-Experts (MoE) language model from OpenAI designed for high-reasoning, agentic, and general-purpose production use cases. It activates 5.1B parameters per forward pass and is optimized...",
201
+ "context_length": 131072,
202
+ "architecture": {
203
+ "modality": "text->text",
204
+ "input_modalities": [
205
+ "text"
206
+ ],
207
+ "output_modalities": [
208
+ "text"
209
+ ],
210
+ "tokenizer": "GPT",
211
+ "instruct_type": null
212
+ },
213
+ "pricing": {
214
+ "prompt": "0.00000003",
215
+ "completion": "0.00000015"
216
+ },
217
+ "top_provider": {
218
+ "context_length": 131072,
219
+ "max_completion_tokens": 131072,
220
+ "is_moderated": false
221
+ },
222
+ "per_request_limits": null,
223
+ "supported_parameters": [
224
+ "frequency_penalty",
225
+ "include_reasoning",
226
+ "logit_bias",
227
+ "logprobs",
228
+ "max_tokens",
229
+ "min_p",
230
+ "presence_penalty",
231
+ "reasoning",
232
+ "repetition_penalty",
233
+ "response_format",
234
+ "seed",
235
+ "stop",
236
+ "structured_outputs",
237
+ "temperature",
238
+ "tool_choice",
239
+ "tools",
240
+ "top_a",
241
+ "top_k",
242
+ "top_logprobs",
243
+ "top_p"
244
+ ],
245
+ "default_parameters": {
246
+ "temperature": null,
247
+ "top_p": null,
248
+ "frequency_penalty": null
249
+ },
250
+ "supported_voices": null,
251
+ "knowledge_cutoff": "2024-06-30",
252
+ "expiration_date": null,
253
+ "links": {
254
+ "details": "/api/v1/models/openai/gpt-oss-120b/endpoints"
255
+ },
256
+ "benchmarks": {
257
+ "design_arena": [
258
+ {
259
+ "arena": "models",
260
+ "category": "3d",
261
+ "elo": 978,
262
+ "win_rate": 29.4,
263
+ "rank": 91
264
+ },
265
+ {
266
+ "arena": "models",
267
+ "category": "codecategories",
268
+ "elo": 1012,
269
+ "win_rate": 33.4,
270
+ "rank": 98
271
+ },
272
+ {
273
+ "arena": "models",
274
+ "category": "dataviz",
275
+ "elo": 1043,
276
+ "win_rate": 45.1,
277
+ "rank": 87
278
+ },
279
+ {
280
+ "arena": "models",
281
+ "category": "gamedev",
282
+ "elo": 1059,
283
+ "win_rate": 40.6,
284
+ "rank": 85
285
+ },
286
+ {
287
+ "arena": "models",
288
+ "category": "uicomponent",
289
+ "elo": 978,
290
+ "win_rate": 35.5,
291
+ "rank": 92
292
+ },
293
+ {
294
+ "arena": "models",
295
+ "category": "website",
296
+ "elo": 1010,
297
+ "win_rate": 32.5,
298
+ "rank": 100
299
+ }
300
+ ],
301
+ "artificial_analysis": {
302
+ "intelligence_index": 23.8,
303
+ "coding_index": 30.4,
304
+ "agentic_index": 13.2
305
+ }
306
+ },
307
+ "reasoning": {
308
+ "mandatory": true,
309
+ "supported_efforts": [
310
+ "high",
311
+ "medium",
312
+ "low"
313
+ ],
314
+ "default_effort": "medium"
315
+ },
316
+ "model_family": "openai"
317
+ },
318
+ "openai/gpt-5.5": {
319
+ "id": "openai/gpt-5.5",
320
+ "canonical_slug": "openai/gpt-5.5-20260423",
321
+ "hugging_face_id": "",
322
+ "name": "OpenAI: GPT-5.5",
323
+ "created": 1777051893,
324
+ "description": "GPT-5.5 is OpenAI’s frontier model designed for complex professional workloads, building on GPT-5.4 with stronger reasoning, higher reliability, and improved token efficiency on hard tasks. It features a 1M+ token...",
325
+ "context_length": 1050000,
326
+ "architecture": {
327
+ "modality": "text+image+file->text",
328
+ "input_modalities": [
329
+ "file",
330
+ "image",
331
+ "text"
332
+ ],
333
+ "output_modalities": [
334
+ "text"
335
+ ],
336
+ "tokenizer": "GPT",
337
+ "instruct_type": null
338
+ },
339
+ "pricing": {
340
+ "prompt": "0.000005",
341
+ "completion": "0.00003",
342
+ "web_search": "0.01",
343
+ "input_cache_read": "0.0000005"
344
+ },
345
+ "top_provider": {
346
+ "context_length": 1050000,
347
+ "max_completion_tokens": 128000,
348
+ "is_moderated": true
349
+ },
350
+ "per_request_limits": null,
351
+ "supported_parameters": [
352
+ "include_reasoning",
353
+ "max_completion_tokens",
354
+ "max_tokens",
355
+ "reasoning",
356
+ "response_format",
357
+ "seed",
358
+ "structured_outputs",
359
+ "tool_choice",
360
+ "tools"
361
+ ],
362
+ "default_parameters": {
363
+ "temperature": null,
364
+ "top_p": null,
365
+ "top_k": null,
366
+ "frequency_penalty": null,
367
+ "presence_penalty": null,
368
+ "repetition_penalty": null
369
+ },
370
+ "supported_voices": null,
371
+ "knowledge_cutoff": "2025-12-01",
372
+ "expiration_date": null,
373
+ "links": {
374
+ "details": "/api/v1/models/openai/gpt-5.5-20260423/endpoints"
375
+ },
376
+ "benchmarks": {
377
+ "design_arena": [
378
+ {
379
+ "arena": "agents",
380
+ "category": "agenticgamedev",
381
+ "elo": 1207,
382
+ "win_rate": 53,
383
+ "rank": 5
384
+ },
385
+ {
386
+ "arena": "agents",
387
+ "category": "agentichtmlslides",
388
+ "elo": 1084,
389
+ "win_rate": 34.2,
390
+ "rank": 9
391
+ },
392
+ {
393
+ "arena": "agents",
394
+ "category": "agenticslides",
395
+ "elo": 1150,
396
+ "win_rate": 43.5,
397
+ "rank": 7
398
+ },
399
+ {
400
+ "arena": "agents",
401
+ "category": "agenticslides(html)",
402
+ "elo": 1077,
403
+ "win_rate": 33.2,
404
+ "rank": 9
405
+ },
406
+ {
407
+ "arena": "agents",
408
+ "category": "agenticslides(python-pptx)",
409
+ "elo": 1155,
410
+ "win_rate": 45.2,
411
+ "rank": 7
412
+ },
413
+ {
414
+ "arena": "agents",
415
+ "category": "androidnative",
416
+ "elo": 1260,
417
+ "win_rate": 55.4,
418
+ "rank": 4
419
+ },
420
+ {
421
+ "arena": "agents",
422
+ "category": "fullstack",
423
+ "elo": 1151,
424
+ "win_rate": 44.5,
425
+ "rank": 15
426
+ },
427
+ {
428
+ "arena": "agents",
429
+ "category": "godotgamedev",
430
+ "elo": 1217,
431
+ "win_rate": 53,
432
+ "rank": 9
433
+ },
434
+ {
435
+ "arena": "agents",
436
+ "category": "htmlslides",
437
+ "elo": 1082,
438
+ "win_rate": 34.3,
439
+ "rank": 11
440
+ },
441
+ {
442
+ "arena": "agents",
443
+ "category": "mobileapps",
444
+ "elo": 1220,
445
+ "win_rate": 51,
446
+ "rank": 9
447
+ },
448
+ {
449
+ "arena": "agents",
450
+ "category": "pptxslides",
451
+ "elo": 1157,
452
+ "win_rate": 45.3,
453
+ "rank": 7
454
+ },
455
+ {
456
+ "arena": "agents",
457
+ "category": "python-pptxslides",
458
+ "elo": 1152,
459
+ "win_rate": 43.3,
460
+ "rank": 8
461
+ },
462
+ {
463
+ "arena": "agents",
464
+ "category": "webapps",
465
+ "elo": 1182,
466
+ "win_rate": 45.2,
467
+ "rank": 18
468
+ },
469
+ {
470
+ "arena": "models",
471
+ "category": "3d",
472
+ "elo": 1264,
473
+ "win_rate": 53.2,
474
+ "rank": 29
475
+ },
476
+ {
477
+ "arena": "models",
478
+ "category": "asciiart",
479
+ "elo": 1316,
480
+ "win_rate": 63.2,
481
+ "rank": 3
482
+ },
483
+ {
484
+ "arena": "models",
485
+ "category": "codecategories",
486
+ "elo": 1296,
487
+ "win_rate": 56.7,
488
+ "rank": 17
489
+ },
490
+ {
491
+ "arena": "models",
492
+ "category": "dataviz",
493
+ "elo": 1300,
494
+ "win_rate": 58.3,
495
+ "rank": 9
496
+ },
497
+ {
498
+ "arena": "models",
499
+ "category": "gamedev",
500
+ "elo": 1348,
501
+ "win_rate": 62.8,
502
+ "rank": 3
503
+ },
504
+ {
505
+ "arena": "models",
506
+ "category": "svg",
507
+ "elo": 1283,
508
+ "win_rate": 59.9,
509
+ "rank": 6
510
+ },
511
+ {
512
+ "arena": "models",
513
+ "category": "uicomponent",
514
+ "elo": 1298,
515
+ "win_rate": 57,
516
+ "rank": 16
517
+ },
518
+ {
519
+ "arena": "models",
520
+ "category": "website",
521
+ "elo": 1290,
522
+ "win_rate": 56,
523
+ "rank": 19
524
+ }
525
+ ],
526
+ "artificial_analysis": {
527
+ "intelligence_index": 54.8,
528
+ "coding_index": 74.9,
529
+ "agentic_index": 44.9
530
+ }
531
+ },
532
+ "reasoning": {
533
+ "mandatory": false,
534
+ "default_enabled": true,
535
+ "supported_efforts": [
536
+ "xhigh",
537
+ "high",
538
+ "medium",
539
+ "low",
540
+ "none"
541
+ ],
542
+ "default_effort": "medium"
543
+ },
544
+ "model_family": "openai"
545
+ },
546
+ "qwen/qwen-2.5-72b-instruct": {
547
+ "id": "qwen/qwen-2.5-72b-instruct",
548
+ "canonical_slug": "qwen/qwen-2.5-72b-instruct",
549
+ "hugging_face_id": "Qwen/Qwen2.5-72B-Instruct",
550
+ "name": "Qwen2.5 72B Instruct",
551
+ "created": 1726704000,
552
+ "description": "Qwen2.5 72B is the latest series of Qwen large language models. Qwen2.5 brings the following improvements upon Qwen2: - Significantly more knowledge and has greatly improved capabilities in coding and...",
553
+ "context_length": 131072,
554
+ "architecture": {
555
+ "modality": "text->text",
556
+ "input_modalities": [
557
+ "text"
558
+ ],
559
+ "output_modalities": [
560
+ "text"
561
+ ],
562
+ "tokenizer": "Qwen",
563
+ "instruct_type": "chatml"
564
+ },
565
+ "pricing": {
566
+ "prompt": "0.00000036",
567
+ "completion": "0.0000004"
568
+ },
569
+ "top_provider": {
570
+ "context_length": 32768,
571
+ "max_completion_tokens": 16384,
572
+ "is_moderated": false
573
+ },
574
+ "per_request_limits": null,
575
+ "supported_parameters": [
576
+ "frequency_penalty",
577
+ "logit_bias",
578
+ "max_tokens",
579
+ "min_p",
580
+ "presence_penalty",
581
+ "repetition_penalty",
582
+ "response_format",
583
+ "seed",
584
+ "stop",
585
+ "structured_outputs",
586
+ "temperature",
587
+ "tool_choice",
588
+ "tools",
589
+ "top_k",
590
+ "top_p"
591
+ ],
592
+ "default_parameters": {},
593
+ "supported_voices": null,
594
+ "knowledge_cutoff": "2024-06-30",
595
+ "expiration_date": null,
596
+ "links": {
597
+ "details": "/api/v1/models/qwen/qwen-2.5-72b-instruct/endpoints"
598
+ },
599
+ "model_family": "qwen"
600
+ },
601
+ "qwen/qwen3-30b-a3b-thinking-2507": {
602
+ "id": "qwen/qwen3-30b-a3b-thinking-2507",
603
+ "canonical_slug": "qwen/qwen3-30b-a3b-thinking-2507",
604
+ "hugging_face_id": "Qwen/Qwen3-30B-A3B-Thinking-2507",
605
+ "name": "Qwen: Qwen3 30B A3B Thinking 2507",
606
+ "created": 1756399192,
607
+ "description": "Qwen3-30B-A3B-Thinking-2507 is a 30B parameter Mixture-of-Experts reasoning model optimized for complex tasks requiring extended multi-step thinking. The model is designed specifically for “thinking mode,” where internal reasoning traces are separated...",
608
+ "context_length": 131072,
609
+ "architecture": {
610
+ "modality": "text->text",
611
+ "input_modalities": [
612
+ "text"
613
+ ],
614
+ "output_modalities": [
615
+ "text"
616
+ ],
617
+ "tokenizer": "Qwen3",
618
+ "instruct_type": null
619
+ },
620
+ "pricing": {
621
+ "prompt": "0.00000013",
622
+ "completion": "0.00000156"
623
+ },
624
+ "top_provider": {
625
+ "context_length": 81920,
626
+ "max_completion_tokens": 32768,
627
+ "is_moderated": false
628
+ },
629
+ "per_request_limits": null,
630
+ "supported_parameters": [
631
+ "include_reasoning",
632
+ "max_tokens",
633
+ "presence_penalty",
634
+ "reasoning",
635
+ "response_format",
636
+ "seed",
637
+ "temperature",
638
+ "tool_choice",
639
+ "tools",
640
+ "top_p"
641
+ ],
642
+ "default_parameters": {},
643
+ "supported_voices": null,
644
+ "knowledge_cutoff": "2025-06-30",
645
+ "expiration_date": null,
646
+ "links": {
647
+ "details": "/api/v1/models/qwen/qwen3-30b-a3b-thinking-2507/endpoints"
648
+ },
649
+ "benchmarks": {
650
+ "design_arena": [
651
+ {
652
+ "arena": "models",
653
+ "category": "dataviz",
654
+ "elo": 969,
655
+ "win_rate": 33.3,
656
+ "rank": 95
657
+ },
658
+ {
659
+ "arena": "models",
660
+ "category": "website",
661
+ "elo": 973,
662
+ "win_rate": 35.5,
663
+ "rank": 103
664
+ }
665
+ ],
666
+ "artificial_analysis": {
667
+ "intelligence_index": 14.4,
668
+ "coding_index": 12.1,
669
+ "agentic_index": 1.8
670
+ }
671
+ },
672
+ "reasoning": {
673
+ "mandatory": true
674
+ },
675
+ "model_family": "qwen"
676
+ },
677
+ "qwen/qwen3.5-flash-02-23": {
678
+ "id": "qwen/qwen3.5-flash-02-23",
679
+ "canonical_slug": "qwen/qwen3.5-flash-20260224",
680
+ "hugging_face_id": null,
681
+ "name": "Qwen: Qwen3.5-Flash",
682
+ "created": 1772053776,
683
+ "description": "The Qwen3.5 native vision-language Flash models are built on a hybrid architecture that integrates a linear attention mechanism with a sparse mixture-of-experts model, achieving higher inference efficiency. Compared to the...",
684
+ "context_length": 1000000,
685
+ "architecture": {
686
+ "modality": "text+image+video->text",
687
+ "input_modalities": [
688
+ "text",
689
+ "image",
690
+ "video"
691
+ ],
692
+ "output_modalities": [
693
+ "text"
694
+ ],
695
+ "tokenizer": "Qwen3",
696
+ "instruct_type": null
697
+ },
698
+ "pricing": {
699
+ "prompt": "0.000000065",
700
+ "completion": "0.00000026"
701
+ },
702
+ "top_provider": {
703
+ "context_length": 1000000,
704
+ "max_completion_tokens": 65536,
705
+ "is_moderated": false
706
+ },
707
+ "per_request_limits": null,
708
+ "supported_parameters": [
709
+ "include_reasoning",
710
+ "max_tokens",
711
+ "presence_penalty",
712
+ "reasoning",
713
+ "response_format",
714
+ "seed",
715
+ "structured_outputs",
716
+ "temperature",
717
+ "tool_choice",
718
+ "tools",
719
+ "top_p"
720
+ ],
721
+ "default_parameters": {
722
+ "temperature": null,
723
+ "top_p": null,
724
+ "frequency_penalty": null
725
+ },
726
+ "supported_voices": null,
727
+ "knowledge_cutoff": null,
728
+ "expiration_date": null,
729
+ "links": {
730
+ "details": "/api/v1/models/qwen/qwen3.5-flash-20260224/endpoints"
731
+ },
732
+ "reasoning": {
733
+ "mandatory": false
734
+ },
735
+ "model_family": "qwen"
736
+ },
737
+ "qwen/qwen3.7-plus": {
738
+ "id": "qwen/qwen3.7-plus",
739
+ "canonical_slug": "qwen/qwen3.7-plus-20260602",
740
+ "hugging_face_id": null,
741
+ "name": "Qwen: Qwen3.7 Plus",
742
+ "created": 1780491783,
743
+ "description": "Qwen3.7-Plus is a cost-effective model in Alibaba's Qwen3.7 series. It supports text and image input with text output, building on the series' text capabilities with a comprehensive upgrade to its...",
744
+ "context_length": 1000000,
745
+ "architecture": {
746
+ "modality": "text+image->text",
747
+ "input_modalities": [
748
+ "text",
749
+ "image"
750
+ ],
751
+ "output_modalities": [
752
+ "text"
753
+ ],
754
+ "tokenizer": "Qwen",
755
+ "instruct_type": null
756
+ },
757
+ "pricing": {
758
+ "prompt": "0.00000032",
759
+ "completion": "0.00000128",
760
+ "input_cache_read": "0.000000064",
761
+ "input_cache_write": "0.0000004"
762
+ },
763
+ "top_provider": {
764
+ "context_length": 1000000,
765
+ "max_completion_tokens": 65536,
766
+ "is_moderated": false
767
+ },
768
+ "per_request_limits": null,
769
+ "supported_parameters": [
770
+ "include_reasoning",
771
+ "logprobs",
772
+ "max_tokens",
773
+ "presence_penalty",
774
+ "reasoning",
775
+ "response_format",
776
+ "seed",
777
+ "structured_outputs",
778
+ "temperature",
779
+ "tool_choice",
780
+ "tools",
781
+ "top_logprobs",
782
+ "top_p"
783
+ ],
784
+ "default_parameters": {},
785
+ "supported_voices": null,
786
+ "knowledge_cutoff": null,
787
+ "expiration_date": null,
788
+ "links": {
789
+ "details": "/api/v1/models/qwen/qwen3.7-plus-20260602/endpoints"
790
+ },
791
+ "benchmarks": {
792
+ "design_arena": [],
793
+ "artificial_analysis": {
794
+ "intelligence_index": 39,
795
+ "coding_index": 55.9,
796
+ "agentic_index": 20.8
797
+ }
798
+ },
799
+ "reasoning": {
800
+ "mandatory": false,
801
+ "default_enabled": true
802
+ },
803
+ "model_family": "qwen"
804
+ },
805
+ "deepseek/deepseek-v3.2": {
806
+ "id": "deepseek/deepseek-v3.2",
807
+ "canonical_slug": "deepseek/deepseek-v3.2-20251201",
808
+ "hugging_face_id": "deepseek-ai/DeepSeek-V3.2",
809
+ "name": "DeepSeek: DeepSeek V3.2",
810
+ "created": 1764594642,
811
+ "description": "DeepSeek-V3.2 is a large language model designed to harmonize high computational efficiency with strong reasoning and agentic tool-use performance. It introduces DeepSeek Sparse Attention (DSA), a fine-grained sparse attention mechanism...",
812
+ "context_length": 131072,
813
+ "architecture": {
814
+ "modality": "text->text",
815
+ "input_modalities": [
816
+ "text"
817
+ ],
818
+ "output_modalities": [
819
+ "text"
820
+ ],
821
+ "tokenizer": "DeepSeek",
822
+ "instruct_type": null
823
+ },
824
+ "pricing": {
825
+ "prompt": "0.0000002288",
826
+ "completion": "0.0000003432",
827
+ "input_cache_read": "0.00000002288"
828
+ },
829
+ "top_provider": {
830
+ "context_length": 128000,
831
+ "max_completion_tokens": 64000,
832
+ "is_moderated": false
833
+ },
834
+ "per_request_limits": null,
835
+ "supported_parameters": [
836
+ "frequency_penalty",
837
+ "include_reasoning",
838
+ "logit_bias",
839
+ "logprobs",
840
+ "max_tokens",
841
+ "min_p",
842
+ "presence_penalty",
843
+ "reasoning",
844
+ "repetition_penalty",
845
+ "response_format",
846
+ "seed",
847
+ "stop",
848
+ "structured_outputs",
849
+ "temperature",
850
+ "tool_choice",
851
+ "tools",
852
+ "top_k",
853
+ "top_logprobs",
854
+ "top_p"
855
+ ],
856
+ "default_parameters": {
857
+ "temperature": 1,
858
+ "top_p": 0.95,
859
+ "top_k": null,
860
+ "frequency_penalty": null,
861
+ "presence_penalty": null,
862
+ "repetition_penalty": null
863
+ },
864
+ "supported_voices": null,
865
+ "knowledge_cutoff": null,
866
+ "expiration_date": null,
867
+ "links": {
868
+ "details": "/api/v1/models/deepseek/deepseek-v3.2-20251201/endpoints"
869
+ },
870
+ "benchmarks": {
871
+ "design_arena": [
872
+ {
873
+ "arena": "models",
874
+ "category": "3d",
875
+ "elo": 1212,
876
+ "win_rate": 49.9,
877
+ "rank": 42
878
+ },
879
+ {
880
+ "arena": "models",
881
+ "category": "asciiart",
882
+ "elo": 1130,
883
+ "win_rate": 40.9,
884
+ "rank": 43
885
+ },
886
+ {
887
+ "arena": "models",
888
+ "category": "codecategories",
889
+ "elo": 1213,
890
+ "win_rate": 49.6,
891
+ "rank": 49
892
+ },
893
+ {
894
+ "arena": "models",
895
+ "category": "dataviz",
896
+ "elo": 1202,
897
+ "win_rate": 48.6,
898
+ "rank": 49
899
+ },
900
+ {
901
+ "arena": "models",
902
+ "category": "gamedev",
903
+ "elo": 1198,
904
+ "win_rate": 46.7,
905
+ "rank": 51
906
+ },
907
+ {
908
+ "arena": "models",
909
+ "category": "svg",
910
+ "elo": 1089,
911
+ "win_rate": 40.9,
912
+ "rank": 55
913
+ },
914
+ {
915
+ "arena": "models",
916
+ "category": "uicomponent",
917
+ "elo": 1202,
918
+ "win_rate": 46.9,
919
+ "rank": 48
920
+ },
921
+ {
922
+ "arena": "models",
923
+ "category": "website",
924
+ "elo": 1216,
925
+ "win_rate": 50.5,
926
+ "rank": 48
927
+ }
928
+ ]
929
+ },
930
+ "reasoning": {
931
+ "mandatory": false,
932
+ "default_enabled": false
933
+ },
934
+ "model_family": "deepseek"
935
+ },
936
+ "deepseek/deepseek-v4-flash": {
937
+ "id": "deepseek/deepseek-v4-flash",
938
+ "canonical_slug": "deepseek/deepseek-v4-flash-20260423",
939
+ "hugging_face_id": "deepseek-ai/DeepSeek-V4-Flash",
940
+ "name": "DeepSeek: DeepSeek V4 Flash",
941
+ "created": 1777000666,
942
+ "description": "DeepSeek V4 Flash is an efficiency-optimized Mixture-of-Experts model from DeepSeek with 284B total parameters and 13B activated parameters, supporting a 1M-token context window. It is designed for fast inference and...",
943
+ "context_length": 1048576,
944
+ "architecture": {
945
+ "modality": "text->text",
946
+ "input_modalities": [
947
+ "text"
948
+ ],
949
+ "output_modalities": [
950
+ "text"
951
+ ],
952
+ "tokenizer": "DeepSeek",
953
+ "instruct_type": null
954
+ },
955
+ "pricing": {
956
+ "prompt": "0.00000009",
957
+ "completion": "0.00000018",
958
+ "input_cache_read": "0.000000018"
959
+ },
960
+ "top_provider": {
961
+ "context_length": 1048576,
962
+ "max_completion_tokens": 16384,
963
+ "is_moderated": false
964
+ },
965
+ "per_request_limits": null,
966
+ "supported_parameters": [
967
+ "frequency_penalty",
968
+ "include_reasoning",
969
+ "logit_bias",
970
+ "logprobs",
971
+ "max_tokens",
972
+ "min_p",
973
+ "presence_penalty",
974
+ "reasoning",
975
+ "repetition_penalty",
976
+ "response_format",
977
+ "seed",
978
+ "stop",
979
+ "structured_outputs",
980
+ "temperature",
981
+ "tool_choice",
982
+ "tools",
983
+ "top_k",
984
+ "top_logprobs",
985
+ "top_p"
986
+ ],
987
+ "default_parameters": {
988
+ "temperature": null,
989
+ "top_p": null,
990
+ "top_k": null,
991
+ "frequency_penalty": null,
992
+ "presence_penalty": null,
993
+ "repetition_penalty": null
994
+ },
995
+ "supported_voices": null,
996
+ "knowledge_cutoff": null,
997
+ "expiration_date": null,
998
+ "links": {
999
+ "details": "/api/v1/models/deepseek/deepseek-v4-flash-20260423/endpoints"
1000
+ },
1001
+ "benchmarks": {
1002
+ "design_arena": [
1003
+ {
1004
+ "arena": "models",
1005
+ "category": "3d",
1006
+ "elo": 1268,
1007
+ "win_rate": 50,
1008
+ "rank": 27
1009
+ },
1010
+ {
1011
+ "arena": "models",
1012
+ "category": "asciiart",
1013
+ "elo": 1165,
1014
+ "win_rate": 44.4,
1015
+ "rank": 36
1016
+ },
1017
+ {
1018
+ "arena": "models",
1019
+ "category": "codecategories",
1020
+ "elo": 1256,
1021
+ "win_rate": 50.1,
1022
+ "rank": 31
1023
+ },
1024
+ {
1025
+ "arena": "models",
1026
+ "category": "dataviz",
1027
+ "elo": 1166,
1028
+ "win_rate": 41.5,
1029
+ "rank": 63
1030
+ },
1031
+ {
1032
+ "arena": "models",
1033
+ "category": "gamedev",
1034
+ "elo": 1263,
1035
+ "win_rate": 50.7,
1036
+ "rank": 28
1037
+ },
1038
+ {
1039
+ "arena": "models",
1040
+ "category": "svg",
1041
+ "elo": 1215,
1042
+ "win_rate": 49.3,
1043
+ "rank": 24
1044
+ },
1045
+ {
1046
+ "arena": "models",
1047
+ "category": "uicomponent",
1048
+ "elo": 1218,
1049
+ "win_rate": 46.2,
1050
+ "rank": 41
1051
+ },
1052
+ {
1053
+ "arena": "models",
1054
+ "category": "website",
1055
+ "elo": 1251,
1056
+ "win_rate": 50.8,
1057
+ "rank": 31
1058
+ }
1059
+ ],
1060
+ "artificial_analysis": {
1061
+ "intelligence_index": 40.3,
1062
+ "coding_index": 56.2,
1063
+ "agentic_index": 31.1
1064
+ }
1065
+ },
1066
+ "reasoning": {
1067
+ "mandatory": false,
1068
+ "supported_efforts": [
1069
+ "xhigh",
1070
+ "high"
1071
+ ],
1072
+ "default_effort": "high"
1073
+ },
1074
+ "model_family": "deepseek"
1075
+ },
1076
+ "deepseek/deepseek-v4-pro": {
1077
+ "id": "deepseek/deepseek-v4-pro",
1078
+ "canonical_slug": "deepseek/deepseek-v4-pro-20260423",
1079
+ "hugging_face_id": "deepseek-ai/DeepSeek-V4-Pro",
1080
+ "name": "DeepSeek: DeepSeek V4 Pro",
1081
+ "created": 1777000679,
1082
+ "description": "DeepSeek V4 Pro is a large-scale Mixture-of-Experts model from DeepSeek with 1.6T total parameters and 49B activated parameters, supporting a 1M-token context window. It is designed for advanced reasoning, coding,...",
1083
+ "context_length": 1048576,
1084
+ "architecture": {
1085
+ "modality": "text->text",
1086
+ "input_modalities": [
1087
+ "text"
1088
+ ],
1089
+ "output_modalities": [
1090
+ "text"
1091
+ ],
1092
+ "tokenizer": "DeepSeek",
1093
+ "instruct_type": null
1094
+ },
1095
+ "pricing": {
1096
+ "prompt": "0.000000435",
1097
+ "completion": "0.00000087",
1098
+ "input_cache_read": "0.000000003625"
1099
+ },
1100
+ "top_provider": {
1101
+ "context_length": 1048576,
1102
+ "max_completion_tokens": 384000,
1103
+ "is_moderated": false
1104
+ },
1105
+ "per_request_limits": null,
1106
+ "supported_parameters": [
1107
+ "frequency_penalty",
1108
+ "include_reasoning",
1109
+ "logit_bias",
1110
+ "logprobs",
1111
+ "max_tokens",
1112
+ "min_p",
1113
+ "presence_penalty",
1114
+ "reasoning",
1115
+ "repetition_penalty",
1116
+ "response_format",
1117
+ "seed",
1118
+ "stop",
1119
+ "structured_outputs",
1120
+ "temperature",
1121
+ "tool_choice",
1122
+ "tools",
1123
+ "top_k",
1124
+ "top_logprobs",
1125
+ "top_p"
1126
+ ],
1127
+ "default_parameters": {
1128
+ "temperature": 1,
1129
+ "top_p": 1,
1130
+ "top_k": null,
1131
+ "frequency_penalty": null,
1132
+ "presence_penalty": null,
1133
+ "repetition_penalty": null
1134
+ },
1135
+ "supported_voices": null,
1136
+ "knowledge_cutoff": null,
1137
+ "expiration_date": null,
1138
+ "links": {
1139
+ "details": "/api/v1/models/deepseek/deepseek-v4-pro-20260423/endpoints"
1140
+ },
1141
+ "benchmarks": {
1142
+ "design_arena": [
1143
+ {
1144
+ "arena": "agents",
1145
+ "category": "fullstack",
1146
+ "elo": 948,
1147
+ "win_rate": 22.1,
1148
+ "rank": 29
1149
+ },
1150
+ {
1151
+ "arena": "agents",
1152
+ "category": "godotgamedev",
1153
+ "elo": 1097,
1154
+ "win_rate": 34,
1155
+ "rank": 20
1156
+ },
1157
+ {
1158
+ "arena": "agents",
1159
+ "category": "webapps",
1160
+ "elo": 1018,
1161
+ "win_rate": 26.6,
1162
+ "rank": 25
1163
+ },
1164
+ {
1165
+ "arena": "models",
1166
+ "category": "3d",
1167
+ "elo": 1325,
1168
+ "win_rate": 60.5,
1169
+ "rank": 7
1170
+ },
1171
+ {
1172
+ "arena": "models",
1173
+ "category": "asciiart",
1174
+ "elo": 1202,
1175
+ "win_rate": 47.6,
1176
+ "rank": 22
1177
+ },
1178
+ {
1179
+ "arena": "models",
1180
+ "category": "codecategories",
1181
+ "elo": 1287,
1182
+ "win_rate": 54.9,
1183
+ "rank": 20
1184
+ },
1185
+ {
1186
+ "arena": "models",
1187
+ "category": "dataviz",
1188
+ "elo": 1221,
1189
+ "win_rate": 48.6,
1190
+ "rank": 38
1191
+ },
1192
+ {
1193
+ "arena": "models",
1194
+ "category": "gamedev",
1195
+ "elo": 1296,
1196
+ "win_rate": 56.1,
1197
+ "rank": 18
1198
+ },
1199
+ {
1200
+ "arena": "models",
1201
+ "category": "svg",
1202
+ "elo": 1193,
1203
+ "win_rate": 46.9,
1204
+ "rank": 34
1205
+ },
1206
+ {
1207
+ "arena": "models",
1208
+ "category": "uicomponent",
1209
+ "elo": 1271,
1210
+ "win_rate": 52,
1211
+ "rank": 25
1212
+ },
1213
+ {
1214
+ "arena": "models",
1215
+ "category": "website",
1216
+ "elo": 1278,
1217
+ "win_rate": 53.7,
1218
+ "rank": 23
1219
+ }
1220
+ ],
1221
+ "artificial_analysis": {
1222
+ "intelligence_index": 44.3,
1223
+ "coding_index": 59.4,
1224
+ "agentic_index": 36.4
1225
+ }
1226
+ },
1227
+ "reasoning": {
1228
+ "mandatory": false,
1229
+ "supported_efforts": [
1230
+ "xhigh",
1231
+ "high"
1232
+ ],
1233
+ "default_effort": "high"
1234
+ },
1235
+ "model_family": "deepseek"
1236
+ },
1237
+ "google/gemini-3-flash-preview": {
1238
+ "id": "google/gemini-3-flash-preview",
1239
+ "canonical_slug": "google/gemini-3-flash-preview-20251217",
1240
+ "hugging_face_id": "",
1241
+ "name": "Google: Gemini 3 Flash Preview",
1242
+ "created": 1765987078,
1243
+ "description": "Gemini 3 Flash Preview is a high speed, high value thinking model designed for agentic workflows, multi turn chat, and coding assistance. It delivers near Pro level reasoning and tool...",
1244
+ "context_length": 1048576,
1245
+ "architecture": {
1246
+ "modality": "text+image+file+audio+video->text",
1247
+ "input_modalities": [
1248
+ "text",
1249
+ "image",
1250
+ "file",
1251
+ "audio",
1252
+ "video"
1253
+ ],
1254
+ "output_modalities": [
1255
+ "text"
1256
+ ],
1257
+ "tokenizer": "Gemini",
1258
+ "instruct_type": null
1259
+ },
1260
+ "pricing": {
1261
+ "prompt": "0.0000005",
1262
+ "completion": "0.000003",
1263
+ "image": "0.0000005",
1264
+ "audio": "0.000001",
1265
+ "web_search": "0.014",
1266
+ "internal_reasoning": "0.000003",
1267
+ "input_cache_read": "0.00000005",
1268
+ "input_cache_write": "0.00000008333333333333334"
1269
+ },
1270
+ "top_provider": {
1271
+ "context_length": 1048576,
1272
+ "max_completion_tokens": 65535,
1273
+ "is_moderated": false
1274
+ },
1275
+ "per_request_limits": null,
1276
+ "supported_parameters": [
1277
+ "include_reasoning",
1278
+ "max_tokens",
1279
+ "reasoning",
1280
+ "response_format",
1281
+ "seed",
1282
+ "stop",
1283
+ "structured_outputs",
1284
+ "temperature",
1285
+ "tool_choice",
1286
+ "tools",
1287
+ "top_p"
1288
+ ],
1289
+ "default_parameters": {
1290
+ "temperature": null,
1291
+ "top_p": null,
1292
+ "top_k": null,
1293
+ "frequency_penalty": null,
1294
+ "presence_penalty": null,
1295
+ "repetition_penalty": null
1296
+ },
1297
+ "supported_voices": null,
1298
+ "knowledge_cutoff": null,
1299
+ "expiration_date": null,
1300
+ "links": {
1301
+ "details": "/api/v1/models/google/gemini-3-flash-preview-20251217/endpoints"
1302
+ },
1303
+ "benchmarks": {
1304
+ "design_arena": [
1305
+ {
1306
+ "arena": "agents",
1307
+ "category": "agenticslides",
1308
+ "elo": 1073,
1309
+ "win_rate": 39.3,
1310
+ "rank": 9
1311
+ },
1312
+ {
1313
+ "arena": "agents",
1314
+ "category": "agenticslides(python-pptx)",
1315
+ "elo": 1075,
1316
+ "win_rate": 39.3,
1317
+ "rank": 9
1318
+ },
1319
+ {
1320
+ "arena": "agents",
1321
+ "category": "androidnative",
1322
+ "elo": 1059,
1323
+ "win_rate": 48,
1324
+ "rank": 24
1325
+ },
1326
+ {
1327
+ "arena": "agents",
1328
+ "category": "fullstack",
1329
+ "elo": 1128,
1330
+ "win_rate": 47.1,
1331
+ "rank": 17
1332
+ },
1333
+ {
1334
+ "arena": "agents",
1335
+ "category": "godotgamedev",
1336
+ "elo": 1218,
1337
+ "win_rate": 52.3,
1338
+ "rank": 8
1339
+ },
1340
+ {
1341
+ "arena": "agents",
1342
+ "category": "mobileapps",
1343
+ "elo": 1183,
1344
+ "win_rate": 49.8,
1345
+ "rank": 17
1346
+ },
1347
+ {
1348
+ "arena": "agents",
1349
+ "category": "webapps",
1350
+ "elo": 1186,
1351
+ "win_rate": 49.5,
1352
+ "rank": 17
1353
+ },
1354
+ {
1355
+ "arena": "models",
1356
+ "category": "3d",
1357
+ "elo": 1261,
1358
+ "win_rate": 62.7,
1359
+ "rank": 30
1360
+ },
1361
+ {
1362
+ "arena": "models",
1363
+ "category": "codecategories",
1364
+ "elo": 1238,
1365
+ "win_rate": 57.6,
1366
+ "rank": 34
1367
+ },
1368
+ {
1369
+ "arena": "models",
1370
+ "category": "gamedev",
1371
+ "elo": 1232,
1372
+ "win_rate": 58.3,
1373
+ "rank": 39
1374
+ },
1375
+ {
1376
+ "arena": "models",
1377
+ "category": "website",
1378
+ "elo": 1238,
1379
+ "win_rate": 57,
1380
+ "rank": 34
1381
+ }
1382
+ ]
1383
+ },
1384
+ "reasoning": {
1385
+ "mandatory": false,
1386
+ "supported_efforts": [
1387
+ "high",
1388
+ "medium",
1389
+ "low",
1390
+ "minimal"
1391
+ ],
1392
+ "default_effort": "medium"
1393
+ },
1394
+ "model_family": "google"
1395
+ },
1396
+ "google/gemini-2.5-flash-lite": {
1397
+ "id": "google/gemini-2.5-flash-lite",
1398
+ "canonical_slug": "google/gemini-2.5-flash-lite",
1399
+ "hugging_face_id": "",
1400
+ "name": "Google: Gemini 2.5 Flash Lite",
1401
+ "created": 1753200276,
1402
+ "description": "Gemini 2.5 Flash-Lite is a lightweight reasoning model in the Gemini 2.5 family, optimized for ultra-low latency and cost efficiency. It offers improved throughput, faster token generation, and better performance...",
1403
+ "context_length": 1048576,
1404
+ "architecture": {
1405
+ "modality": "text+image+file+audio+video->text",
1406
+ "input_modalities": [
1407
+ "text",
1408
+ "image",
1409
+ "file",
1410
+ "audio",
1411
+ "video"
1412
+ ],
1413
+ "output_modalities": [
1414
+ "text"
1415
+ ],
1416
+ "tokenizer": "Gemini",
1417
+ "instruct_type": null
1418
+ },
1419
+ "pricing": {
1420
+ "prompt": "0.0000001",
1421
+ "completion": "0.0000004",
1422
+ "image": "0.0000001",
1423
+ "audio": "0.0000003",
1424
+ "web_search": "0.014",
1425
+ "internal_reasoning": "0.0000004",
1426
+ "input_cache_read": "0.00000001",
1427
+ "input_cache_write": "0.00000008333333333333334"
1428
+ },
1429
+ "top_provider": {
1430
+ "context_length": 1048576,
1431
+ "max_completion_tokens": 65535,
1432
+ "is_moderated": false
1433
+ },
1434
+ "per_request_limits": null,
1435
+ "supported_parameters": [
1436
+ "include_reasoning",
1437
+ "max_tokens",
1438
+ "reasoning",
1439
+ "response_format",
1440
+ "seed",
1441
+ "stop",
1442
+ "structured_outputs",
1443
+ "temperature",
1444
+ "tool_choice",
1445
+ "tools",
1446
+ "top_p"
1447
+ ],
1448
+ "default_parameters": {
1449
+ "temperature": null,
1450
+ "top_p": null,
1451
+ "frequency_penalty": null
1452
+ },
1453
+ "supported_voices": null,
1454
+ "knowledge_cutoff": "2025-01-31",
1455
+ "expiration_date": null,
1456
+ "links": {
1457
+ "details": "/api/v1/models/google/gemini-2.5-flash-lite/endpoints"
1458
+ },
1459
+ "reasoning": {
1460
+ "mandatory": false
1461
+ },
1462
+ "model_family": "google"
1463
+ },
1464
+ "google/gemma-4-31b-it": {
1465
+ "id": "google/gemma-4-31b-it",
1466
+ "canonical_slug": "google/gemma-4-31b-it-20260402",
1467
+ "hugging_face_id": "google/gemma-4-31B-it",
1468
+ "name": "Google: Gemma 4 31B",
1469
+ "created": 1775148486,
1470
+ "description": "Gemma 4 31B Instruct is Google DeepMind's 30.7B dense multimodal model supporting text and image input with text output. Features a 256K token context window, configurable thinking/reasoning mode, native function...",
1471
+ "context_length": 262144,
1472
+ "architecture": {
1473
+ "modality": "text+image+video->text",
1474
+ "input_modalities": [
1475
+ "image",
1476
+ "text",
1477
+ "video"
1478
+ ],
1479
+ "output_modalities": [
1480
+ "text"
1481
+ ],
1482
+ "tokenizer": "Gemma",
1483
+ "instruct_type": null
1484
+ },
1485
+ "pricing": {
1486
+ "prompt": "0.00000012",
1487
+ "completion": "0.00000035",
1488
+ "input_cache_read": "0.00000009"
1489
+ },
1490
+ "top_provider": {
1491
+ "context_length": 262144,
1492
+ "max_completion_tokens": 262144,
1493
+ "is_moderated": false
1494
+ },
1495
+ "per_request_limits": null,
1496
+ "supported_parameters": [
1497
+ "frequency_penalty",
1498
+ "include_reasoning",
1499
+ "logit_bias",
1500
+ "logprobs",
1501
+ "max_tokens",
1502
+ "min_p",
1503
+ "presence_penalty",
1504
+ "reasoning",
1505
+ "repetition_penalty",
1506
+ "response_format",
1507
+ "seed",
1508
+ "stop",
1509
+ "structured_outputs",
1510
+ "temperature",
1511
+ "tool_choice",
1512
+ "tools",
1513
+ "top_k",
1514
+ "top_logprobs",
1515
+ "top_p"
1516
+ ],
1517
+ "default_parameters": {
1518
+ "temperature": 1,
1519
+ "top_p": 0.95,
1520
+ "top_k": 64,
1521
+ "frequency_penalty": null,
1522
+ "presence_penalty": null,
1523
+ "repetition_penalty": null
1524
+ },
1525
+ "supported_voices": null,
1526
+ "knowledge_cutoff": null,
1527
+ "expiration_date": null,
1528
+ "links": {
1529
+ "details": "/api/v1/models/google/gemma-4-31b-it-20260402/endpoints"
1530
+ },
1531
+ "benchmarks": {
1532
+ "design_arena": [],
1533
+ "artificial_analysis": {
1534
+ "intelligence_index": 29.4,
1535
+ "coding_index": 43.4,
1536
+ "agentic_index": 14.4
1537
+ }
1538
+ },
1539
+ "reasoning": {
1540
+ "mandatory": false,
1541
+ "default_enabled": false
1542
+ },
1543
+ "model_family": "google"
1544
+ },
1545
+ "google/gemini-3.5-flash": {
1546
+ "id": "google/gemini-3.5-flash",
1547
+ "canonical_slug": "google/gemini-3.5-flash-20260519",
1548
+ "hugging_face_id": null,
1549
+ "name": "Google: Gemini 3.5 Flash",
1550
+ "created": 1779193800,
1551
+ "description": "Gemini 3.5 Flash is Google's high-efficiency multimodal model, bringing near-Pro level coding and reasoning at Flash-tier cost and speed. It is highly optimized for coding proficiency and parallel agentic execution...",
1552
+ "context_length": 1048576,
1553
+ "architecture": {
1554
+ "modality": "text+image+file+audio+video->text",
1555
+ "input_modalities": [
1556
+ "text",
1557
+ "image",
1558
+ "video",
1559
+ "file",
1560
+ "audio"
1561
+ ],
1562
+ "output_modalities": [
1563
+ "text"
1564
+ ],
1565
+ "tokenizer": "Gemini",
1566
+ "instruct_type": null
1567
+ },
1568
+ "pricing": {
1569
+ "prompt": "0.0000015",
1570
+ "completion": "0.000009",
1571
+ "image": "0.0000015",
1572
+ "audio": "0.000003",
1573
+ "web_search": "0.014",
1574
+ "internal_reasoning": "0.000009",
1575
+ "input_cache_read": "0.00000015",
1576
+ "input_cache_write": "0.00000008333333333333334"
1577
+ },
1578
+ "top_provider": {
1579
+ "context_length": 1048576,
1580
+ "max_completion_tokens": 65536,
1581
+ "is_moderated": false
1582
+ },
1583
+ "per_request_limits": null,
1584
+ "supported_parameters": [
1585
+ "include_reasoning",
1586
+ "max_tokens",
1587
+ "reasoning",
1588
+ "response_format",
1589
+ "seed",
1590
+ "stop",
1591
+ "structured_outputs",
1592
+ "temperature",
1593
+ "tool_choice",
1594
+ "tools",
1595
+ "top_p"
1596
+ ],
1597
+ "default_parameters": {
1598
+ "temperature": null,
1599
+ "top_p": null,
1600
+ "top_k": null,
1601
+ "frequency_penalty": null,
1602
+ "presence_penalty": null,
1603
+ "repetition_penalty": null
1604
+ },
1605
+ "supported_voices": null,
1606
+ "knowledge_cutoff": "2025-01-01",
1607
+ "expiration_date": null,
1608
+ "links": {
1609
+ "details": "/api/v1/models/google/gemini-3.5-flash-20260519/endpoints"
1610
+ },
1611
+ "benchmarks": {
1612
+ "design_arena": [
1613
+ {
1614
+ "arena": "agents",
1615
+ "category": "agenticgamedev",
1616
+ "elo": 1212,
1617
+ "win_rate": 54.9,
1618
+ "rank": 3
1619
+ },
1620
+ {
1621
+ "arena": "agents",
1622
+ "category": "agentichtmlslides",
1623
+ "elo": 1162,
1624
+ "win_rate": 45.8,
1625
+ "rank": 7
1626
+ },
1627
+ {
1628
+ "arena": "agents",
1629
+ "category": "agenticslides",
1630
+ "elo": 1244,
1631
+ "win_rate": 57.5,
1632
+ "rank": 4
1633
+ },
1634
+ {
1635
+ "arena": "agents",
1636
+ "category": "agenticslides(html)",
1637
+ "elo": 1162,
1638
+ "win_rate": 45.7,
1639
+ "rank": 7
1640
+ },
1641
+ {
1642
+ "arena": "agents",
1643
+ "category": "agenticslides(python-pptx)",
1644
+ "elo": 1242,
1645
+ "win_rate": 57.8,
1646
+ "rank": 3
1647
+ },
1648
+ {
1649
+ "arena": "agents",
1650
+ "category": "androidnative",
1651
+ "elo": 1256,
1652
+ "win_rate": 54.4,
1653
+ "rank": 5
1654
+ },
1655
+ {
1656
+ "arena": "agents",
1657
+ "category": "fullstack",
1658
+ "elo": 1264,
1659
+ "win_rate": 58,
1660
+ "rank": 6
1661
+ },
1662
+ {
1663
+ "arena": "agents",
1664
+ "category": "htmlslides",
1665
+ "elo": 1181,
1666
+ "win_rate": 49,
1667
+ "rank": 9
1668
+ },
1669
+ {
1670
+ "arena": "agents",
1671
+ "category": "mobileapps",
1672
+ "elo": 1257,
1673
+ "win_rate": 56.5,
1674
+ "rank": 3
1675
+ },
1676
+ {
1677
+ "arena": "agents",
1678
+ "category": "pptxslides",
1679
+ "elo": 1244,
1680
+ "win_rate": 57.7,
1681
+ "rank": 3
1682
+ },
1683
+ {
1684
+ "arena": "agents",
1685
+ "category": "python-pptxslides",
1686
+ "elo": 1247,
1687
+ "win_rate": 57.4,
1688
+ "rank": 4
1689
+ },
1690
+ {
1691
+ "arena": "agents",
1692
+ "category": "webapps",
1693
+ "elo": 1264,
1694
+ "win_rate": 54.2,
1695
+ "rank": 6
1696
+ },
1697
+ {
1698
+ "arena": "models",
1699
+ "category": "3d",
1700
+ "elo": 1313,
1701
+ "win_rate": 60.2,
1702
+ "rank": 14
1703
+ },
1704
+ {
1705
+ "arena": "models",
1706
+ "category": "asciiart",
1707
+ "elo": 1310,
1708
+ "win_rate": 62.1,
1709
+ "rank": 5
1710
+ },
1711
+ {
1712
+ "arena": "models",
1713
+ "category": "codecategories",
1714
+ "elo": 1306,
1715
+ "win_rate": 58.4,
1716
+ "rank": 12
1717
+ },
1718
+ {
1719
+ "arena": "models",
1720
+ "category": "dataviz",
1721
+ "elo": 1266,
1722
+ "win_rate": 54.9,
1723
+ "rank": 24
1724
+ },
1725
+ {
1726
+ "arena": "models",
1727
+ "category": "gamedev",
1728
+ "elo": 1330,
1729
+ "win_rate": 59.3,
1730
+ "rank": 9
1731
+ },
1732
+ {
1733
+ "arena": "models",
1734
+ "category": "svg",
1735
+ "elo": 1307,
1736
+ "win_rate": 63,
1737
+ "rank": 3
1738
+ },
1739
+ {
1740
+ "arena": "models",
1741
+ "category": "uicomponent",
1742
+ "elo": 1311,
1743
+ "win_rate": 59.4,
1744
+ "rank": 12
1745
+ },
1746
+ {
1747
+ "arena": "models",
1748
+ "category": "website",
1749
+ "elo": 1299,
1750
+ "win_rate": 57.5,
1751
+ "rank": 15
1752
+ }
1753
+ ],
1754
+ "artificial_analysis": {
1755
+ "intelligence_index": 50.2,
1756
+ "coding_index": 70.1,
1757
+ "agentic_index": 37.4
1758
+ }
1759
+ },
1760
+ "reasoning": {
1761
+ "mandatory": true,
1762
+ "default_enabled": true,
1763
+ "supported_efforts": [
1764
+ "high",
1765
+ "medium",
1766
+ "low",
1767
+ "minimal"
1768
+ ],
1769
+ "default_effort": "medium"
1770
+ },
1771
+ "model_family": "google"
1772
+ },
1773
+ "cohere/north-mini-code:free": {
1774
+ "id": "cohere/north-mini-code:free",
1775
+ "canonical_slug": "cohere/north-mini-code-20260617",
1776
+ "hugging_face_id": "CohereLabs/North-Mini-Code-1.0",
1777
+ "name": "Cohere: North Mini Code (free)",
1778
+ "created": 1781723748,
1779
+ "description": "North Mini Code is Cohere's first agentic coding model and the debut of its North family. A sparse mixture-of-experts model with 30B total parameters and 3B active, it is optimized...",
1780
+ "context_length": 256000,
1781
+ "architecture": {
1782
+ "modality": "text->text",
1783
+ "input_modalities": [
1784
+ "text"
1785
+ ],
1786
+ "output_modalities": [
1787
+ "text"
1788
+ ],
1789
+ "tokenizer": "Cohere",
1790
+ "instruct_type": null
1791
+ },
1792
+ "pricing": {
1793
+ "prompt": "0",
1794
+ "completion": "0"
1795
+ },
1796
+ "top_provider": {
1797
+ "context_length": 256000,
1798
+ "max_completion_tokens": 64000,
1799
+ "is_moderated": true
1800
+ },
1801
+ "per_request_limits": null,
1802
+ "supported_parameters": [
1803
+ "frequency_penalty",
1804
+ "include_reasoning",
1805
+ "max_tokens",
1806
+ "presence_penalty",
1807
+ "reasoning",
1808
+ "seed",
1809
+ "stop",
1810
+ "temperature",
1811
+ "tool_choice",
1812
+ "tools",
1813
+ "top_k",
1814
+ "top_p"
1815
+ ],
1816
+ "default_parameters": {
1817
+ "temperature": null,
1818
+ "top_p": null,
1819
+ "top_k": null,
1820
+ "frequency_penalty": null,
1821
+ "presence_penalty": null,
1822
+ "repetition_penalty": null
1823
+ },
1824
+ "supported_voices": null,
1825
+ "knowledge_cutoff": null,
1826
+ "expiration_date": null,
1827
+ "links": {
1828
+ "details": "/api/v1/models/cohere/north-mini-code-20260617/endpoints"
1829
+ },
1830
+ "reasoning": {
1831
+ "mandatory": false
1832
+ },
1833
+ "model_family": "others"
1834
+ },
1835
+ "mistralai/mistral-nemo": {
1836
+ "id": "mistralai/mistral-nemo",
1837
+ "canonical_slug": "mistralai/mistral-nemo",
1838
+ "hugging_face_id": "mistralai/Mistral-Nemo-Instruct-2407",
1839
+ "name": "Mistral: Mistral Nemo",
1840
+ "created": 1721347200,
1841
+ "description": "A 12B parameter model with a 128k token context length built by Mistral in collaboration with NVIDIA. The model is multilingual, supporting English, French, German, Spanish, Italian, Portuguese, Chinese, Japanese,...",
1842
+ "context_length": 131072,
1843
+ "architecture": {
1844
+ "modality": "text->text",
1845
+ "input_modalities": [
1846
+ "text"
1847
+ ],
1848
+ "output_modalities": [
1849
+ "text"
1850
+ ],
1851
+ "tokenizer": "Mistral",
1852
+ "instruct_type": "mistral"
1853
+ },
1854
+ "pricing": {
1855
+ "prompt": "0.00000002",
1856
+ "completion": "0.00000003"
1857
+ },
1858
+ "top_provider": {
1859
+ "context_length": 131072,
1860
+ "max_completion_tokens": null,
1861
+ "is_moderated": false
1862
+ },
1863
+ "per_request_limits": null,
1864
+ "supported_parameters": [
1865
+ "frequency_penalty",
1866
+ "logit_bias",
1867
+ "logprobs",
1868
+ "max_tokens",
1869
+ "min_p",
1870
+ "presence_penalty",
1871
+ "repetition_penalty",
1872
+ "response_format",
1873
+ "seed",
1874
+ "stop",
1875
+ "structured_outputs",
1876
+ "temperature",
1877
+ "tool_choice",
1878
+ "tools",
1879
+ "top_k",
1880
+ "top_logprobs",
1881
+ "top_p"
1882
+ ],
1883
+ "default_parameters": {
1884
+ "temperature": 0.3
1885
+ },
1886
+ "supported_voices": null,
1887
+ "knowledge_cutoff": "2024-04-30",
1888
+ "expiration_date": null,
1889
+ "links": {
1890
+ "details": "/api/v1/models/mistralai/mistral-nemo/endpoints"
1891
+ },
1892
+ "model_family": "others"
1893
+ },
1894
+ "poolside/laguna-m.1": {
1895
+ "id": "poolside/laguna-m.1",
1896
+ "canonical_slug": "poolside/laguna-m.1-20260312",
1897
+ "hugging_face_id": "poolside/Laguna-M.1",
1898
+ "name": "Poolside: Laguna M.1",
1899
+ "created": 1777388504,
1900
+ "description": "Laguna M.1 is the flagship coding agent model from [Poolside](https://poolside.ai/), optimized for complex software engineering tasks. Designed for agentic coding workflows, it supports tool calling and reasoning, with a 256K...",
1901
+ "context_length": 262144,
1902
+ "architecture": {
1903
+ "modality": "text->text",
1904
+ "input_modalities": [
1905
+ "text"
1906
+ ],
1907
+ "output_modalities": [
1908
+ "text"
1909
+ ],
1910
+ "tokenizer": "Other",
1911
+ "instruct_type": null
1912
+ },
1913
+ "pricing": {
1914
+ "prompt": "0.0000002",
1915
+ "completion": "0.0000004",
1916
+ "input_cache_read": "0.0000001"
1917
+ },
1918
+ "top_provider": {
1919
+ "context_length": 262144,
1920
+ "max_completion_tokens": 32768,
1921
+ "is_moderated": false
1922
+ },
1923
+ "per_request_limits": null,
1924
+ "supported_parameters": [
1925
+ "include_reasoning",
1926
+ "max_tokens",
1927
+ "reasoning",
1928
+ "temperature",
1929
+ "tool_choice",
1930
+ "tools"
1931
+ ],
1932
+ "default_parameters": {
1933
+ "temperature": null,
1934
+ "top_p": null,
1935
+ "top_k": null,
1936
+ "frequency_penalty": null,
1937
+ "presence_penalty": null,
1938
+ "repetition_penalty": null
1939
+ },
1940
+ "supported_voices": null,
1941
+ "knowledge_cutoff": null,
1942
+ "expiration_date": null,
1943
+ "links": {
1944
+ "details": "/api/v1/models/poolside/laguna-m.1-20260312/endpoints"
1945
+ },
1946
+ "reasoning": {
1947
+ "mandatory": false,
1948
+ "default_enabled": true
1949
+ },
1950
+ "model_family": "others"
1951
+ },
1952
+ "xiaomi/mimo-v2.5": {
1953
+ "id": "xiaomi/mimo-v2.5",
1954
+ "canonical_slug": "xiaomi/mimo-v2.5-20260422",
1955
+ "hugging_face_id": "XiaomiMiMo/MiMo-V2.5",
1956
+ "name": "Xiaomi: MiMo-V2.5",
1957
+ "created": 1776874269,
1958
+ "description": "MiMo-V2.5 is a native omnimodal model by Xiaomi. It delivers Pro-level agentic performance at roughly half the inference cost, while surpassing MiMo-V2-Omni in multimodal perception across image and video understanding...",
1959
+ "context_length": 1048576,
1960
+ "architecture": {
1961
+ "modality": "text+image+audio+video->text",
1962
+ "input_modalities": [
1963
+ "text",
1964
+ "audio",
1965
+ "image",
1966
+ "video"
1967
+ ],
1968
+ "output_modalities": [
1969
+ "text"
1970
+ ],
1971
+ "tokenizer": "Other",
1972
+ "instruct_type": null
1973
+ },
1974
+ "pricing": {
1975
+ "prompt": "0.000000105",
1976
+ "completion": "0.00000028"
1977
+ },
1978
+ "top_provider": {
1979
+ "context_length": 32000,
1980
+ "max_completion_tokens": null,
1981
+ "is_moderated": false
1982
+ },
1983
+ "per_request_limits": null,
1984
+ "supported_parameters": [
1985
+ "frequency_penalty",
1986
+ "include_reasoning",
1987
+ "logit_bias",
1988
+ "logprobs",
1989
+ "max_tokens",
1990
+ "min_p",
1991
+ "presence_penalty",
1992
+ "reasoning",
1993
+ "repetition_penalty",
1994
+ "response_format",
1995
+ "seed",
1996
+ "stop",
1997
+ "structured_outputs",
1998
+ "temperature",
1999
+ "tool_choice",
2000
+ "tools",
2001
+ "top_k",
2002
+ "top_logprobs",
2003
+ "top_p"
2004
+ ],
2005
+ "default_parameters": {
2006
+ "temperature": 1,
2007
+ "top_p": 0.95,
2008
+ "top_k": null,
2009
+ "frequency_penalty": null,
2010
+ "presence_penalty": null,
2011
+ "repetition_penalty": null
2012
+ },
2013
+ "supported_voices": null,
2014
+ "knowledge_cutoff": null,
2015
+ "expiration_date": null,
2016
+ "links": {
2017
+ "details": "/api/v1/models/xiaomi/mimo-v2.5-20260422/endpoints"
2018
+ },
2019
+ "benchmarks": {
2020
+ "design_arena": [
2021
+ {
2022
+ "arena": "models",
2023
+ "category": "3d",
2024
+ "elo": 1298,
2025
+ "win_rate": 54.1,
2026
+ "rank": 19
2027
+ },
2028
+ {
2029
+ "arena": "models",
2030
+ "category": "asciiart",
2031
+ "elo": 1189,
2032
+ "win_rate": 47.5,
2033
+ "rank": 28
2034
+ },
2035
+ {
2036
+ "arena": "models",
2037
+ "category": "codecategories",
2038
+ "elo": 1303,
2039
+ "win_rate": 55,
2040
+ "rank": 15
2041
+ },
2042
+ {
2043
+ "arena": "models",
2044
+ "category": "dataviz",
2045
+ "elo": 1282,
2046
+ "win_rate": 54,
2047
+ "rank": 16
2048
+ },
2049
+ {
2050
+ "arena": "models",
2051
+ "category": "gamedev",
2052
+ "elo": 1298,
2053
+ "win_rate": 55.6,
2054
+ "rank": 17
2055
+ },
2056
+ {
2057
+ "arena": "models",
2058
+ "category": "svg",
2059
+ "elo": 1219,
2060
+ "win_rate": 52.3,
2061
+ "rank": 22
2062
+ },
2063
+ {
2064
+ "arena": "models",
2065
+ "category": "uicomponent",
2066
+ "elo": 1311,
2067
+ "win_rate": 56.1,
2068
+ "rank": 13
2069
+ },
2070
+ {
2071
+ "arena": "models",
2072
+ "category": "website",
2073
+ "elo": 1304,
2074
+ "win_rate": 55.2,
2075
+ "rank": 12
2076
+ }
2077
+ ]
2078
+ },
2079
+ "reasoning": {
2080
+ "mandatory": false
2081
+ },
2082
+ "model_family": "others"
2083
+ },
2084
+ "minimax/minimax-m3": {
2085
+ "id": "minimax/minimax-m3",
2086
+ "canonical_slug": "minimax/minimax-m3-20260531",
2087
+ "hugging_face_id": "MiniMaxAI/Minimax-M3",
2088
+ "name": "MiniMax: MiniMax M3",
2089
+ "created": 1780245374,
2090
+ "description": "MiniMax-M3 is a multimodal foundation model from MiniMax. It supports text, image, and video inputs with text output, a 1M-token context window, and is suited for long-horizon agentic work, coding,...",
2091
+ "context_length": 1048576,
2092
+ "architecture": {
2093
+ "modality": "text+image+video->text",
2094
+ "input_modalities": [
2095
+ "text",
2096
+ "image",
2097
+ "video"
2098
+ ],
2099
+ "output_modalities": [
2100
+ "text"
2101
+ ],
2102
+ "tokenizer": "Other",
2103
+ "instruct_type": null
2104
+ },
2105
+ "pricing": {
2106
+ "prompt": "0.0000003",
2107
+ "completion": "0.0000012",
2108
+ "input_cache_read": "0.00000006"
2109
+ },
2110
+ "top_provider": {
2111
+ "context_length": 524288,
2112
+ "max_completion_tokens": 512000,
2113
+ "is_moderated": false
2114
+ },
2115
+ "per_request_limits": null,
2116
+ "supported_parameters": [
2117
+ "frequency_penalty",
2118
+ "include_reasoning",
2119
+ "logit_bias",
2120
+ "logprobs",
2121
+ "max_tokens",
2122
+ "min_p",
2123
+ "presence_penalty",
2124
+ "reasoning",
2125
+ "repetition_penalty",
2126
+ "response_format",
2127
+ "seed",
2128
+ "stop",
2129
+ "structured_outputs",
2130
+ "temperature",
2131
+ "tool_choice",
2132
+ "tools",
2133
+ "top_k",
2134
+ "top_logprobs",
2135
+ "top_p"
2136
+ ],
2137
+ "default_parameters": {
2138
+ "temperature": 1,
2139
+ "top_p": 0.95,
2140
+ "top_k": null,
2141
+ "frequency_penalty": null,
2142
+ "presence_penalty": null,
2143
+ "repetition_penalty": null
2144
+ },
2145
+ "supported_voices": null,
2146
+ "knowledge_cutoff": null,
2147
+ "expiration_date": null,
2148
+ "links": {
2149
+ "details": "/api/v1/models/minimax/minimax-m3-20260531/endpoints"
2150
+ },
2151
+ "benchmarks": {
2152
+ "design_arena": [
2153
+ {
2154
+ "arena": "agents",
2155
+ "category": "androidnative",
2156
+ "elo": 1047,
2157
+ "win_rate": 26,
2158
+ "rank": 26
2159
+ },
2160
+ {
2161
+ "arena": "models",
2162
+ "category": "3d",
2163
+ "elo": 1305,
2164
+ "win_rate": 56.6,
2165
+ "rank": 17
2166
+ },
2167
+ {
2168
+ "arena": "models",
2169
+ "category": "asciiart",
2170
+ "elo": 1221,
2171
+ "win_rate": 49.8,
2172
+ "rank": 15
2173
+ },
2174
+ {
2175
+ "arena": "models",
2176
+ "category": "codecategories",
2177
+ "elo": 1306,
2178
+ "win_rate": 55.6,
2179
+ "rank": 14
2180
+ },
2181
+ {
2182
+ "arena": "models",
2183
+ "category": "dataviz",
2184
+ "elo": 1291,
2185
+ "win_rate": 56.7,
2186
+ "rank": 11
2187
+ },
2188
+ {
2189
+ "arena": "models",
2190
+ "category": "gamedev",
2191
+ "elo": 1288,
2192
+ "win_rate": 51.6,
2193
+ "rank": 20
2194
+ },
2195
+ {
2196
+ "arena": "models",
2197
+ "category": "svg",
2198
+ "elo": 1243,
2199
+ "win_rate": 54.3,
2200
+ "rank": 15
2201
+ },
2202
+ {
2203
+ "arena": "models",
2204
+ "category": "uicomponent",
2205
+ "elo": 1294,
2206
+ "win_rate": 54.1,
2207
+ "rank": 17
2208
+ },
2209
+ {
2210
+ "arena": "models",
2211
+ "category": "website",
2212
+ "elo": 1304,
2213
+ "win_rate": 55.6,
2214
+ "rank": 13
2215
+ }
2216
+ ],
2217
+ "artificial_analysis": {
2218
+ "intelligence_index": 44.4,
2219
+ "coding_index": 58.6,
2220
+ "agentic_index": 35.4
2221
+ }
2222
+ },
2223
+ "reasoning": {
2224
+ "mandatory": false
2225
+ },
2226
+ "model_family": "others"
2227
+ },
2228
+ "z-ai/glm-5.2": {
2229
+ "id": "z-ai/glm-5.2",
2230
+ "canonical_slug": "z-ai/glm-5.2-20260616",
2231
+ "hugging_face_id": "zai-org/GLM-5.2",
2232
+ "name": "Z.ai: GLM 5.2",
2233
+ "created": 1781631930,
2234
+ "description": "GLM 5.2 is a large-scale reasoning model from Z.ai. It supports text input and output with a 1M-token context window, and is suited for long-horizon agent workflows, project-level software engineering,...",
2235
+ "context_length": 1048576,
2236
+ "architecture": {
2237
+ "modality": "text->text",
2238
+ "input_modalities": [
2239
+ "text"
2240
+ ],
2241
+ "output_modalities": [
2242
+ "text"
2243
+ ],
2244
+ "tokenizer": "Other",
2245
+ "instruct_type": null
2246
+ },
2247
+ "pricing": {
2248
+ "prompt": "0.00000056",
2249
+ "completion": "0.00000176",
2250
+ "input_cache_read": "0.000000104"
2251
+ },
2252
+ "top_provider": {
2253
+ "context_length": 1048576,
2254
+ "max_completion_tokens": 131072,
2255
+ "is_moderated": false
2256
+ },
2257
+ "per_request_limits": null,
2258
+ "supported_parameters": [
2259
+ "frequency_penalty",
2260
+ "include_reasoning",
2261
+ "logit_bias",
2262
+ "logprobs",
2263
+ "max_tokens",
2264
+ "min_p",
2265
+ "parallel_tool_calls",
2266
+ "presence_penalty",
2267
+ "reasoning",
2268
+ "reasoning_effort",
2269
+ "repetition_penalty",
2270
+ "response_format",
2271
+ "seed",
2272
+ "stop",
2273
+ "structured_outputs",
2274
+ "temperature",
2275
+ "tool_choice",
2276
+ "tools",
2277
+ "top_k",
2278
+ "top_logprobs",
2279
+ "top_p"
2280
+ ],
2281
+ "default_parameters": {
2282
+ "temperature": 1,
2283
+ "top_p": 0.95,
2284
+ "top_k": null,
2285
+ "frequency_penalty": null,
2286
+ "presence_penalty": null,
2287
+ "repetition_penalty": null
2288
+ },
2289
+ "supported_voices": null,
2290
+ "knowledge_cutoff": null,
2291
+ "expiration_date": null,
2292
+ "links": {
2293
+ "details": "/api/v1/models/z-ai/glm-5.2-20260616/endpoints"
2294
+ },
2295
+ "benchmarks": {
2296
+ "design_arena": [
2297
+ {
2298
+ "arena": "agents",
2299
+ "category": "androidnative",
2300
+ "elo": 1252,
2301
+ "win_rate": 57,
2302
+ "rank": 6
2303
+ },
2304
+ {
2305
+ "arena": "agents",
2306
+ "category": "fullstack",
2307
+ "elo": 1293,
2308
+ "win_rate": 63.6,
2309
+ "rank": 3
2310
+ },
2311
+ {
2312
+ "arena": "agents",
2313
+ "category": "htmlslides",
2314
+ "elo": 1204,
2315
+ "win_rate": 52.5,
2316
+ "rank": 8
2317
+ },
2318
+ {
2319
+ "arena": "agents",
2320
+ "category": "mobileapps",
2321
+ "elo": 1240,
2322
+ "win_rate": 54,
2323
+ "rank": 5
2324
+ },
2325
+ {
2326
+ "arena": "agents",
2327
+ "category": "python-pptxslides",
2328
+ "elo": 1217,
2329
+ "win_rate": 50.3,
2330
+ "rank": 5
2331
+ },
2332
+ {
2333
+ "arena": "agents",
2334
+ "category": "webapps",
2335
+ "elo": 1284,
2336
+ "win_rate": 57.5,
2337
+ "rank": 3
2338
+ },
2339
+ {
2340
+ "arena": "models",
2341
+ "category": "3d",
2342
+ "elo": 1373,
2343
+ "win_rate": 64,
2344
+ "rank": 1
2345
+ },
2346
+ {
2347
+ "arena": "models",
2348
+ "category": "codecategories",
2349
+ "elo": 1360,
2350
+ "win_rate": 62,
2351
+ "rank": 1
2352
+ },
2353
+ {
2354
+ "arena": "models",
2355
+ "category": "dataviz",
2356
+ "elo": 1326,
2357
+ "win_rate": 59.8,
2358
+ "rank": 3
2359
+ },
2360
+ {
2361
+ "arena": "models",
2362
+ "category": "gamedev",
2363
+ "elo": 1357,
2364
+ "win_rate": 61.3,
2365
+ "rank": 2
2366
+ },
2367
+ {
2368
+ "arena": "models",
2369
+ "category": "uicomponent",
2370
+ "elo": 1339,
2371
+ "win_rate": 59.8,
2372
+ "rank": 5
2373
+ },
2374
+ {
2375
+ "arena": "models",
2376
+ "category": "website",
2377
+ "elo": 1356,
2378
+ "win_rate": 61.6,
2379
+ "rank": 1
2380
+ }
2381
+ ],
2382
+ "artificial_analysis": {
2383
+ "intelligence_index": 51.1,
2384
+ "coding_index": 68.8,
2385
+ "agentic_index": 43.1
2386
+ }
2387
+ },
2388
+ "reasoning": {
2389
+ "mandatory": false,
2390
+ "default_enabled": true,
2391
+ "supported_efforts": [
2392
+ "xhigh",
2393
+ "high"
2394
+ ],
2395
+ "default_effort": "high"
2396
+ },
2397
+ "model_family": "others"
2398
+ }
2399
+ }
requirements.txt ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ streamlit>=1.40.0
2
+ pandas>=2.0.0
3
+ plotly>=5.20.0
4
+ datasets>=2.19.0
5
+ pyarrow>=15.0.0
6
+ requests>=2.31.0