QAQ123 commited on
Commit
5fb15ef
·
verified ·
1 Parent(s): 80a3a34

Upload RPC-Bench leaderboard Space

Browse files
Files changed (5) hide show
  1. README.md +38 -7
  2. app.py +498 -0
  3. data/leaderboard.json +442 -0
  4. data/leaderboard_seed.csv +29 -0
  5. requirements.txt +5 -0
README.md CHANGED
@@ -1,13 +1,44 @@
1
  ---
2
- title: Test
3
- emoji: 📊
4
- colorFrom: gray
5
- colorTo: yellow
6
  sdk: gradio
7
- sdk_version: 6.19.0
8
- python_version: '3.13'
9
  app_file: app.py
10
  pinned: false
 
11
  ---
12
 
13
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: RPC-Bench Leaderboard
3
+ emoji: 📄
4
+ colorFrom: blue
5
+ colorTo: gray
6
  sdk: gradio
7
+ sdk_version: 5.0.0
8
+ python_version: 3.11
9
  app_file: app.py
10
  pinned: false
11
+ license: apache-2.0
12
  ---
13
 
14
+ # RPC-Bench Leaderboard Space
15
+
16
+ This Space displays RPC-Bench leaderboard results and documents the public submission format.
17
+
18
+ The design follows the same high-level pattern as the Terminal-Bench 2.0
19
+ leaderboard repository, but the current RPC-Bench flow is maintainer-run rather
20
+ than webhook-driven:
21
+
22
+ 1. Submitters open a Pull Request to a dataset repository.
23
+ 2. Maintainers validate the submitted `metadata.yaml` and `predictions.jsonl`.
24
+ 3. The official evaluator runs locally in the maintainers' controlled environment.
25
+ 4. Accepted aggregate results are imported into `data/leaderboard_seed.csv`.
26
+ 5. This Space displays the updated leaderboard.
27
+
28
+ RPC-Bench submissions contain prediction files and lightweight metadata, not executable user code. The public Space does not run evaluation.
29
+
30
+ ## Expected Dataset Repository Layout
31
+
32
+ ```text
33
+ submissions/
34
+ rpc-bench/
35
+ <organization>__<model>__<input_config>/
36
+ metadata.yaml
37
+ predictions.jsonl
38
+ generation_config.json # optional
39
+ artifacts/ # optional logs, prompts, run notes
40
+ ```
41
+
42
+ ## Leaderboard Data Source
43
+
44
+ The app reads `data/leaderboard_seed.csv` first and falls back to `data/leaderboard.json`. Maintainer-only scripts for fetching submissions, running evaluation, updating the CSV/JSON, and uploading the Space live outside this Space directory in `leaderboard_ops/`.
app.py ADDED
@@ -0,0 +1,498 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import html
2
+ import json
3
+ import re
4
+ from pathlib import Path
5
+
6
+ import gradio as gr
7
+ import pandas as pd
8
+
9
+
10
+ ROOT = Path(__file__).parent
11
+ DATA_DIR = ROOT / "data"
12
+ LEADERBOARD_JSON_PATH = DATA_DIR / "leaderboard.json"
13
+ LEADERBOARD_CSV_PATH = DATA_DIR / "leaderboard_seed.csv"
14
+
15
+ MODEL_LINK_RE = re.compile(r"^\[(?P<name>.*)\]\((?P<url>.*)\)$")
16
+ DISPLAY_COLUMNS = [
17
+ "Rank",
18
+ "Model",
19
+ "Organization",
20
+ "Input Config",
21
+ "Conciseness",
22
+ "Correctness",
23
+ "Completeness",
24
+ "F1-like",
25
+ "Informativeness",
26
+ "Date",
27
+ ]
28
+ NUMERIC_COLUMNS = ["Conciseness", "Correctness", "Completeness", "F1-like", "Informativeness"]
29
+
30
+ CUSTOM_CSS = """
31
+ footer { display: none !important; }
32
+ .api-docs, .show-api, .built-with, [data-testid="api-info"] { display: none !important; }
33
+ .gradio-container { max-width: 100% !important; padding: 18px 24px 16px !important; }
34
+ #component-0 { max-width: 100% !important; }
35
+ .rpc-title h1 { margin-bottom: 4px !important; }
36
+ .rpc-title p { margin-top: 0 !important; color: #555; }
37
+ .rpc-links {
38
+ display: flex;
39
+ justify-content: center;
40
+ align-items: center;
41
+ gap: 8px;
42
+ flex-wrap: wrap;
43
+ margin: 4px 0 12px;
44
+ color: #4b5563;
45
+ }
46
+ .rpc-links a { color: #2563eb; text-decoration: none; }
47
+ .rpc-links a:hover { text-decoration: underline; }
48
+ .leaderboard-toolbar {
49
+ display: flex;
50
+ align-items: center;
51
+ justify-content: space-between;
52
+ gap: 12px;
53
+ margin: 8px 0 12px;
54
+ flex-wrap: wrap;
55
+ }
56
+ .config-filter {
57
+ display: inline-flex;
58
+ align-items: center;
59
+ gap: 4px;
60
+ padding: 3px;
61
+ border: 1px solid #e5e7eb;
62
+ border-radius: 8px;
63
+ background: #f8fafc;
64
+ }
65
+ .config-filter button {
66
+ border: 0;
67
+ background: transparent;
68
+ color: #4b5563;
69
+ cursor: pointer;
70
+ font-size: 13px;
71
+ font-weight: 600;
72
+ padding: 6px 10px;
73
+ border-radius: 6px;
74
+ }
75
+ .config-filter button.active {
76
+ background: #111827;
77
+ color: #ffffff;
78
+ }
79
+ .table-count {
80
+ color: #6b7280;
81
+ font-size: 13px;
82
+ }
83
+ .leaderboard-shell {
84
+ height: calc(100vh - 245px);
85
+ min-height: 460px;
86
+ max-height: 780px;
87
+ overflow: auto;
88
+ border: 1px solid #e5e7eb;
89
+ border-radius: 8px;
90
+ background: white;
91
+ }
92
+ .rpc-table {
93
+ width: 100%;
94
+ border-collapse: separate;
95
+ border-spacing: 0;
96
+ font-size: 14px;
97
+ }
98
+ .rpc-table th {
99
+ position: sticky;
100
+ top: 0;
101
+ z-index: 2;
102
+ background: #f8fafc;
103
+ color: #111827;
104
+ font-weight: 650;
105
+ text-align: left;
106
+ border-bottom: 1px solid #d1d5db;
107
+ padding: 9px 11px;
108
+ white-space: nowrap;
109
+ cursor: pointer;
110
+ user-select: none;
111
+ }
112
+ .rpc-table th::after {
113
+ content: "↕";
114
+ color: #9ca3af;
115
+ font-size: 11px;
116
+ margin-left: 6px;
117
+ }
118
+ .rpc-table th.sort-asc::after { content: "↑"; color: #111827; }
119
+ .rpc-table th.sort-desc::after { content: "↓"; color: #111827; }
120
+ .rpc-table td {
121
+ border-bottom: 1px solid #eef2f7;
122
+ padding: 9px 11px;
123
+ vertical-align: middle;
124
+ white-space: nowrap;
125
+ }
126
+ .rpc-table tbody tr:hover { background: #f9fafb; }
127
+ .rpc-table .num { text-align: right; font-variant-numeric: tabular-nums; }
128
+ .rpc-table .rank { width: 64px; text-align: right; color: #4b5563; }
129
+ .rpc-table .model { min-width: 210px; font-weight: 600; }
130
+ .rpc-table .org { min-width: 180px; }
131
+ .config-badge {
132
+ display: inline-flex;
133
+ align-items: center;
134
+ justify-content: center;
135
+ min-width: 58px;
136
+ padding: 3px 8px;
137
+ border-radius: 999px;
138
+ font-size: 12px;
139
+ font-weight: 700;
140
+ letter-spacing: 0.02em;
141
+ }
142
+ .config-text {
143
+ background: #e0f2fe;
144
+ color: #075985;
145
+ }
146
+ .config-visual {
147
+ background: #fef3c7;
148
+ color: #92400e;
149
+ }
150
+ .rpc-table a { color: #2563eb; text-decoration: none; }
151
+ .rpc-table a:hover { text-decoration: underline; }
152
+ .submit-panel { max-width: 980px; }
153
+ .submit-panel pre { border-radius: 8px; }
154
+ """
155
+
156
+
157
+ TABLE_SCRIPT = """
158
+ <script>
159
+ (function () {
160
+ const table = document.getElementById("rpc-leaderboard-table");
161
+ if (!table) return;
162
+
163
+ const tbody = table.querySelector("tbody");
164
+ const headers = table.querySelectorAll("th[data-sort]");
165
+ const filterButtons = document.querySelectorAll(".config-filter button");
166
+ const countEl = document.getElementById("table-count");
167
+ let activeConfig = "ALL";
168
+ let sortColumn = "Informativeness";
169
+ let sortDirection = "desc";
170
+
171
+ function parseValue(row, column) {
172
+ const cell = row.querySelector(`[data-col="${column}"]`);
173
+ if (!cell) return "";
174
+ const raw = cell.getAttribute("data-value") || cell.textContent || "";
175
+ if (["Rank", "Conciseness", "Correctness", "Completeness", "F1-like", "Informativeness"].includes(column)) {
176
+ const num = Number.parseFloat(raw);
177
+ return Number.isNaN(num) ? -Infinity : num;
178
+ }
179
+ if (column === "Date") {
180
+ const time = Date.parse(raw);
181
+ return Number.isNaN(time) ? 0 : time;
182
+ }
183
+ return raw.toLowerCase();
184
+ }
185
+
186
+
187
+ function apply() {
188
+ const rows = Array.from(tbody.querySelectorAll("tr"));
189
+ const sorted = rows.slice().sort((a, b) => {
190
+ const av = parseValue(a, sortColumn);
191
+ const bv = parseValue(b, sortColumn);
192
+ if (av < bv) return sortDirection === "asc" ? -1 : 1;
193
+ if (av > bv) return sortDirection === "asc" ? 1 : -1;
194
+ return 0;
195
+ });
196
+
197
+ sorted.forEach(row => tbody.appendChild(row));
198
+
199
+ let shown = 0;
200
+ Array.from(tbody.querySelectorAll("tr")).forEach(row => {
201
+ const visible = activeConfig === "ALL" || row.dataset.config === activeConfig;
202
+ row.style.display = visible ? "" : "none";
203
+ if (visible) {
204
+ shown += 1;
205
+ const rankCell = row.querySelector('[data-col="Rank"]');
206
+ if (rankCell) {
207
+ rankCell.textContent = shown;
208
+ rankCell.setAttribute("data-value", String(shown));
209
+ }
210
+ }
211
+ });
212
+
213
+ if (countEl) countEl.textContent = `${shown} entries`;
214
+ headers.forEach(header => {
215
+ header.classList.remove("sort-asc", "sort-desc");
216
+ if (header.dataset.sort === sortColumn) {
217
+ header.classList.add(sortDirection === "asc" ? "sort-asc" : "sort-desc");
218
+ }
219
+ });
220
+ }
221
+
222
+ headers.forEach(header => {
223
+ header.addEventListener("click", () => {
224
+ const column = header.dataset.sort;
225
+ if (sortColumn === column) {
226
+ sortDirection = sortDirection === "asc" ? "desc" : "asc";
227
+ } else {
228
+ sortColumn = column;
229
+ sortDirection = ["Model", "Organization", "Input Config", "Date"].includes(column) ? "asc" : "desc";
230
+ }
231
+ apply();
232
+ });
233
+ });
234
+
235
+ filterButtons.forEach(button => {
236
+ button.addEventListener("click", () => {
237
+ activeConfig = button.dataset.config;
238
+ filterButtons.forEach(item => item.classList.toggle("active", item === button));
239
+ apply();
240
+ });
241
+ });
242
+
243
+ apply();
244
+ })();
245
+ </script>
246
+ """
247
+
248
+ SUBMISSION_GUIDE = """
249
+ <div class="submit-panel">
250
+
251
+ ### How to Submit
252
+
253
+ 1. Fork <a href="https://huggingface.co/datasets/zai-org/RPC-Bench" target="_blank" rel="noopener noreferrer">this repository</a>.
254
+ 2. Create a new branch for your submission.
255
+ 3. Add your submission folder under
256
+ `submissions/rpc-bench/<organization>__<model>__<input_config>/`.
257
+ 4. Open a Pull Request with the new submission folder.
258
+
259
+ ### Submission Directory Requirements
260
+
261
+ Each submission directory must contain the metadata and predictions for one
262
+ model/input configuration pair:
263
+
264
+ ```text
265
+ <organization>__<model>__<input_config>/
266
+ metadata.yaml
267
+ predictions.jsonl
268
+ generation_config.json # optional, recommended
269
+ artifacts/ # optional logs or prompt notes
270
+ ```
271
+
272
+ Use URL-safe directory names. Replace spaces, slashes, and special characters
273
+ with hyphens; keep `input_config` as `TEXT` or `VISUAL`.
274
+
275
+ ### `metadata.yaml`
276
+
277
+ ```yaml
278
+ model_name: "My Model"
279
+ organization: "My Org"
280
+ model_url: https://... # optional work link: paper, GitHub, model card, etc.
281
+ date: "2026-06-17" # model release date, not submission date
282
+ split: test
283
+ input_config: TEXT # TEXT or VISUAL
284
+ ```
285
+
286
+ ### `predictions.jsonl`
287
+
288
+ Each line must be one JSON object:
289
+
290
+ ```json
291
+ {
292
+ "id": "paper-id",
293
+ "part_idx": 1,
294
+ "question": "question text",
295
+ "category": "category",
296
+ "gen_answer": "model answer"
297
+ }
298
+ ```
299
+
300
+ `part_idx` is the question index in the current paper's `qa_pairs` list (`1` for the first item). `category` must match the corresponding item in `test.json`.
301
+
302
+ ### Validation Rules
303
+
304
+ Your submission will be validated before evaluation. To pass:
305
+
306
+ - `metadata.yaml` must include `model_name`, `organization`, `date`, `split`,
307
+ and `input_config`.
308
+ - `model_url` is optional.
309
+ - `date` is the model release date, not the submission date.
310
+ - `split` must be `test`.
311
+ - `input_config` must be `TEXT` or `VISUAL`.
312
+ - `predictions.jsonl` must contain exactly one line for every QA item in
313
+ `test.json`.
314
+ - `part_idx` is the question index in the current paper's `qa_pairs` list
315
+ (`1` for the first item).
316
+ - `id`, `part_idx`, `question`, and `category` must exactly match the benchmark
317
+ item.
318
+ - `gen_answer` must be a string.
319
+ - For `Claim_Verification`, `gen_answer` must be exactly `True` or `False`.
320
+
321
+ ### Submission Process
322
+
323
+ 1. Open PR: add your folder under
324
+ `submissions/rpc-bench/<organization>__<model>__<input_config>/`.
325
+ 2. Fix issues: if validation fails, update the PR with corrected files.
326
+ 3. Review: once validation passes, a maintainer reviews the submission.
327
+ 4. Evaluate: maintainers run the official evaluator in a controlled local
328
+ environment.
329
+ 5. Import: accepted aggregate results are imported to the leaderboard.
330
+
331
+ </div>
332
+ """
333
+
334
+
335
+ def _parse_markdown_link(value):
336
+ text = str(value).strip()
337
+ match = MODEL_LINK_RE.match(text)
338
+ if match:
339
+ return match.group("name"), match.group("url")
340
+ return text, ""
341
+
342
+
343
+ def _read_csv_leaderboard():
344
+ df = pd.read_csv(LEADERBOARD_CSV_PATH)
345
+ if "Info" in df.columns and "Informativeness" not in df.columns:
346
+ df = df.rename(columns={"Info": "Informativeness"})
347
+ names = []
348
+ urls = []
349
+ for value in df.get("Model", []):
350
+ name, url = _parse_markdown_link(value)
351
+ names.append(name)
352
+ urls.append(url)
353
+ if "Model" in df.columns:
354
+ df["Model"] = names
355
+ df["url"] = urls
356
+ for col in NUMERIC_COLUMNS:
357
+ if col in df.columns:
358
+ df[col] = pd.to_numeric(df[col], errors="coerce")
359
+ df = df.sort_values("Informativeness", ascending=False, na_position="last").reset_index(drop=True)
360
+ df.insert(0, "Rank", range(1, len(df) + 1))
361
+ return df
362
+
363
+
364
+ def _read_json_leaderboard():
365
+ with LEADERBOARD_JSON_PATH.open("r", encoding="utf-8") as f:
366
+ data = json.load(f)
367
+ rows = []
368
+ for season in data.get("seasons", {}).values():
369
+ for row in season.get("models", []):
370
+ rows.append({
371
+ "Model": row.get("name", ""),
372
+ "url": row.get("url", ""),
373
+ "Organization": row.get("org", ""),
374
+ "Input Config": str(row.get("modality", "")).upper(),
375
+ "Conciseness": row.get("conciseness", 0),
376
+ "Correctness": row.get("correctness", 0),
377
+ "Completeness": row.get("completeness", 0),
378
+ "F1-like": row.get("f1_like", row.get("informativeness", 0)),
379
+ "Informativeness": row.get("informativeness", row.get("info", row.get("overall", 0))),
380
+ "Date": row.get("date", ""),
381
+ })
382
+ df = pd.DataFrame(rows)
383
+ if df.empty:
384
+ return pd.DataFrame(columns=DISPLAY_COLUMNS + ["url"])
385
+ df = df.sort_values("Informativeness", ascending=False, na_position="last").reset_index(drop=True)
386
+ df.insert(0, "Rank", range(1, len(df) + 1))
387
+ return df
388
+
389
+
390
+ def load_leaderboard_table():
391
+ if LEADERBOARD_CSV_PATH.exists():
392
+ try:
393
+ return _read_csv_leaderboard()
394
+ except Exception:
395
+ pass
396
+ return _read_json_leaderboard()
397
+
398
+
399
+ def _format_cell(value, column):
400
+ if pd.isna(value):
401
+ return ""
402
+ if column in NUMERIC_COLUMNS:
403
+ return f"{float(value):.2f}"
404
+ return html.escape(str(value))
405
+
406
+
407
+ def _render_input_config(value):
408
+ config = str(value).upper()
409
+ if config == "TEXT":
410
+ return '<span class="config-badge config-text">TEXT</span>'
411
+ if config == "VISUAL":
412
+ return '<span class="config-badge config-visual">VISUAL</span>'
413
+ return html.escape(config)
414
+
415
+
416
+ def render_leaderboard_html():
417
+ df = load_leaderboard_table()
418
+ columns = [col for col in DISPLAY_COLUMNS if col in df.columns]
419
+
420
+ thead = "".join(
421
+ f'<th data-sort="{html.escape(col, quote=True)}">{html.escape(col)}</th>'
422
+ for col in columns
423
+ )
424
+ body_rows = []
425
+ for _, row in df.iterrows():
426
+ cells = []
427
+ config_value = str(row.get("Input Config", "")).upper()
428
+ for col in columns:
429
+ classes = []
430
+ if col == "Rank":
431
+ classes.append("rank")
432
+ if col == "Model":
433
+ classes.append("model")
434
+ if col == "Organization":
435
+ classes.append("org")
436
+ if col in NUMERIC_COLUMNS or col == "Rank":
437
+ classes.append("num")
438
+ class_attr = f' class="{" ".join(classes)}"' if classes else ""
439
+ data_value = html.escape(str(row[col]), quote=True)
440
+ data_col = html.escape(col, quote=True)
441
+ if col == "Model" and row.get("url"):
442
+ text = html.escape(str(row[col]))
443
+ url = html.escape(str(row["url"]), quote=True)
444
+ value = f'<a href="{url}" target="_blank" rel="noopener noreferrer">{text}</a>'
445
+ elif col == "Input Config":
446
+ value = _render_input_config(row[col])
447
+ else:
448
+ value = _format_cell(row[col], col)
449
+ cells.append(f'<td{class_attr} data-col="{data_col}" data-value="{data_value}">{value}</td>')
450
+ body_rows.append(f'<tr data-config="{html.escape(config_value, quote=True)}">' + "".join(cells) + "</tr>")
451
+
452
+ return f"""
453
+ <div class="leaderboard-toolbar">
454
+ <div class="config-filter" aria-label="Input Config filter">
455
+ <button type="button" class="active" data-config="ALL">All</button>
456
+ <button type="button" data-config="TEXT">TEXT</button>
457
+ <button type="button" data-config="VISUAL">VISUAL</button>
458
+ </div>
459
+ <div id="table-count" class="table-count">{len(df)} entries</div>
460
+ </div>
461
+ <div class="leaderboard-shell">
462
+ <table id="rpc-leaderboard-table" class="rpc-table">
463
+ <thead><tr>{thead}</tr></thead>
464
+ <tbody>{''.join(body_rows)}</tbody>
465
+ </table>
466
+ </div>
467
+ {TABLE_SCRIPT}
468
+ """
469
+
470
+
471
+
472
+ with gr.Blocks(title="RPC-Bench Leaderboard", analytics_enabled=False, css=CUSTOM_CSS) as demo:
473
+ gr.Markdown(
474
+ """
475
+ # RPC-Bench Leaderboard
476
+
477
+ <div class="rpc-links">
478
+ <span>🌐 <a href="https://rpc-bench.github.io/" target="_blank" rel="noopener noreferrer">Project Page</a></span>
479
+ <span>•</span>
480
+ <span>📖 <a href="https://arxiv.org/abs/2601.14289" target="_blank" rel="noopener noreferrer">Paper</a></span>
481
+ <span>•</span>
482
+ <span>🤗 <a href="https://huggingface.co/datasets/zai-org/RPC-Bench" target="_blank" rel="noopener noreferrer">Hugging Face</a></span>
483
+ <span>•</span>
484
+ <span>🧭 <a href="https://modelscope.cn/datasets/ZhipuAI/RPC-Bench" target="_blank" rel="noopener noreferrer">ModelScope</a></span>
485
+ </div>
486
+ """,
487
+ elem_classes=["rpc-title"],
488
+ )
489
+
490
+ with gr.Tab("Leaderboard"):
491
+ gr.HTML(render_leaderboard_html())
492
+
493
+ with gr.Tab("Submit"):
494
+ gr.Markdown(SUBMISSION_GUIDE)
495
+
496
+
497
+ if __name__ == "__main__":
498
+ demo.launch(show_api=False)
data/leaderboard.json ADDED
@@ -0,0 +1,442 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "benchmark": "rpc-bench",
3
+ "schema_version": "1.0",
4
+ "last_updated": "2026-06-17",
5
+ "source": "data/leaderboard_seed.csv",
6
+ "seasons": {
7
+ "default": {
8
+ "period": "rolling",
9
+ "dataset_version": "rpc-bench-test-v1",
10
+ "eval_version": "eval.py@rpc-leaderboard-v1",
11
+ "judges": {
12
+ "open_qa": [
13
+ "gpt-5-2025-08-07",
14
+ "gemini-2.5-pro"
15
+ ],
16
+ "claim_verification": "exact-match"
17
+ },
18
+ "models": [
19
+ {
20
+ "rank": 1,
21
+ "name": "GPT-5",
22
+ "url": "https://openai.com/index/introducing-gpt-5/",
23
+ "org": "OpenAI",
24
+ "modality": "text",
25
+ "date": "2025-8-7",
26
+ "status": "published",
27
+ "conciseness": 54.93,
28
+ "correctness": 69.1,
29
+ "completeness": 67.33,
30
+ "f1_like": 68.2,
31
+ "info": 37.46,
32
+ "overall": 37.46
33
+ },
34
+ {
35
+ "rank": 2,
36
+ "name": "GPT-5.2",
37
+ "url": "https://openai.com/index/introducing-gpt-5-2/",
38
+ "org": "OpenAI",
39
+ "modality": "text",
40
+ "date": "2025-12-11",
41
+ "status": "published",
42
+ "conciseness": 53.81,
43
+ "correctness": 66.84,
44
+ "completeness": 64.03,
45
+ "f1_like": 65.4,
46
+ "info": 35.19,
47
+ "overall": 35.19
48
+ },
49
+ {
50
+ "rank": 3,
51
+ "name": "GPT-5",
52
+ "url": "https://openai.com/index/introducing-gpt-5/",
53
+ "org": "OpenAI",
54
+ "modality": "visual",
55
+ "date": "2025-8-7",
56
+ "status": "published",
57
+ "conciseness": 61.47,
58
+ "correctness": 58.9,
59
+ "completeness": 55.34,
60
+ "f1_like": 57.07,
61
+ "info": 35.08,
62
+ "overall": 35.08
63
+ },
64
+ {
65
+ "rank": 4,
66
+ "name": "Gemini-2.5-Pro",
67
+ "url": "https://blog.google/technology/google-deepmind/gemini-model-thinking-updates-march-2025/",
68
+ "org": "Google",
69
+ "modality": "text",
70
+ "date": "2025-3-25",
71
+ "status": "published",
72
+ "conciseness": 54.87,
73
+ "correctness": 62.65,
74
+ "completeness": 59.03,
75
+ "f1_like": 60.79,
76
+ "info": 33.35,
77
+ "overall": 33.35
78
+ },
79
+ {
80
+ "rank": 5,
81
+ "name": "Gemini-3-Pro",
82
+ "url": "https://blog.google/products-and-platforms/products/gemini/gemini-3/",
83
+ "org": "Google",
84
+ "modality": "text",
85
+ "date": "2025-11-18",
86
+ "status": "published",
87
+ "conciseness": 52.81,
88
+ "correctness": 62.69,
89
+ "completeness": 60.28,
90
+ "f1_like": 61.46,
91
+ "info": 32.46,
92
+ "overall": 32.46
93
+ },
94
+ {
95
+ "rank": 6,
96
+ "name": "DeepSeek-V3.2",
97
+ "url": "https://api-docs.deepseek.com/news/news251201",
98
+ "org": "DeepSeek-AI",
99
+ "modality": "text",
100
+ "date": "2025-12-1",
101
+ "status": "published",
102
+ "conciseness": 56.31,
103
+ "correctness": 58.73,
104
+ "completeness": 55.19,
105
+ "f1_like": 56.91,
106
+ "info": 32.04,
107
+ "overall": 32.04
108
+ },
109
+ {
110
+ "rank": 7,
111
+ "name": "GPT-5.2",
112
+ "url": "https://openai.com/index/introducing-gpt-5-2/",
113
+ "org": "OpenAI",
114
+ "modality": "visual",
115
+ "date": "2025-12-11",
116
+ "status": "published",
117
+ "conciseness": 56.43,
118
+ "correctness": 56.75,
119
+ "completeness": 52.82,
120
+ "f1_like": 54.72,
121
+ "info": 30.88,
122
+ "overall": 30.88
123
+ },
124
+ {
125
+ "rank": 8,
126
+ "name": "DeepSeek-V3.1",
127
+ "url": "https://api-docs.deepseek.com/news/news250821",
128
+ "org": "DeepSeek-AI",
129
+ "modality": "text",
130
+ "date": "2025-8-21",
131
+ "status": "published",
132
+ "conciseness": 54.76,
133
+ "correctness": 57.85,
134
+ "completeness": 54.85,
135
+ "f1_like": 56.31,
136
+ "info": 30.84,
137
+ "overall": 30.84
138
+ },
139
+ {
140
+ "rank": 9,
141
+ "name": "GLM-4.6V",
142
+ "url": "https://github.com/zai-org/GLM-V",
143
+ "org": "Z.ai",
144
+ "modality": "visual",
145
+ "date": "2025-12-8",
146
+ "status": "published",
147
+ "conciseness": 64.55,
148
+ "correctness": 47.32,
149
+ "completeness": 43.43,
150
+ "f1_like": 45.29,
151
+ "info": 29.23,
152
+ "overall": 29.23
153
+ },
154
+ {
155
+ "rank": 10,
156
+ "name": "GLM-4.7",
157
+ "url": "https://z.ai/blog/glm-4.7",
158
+ "org": "Z.ai",
159
+ "modality": "text",
160
+ "date": "2025-12-22",
161
+ "status": "published",
162
+ "conciseness": 54.34,
163
+ "correctness": 54.36,
164
+ "completeness": 51.75,
165
+ "f1_like": 53.02,
166
+ "info": 28.81,
167
+ "overall": 28.81
168
+ },
169
+ {
170
+ "rank": 11,
171
+ "name": "GLM-4.5V",
172
+ "url": "https://github.com/zai-org/GLM-V",
173
+ "org": "Z.ai",
174
+ "modality": "visual",
175
+ "date": "2025-8-11",
176
+ "status": "published",
177
+ "conciseness": 59.44,
178
+ "correctness": 48.79,
179
+ "completeness": 43.62,
180
+ "f1_like": 46.06,
181
+ "info": 27.38,
182
+ "overall": 27.38
183
+ },
184
+ {
185
+ "rank": 12,
186
+ "name": "gemini-3-pro",
187
+ "url": "https://blog.google/products-and-platforms/products/gemini/gemini-3/",
188
+ "org": "Google",
189
+ "modality": "visual",
190
+ "date": "2025-11-18",
191
+ "status": "published",
192
+ "conciseness": 50.22,
193
+ "correctness": 56.06,
194
+ "completeness": 52.69,
195
+ "f1_like": 54.32,
196
+ "info": 27.28,
197
+ "overall": 27.28
198
+ },
199
+ {
200
+ "rank": 13,
201
+ "name": "GLM-4.5",
202
+ "url": "https://z.ai/blog/glm-4.5",
203
+ "org": "Z.ai",
204
+ "modality": "text",
205
+ "date": "2025-7-28",
206
+ "status": "published",
207
+ "conciseness": 43.41,
208
+ "correctness": 58.95,
209
+ "completeness": 59.54,
210
+ "f1_like": 59.24,
211
+ "info": 25.72,
212
+ "overall": 25.72
213
+ },
214
+ {
215
+ "rank": 14,
216
+ "name": "gemini-2.5-pro",
217
+ "url": "https://blog.google/technology/google-deepmind/gemini-model-thinking-updates-march-2025/",
218
+ "org": "Google",
219
+ "modality": "visual",
220
+ "date": "2025-3-25",
221
+ "status": "published",
222
+ "conciseness": 51.71,
223
+ "correctness": 48.39,
224
+ "completeness": 45.59,
225
+ "f1_like": 46.95,
226
+ "info": 24.28,
227
+ "overall": 24.28
228
+ },
229
+ {
230
+ "rank": 15,
231
+ "name": "Claude-Sonnet-4",
232
+ "url": "https://www.anthropic.com/news/claude-4",
233
+ "org": "Anthropic",
234
+ "modality": "text",
235
+ "date": "2025-5-23",
236
+ "status": "published",
237
+ "conciseness": 41.37,
238
+ "correctness": 58.53,
239
+ "completeness": 58.44,
240
+ "f1_like": 58.48,
241
+ "info": 24.19,
242
+ "overall": 24.19
243
+ },
244
+ {
245
+ "rank": 16,
246
+ "name": "Qwen3",
247
+ "url": "https://github.com/QwenLM/Qwen3",
248
+ "org": "Alibaba",
249
+ "modality": "text",
250
+ "date": "2025-7-21",
251
+ "status": "published",
252
+ "conciseness": 41.44,
253
+ "correctness": 55.88,
254
+ "completeness": 56.64,
255
+ "f1_like": 56.26,
256
+ "info": 23.31,
257
+ "overall": 23.31
258
+ },
259
+ {
260
+ "rank": 17,
261
+ "name": "Claude-Sonnet-4.5",
262
+ "url": "https://www.anthropic.com/news/claude-sonnet-4-5",
263
+ "org": "Anthropic",
264
+ "modality": "text",
265
+ "date": "2025-9-30",
266
+ "status": "published",
267
+ "conciseness": 31.02,
268
+ "correctness": 64.31,
269
+ "completeness": 64.97,
270
+ "f1_like": 64.64,
271
+ "info": 20.05,
272
+ "overall": 20.05
273
+ },
274
+ {
275
+ "rank": 18,
276
+ "name": "Claude-Sonnet-4.5",
277
+ "url": "https://www.anthropic.com/news/claude-sonnet-4-5",
278
+ "org": "Anthropic",
279
+ "modality": "visual",
280
+ "date": "2025-9-30",
281
+ "status": "published",
282
+ "conciseness": 31.95,
283
+ "correctness": 55.35,
284
+ "completeness": 54.45,
285
+ "f1_like": 54.89,
286
+ "info": 17.54,
287
+ "overall": 17.54
288
+ },
289
+ {
290
+ "rank": 19,
291
+ "name": "Claude-Sonnet-4",
292
+ "url": "https://www.anthropic.com/news/claude-4",
293
+ "org": "Anthropic",
294
+ "modality": "visual",
295
+ "date": "2025-5-23",
296
+ "status": "published",
297
+ "conciseness": 31.63,
298
+ "correctness": 54.16,
299
+ "completeness": 53.32,
300
+ "f1_like": 53.74,
301
+ "info": 16.99,
302
+ "overall": 16.99
303
+ },
304
+ {
305
+ "rank": 20,
306
+ "name": "HippoRAG2",
307
+ "url": "https://github.com/ianliuwd/HippoRAG2",
308
+ "org": "The Ohio State University",
309
+ "modality": "text",
310
+ "date": "2025-6-19",
311
+ "status": "published",
312
+ "conciseness": 45.77,
313
+ "correctness": 33.13,
314
+ "completeness": 27.88,
315
+ "f1_like": 30.28,
316
+ "info": 13.86,
317
+ "overall": 13.86
318
+ },
319
+ {
320
+ "rank": 21,
321
+ "name": "MemoRAG",
322
+ "url": "https://github.com/qhjqhj00/MemoRAG",
323
+ "org": "Peking University & Hong Kong Polytechnic University",
324
+ "modality": "text",
325
+ "date": "2025-4-9",
326
+ "status": "published",
327
+ "conciseness": 51.31,
328
+ "correctness": 24.19,
329
+ "completeness": 19.1,
330
+ "f1_like": 21.35,
331
+ "info": 10.96,
332
+ "overall": 10.96
333
+ },
334
+ {
335
+ "rank": 22,
336
+ "name": "VdocRAG",
337
+ "url": "https://vdocrag.github.io/",
338
+ "org": "NTT Corporation & Tohoku University",
339
+ "modality": "visual",
340
+ "date": "2025-4-14",
341
+ "status": "published",
342
+ "conciseness": 61.54,
343
+ "correctness": 21.17,
344
+ "completeness": 13.88,
345
+ "f1_like": 16.77,
346
+ "info": 10.32,
347
+ "overall": 10.32
348
+ },
349
+ {
350
+ "rank": 23,
351
+ "name": "VisRAG",
352
+ "url": "https://github.com/OpenBMB/VisRAG",
353
+ "org": "Tsinghua University & ModelBest Inc.",
354
+ "modality": "visual",
355
+ "date": "2025-3-2",
356
+ "status": "published",
357
+ "conciseness": 39.9,
358
+ "correctness": 26.24,
359
+ "completeness": 23.63,
360
+ "f1_like": 24.87,
361
+ "info": 9.92,
362
+ "overall": 9.92
363
+ },
364
+ {
365
+ "rank": 24,
366
+ "name": "Raptor",
367
+ "url": "https://github.com/parthsarthi03/raptor",
368
+ "org": "Stanford University",
369
+ "modality": "text",
370
+ "date": "2024-1-31",
371
+ "status": "published",
372
+ "conciseness": 36.47,
373
+ "correctness": 25.28,
374
+ "completeness": 20.82,
375
+ "f1_like": 22.84,
376
+ "info": 8.33,
377
+ "overall": 8.33
378
+ },
379
+ {
380
+ "rank": 25,
381
+ "name": "Monkey",
382
+ "url": "https://github.com/Yuliang-Liu/Monkey",
383
+ "org": "Huazhong University of Science and Technology",
384
+ "modality": "visual",
385
+ "date": "2024-8-26",
386
+ "status": "published",
387
+ "conciseness": 54.61,
388
+ "correctness": 17.08,
389
+ "completeness": 11.27,
390
+ "f1_like": 13.58,
391
+ "info": 7.41,
392
+ "overall": 7.41
393
+ },
394
+ {
395
+ "rank": 26,
396
+ "name": "Docopilot",
397
+ "url": "https://github.com/OpenGVLab/Docopilot",
398
+ "org": "Shanghai AI Laboratory",
399
+ "modality": "visual",
400
+ "date": "2025-7-19",
401
+ "status": "published",
402
+ "conciseness": 39.31,
403
+ "correctness": 18.31,
404
+ "completeness": 17.12,
405
+ "f1_like": 17.69,
406
+ "info": 6.96,
407
+ "overall": 6.96
408
+ },
409
+ {
410
+ "rank": 27,
411
+ "name": "Qwen3",
412
+ "url": "https://github.com/QwenLM/Qwen3",
413
+ "org": "Alibaba",
414
+ "modality": "visual",
415
+ "date": "2025-7-21",
416
+ "status": "published",
417
+ "conciseness": 22.64,
418
+ "correctness": 20.17,
419
+ "completeness": 20.14,
420
+ "f1_like": 20.16,
421
+ "info": 4.56,
422
+ "overall": 4.56
423
+ },
424
+ {
425
+ "rank": 28,
426
+ "name": "DocOwl2",
427
+ "url": "https://github.com/X-PLUG/mPLUG-DocOwl",
428
+ "org": "Alibaba",
429
+ "modality": "visual",
430
+ "date": "2024-9-9",
431
+ "status": "published",
432
+ "conciseness": 50.19,
433
+ "correctness": 11.75,
434
+ "completeness": 6.66,
435
+ "f1_like": 8.5,
436
+ "info": 4.27,
437
+ "overall": 4.27
438
+ }
439
+ ]
440
+ }
441
+ }
442
+ }
data/leaderboard_seed.csv ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Model,Organization,Input Config,Date,Conciseness,Correctness,Completeness,F1-like,Informativeness
2
+ [GPT-5](https://openai.com/index/introducing-gpt-5/),OpenAI,TEXT,2025-8-7,54.93,69.10,67.33,68.20,37.46
3
+ [GPT-5.2](https://openai.com/index/introducing-gpt-5-2/),OpenAI,TEXT,2025-12-11,53.81,66.84,64.03,65.40,35.19
4
+ [GPT-5](https://openai.com/index/introducing-gpt-5/),OpenAI,VISUAL,2025-8-7,61.47,58.90,55.34,57.07,35.08
5
+ [Gemini-2.5-Pro](https://blog.google/technology/google-deepmind/gemini-model-thinking-updates-march-2025/),Google,TEXT,2025-3-25,54.87,62.65,59.03,60.79,33.35
6
+ [Gemini-3-Pro](https://blog.google/products-and-platforms/products/gemini/gemini-3/),Google,TEXT,2025-11-18,52.81,62.69,60.28,61.46,32.46
7
+ [DeepSeek-V3.2](https://api-docs.deepseek.com/news/news251201),DeepSeek-AI,TEXT,2025-12-1,56.31,58.73,55.19,56.91,32.04
8
+ [GPT-5.2](https://openai.com/index/introducing-gpt-5-2/),OpenAI,VISUAL,2025-12-11,56.43,56.75,52.82,54.72,30.88
9
+ [DeepSeek-V3.1](https://api-docs.deepseek.com/news/news250821),DeepSeek-AI,TEXT,2025-8-21,54.76,57.85,54.85,56.31,30.84
10
+ [GLM-4.6V](https://github.com/zai-org/GLM-V),Z.ai,VISUAL,2025-12-8,64.55,47.32,43.43,45.29,29.23
11
+ [GLM-4.7](https://z.ai/blog/glm-4.7),Z.ai,TEXT,2025-12-22,54.34,54.36,51.75,53.02,28.81
12
+ [GLM-4.5V](https://github.com/zai-org/GLM-V),Z.ai,VISUAL,2025-8-11,59.44,48.79,43.62,46.06,27.38
13
+ [gemini-3-pro](https://blog.google/products-and-platforms/products/gemini/gemini-3/),Google,VISUAL,2025-11-18,50.22,56.06,52.69,54.32,27.28
14
+ [GLM-4.5](https://z.ai/blog/glm-4.5),Z.ai,TEXT,2025-7-28,43.41,58.95,59.54,59.24,25.72
15
+ [gemini-2.5-pro](https://blog.google/technology/google-deepmind/gemini-model-thinking-updates-march-2025/),Google,VISUAL,2025-3-25,51.71,48.39,45.59,46.95,24.28
16
+ [Claude-Sonnet-4](https://www.anthropic.com/news/claude-4),Anthropic,TEXT,2025-5-23,41.37,58.53,58.44,58.48,24.19
17
+ [Qwen3](https://github.com/QwenLM/Qwen3),Alibaba,TEXT,2025-7-21,41.44,55.88,56.64,56.26,23.31
18
+ [Claude-Sonnet-4.5](https://www.anthropic.com/news/claude-sonnet-4-5),Anthropic,TEXT,2025-9-30,31.02,64.31,64.97,64.64,20.05
19
+ [Claude-Sonnet-4.5](https://www.anthropic.com/news/claude-sonnet-4-5),Anthropic,VISUAL,2025-9-30,31.95,55.35,54.45,54.89,17.54
20
+ [Claude-Sonnet-4](https://www.anthropic.com/news/claude-4),Anthropic,VISUAL,2025-5-23,31.63,54.16,53.32,53.74,16.99
21
+ [HippoRAG2](https://github.com/ianliuwd/HippoRAG2),The Ohio State University,TEXT,2025-6-19,45.77,33.13,27.88,30.28,13.86
22
+ [MemoRAG](https://github.com/qhjqhj00/MemoRAG),Peking University & Hong Kong Polytechnic University,TEXT,2025-4-9,51.31,24.19,19.10,21.35,10.96
23
+ [VdocRAG](https://vdocrag.github.io/),NTT Corporation & Tohoku University,VISUAL,2025-4-14,61.54,21.17,13.88,16.77,10.32
24
+ [VisRAG](https://github.com/OpenBMB/VisRAG),Tsinghua University & ModelBest Inc.,VISUAL,2025-3-2,39.90,26.24,23.63,24.87,9.92
25
+ [Raptor](https://github.com/parthsarthi03/raptor),Stanford University,TEXT,2024-1-31,36.47,25.28,20.82,22.84,8.33
26
+ [Monkey](https://github.com/Yuliang-Liu/Monkey),Huazhong University of Science and Technology,VISUAL,2024-8-26,54.61,17.08,11.27,13.58,7.41
27
+ [Docopilot](https://github.com/OpenGVLab/Docopilot),Shanghai AI Laboratory,VISUAL,2025-7-19,39.31,18.31,17.12,17.69,6.96
28
+ [Qwen3](https://github.com/QwenLM/Qwen3),Alibaba,VISUAL,2025-7-21,22.64,20.17,20.14,20.16,4.56
29
+ [DocOwl2](https://github.com/X-PLUG/mPLUG-DocOwl),Alibaba,VISUAL,2024-9-9,50.19,11.75,6.66,8.50,4.27
requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ gradio>=5.0.0,<6.0.0
2
+ pandas>=2.0.0
3
+ huggingface_hub>=0.24.0,<1.0.0
4
+ pyyaml>=6.0.0
5
+ pyaudioop>=0.2.0; python_version >= "3.13"