Update leaderboard, detailed results, figures and submission interface
Browse filesPublish the reviewed UI and prepare the Docker submission service. Keep the static app running while private runtime credentials are configured.
- .gitattributes +4 -0
- Dockerfile +12 -0
- admin.html +10 -0
- app.js +74 -19
- assets/benchmark-overview.png +3 -0
- assets/rise-agent.png +3 -0
- data/leaderboard.json +0 -0
- dist/README.md +18 -0
- dist/admin.html +10 -0
- dist/app.js +258 -0
- dist/assets/benchmark-overview.png +3 -0
- dist/assets/favicon.svg +1 -0
- dist/assets/rise-agent.png +3 -0
- dist/data/leaderboard.json +0 -0
- dist/index.html +0 -0
- dist/portal.css +87 -0
- dist/portal.js +148 -0
- dist/styles.css +390 -0
- dist/submit.html +34 -0
- index.html +0 -0
- portal.css +87 -0
- portal.js +148 -0
- pyproject.toml +15 -0
- scripts/serve.py +21 -0
- server/__init__.py +1 -0
- server/app.py +267 -0
- server/storage.py +88 -0
- server/validation.py +160 -0
- styles.css +83 -0
- submit.html +34 -0
.gitattributes
CHANGED
|
@@ -35,3 +35,7 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
assets/judge-base.png filter=lfs diff=lfs merge=lfs -text
|
| 37 |
assets/judge-plus.png filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
assets/judge-base.png filter=lfs diff=lfs merge=lfs -text
|
| 37 |
assets/judge-plus.png filter=lfs diff=lfs merge=lfs -text
|
| 38 |
+
assets/benchmark-overview.png filter=lfs diff=lfs merge=lfs -text
|
| 39 |
+
assets/rise-agent.png filter=lfs diff=lfs merge=lfs -text
|
| 40 |
+
dist/assets/benchmark-overview.png filter=lfs diff=lfs merge=lfs -text
|
| 41 |
+
dist/assets/rise-agent.png filter=lfs diff=lfs merge=lfs -text
|
Dockerfile
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
FROM python:3.11-slim
|
| 2 |
+
RUN useradd -m -u 1000 user
|
| 3 |
+
WORKDIR /app
|
| 4 |
+
COPY pyproject.toml /app/
|
| 5 |
+
COPY server /app/server
|
| 6 |
+
RUN pip install --no-cache-dir .
|
| 7 |
+
COPY --chown=user scripts/serve.py /app/scripts/serve.py
|
| 8 |
+
COPY --chown=user dist /app/dist
|
| 9 |
+
USER user
|
| 10 |
+
ENV PYTHONUNBUFFERED=1 HF_HOME=/home/user/.cache/huggingface
|
| 11 |
+
EXPOSE 7860
|
| 12 |
+
CMD ["python", "scripts/serve.py"]
|
admin.html
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Review submissions · RISEBench</title><link rel="icon" href="assets/favicon.svg"><link rel="stylesheet" href="styles.css"><link rel="stylesheet" href="portal.css"></head>
|
| 3 |
+
<body data-page="admin"><main class="portal-width review-width">
|
| 4 |
+
<nav class="portal-nav" aria-label="Main navigation"><a class="wordmark" href="index.html">RISEBench<span>++</span></a><div><a href="index.html">Leaderboard</a><a href="submit.html">Submit results</a><button id="sign-out" class="text-button" hidden>Sign out</button></div></nav>
|
| 5 |
+
<header class="portal-heading"><span class="section-kicker">REVIEW WORKSPACE</span><h1>Review submissions.</h1><p>Verify evaluation artifacts, then approve or return results.</p></header>
|
| 6 |
+
<p class="notice" id="service-notice" hidden></p>
|
| 7 |
+
<section class="portal-card login-card" id="login-panel"><h2>Administrator sign in</h2><form id="login-form"><label id="passphrase-label">Passphrase<input type="password" id="admin-passphrase" autocomplete="current-password" required></label><p class="form-message" id="login-message" role="status"></p><button type="submit" class="primary-button" id="login-button">Sign in</button></form></section>
|
| 8 |
+
<section id="review-workspace" hidden><div class="review-toolbar"><div class="review-filters" role="group" aria-label="Submission status"><button data-status="pending" aria-pressed="true">Pending <span id="pending-count">0</span></button><button data-status="approved" aria-pressed="false">Approved</button><button data-status="rejected" aria-pressed="false">Returned</button><button data-status="withdrawn" aria-pressed="false">Withdrawn</button><button data-status="all" aria-pressed="false">All</button></div><button class="outline-button" id="refresh-queue">Refresh</button></div><p id="queue-message" class="form-message" role="status"></p><div class="review-layout"><aside class="review-list" id="review-list" aria-label="Submissions"></aside><section class="portal-card review-detail" id="review-detail"><div class="review-empty"><h2>Select a submission</h2><p>Its scores and evaluation artifacts will appear here.</p></div></section></div></section>
|
| 9 |
+
<footer class="page-footer"><a href="index.html">← Back to leaderboard</a><span>Private review workspace</span></footer>
|
| 10 |
+
</main><script id="submission-schema" type="application/json">{"benchmarks": [{"id": "risebench-plusplus", "name": "RISEBench++", "case_count": 1000, "available_result_languages": ["en", "zh"], "accuracy_unit": "%", "metric_unit": "/100", "score_decimals": 1, "default_sort": "total", "dimensions": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}, {"key": "counterfactual", "label": "Counterfactual", "description": "Visualize outcomes under hypothetical or contrary-to-fact conditions."}, {"key": "hybrid", "label": "Hybrid", "description": "Combine reasoning across three to five successive editing instructions."}], "metrics": [{"key": "instruction_reasoning", "label": "Instruction Reasoning", "description": "Whether the edit realizes the intended reasoning outcome."}, {"key": "appearance_consistency", "label": "Appearance Consistency", "description": "Whether content that should remain unchanged is preserved."}, {"key": "visual_plausibility", "label": "Visual Plausibility", "description": "Visual quality and plausibility; logical tasks are excluded."}], "accuracy_columns": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}, {"key": "counterfactual", "label": "Counterfactual", "description": "Visualize outcomes under hypothetical or contrary-to-fact conditions."}, {"key": "hybrid", "label": "Hybrid", "description": "Combine reasoning across three to five successive editing instructions."}, {"key": "single", "label": "Single", "description": "Accuracy on single-image cases."}, {"key": "multi", "label": "Multi", "description": "Accuracy on multi-image cases. Not evaluated for models without multi-image support."}, {"key": "total", "label": "Total", "description": "Accuracy on the complete benchmark. Not evaluated for single-image-only models."}], "subcategory_columns": [{"key": "temporal_common_sense_knowledge", "label": "Common-Sense Knowledge", "dimension": "temporal", "case_count": 85, "multi_image_case_count": 0, "code": "CSK", "description": "Temporal · Common-Sense Knowledge — accuracy (%)"}, {"key": "temporal_context_knowledge", "label": "Context Knowledge", "dimension": "temporal", "case_count": 52, "multi_image_case_count": 28, "code": "CtxK", "description": "Temporal · Context Knowledge — accuracy (%)"}, {"key": "temporal_disciplinary_knowledge", "label": "Disciplinary Knowledge", "dimension": "temporal", "case_count": 63, "multi_image_case_count": 4, "code": "DK", "description": "Temporal · Disciplinary Knowledge — accuracy (%)"}, {"key": "causal_common_sense_knowledge", "label": "Common-Sense Knowledge", "dimension": "causal", "case_count": 80, "multi_image_case_count": 1, "code": "CSK", "description": "Causal · Common-Sense Knowledge — accuracy (%)"}, {"key": "causal_context_knowledge", "label": "Context Knowledge", "dimension": "causal", "case_count": 40, "multi_image_case_count": 2, "code": "CtxK", "description": "Causal · Context Knowledge — accuracy (%)"}, {"key": "causal_disciplinary_knowledge", "label": "Disciplinary Knowledge", "dimension": "causal", "case_count": 80, "multi_image_case_count": 5, "code": "DK", "description": "Causal · Disciplinary Knowledge — accuracy (%)"}, {"key": "spatial_relation", "label": "Relation", "dimension": "spatial", "case_count": 106, "multi_image_case_count": 6, "code": "Rel.", "description": "Spatial · Relation — accuracy (%)"}, {"key": "spatial_structure", "label": "Structure", "dimension": "spatial", "case_count": 94, "multi_image_case_count": 12, "code": "Struct.", "description": "Spatial · Structure — accuracy (%)"}, {"key": "logical_explicit_rule_deduction", "label": "Explicit Rule Deduction", "dimension": "logical", "case_count": 123, "multi_image_case_count": 0, "code": "ERD", "description": "Logical · Explicit Rule Deduction — accuracy (%)"}, {"key": "logical_implicit_pattern_induction", "label": "Implicit Pattern Induction", "dimension": "logical", "case_count": 77, "multi_image_case_count": 20, "code": "IPI", "description": "Logical · Implicit Pattern Induction — accuracy (%)"}, {"key": "counterfactual_counterfactual_imagination", "label": "Counterfactual Imagination", "dimension": "counterfactual", "case_count": 70, "multi_image_case_count": 0, "code": "CFI", "description": "Counterfactual · Counterfactual Imagination — accuracy (%)"}, {"key": "counterfactual_anomaly_correction_and_generation", "label": "Anomaly Correction and Generation", "dimension": "counterfactual", "case_count": 30, "multi_image_case_count": 0, "code": "ACG", "description": "Counterfactual · Anomaly Correction and Generation — accuracy (%)"}], "task_type_columns": [{"key": "T01", "code": "T01", "label": "Life Progression", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 24, "multi_image_case_count": 0, "description": "Temporal · Life Progression — accuracy (%)"}, {"key": "T02", "code": "T02", "label": "Material Transformation", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 9, "multi_image_case_count": 0, "description": "Temporal · Material Transformation — accuracy (%)"}, {"key": "T03", "code": "T03", "label": "Natural Environmental Changes", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 13, "multi_image_case_count": 0, "description": "Temporal · Natural Environmental Changes — accuracy (%)"}, {"key": "T04", "code": "T04", "label": "Physical Aging", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 20, "multi_image_case_count": 0, "description": "Temporal · Physical Aging — accuracy (%)"}, {"key": "T05", "code": "T05", "label": "Social Activities", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 8, "multi_image_case_count": 0, "description": "Temporal · Social Activities — accuracy (%)"}, {"key": "T06", "code": "T06", "label": "Tool Evolution", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 7, "multi_image_case_count": 0, "description": "Temporal · Tool Evolution — accuracy (%)"}, {"key": "T07", "code": "T07", "label": "Urban Evolution", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Temporal · Urban Evolution — accuracy (%)"}, {"key": "T08", "code": "T08", "label": "Temporal State Transition", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 15, "multi_image_case_count": 4, "description": "Temporal · Temporal State Transition — accuracy (%)"}, {"key": "T09", "code": "T09", "label": "Precise Temporal Localization", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 14, "multi_image_case_count": 2, "description": "Temporal · Precise Temporal Localization — accuracy (%)"}, {"key": "T10", "code": "T10", "label": "Position Change", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 15, "multi_image_case_count": 14, "description": "Temporal · Position Change — accuracy (%)"}, {"key": "T11", "code": "T11", "label": "Action Sequence", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 8, "multi_image_case_count": 8, "description": "Temporal · Action Sequence — accuracy (%)"}, {"key": "T12", "code": "T12", "label": "Physics", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Temporal · Physics — accuracy (%)"}, {"key": "T13", "code": "T13", "label": "Chemistry", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 8, "multi_image_case_count": 4, "description": "Temporal · Chemistry — accuracy (%)"}, {"key": "T14", "code": "T14", "label": "Biology", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 9, "multi_image_case_count": 0, "description": "Temporal · Biology — accuracy (%)"}, {"key": "T15", "code": "T15", "label": "Astronomy", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 12, "multi_image_case_count": 0, "description": "Temporal · Astronomy — accuracy (%)"}, {"key": "T16", "code": "T16", "label": "Geography", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 18, "multi_image_case_count": 0, "description": "Temporal · Geography — accuracy (%)"}, {"key": "T17", "code": "T17", "label": "History", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 5, "multi_image_case_count": 0, "description": "Temporal · History — accuracy (%)"}, {"key": "T18", "code": "T18", "label": "Medicine", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Temporal · Medicine — accuracy (%)"}, {"key": "T19", "code": "T19", "label": "Computer Science", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 3, "multi_image_case_count": 0, "description": "Temporal · Computer Science — accuracy (%)"}, {"key": "C01", "code": "C01", "label": "Physical State Transition", "dimension": "causal", "subcategory": "causal_common_sense_knowledge", "case_count": 31, "multi_image_case_count": 0, "description": "Causal · Physical State Transition — accuracy (%)"}, {"key": "C02", "code": "C02", "label": "Structural Damage", "dimension": "causal", "subcategory": "causal_common_sense_knowledge", "case_count": 27, "multi_image_case_count": 0, "description": "Causal · Structural Damage — accuracy (%)"}, {"key": "C03", "code": "C03", "label": "Flexible Deformation", "dimension": "causal", "subcategory": "causal_common_sense_knowledge", "case_count": 22, "multi_image_case_count": 1, "description": "Causal · Flexible Deformation — accuracy (%)"}, {"key": "C04", "code": "C04", "label": "Magnitude Change", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Magnitude Change — accuracy (%)"}, {"key": "C05", "code": "C05", "label": "Reading Offset", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 2, "description": "Causal · Reading Offset — accuracy (%)"}, {"key": "C06", "code": "C06", "label": "Order Relation", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Order Relation — accuracy (%)"}, {"key": "C07", "code": "C07", "label": "Feature Mapping", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Feature Mapping — accuracy (%)"}, {"key": "C08", "code": "C08", "label": "Physics", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 25, "multi_image_case_count": 1, "description": "Causal · Physics — accuracy (%)"}, {"key": "C09", "code": "C09", "label": "Chemistry", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 23, "multi_image_case_count": 4, "description": "Causal · Chemistry — accuracy (%)"}, {"key": "C10", "code": "C10", "label": "Biology", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 12, "multi_image_case_count": 0, "description": "Causal · Biology — accuracy (%)"}, {"key": "C11", "code": "C11", "label": "Astronomy", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 3, "multi_image_case_count": 0, "description": "Causal · Astronomy — accuracy (%)"}, {"key": "C12", "code": "C12", "label": "Medicine", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Causal · Medicine — accuracy (%)"}, {"key": "C13", "code": "C13", "label": "Music Theory", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 3, "multi_image_case_count": 0, "description": "Causal · Music Theory — accuracy (%)"}, {"key": "C14", "code": "C14", "label": "Computer Science", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Computer Science — accuracy (%)"}, {"key": "S01", "code": "S01", "label": "Adjacency", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 11, "multi_image_case_count": 0, "description": "Spatial · Adjacency — accuracy (%)"}, {"key": "S02", "code": "S02", "label": "Direction", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 11, "multi_image_case_count": 0, "description": "Spatial · Direction — accuracy (%)"}, {"key": "S03", "code": "S03", "label": "Orientation", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 11, "multi_image_case_count": 0, "description": "Spatial · Orientation — accuracy (%)"}, {"key": "S04", "code": "S04", "label": "Projection", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 12, "multi_image_case_count": 0, "description": "Spatial · Projection — accuracy (%)"}, {"key": "S05", "code": "S05", "label": "Distance", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 13, "multi_image_case_count": 0, "description": "Spatial · Distance — accuracy (%)"}, {"key": "S06", "code": "S06", "label": "Size", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 15, "multi_image_case_count": 0, "description": "Spatial · Size — accuracy (%)"}, {"key": "S07", "code": "S07", "label": "Configuration", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 18, "multi_image_case_count": 0, "description": "Spatial · Configuration — accuracy (%)"}, {"key": "S08", "code": "S08", "label": "Viewing Scale", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 9, "multi_image_case_count": 0, "description": "Spatial · Viewing Scale — accuracy (%)"}, {"key": "S09", "code": "S09", "label": "Localization", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 6, "multi_image_case_count": 6, "description": "Spatial · Localization — accuracy (%)"}, {"key": "S10", "code": "S10", "label": "Part-Whole Perception", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 24, "multi_image_case_count": 0, "description": "Spatial · Part-Whole Perception — accuracy (%)"}, {"key": "S11", "code": "S11", "label": "Geometric Regularities Reasoning", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 15, "multi_image_case_count": 0, "description": "Spatial · Geometric Regularities Reasoning — accuracy (%)"}, {"key": "S12", "code": "S12", "label": "Viewpoint Generation", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 26, "multi_image_case_count": 0, "description": "Spatial · Viewpoint Generation — accuracy (%)"}, {"key": "S13", "code": "S13", "label": "Environmental Structure Reasoning", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 19, "multi_image_case_count": 2, "description": "Spatial · Environmental Structure Reasoning — accuracy (%)"}, {"key": "S14", "code": "S14", "label": "Egocentric Scene Reconstruction", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 10, "multi_image_case_count": 10, "description": "Spatial · Egocentric Scene Reconstruction — accuracy (%)"}, {"key": "L01", "code": "L01", "label": "Path Searching", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 24, "multi_image_case_count": 0, "description": "Logical · Path Searching — accuracy (%)"}, {"key": "L02", "code": "L02", "label": "Mathematical Derivation", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 27, "multi_image_case_count": 0, "description": "Logical · Mathematical Derivation — accuracy (%)"}, {"key": "L03", "code": "L03", "label": "Game Deduction", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 37, "multi_image_case_count": 0, "description": "Logical · Game Deduction — accuracy (%)"}, {"key": "L04", "code": "L04", "label": "Puzzle Solving", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 35, "multi_image_case_count": 0, "description": "Logical · Puzzle Solving — accuracy (%)"}, {"key": "L05", "code": "L05", "label": "Pattern Prediction", "dimension": "logical", "subcategory": "logical_implicit_pattern_induction", "case_count": 39, "multi_image_case_count": 0, "description": "Logical · Pattern Prediction — accuracy (%)"}, {"key": "L06", "code": "L06", "label": "Visual Oddity Detection", "dimension": "logical", "subcategory": "logical_implicit_pattern_induction", "case_count": 18, "multi_image_case_count": 0, "description": "Logical · Visual Oddity Detection — accuracy (%)"}, {"key": "L07", "code": "L07", "label": "Rule Transfer", "dimension": "logical", "subcategory": "logical_implicit_pattern_induction", "case_count": 20, "multi_image_case_count": 20, "description": "Logical · Rule Transfer — accuracy (%)"}, {"key": "F01", "code": "F01", "label": "Physical Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 23, "multi_image_case_count": 0, "description": "Counterfactual · Physical Counterfactual — accuracy (%)"}, {"key": "F02", "code": "F02", "label": "Chemical Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 9, "multi_image_case_count": 0, "description": "Counterfactual · Chemical Counterfactual — accuracy (%)"}, {"key": "F03", "code": "F03", "label": "Biological Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 8, "multi_image_case_count": 0, "description": "Counterfactual · Biological Counterfactual — accuracy (%)"}, {"key": "F04", "code": "F04", "label": "Astronomy Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 7, "multi_image_case_count": 0, "description": "Counterfactual · Astronomy Counterfactual — accuracy (%)"}, {"key": "F05", "code": "F05", "label": "Geography Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 8, "multi_image_case_count": 0, "description": "Counterfactual · Geography Counterfactual — accuracy (%)"}, {"key": "F06", "code": "F06", "label": "History Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 7, "multi_image_case_count": 0, "description": "Counterfactual · History Counterfactual — accuracy (%)"}, {"key": "F07", "code": "F07", "label": "Music Theory Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 4, "multi_image_case_count": 0, "description": "Counterfactual · Music Theory Counterfactual — accuracy (%)"}, {"key": "F08", "code": "F08", "label": "Computer Science Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 4, "multi_image_case_count": 0, "description": "Counterfactual · Computer Science Counterfactual — accuracy (%)"}, {"key": "F09", "code": "F09", "label": "Anatomical Errors", "dimension": "counterfactual", "subcategory": "counterfactual_anomaly_correction_and_generation", "case_count": 10, "multi_image_case_count": 0, "description": "Counterfactual · Anatomical Errors — accuracy (%)"}, {"key": "F10", "code": "F10", "label": "Structural Anomalies", "dimension": "counterfactual", "subcategory": "counterfactual_anomaly_correction_and_generation", "case_count": 11, "multi_image_case_count": 0, "description": "Counterfactual · Structural Anomalies — accuracy (%)"}, {"key": "F11", "code": "F11", "label": "Relational Anomalies", "dimension": "counterfactual", "subcategory": "counterfactual_anomaly_correction_and_generation", "case_count": 9, "multi_image_case_count": 0, "description": "Counterfactual · Relational Anomalies — accuracy (%)"}], "links": {"paper": "https://arxiv.org/abs/2610.12343", "data": "https://huggingface.co/datasets/VisionXLab/RISEBench-plusplus", "outputs": "https://huggingface.co/datasets/VisionXLab/RISEBench-plusplus_Outputs", "github": "https://github.com/VisionXLab/RISEBench/tree/main/RISEBench%2B%2B"}, "judges": {"instruction_reasoning": "Gemini-3-Flash", "appearance_consistency": "Gemini-3-Flash", "visual_plausibility": "Gemini-3.1-Flash-Lite"}, "results_by_language": {"en": {"models": [{"id": "gpt-image-2-5-sunburst", "name": "GPT-Image-2.5 Sunburst"}, {"id": "nano-banana-pro", "name": "Nano Banana Pro"}, {"id": "nano-banana-2", "name": "Nano Banana 2"}, {"id": "gpt-image-2", "name": "GPT-Image-2"}, {"id": "gpt-image-2-5-flare", "name": "GPT-Image-2.5 Flare"}, {"id": "luma-uni-1", "name": "Luma Uni-1"}, {"id": "qwen-image-3-0", "name": "Qwen-Image-3.0"}, {"id": "nano-banana-2-lite", "name": "Nano Banana 2 Lite"}, {"id": "flux-2-max", "name": "FLUX.2 Max"}, {"id": "gpt-image-1-5", "name": "GPT-Image-1.5"}, {"id": "flux-2-pro", "name": "FLUX.2 Pro"}, {"id": "nano-banana", "name": "Nano Banana"}, {"id": "hunyuanimage-3-5", "name": "HunyuanImage-3.5"}, {"id": "wan2-7-image-pro", "name": "Wan2.7-Image-Pro"}, {"id": "gpt-image-1", "name": "GPT-Image-1"}, {"id": "qwen-image-2-0", "name": "Qwen-Image-2.0"}, {"id": "seedream-4-5", "name": "Seedream 4.5"}, {"id": "seedream-5-0", "name": "Seedream 5.0"}, {"id": "step-image-edit-2", "name": "Step Image Edit 2"}, {"id": "hunyuanimage-3-0-instruct", "name": "HunyuanImage-3.0-Instruct"}, {"id": "qwen-image-edit-2511", "name": "Qwen-Image-Edit-2511"}, {"id": "qwen-image-2-1", "name": "Qwen-Image-2.1"}, {"id": "firered-image-edit-1-0", "name": "FireRed-Image-Edit-1.0"}, {"id": "firered-image-edit-1-1", "name": "FireRed-Image-Edit-1.1"}, {"id": "qwen-image-edit-2509", "name": "Qwen-Image-Edit-2509"}, {"id": "hidream-o1-image", "name": "HiDream-O1-Image"}, {"id": "flux-2-dev", "name": "FLUX.2 Dev"}, {"id": "flux-2-klein-9b", "name": "FLUX.2 Klein 9B"}, {"id": "joyai-image-edit-plus", "name": "JoyAI-Image-Edit-Plus"}, {"id": "sensenova-u1-a3b-mot-sft", "name": "SenseNova-U1-A3B-MoT-SFT"}, {"id": "unipic-3-0", "name": "UniPic 3.0"}, {"id": "bagel-w-cot", "name": "BAGEL (w/ CoT)"}, {"id": "sensenova-u1-8b-mot-sft", "name": "SenseNova-U1-8B-MoT-SFT"}, {"id": "flux-2-klein-4b", "name": "FLUX.2 Klein 4B"}, {"id": "uniworld-v2", "name": "UniWorld-V2"}, {"id": "bagel", "name": "BAGEL"}, {"id": "omnigen2", "name": "OmniGen2"}, {"id": "omnigen", "name": "OmniGen"}, {"id": "emu2-gen", "name": "Emu2-Gen"}, {"id": "joyai-image-edit", "name": "JoyAI-Image-Edit"}, {"id": "step1x-edit-thinking", "name": "Step1X-Edit (thinking)"}, {"id": "boogu-image-0-1-edit", "name": "Boogu-Image-0.1-Edit"}, {"id": "step1x-edit-thinking-reflection", "name": "Step1X-Edit (thinking + reflection)"}, {"id": "longcat-image-edit", "name": "LongCat-Image-Edit"}, {"id": "step1x-edit-base", "name": "Step1X-Edit (base)"}, {"id": "internvl-u-w-cot", "name": "InternVL-U (w/ CoT)"}, {"id": "flux-1-kontext-dev", "name": "FLUX.1 Kontext Dev"}, {"id": "llada-image", "name": "LLaDA-Image"}, {"id": "ovis-u1", "name": "Ovis-U1"}, {"id": "internvl-u", "name": "InternVL-U"}, {"id": "unipic2-sd3-5m-kontext-2b", "name": "UniPic2-SD3.5M-Kontext-2B"}, {"id": "lumina-dimoo", "name": "Lumina-DiMOO"}, {"id": "uniworld-v1", "name": "UniWorld-V1"}, {"id": "rise-agent-ours", "name": "RISE-Agent (Ours)"}, {"id": "mindbrush", "name": "MindBrush"}, {"id": "interleavethinker", "name": "InterleaveThinker"}, {"id": "intentedit", "name": "IntentEdit"}, {"id": "imagent", "name": "ImAgent"}]}, "zh": {"models": [{"id": "gpt-image-2-5-sunburst", "name": "GPT-Image-2.5 Sunburst"}, {"id": "nano-banana-pro", "name": "Nano Banana Pro"}, {"id": "nano-banana-2", "name": "Nano Banana 2"}, {"id": "luma-uni-1", "name": "Luma Uni-1"}, {"id": "gpt-image-2", "name": "GPT-Image-2"}, {"id": "qwen-image-3-0", "name": "Qwen-Image-3.0"}, {"id": "gpt-image-2-5-flare", "name": "GPT-Image-2.5 Flare"}, {"id": "flux-2-max", "name": "FLUX.2 Max"}, {"id": "nano-banana-2-lite", "name": "Nano Banana 2 Lite"}, {"id": "gpt-image-1-5", "name": "GPT-Image-1.5"}, {"id": "nano-banana", "name": "Nano Banana"}, {"id": "flux-2-pro", "name": "FLUX.2 Pro"}, {"id": "hunyuanimage-3-5", "name": "HunyuanImage-3.5"}, {"id": "wan2-7-image-pro", "name": "Wan2.7-Image-Pro"}, {"id": "qwen-image-2-0", "name": "Qwen-Image-2.0"}, {"id": "seedream-4-5", "name": "Seedream 4.5"}, {"id": "seedream-5-0", "name": "Seedream 5.0"}, {"id": "gpt-image-1", "name": "GPT-Image-1"}, {"id": "step-image-edit-2", "name": "Step Image Edit 2"}, {"id": "hunyuanimage-3-0-instruct", "name": "HunyuanImage-3.0-Instruct"}, {"id": "qwen-image-2-1", "name": "Qwen-Image-2.1"}, {"id": "firered-image-edit-1-1", "name": "FireRed-Image-Edit-1.1"}, {"id": "flux-2-dev", "name": "FLUX.2 Dev"}, {"id": "qwen-image-edit-2511", "name": "Qwen-Image-Edit-2511"}, {"id": "qwen-image-edit-2509", "name": "Qwen-Image-Edit-2509"}, {"id": "firered-image-edit-1-0", "name": "FireRed-Image-Edit-1.0"}, {"id": "sensenova-u1-a3b-mot-sft", "name": "SenseNova-U1-A3B-MoT-SFT"}, {"id": "joyai-image-edit-plus", "name": "JoyAI-Image-Edit-Plus"}, {"id": "flux-2-klein-9b", "name": "FLUX.2 Klein 9B"}, {"id": "bagel-w-cot", "name": "BAGEL (w/ CoT)"}, {"id": "hidream-o1-image", "name": "HiDream-O1-Image"}, {"id": "flux-2-klein-4b", "name": "FLUX.2 Klein 4B"}, {"id": "uniworld-v2", "name": "UniWorld-V2"}, {"id": "sensenova-u1-8b-mot-sft", "name": "SenseNova-U1-8B-MoT-SFT"}, {"id": "unipic-3-0", "name": "UniPic 3.0"}, {"id": "bagel", "name": "BAGEL"}, {"id": "omnigen2", "name": "OmniGen2"}, {"id": "omnigen", "name": "OmniGen"}, {"id": "emu2-gen", "name": "Emu2-Gen"}, {"id": "joyai-image-edit", "name": "JoyAI-Image-Edit"}, {"id": "boogu-image-0-1-edit", "name": "Boogu-Image-0.1-Edit"}, {"id": "step1x-edit-thinking-reflection", "name": "Step1X-Edit (thinking + reflection)"}, {"id": "step1x-edit-thinking", "name": "Step1X-Edit (thinking)"}, {"id": "step1x-edit-base", "name": "Step1X-Edit (base)"}, {"id": "longcat-image-edit", "name": "LongCat-Image-Edit"}, {"id": "flux-1-kontext-dev", "name": "FLUX.1 Kontext Dev"}, {"id": "llada-image", "name": "LLaDA-Image"}, {"id": "internvl-u-w-cot", "name": "InternVL-U (w/ CoT)"}, {"id": "ovis-u1", "name": "Ovis-U1"}, {"id": "internvl-u", "name": "InternVL-U"}, {"id": "lumina-dimoo", "name": "Lumina-DiMOO"}, {"id": "uniworld-v1", "name": "UniWorld-V1"}, {"id": "unipic2-sd3-5m-kontext-2b", "name": "UniPic2-SD3.5M-Kontext-2B"}, {"id": "rise-agent-ours", "name": "RISE-Agent (Ours)"}, {"id": "mindbrush", "name": "MindBrush"}, {"id": "interleavethinker", "name": "InterleaveThinker"}, {"id": "intentedit", "name": "IntentEdit"}, {"id": "imagent", "name": "ImAgent"}]}}}, {"id": "risebench", "name": "RISEBench", "case_count": 360, "available_result_languages": ["en"], "accuracy_unit": "%", "metric_unit": "/100", "score_decimals": 1, "default_sort": "total", "dimensions": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}], "metrics": [{"key": "instruction_reasoning", "label": "Instruction Reasoning", "description": "Whether the edit realizes the intended reasoning outcome."}, {"key": "appearance_consistency", "label": "Appearance Consistency", "description": "Whether content that should remain unchanged is preserved."}, {"key": "visual_plausibility", "label": "Visual Plausibility", "description": "Visual quality and plausibility; logical tasks are excluded."}], "accuracy_columns": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}, {"key": "total", "label": "Overall", "description": "Accuracy on the complete RISEBench-360 benchmark."}], "links": {"paper": "https://arxiv.org/abs/2504.02826", "data": "https://huggingface.co/datasets/PhoenixZ/RISEBench", "outputs": "https://huggingface.co/datasets/zpy777/RISEBench_Outputs", "github": "https://github.com/VisionXLab/RISEBench/tree/main/RISEBench"}, "judges": {"instruction_reasoning": "GPT-4o", "appearance_consistency": "GPT-4o", "visual_plausibility": "GPT-4o"}, "results_by_language": {"en": {"models": [{"id": "gpt-image-1-5", "name": "GPT-Image-1.5"}, {"id": "gpt-image-2", "name": "GPT-Image-2"}, {"id": "gemini-3-pro-image-preview-nano-banana-pro", "name": "Gemini-3-pro-image-preview (Nano Banana-pro)"}, {"id": "gemini-2-5-flash-image-nano-banana", "name": "Gemini-2.5-Flash-Image (Nano Banana)"}, {"id": "gpt-image-1", "name": "GPT-Image-1"}, {"id": "gpt-image-1-mini", "name": "GPT-Image-1-mini"}, {"id": "qwen-image-edit-2511", "name": "Qwen-Image-Edit-2511"}, {"id": "bagel-w-cot", "name": "BAGEL (w/ CoT)"}, {"id": "gemini-2-0-flash-exp", "name": "Gemini-2.0-Flash-exp"}, {"id": "seedream-4-0", "name": "Seedream-4.0"}, {"id": "gemini-2-0-flash-pre", "name": "Gemini-2.0-Flash-pre"}, {"id": "qwen-image-edit-2509", "name": "Qwen-Image-Edit-2509"}, {"id": "bagel", "name": "BAGEL"}, {"id": "flux-1-kontext-dev", "name": "FLUX.1-Kontext-Dev"}, {"id": "ovis-u1", "name": "Ovis-U1"}, {"id": "step1x-edit", "name": "Step1X-Edit"}, {"id": "omnigen", "name": "OmniGen"}, {"id": "emu2", "name": "EMU2"}, {"id": "hidream-edit", "name": "HiDream-Edit"}, {"id": "flux-1-canny", "name": "FLUX.1-Canny"}]}}}]}</script><script src="portal.js" defer></script></body></html>
|
app.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
'use strict';
|
| 2 |
(() => {
|
| 3 |
-
|
| 4 |
const CITATIONS = JSON.parse(document.getElementById('citation-data').textContent);
|
| 5 |
const $ = (selector) => document.querySelector(selector);
|
| 6 |
const $$ = (selector) => [...document.querySelectorAll(selector)];
|
|
@@ -9,14 +9,14 @@
|
|
| 9 |
const colors = ['#3283bf','#2d9a86','#9b75bd'];
|
| 10 |
const params = new URLSearchParams(location.search);
|
| 11 |
const initialBenchmark = DATA.benchmarks.find(b => b.id === params.get('benchmark')) || DATA.benchmarks[0];
|
| 12 |
-
const state = {benchmark:initialBenchmark.id,language:params.get('language')==='zh'?'zh':'en',view:'accuracy',sort:'total',direction:'desc',group:'all',input:'all',query:'',selected:[],visible:[]};
|
| 13 |
let toastTimer;
|
| 14 |
const benchmarkMetadata = () => DATA.benchmarks.find(b => b.id === state.benchmark);
|
| 15 |
const languageCode = () => benchmarkMetadata().results_by_language[state.language] ? state.language : 'en';
|
| 16 |
const benchmark = () => ({...benchmarkMetadata(), ...benchmarkMetadata().results_by_language[languageCode()]});
|
| 17 |
const resultLanguageLabel = () => state.benchmark==='risebench-plusplus' ? benchmark().language : 'Original';
|
| 18 |
const modelById = id => benchmark().models.find(m => m.id === id);
|
| 19 |
-
const score = (model, key = state.sort) => model[state.view][key] ?? null;
|
| 20 |
const fmt = value => value == null ? '—' : value.toFixed(1);
|
| 21 |
const summaryKeys = ['total','single','multi'];
|
| 22 |
const orderedAccuracyColumns = () => {
|
|
@@ -25,7 +25,15 @@
|
|
| 25 |
? [...columns.filter(c=>!summaryKeys.includes(c.key)), ...summaryKeys.map(key=>columns.find(c=>c.key===key))]
|
| 26 |
: [columns.find(c=>c.key==='total'), ...columns.filter(c=>c.key!=='total')];
|
| 27 |
};
|
| 28 |
-
const
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 29 |
const scoreLabel = key => availableColumns().find(c=>c.key===key)?.label || key;
|
| 30 |
const isPlus = () => state.benchmark === 'risebench-plusplus';
|
| 31 |
function toast(message) {
|
|
@@ -55,30 +63,62 @@
|
|
| 55 |
function renderResources() {
|
| 56 |
const b=benchmark();
|
| 57 |
$('#hero-links').innerHTML=[['Paper','paper'],['Dataset','data'],['Outputs','outputs'],['Code','github']].map(([label,key])=>`<a href="${esc(b.links[key])}" target="_blank" rel="noopener noreferrer">${label} <span aria-hidden="true">↗</span></a>`).join('');
|
|
|
|
|
|
|
| 58 |
$('#board-options').hidden=b.available_result_languages.length<2;
|
| 59 |
$$('[data-language]').forEach(button=>button.setAttribute('aria-pressed',button.dataset.language===languageCode()));
|
| 60 |
$('#group-filters').innerHTML=isPlus()?['all','closed','open','agentic'].map(g=>`<button data-group="${g}" aria-pressed="${state.group===g}">${g==='all'?'All models':groupLabels[g]}<span>${g==='all'?b.models.length:b.models.filter(m=>m.group===g).length}</span></button>`).join(''):'<span class="caption-text">All models</span>';
|
| 61 |
$('.input-filter').hidden=!isPlus();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 62 |
renderColumns();
|
| 63 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 64 |
function renderColumns() {
|
| 65 |
-
$('#column-options').innerHTML='<div class="eyebrow muted" >VISIBLE SCORE COLUMNS</div>'+availableColumns().map(c=>`<label><input type="checkbox" data-column="${c.key}" ${state.visible.includes(c.key)?'checked':''}>${esc(c
|
| 66 |
}
|
| 67 |
function renderTable() {
|
| 68 |
const b=benchmark(), models=filteredModels(), columns=availableColumns().filter(c=>state.visible.includes(c.key));
|
| 69 |
-
const minimumWidth=370+(isPlus()?86:0)+columns.length*96;
|
| 70 |
$('#results-table').style.minWidth=minimumWidth+'px';
|
| 71 |
-
$('#
|
|
|
|
| 72 |
const summaryClass=key=>isPlus()&&summaryKeys.includes(key)?'summary-result':'';
|
| 73 |
const sortableHeader=c=>`<th scope="col" class="${summaryClass(c.key)} ${state.sort===c.key?'active-sort':''}" aria-sort="${state.sort===c.key?(state.direction==='desc'?'descending':'ascending'):'none'}"><button data-sort="${c.key}" title="${esc(c.description)} — sort ${state.sort===c.key&&state.direction==='desc'?'ascending':'descending'}"><span>${c.key==='counterfactual'?'Counter-<br>factual':c.key==='instruction_reasoning'?'Instruction<br>Reasoning':c.key==='appearance_consistency'?'Appearance<br>Consistency':c.key==='visual_plausibility'?'Visual<br>Plausibility':esc(c.label)}</span><span class="sort-icon" aria-hidden="true">${state.sort===c.key?(state.direction==='desc'?'↓':'↑'):'↕'}</span></button></th>`;
|
| 74 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 75 |
$('#table-body').innerHTML=models.map(m=>{
|
| 76 |
const rank=rankOf(m), ours=m.id==='rise-agent-ours';
|
| 77 |
-
const cells=columns.map(c=>{const v=score(m,c.key), featured=isPlus()&&summaryKeys.includes(c.key), tint=v==null?0:(featured ? .065+(v/100)*.10 : .02+(v/100)*.055);return `<td class="score-cell ${summaryClass(c.key)} ${c.key==='total'?'overall':''} ${v===null?'missing':''}" style="background-color:rgba(88,118,158,${tint.toFixed(4)})" title="${esc(c.label)}: ${v===null?'Not evaluated':fmt(v)+(state.view==='
|
| 78 |
return `<tr class="${ours?'ours ':''}${state.selected.includes(m.id)?'selected':''}"><td class="select-cell"><input type="checkbox" data-select="${esc(m.id)}" aria-label="Compare ${esc(m.name)}" ${state.selected.includes(m.id)?'checked':''}></td><td class="rank-cell">${rank===null?'—':`<span class="${rank<=3?'rank-top rank-'+rank:''}">${rank}</span>`}</td><th scope="row" class="model-cell" style="position:sticky;top:auto"><button class="model-button" data-model="${esc(m.id)}">${esc(m.name)}</button><span class="model-meta">${m.group?`<span class="group-dot ${m.group}"></span>${groupLabels[m.group]}`:''}${ours?'<span class="ours-badge">OURS</span>':''}</span></th>${isPlus()?`<td><span class="input-pill ${m.multi_image?'multi':''}" title="${m.multi_image?'Supports multiple input images':'Single-image only'}">${m.multi_image?'Multi':'Single'}</span></td>`:''}${cells}</tr>`;
|
| 79 |
}).join('');
|
| 80 |
$('#empty-state').hidden=models.length>0; $('#results-table').hidden=models.length===0;
|
| 81 |
$('#result-count').innerHTML=`<strong>${models.length}</strong>${models.length<b.models.length?' / '+b.models.length:''} models`;
|
|
|
|
| 82 |
$('#reset-filters').hidden=!(state.query||state.group!=='all'||state.input!=='all');
|
| 83 |
$$('#group-filters button').forEach(el=>el.setAttribute('aria-pressed',el.dataset.group===state.group));
|
| 84 |
renderTray();
|
|
@@ -117,18 +157,22 @@
|
|
| 117 |
renderResources();renderTable();saveState();
|
| 118 |
}
|
| 119 |
function switchView(view) {
|
| 120 |
-
|
|
|
|
|
|
|
|
|
|
| 121 |
$$('[data-view]').forEach(btn=>btn.setAttribute('aria-pressed',btn.dataset.view===view));
|
| 122 |
-
renderColumns();renderTable();
|
| 123 |
}
|
| 124 |
function download(name,content,type) {
|
| 125 |
const url=URL.createObjectURL(new Blob([content],{type}));const a=document.createElement('a');a.href=url;a.download=name;document.body.appendChild(a);a.click();a.remove();setTimeout(()=>URL.revokeObjectURL(url),1000);
|
| 126 |
}
|
| 127 |
function exportCSV(models,name='filtered') {
|
| 128 |
-
const b=benchmark(),
|
| 129 |
-
const
|
| 130 |
-
const
|
| 131 |
-
|
|
|
|
| 132 |
}
|
| 133 |
function radar(models) {
|
| 134 |
const dims=benchmark().dimensions, cx=205,cy=156,r=98,n=dims.length;
|
|
@@ -146,13 +190,13 @@
|
|
| 146 |
function showModels(ids) {
|
| 147 |
const b=benchmark(), models=ids.map(modelById).filter(Boolean);if(!models.length)return;
|
| 148 |
const mixed=isPlus()&&new Set(models.map(m=>m.multi_image)).size>1;
|
| 149 |
-
const tableSection=(title,fields,type)=>`<tr class="comparison-section"><td colspan="${models.length+1}">${title}</td></tr>`+fields.map(c=>{const vals=models.map(m=>m[type][c.key]);const max=Math.max(...vals.filter(v=>v!==null));return `<tr><td>${esc(c.label)}</td>${vals.map(v=>`<td class="${v!==null&&v===max&&models.length>1?'best-value':''}">${fmt(v)}${v!==null&&type==
|
| 150 |
-
showDialog(b.name+' · '+resultLanguageLabel().toUpperCase()+' RESULTS',`<h2 class="dialog-title" id="dialog-title">${models.length===1?esc(models[0].name):'Model comparison'}</h2>${mixed?'<p class="comparison-warning">These models use different evaluation subsets: single-image only and full benchmark.</p>':''}<div class="comparison-layout">${radar(models)}<div class="compare-summaries">${models.map((m,i)=>`<div class="compare-summary"><div><h4><span class="series-dot" style="background:${colors[i]}"></span>${esc(m.name)}</h4><p>${esc(groupLabels[m.group]||b.name)}${isPlus()?' · '+(m.multi_image?'Multi-image supported':'Single-image only'):''}</p></div><strong style="color:${colors[i]}">${fmt(m.accuracy.total)}<small> ${m.accuracy.total!==null?'%':''}<br>${isPlus()?'Total':'Overall'}</small></strong></div>`).join('')}${models.some(m=>m.accuracy.total===null)?'<p class="caption-text">Single-image-only models have no Total score.</p>':''}</div></div><div class="comparison-table-wrap"><table class="comparison-table"><thead><tr><th>Metric</th>${models.map((m,i)=>`<th><span class="series-dot" style="background:${colors[i]}"></span>${esc(m.name)}</th>`).join('')}</tr></thead><tbody>${tableSection('REASONING ACCURACY (%)',isPlus()?orderedAccuracyColumns():b.accuracy_columns,'accuracy')}${tableSection('EVALUATION SCORES (/100)',b.metrics,'metrics')}</tbody></table></div><div class="dialog-actions"><button class="outline-button" id="dialog-export">Export ${models.length===1?'model':'comparison'} CSV ↓</button></div>`);
|
| 151 |
$('#dialog-export').addEventListener('click',()=>exportCSV(models,'comparison'));
|
| 152 |
}
|
| 153 |
async function copyCitation(text,button) {
|
| 154 |
try {await navigator.clipboard.writeText(text);button.textContent='Copied ✓';toast('BibTeX copied.');}
|
| 155 |
-
catch(_){const area=document.createElement('textarea');area.value=text;$('#dialog-content').appendChild(area);area.select();const copied=document.execCommand('copy');area.remove();toast(copied?'BibTeX copied.':'Select and copy the citation below.');}
|
| 156 |
}
|
| 157 |
function showCitation() {
|
| 158 |
const citation=CITATIONS[state.benchmark];
|
|
@@ -165,6 +209,7 @@
|
|
| 165 |
if(button.dataset.benchmark)switchBenchmark(button.dataset.benchmark);
|
| 166 |
if(button.dataset.view)switchView(button.dataset.view);
|
| 167 |
if(button.dataset.language)switchLanguage(button.dataset.language);
|
|
|
|
| 168 |
if(button.dataset.group){state.group=button.dataset.group;renderTable();}
|
| 169 |
if(button.dataset.sort){state.direction=state.sort===button.dataset.sort&&state.direction==='desc'?'asc':'desc';state.sort=button.dataset.sort;renderTable();}
|
| 170 |
if(button.dataset.model)showModels([button.dataset.model]);
|
|
@@ -182,6 +227,9 @@
|
|
| 182 |
});
|
| 183 |
$('#model-search').addEventListener('input',e=>{state.query=e.target.value;renderTable();});
|
| 184 |
$('#input-filter').addEventListener('change',e=>{state.input=e.target.value;renderTable();});
|
|
|
|
|
|
|
|
|
|
| 185 |
$('#reset-filters').addEventListener('click',resetFilters);$('#empty-reset').addEventListener('click',resetFilters);
|
| 186 |
$('#download-csv').addEventListener('click',()=>exportCSV(filteredModels()));
|
| 187 |
$('#compare-open').addEventListener('click',()=>showModels(state.selected));
|
|
@@ -194,10 +242,17 @@
|
|
| 194 |
if(e.key==='/'&&!['INPUT','TEXTAREA','SELECT'].includes(document.activeElement.tagName)&&!$('#detail-dialog').open){e.preventDefault();$('#model-search').focus();}
|
| 195 |
const tab=e.target.closest('[data-benchmark], [data-view], [data-language]');
|
| 196 |
if(tab&&['ArrowLeft','ArrowRight','Home','End'].includes(e.key)){
|
| 197 |
-
e.preventDefault();const siblings=[...tab.parentElement.querySelectorAll('[data-benchmark], [data-view], [data-language]')],i=siblings.indexOf(tab);
|
| 198 |
const n=e.key==='Home'?0:e.key==='End'?siblings.length-1:(i+(e.key==='ArrowRight'?1:-1)+siblings.length)%siblings.length;
|
| 199 |
siblings[n].click();siblings[n].focus();
|
| 200 |
}
|
| 201 |
});
|
| 202 |
switchBenchmark(state.benchmark);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 203 |
})();
|
|
|
|
| 1 |
'use strict';
|
| 2 |
(() => {
|
| 3 |
+
let DATA = JSON.parse(document.getElementById('leaderboard-data').textContent);
|
| 4 |
const CITATIONS = JSON.parse(document.getElementById('citation-data').textContent);
|
| 5 |
const $ = (selector) => document.querySelector(selector);
|
| 6 |
const $$ = (selector) => [...document.querySelectorAll(selector)];
|
|
|
|
| 9 |
const colors = ['#3283bf','#2d9a86','#9b75bd'];
|
| 10 |
const params = new URLSearchParams(location.search);
|
| 11 |
const initialBenchmark = DATA.benchmarks.find(b => b.id === params.get('benchmark')) || DATA.benchmarks[0];
|
| 12 |
+
const state = {benchmark:initialBenchmark.id,language:params.get('language')==='zh'?'zh':'en',view:'accuracy',dimension:'temporal',subcategory:'all',sort:'total',direction:'desc',group:'all',input:'all',query:'',selected:[],visible:[]};
|
| 13 |
let toastTimer;
|
| 14 |
const benchmarkMetadata = () => DATA.benchmarks.find(b => b.id === state.benchmark);
|
| 15 |
const languageCode = () => benchmarkMetadata().results_by_language[state.language] ? state.language : 'en';
|
| 16 |
const benchmark = () => ({...benchmarkMetadata(), ...benchmarkMetadata().results_by_language[languageCode()]});
|
| 17 |
const resultLanguageLabel = () => state.benchmark==='risebench-plusplus' ? benchmark().language : 'Original';
|
| 18 |
const modelById = id => benchmark().models.find(m => m.id === id);
|
| 19 |
+
const score = (model, key = state.sort) => model[state.view]?.[key] ?? null;
|
| 20 |
const fmt = value => value == null ? '—' : value.toFixed(1);
|
| 21 |
const summaryKeys = ['total','single','multi'];
|
| 22 |
const orderedAccuracyColumns = () => {
|
|
|
|
| 25 |
? [...columns.filter(c=>!summaryKeys.includes(c.key)), ...summaryKeys.map(key=>columns.find(c=>c.key===key))]
|
| 26 |
: [columns.find(c=>c.key==='total'), ...columns.filter(c=>c.key!=='total')];
|
| 27 |
};
|
| 28 |
+
const isBreakdown = () => ['subcategories','task_types'].includes(state.view);
|
| 29 |
+
const viewLabel = () => ({accuracy:'Reasoning accuracy',metrics:'Evaluation scores',subcategories:'Subcategory accuracy',task_types:'Task-type accuracy'}[state.view]);
|
| 30 |
+
const availableColumns = () => {
|
| 31 |
+
const b=benchmark();
|
| 32 |
+
if(state.view==='accuracy')return orderedAccuracyColumns();
|
| 33 |
+
if(state.view==='metrics')return b.metrics;
|
| 34 |
+
return b[state.view==='subcategories'?'subcategory_columns':'task_type_columns'].filter(c=>(state.dimension==='all'||c.dimension===state.dimension)&&(state.view!=='task_types'||state.subcategory==='all'||c.subcategory===state.subcategory));
|
| 35 |
+
};
|
| 36 |
+
const qualifiedLabel = c => isBreakdown()?`${c.dimension[0].toUpperCase()+c.dimension.slice(1)} · ${c.label}`:c.label;
|
| 37 |
const scoreLabel = key => availableColumns().find(c=>c.key===key)?.label || key;
|
| 38 |
const isPlus = () => state.benchmark === 'risebench-plusplus';
|
| 39 |
function toast(message) {
|
|
|
|
| 63 |
function renderResources() {
|
| 64 |
const b=benchmark();
|
| 65 |
$('#hero-links').innerHTML=[['Paper','paper'],['Dataset','data'],['Outputs','outputs'],['Code','github']].map(([label,key])=>`<a href="${esc(b.links[key])}" target="_blank" rel="noopener noreferrer">${label} <span aria-hidden="true">↗</span></a>`).join('');
|
| 66 |
+
$('#submit-results-link').href='submit.html?'+new URLSearchParams({benchmark:state.benchmark,language:languageCode()});
|
| 67 |
+
$('#submit-results-link').setAttribute('aria-label','Submit results to '+b.name);
|
| 68 |
$('#board-options').hidden=b.available_result_languages.length<2;
|
| 69 |
$$('[data-language]').forEach(button=>button.setAttribute('aria-pressed',button.dataset.language===languageCode()));
|
| 70 |
$('#group-filters').innerHTML=isPlus()?['all','closed','open','agentic'].map(g=>`<button data-group="${g}" aria-pressed="${state.group===g}">${g==='all'?'All models':groupLabels[g]}<span>${g==='all'?b.models.length:b.models.filter(m=>m.group===g).length}</span></button>`).join(''):'<span class="caption-text">All models</span>';
|
| 71 |
$('.input-filter').hidden=!isPlus();
|
| 72 |
+
$$('[data-plus-only]').forEach(el=>el.hidden=!isPlus());
|
| 73 |
+
$('#page-citation-code').textContent=CITATIONS[state.benchmark];
|
| 74 |
+
$('#citation-benchmark').textContent=b.name;
|
| 75 |
+
$('#page-copy-citation').textContent='Copy BibTeX';
|
| 76 |
+
renderBreakdownControls();
|
| 77 |
renderColumns();
|
| 78 |
}
|
| 79 |
+
function renderBreakdownControls() {
|
| 80 |
+
$('#breakdown-controls').hidden=!isBreakdown();
|
| 81 |
+
if(!isBreakdown())return;
|
| 82 |
+
const b=benchmark(), dimensions=b.dimensions.filter(d=>b.subcategory_columns.some(c=>c.dimension===d.key));
|
| 83 |
+
$('#dimension-tabs').innerHTML=[{key:'all',label:'All dimensions'},...dimensions].map(d=>`<button data-dimension="${d.key}" aria-pressed="${state.dimension===d.key}">${esc(d.label)}</button>`).join('');
|
| 84 |
+
$('#subcategory-filter').hidden=state.view!=='task_types';
|
| 85 |
+
const subs=b.subcategory_columns.filter(c=>state.dimension==='all'||c.dimension===state.dimension);
|
| 86 |
+
$('#subcategory-select').innerHTML='<option value="all">All subcategories</option>'+subs.map(c=>`<option value="${c.key}">${esc((state.dimension==='all'?c.dimension[0].toUpperCase()+c.dimension.slice(1)+' · ':'')+c.label)}</option>`).join('');
|
| 87 |
+
$('#subcategory-select').value=state.subcategory;
|
| 88 |
+
}
|
| 89 |
+
function resetScoreColumns() {
|
| 90 |
+
state.visible=availableColumns().map(c=>c.key);state.sort=state.visible[0];state.direction='desc';
|
| 91 |
+
renderBreakdownControls();renderColumns();renderTable();$('.table-scroll').scrollLeft=0;
|
| 92 |
+
}
|
| 93 |
function renderColumns() {
|
| 94 |
+
$('#column-options').innerHTML='<div class="eyebrow muted" >VISIBLE SCORE COLUMNS</div>'+availableColumns().map(c=>`<label><input type="checkbox" data-column="${c.key}" ${state.visible.includes(c.key)?'checked':''}>${esc(qualifiedLabel(c))}</label>`).join('');
|
| 95 |
}
|
| 96 |
function renderTable() {
|
| 97 |
const b=benchmark(), models=filteredModels(), columns=availableColumns().filter(c=>state.visible.includes(c.key));
|
| 98 |
+
const minimumWidth=370+(isPlus()?86:0)+columns.length*(isBreakdown()?156:96);
|
| 99 |
$('#results-table').style.minWidth=minimumWidth+'px';
|
| 100 |
+
$('#results-table').classList.toggle('breakdown-table',isBreakdown());
|
| 101 |
+
$('#table-caption').textContent=b.name+' '+resultLanguageLabel()+' results, '+viewLabel()+(state.view==='metrics'?' (/100)':' (%)')+', sorted by '+scoreLabel(state.sort)+' '+state.direction;
|
| 102 |
const summaryClass=key=>isPlus()&&summaryKeys.includes(key)?'summary-result':'';
|
| 103 |
const sortableHeader=c=>`<th scope="col" class="${summaryClass(c.key)} ${state.sort===c.key?'active-sort':''}" aria-sort="${state.sort===c.key?(state.direction==='desc'?'descending':'ascending'):'none'}"><button data-sort="${c.key}" title="${esc(c.description)} — sort ${state.sort===c.key&&state.direction==='desc'?'ascending':'descending'}"><span>${c.key==='counterfactual'?'Counter-<br>factual':c.key==='instruction_reasoning'?'Instruction<br>Reasoning':c.key==='appearance_consistency'?'Appearance<br>Consistency':c.key==='visual_plausibility'?'Visual<br>Plausibility':esc(c.label)}</span><span class="sort-icon" aria-hidden="true">${state.sort===c.key?(state.direction==='desc'?'↓':'↑'):'↕'}</span></button></th>`;
|
| 104 |
+
const rowSpan=isBreakdown()?' rowspan="2"':'';
|
| 105 |
+
const modelHeaders=`<th scope="col" class="select-cell"${rowSpan}><span class="sr-only">Compare</span></th><th scope="col" class="rank-cell"${rowSpan} title="Global rank on the currently sorted score">#</th><th scope="col" class="model-cell"${rowSpan}>Model <span class="muted" style="font-weight:400">/ method</span></th>${isPlus()?`<th scope="col" style="width:86px"${rowSpan}>Input</th>`:''}`;
|
| 106 |
+
const groups=[];
|
| 107 |
+
if(isBreakdown())columns.forEach(c=>{
|
| 108 |
+
const dimension=c.dimension[0].toUpperCase()+c.dimension.slice(1);
|
| 109 |
+
const label=state.view==='task_types'?(state.dimension==='all'?dimension+' · ':'')+b.subcategory_columns.find(s=>s.key===c.subcategory).label:dimension;
|
| 110 |
+
const key=state.view==='task_types'?c.subcategory:c.dimension;
|
| 111 |
+
if(groups.at(-1)?.key===key)groups.at(-1).count++;else groups.push({key,label,count:1,dimension:c.dimension});
|
| 112 |
+
});
|
| 113 |
+
$('#table-head').innerHTML=isBreakdown()?`<tr>${modelHeaders}${groups.map(g=>`<th scope="colgroup" colspan="${g.count}" class="dimension-band dim-${g.dimension}">${esc(g.label)}</th>`).join('')}</tr><tr>${columns.map(sortableHeader).join('')}</tr>`:`<tr>${modelHeaders}${columns.map(sortableHeader).join('')}</tr>`;
|
| 114 |
$('#table-body').innerHTML=models.map(m=>{
|
| 115 |
const rank=rankOf(m), ours=m.id==='rise-agent-ours';
|
| 116 |
+
const cells=columns.map(c=>{const v=score(m,c.key), featured=isPlus()&&summaryKeys.includes(c.key), tint=v==null?0:(featured ? .065+(v/100)*.10 : .02+(v/100)*.055);return `<td class="score-cell ${summaryClass(c.key)} ${c.key==='total'?'overall':''} ${v===null?'missing':''}" style="background-color:rgba(88,118,158,${tint.toFixed(4)})" title="${esc(c.label)}: ${v===null?'Not evaluated':fmt(v)+(state.view==='metrics'?' / 100':'%')}">${fmt(v)}${c.key==='total'&&v!==null?`<span class="score-meter" aria-hidden="true"><i style="width:${v}%"></i></span>`:''}</td>`;}).join('');
|
| 117 |
return `<tr class="${ours?'ours ':''}${state.selected.includes(m.id)?'selected':''}"><td class="select-cell"><input type="checkbox" data-select="${esc(m.id)}" aria-label="Compare ${esc(m.name)}" ${state.selected.includes(m.id)?'checked':''}></td><td class="rank-cell">${rank===null?'—':`<span class="${rank<=3?'rank-top rank-'+rank:''}">${rank}</span>`}</td><th scope="row" class="model-cell" style="position:sticky;top:auto"><button class="model-button" data-model="${esc(m.id)}">${esc(m.name)}</button><span class="model-meta">${m.group?`<span class="group-dot ${m.group}"></span>${groupLabels[m.group]}`:''}${ours?'<span class="ours-badge">OURS</span>':''}</span></th>${isPlus()?`<td><span class="input-pill ${m.multi_image?'multi':''}" title="${m.multi_image?'Supports multiple input images':'Single-image only'}">${m.multi_image?'Multi':'Single'}</span></td>`:''}${cells}</tr>`;
|
| 118 |
}).join('');
|
| 119 |
$('#empty-state').hidden=models.length>0; $('#results-table').hidden=models.length===0;
|
| 120 |
$('#result-count').innerHTML=`<strong>${models.length}</strong>${models.length<b.models.length?' / '+b.models.length:''} models`;
|
| 121 |
+
if(isBreakdown())$('#result-count').innerHTML+=`<span class="context-separator">·</span>${columns.length} ${state.view==='subcategories'?'subcategories':'task types'}`;
|
| 122 |
$('#reset-filters').hidden=!(state.query||state.group!=='all'||state.input!=='all');
|
| 123 |
$$('#group-filters button').forEach(el=>el.setAttribute('aria-pressed',el.dataset.group===state.group));
|
| 124 |
renderTray();
|
|
|
|
| 157 |
renderResources();renderTable();saveState();
|
| 158 |
}
|
| 159 |
function switchView(view) {
|
| 160 |
+
if(!isPlus()&&['subcategories','task_types'].includes(view))return;
|
| 161 |
+
state.view=view;
|
| 162 |
+
if(view==='task_types')state.subcategory=benchmark().subcategory_columns.find(c=>state.dimension==='all'||c.dimension===state.dimension).key;
|
| 163 |
+
state.sort=isBreakdown()?availableColumns()[0].key:view==='accuracy'?'total':'instruction_reasoning';state.direction='desc';state.visible=availableColumns().map(c=>c.key);
|
| 164 |
$$('[data-view]').forEach(btn=>btn.setAttribute('aria-pressed',btn.dataset.view===view));
|
| 165 |
+
renderBreakdownControls();renderColumns();renderTable();$('.table-scroll').scrollLeft=0;
|
| 166 |
}
|
| 167 |
function download(name,content,type) {
|
| 168 |
const url=URL.createObjectURL(new Blob([content],{type}));const a=document.createElement('a');a.href=url;a.download=name;document.body.appendChild(a);a.click();a.remove();setTimeout(()=>URL.revokeObjectURL(url),1000);
|
| 169 |
}
|
| 170 |
function exportCSV(models,name='filtered') {
|
| 171 |
+
const b=benchmark(), mainFields=[...(isPlus()?orderedAccuracyColumns():b.accuracy_columns).map(c=>({type:'accuracy',...c})),...b.metrics.map(c=>({type:'metrics',...c}))];
|
| 172 |
+
const fields=isBreakdown()?[...(name==='comparison'?mainFields:[]),...availableColumns().filter(c=>state.visible.includes(c.key)).map(c=>({type:state.view,...c,label:qualifiedLabel(c)}))]:mainFields;
|
| 173 |
+
const safeCSV=value=>{let t=String(value??'');if(/^\s*[=+@-]|^[\t\r\n]/.test(t))t="'"+t;return '"'+t.replace(/"/g,'""')+'"';};
|
| 174 |
+
const rows=[['Benchmark','Result language','Model','Category','Multi-image support',...fields.map(c=>c.label+(c.type==='metrics'?' (/100)':' (%)'))],...models.map(m=>[b.name,b.language,m.name,groupLabels[m.group]||'Not specified',m.multi_image===null?'Not specified':m.multi_image?'Yes':'No',...fields.map(c=>m[c.type][c.key]===null?'':fmt(m[c.type][c.key]))])];
|
| 175 |
+
download(`${b.id}-${languageCode()}-${state.view}-${name}-results.csv`,'\uFEFF'+rows.map(r=>r.map(safeCSV).join(',')).join('\r\n'),'text/csv;charset=utf-8');toast(`Exported ${models.length} models · ${resultLanguageLabel()} results.`);
|
| 176 |
}
|
| 177 |
function radar(models) {
|
| 178 |
const dims=benchmark().dimensions, cx=205,cy=156,r=98,n=dims.length;
|
|
|
|
| 190 |
function showModels(ids) {
|
| 191 |
const b=benchmark(), models=ids.map(modelById).filter(Boolean);if(!models.length)return;
|
| 192 |
const mixed=isPlus()&&new Set(models.map(m=>m.multi_image)).size>1;
|
| 193 |
+
const tableSection=(title,fields,type)=>`<tr class="comparison-section"><td colspan="${models.length+1}">${title}</td></tr>`+fields.map(c=>{const vals=models.map(m=>m[type]?.[c.key] ?? null);const max=Math.max(...vals.filter(v=>v!==null));return `<tr><td>${esc(c.label)}</td>${vals.map(v=>`<td class="${v!==null&&v===max&&models.length>1?'best-value':''}">${fmt(v)}${v!==null&&type!=='metrics'?'%':''}</td>`).join('')}</tr>`;}).join('');
|
| 194 |
+
showDialog(b.name+' · '+resultLanguageLabel().toUpperCase()+' RESULTS',`<h2 class="dialog-title" id="dialog-title">${models.length===1?esc(models[0].name):'Model comparison'}</h2>${mixed?'<p class="comparison-warning">These models use different evaluation subsets: single-image only and full benchmark.</p>':''}<div class="comparison-layout">${radar(models)}<div class="compare-summaries">${models.map((m,i)=>`<div class="compare-summary"><div><h4><span class="series-dot" style="background:${colors[i]}"></span>${esc(m.name)}</h4><p>${esc(groupLabels[m.group]||b.name)}${isPlus()?' · '+(m.multi_image?'Multi-image supported':'Single-image only'):''}</p></div><strong style="color:${colors[i]}">${fmt(m.accuracy.total)}<small> ${m.accuracy.total!==null?'%':''}<br>${isPlus()?'Total':'Overall'}</small></strong></div>`).join('')}${models.some(m=>m.accuracy.total===null)?'<p class="caption-text">Single-image-only models have no Total score.</p>':''}</div></div><div class="comparison-table-wrap"><table class="comparison-table"><thead><tr><th>Metric</th>${models.map((m,i)=>`<th><span class="series-dot" style="background:${colors[i]}"></span>${esc(m.name)}</th>`).join('')}</tr></thead><tbody>${tableSection('REASONING ACCURACY (%)',isPlus()?orderedAccuracyColumns():b.accuracy_columns,'accuracy')}${tableSection('EVALUATION SCORES (/100)',b.metrics,'metrics')}${isBreakdown()?tableSection(viewLabel().toUpperCase()+' (%)',availableColumns().filter(c=>state.visible.includes(c.key)).map(c=>({...c,label:qualifiedLabel(c)})),state.view):''}</tbody></table></div><div class="dialog-actions"><button class="outline-button" id="dialog-export">Export ${models.length===1?'model':'comparison'} CSV ↓</button></div>`);
|
| 195 |
$('#dialog-export').addEventListener('click',()=>exportCSV(models,'comparison'));
|
| 196 |
}
|
| 197 |
async function copyCitation(text,button) {
|
| 198 |
try {await navigator.clipboard.writeText(text);button.textContent='Copied ✓';toast('BibTeX copied.');}
|
| 199 |
+
catch(_){const area=document.createElement('textarea');area.value=text;($('#detail-dialog').open?$('#dialog-content'):document.body).appendChild(area);area.select();const copied=document.execCommand('copy');area.remove();toast(copied?'BibTeX copied.':'Select and copy the citation below.');}
|
| 200 |
}
|
| 201 |
function showCitation() {
|
| 202 |
const citation=CITATIONS[state.benchmark];
|
|
|
|
| 209 |
if(button.dataset.benchmark)switchBenchmark(button.dataset.benchmark);
|
| 210 |
if(button.dataset.view)switchView(button.dataset.view);
|
| 211 |
if(button.dataset.language)switchLanguage(button.dataset.language);
|
| 212 |
+
if(button.dataset.dimension){state.dimension=button.dataset.dimension;state.subcategory='all';resetScoreColumns();}
|
| 213 |
if(button.dataset.group){state.group=button.dataset.group;renderTable();}
|
| 214 |
if(button.dataset.sort){state.direction=state.sort===button.dataset.sort&&state.direction==='desc'?'asc':'desc';state.sort=button.dataset.sort;renderTable();}
|
| 215 |
if(button.dataset.model)showModels([button.dataset.model]);
|
|
|
|
| 227 |
});
|
| 228 |
$('#model-search').addEventListener('input',e=>{state.query=e.target.value;renderTable();});
|
| 229 |
$('#input-filter').addEventListener('change',e=>{state.input=e.target.value;renderTable();});
|
| 230 |
+
$('#subcategory-select').addEventListener('change',e=>{state.subcategory=e.target.value;resetScoreColumns();});
|
| 231 |
+
$('#page-copy-citation').addEventListener('click',e=>copyCitation(CITATIONS[state.benchmark],e.currentTarget));
|
| 232 |
+
$('#page-save-citation').addEventListener('click',()=>download(state.benchmark+'.bib',CITATIONS[state.benchmark]+'\n','text/plain;charset=utf-8'));
|
| 233 |
$('#reset-filters').addEventListener('click',resetFilters);$('#empty-reset').addEventListener('click',resetFilters);
|
| 234 |
$('#download-csv').addEventListener('click',()=>exportCSV(filteredModels()));
|
| 235 |
$('#compare-open').addEventListener('click',()=>showModels(state.selected));
|
|
|
|
| 242 |
if(e.key==='/'&&!['INPUT','TEXTAREA','SELECT'].includes(document.activeElement.tagName)&&!$('#detail-dialog').open){e.preventDefault();$('#model-search').focus();}
|
| 243 |
const tab=e.target.closest('[data-benchmark], [data-view], [data-language]');
|
| 244 |
if(tab&&['ArrowLeft','ArrowRight','Home','End'].includes(e.key)){
|
| 245 |
+
e.preventDefault();const siblings=[...tab.parentElement.querySelectorAll('[data-benchmark], [data-view], [data-language]')].filter(el=>!el.hidden),i=siblings.indexOf(tab);
|
| 246 |
const n=e.key==='Home'?0:e.key==='End'?siblings.length-1:(i+(e.key==='ArrowRight'?1:-1)+siblings.length)%siblings.length;
|
| 247 |
siblings[n].click();siblings[n].focus();
|
| 248 |
}
|
| 249 |
});
|
| 250 |
switchBenchmark(state.benchmark);
|
| 251 |
+
if(location.protocol!=='file:')fetch('/api/leaderboard',{cache:'no-store'}).then(r=>r.ok?r.json():null).then(data=>{
|
| 252 |
+
if(!data?.benchmarks)return;
|
| 253 |
+
DATA=data;
|
| 254 |
+
state.selected=state.selected.filter(id=>modelById(id));
|
| 255 |
+
renderResources();renderTable();
|
| 256 |
+
$('#json-download').href='/api/leaderboard';
|
| 257 |
+
}).catch(()=>{});
|
| 258 |
})();
|
assets/benchmark-overview.png
ADDED
|
Git LFS Details
|
assets/rise-agent.png
ADDED
|
Git LFS Details
|
data/leaderboard.json
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dist/README.md
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
title: RISE Leaderboard
|
| 3 |
+
emoji: 📈
|
| 4 |
+
colorFrom: blue
|
| 5 |
+
colorTo: gray
|
| 6 |
+
sdk: static
|
| 7 |
+
app_file: index.html
|
| 8 |
+
pinned: false
|
| 9 |
+
fullWidth: true
|
| 10 |
+
short_description: Official Leaderboard of RISEBench
|
| 11 |
+
---
|
| 12 |
+
|
| 13 |
+
# RISE Leaderboard
|
| 14 |
+
|
| 15 |
+
Official leaderboard of RISEBench and RISEBench++.
|
| 16 |
+
|
| 17 |
+
[Code](https://github.com/VisionXLab/RISEBench) · [RISEBench++ paper](https://arxiv.org/abs/2610.12343) · [Dataset](https://huggingface.co/datasets/VisionXLab/RISEBench-plusplus) · [Outputs](https://huggingface.co/datasets/VisionXLab/RISEBench-plusplus_Outputs)
|
| 18 |
+
|
dist/admin.html
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Review submissions · RISEBench</title><link rel="icon" href="assets/favicon.svg"><link rel="stylesheet" href="styles.css"><link rel="stylesheet" href="portal.css"></head>
|
| 3 |
+
<body data-page="admin"><main class="portal-width review-width">
|
| 4 |
+
<nav class="portal-nav" aria-label="Main navigation"><a class="wordmark" href="index.html">RISEBench<span>++</span></a><div><a href="index.html">Leaderboard</a><a href="submit.html">Submit results</a><button id="sign-out" class="text-button" hidden>Sign out</button></div></nav>
|
| 5 |
+
<header class="portal-heading"><span class="section-kicker">REVIEW WORKSPACE</span><h1>Review submissions.</h1><p>Verify evaluation artifacts, then approve or return results.</p></header>
|
| 6 |
+
<p class="notice" id="service-notice" hidden></p>
|
| 7 |
+
<section class="portal-card login-card" id="login-panel"><h2>Administrator sign in</h2><form id="login-form"><label id="passphrase-label">Passphrase<input type="password" id="admin-passphrase" autocomplete="current-password" required></label><p class="form-message" id="login-message" role="status"></p><button type="submit" class="primary-button" id="login-button">Sign in</button></form></section>
|
| 8 |
+
<section id="review-workspace" hidden><div class="review-toolbar"><div class="review-filters" role="group" aria-label="Submission status"><button data-status="pending" aria-pressed="true">Pending <span id="pending-count">0</span></button><button data-status="approved" aria-pressed="false">Approved</button><button data-status="rejected" aria-pressed="false">Returned</button><button data-status="withdrawn" aria-pressed="false">Withdrawn</button><button data-status="all" aria-pressed="false">All</button></div><button class="outline-button" id="refresh-queue">Refresh</button></div><p id="queue-message" class="form-message" role="status"></p><div class="review-layout"><aside class="review-list" id="review-list" aria-label="Submissions"></aside><section class="portal-card review-detail" id="review-detail"><div class="review-empty"><h2>Select a submission</h2><p>Its scores and evaluation artifacts will appear here.</p></div></section></div></section>
|
| 9 |
+
<footer class="page-footer"><a href="index.html">← Back to leaderboard</a><span>Private review workspace</span></footer>
|
| 10 |
+
</main><script id="submission-schema" type="application/json">{"benchmarks": [{"id": "risebench-plusplus", "name": "RISEBench++", "case_count": 1000, "available_result_languages": ["en", "zh"], "accuracy_unit": "%", "metric_unit": "/100", "score_decimals": 1, "default_sort": "total", "dimensions": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}, {"key": "counterfactual", "label": "Counterfactual", "description": "Visualize outcomes under hypothetical or contrary-to-fact conditions."}, {"key": "hybrid", "label": "Hybrid", "description": "Combine reasoning across three to five successive editing instructions."}], "metrics": [{"key": "instruction_reasoning", "label": "Instruction Reasoning", "description": "Whether the edit realizes the intended reasoning outcome."}, {"key": "appearance_consistency", "label": "Appearance Consistency", "description": "Whether content that should remain unchanged is preserved."}, {"key": "visual_plausibility", "label": "Visual Plausibility", "description": "Visual quality and plausibility; logical tasks are excluded."}], "accuracy_columns": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}, {"key": "counterfactual", "label": "Counterfactual", "description": "Visualize outcomes under hypothetical or contrary-to-fact conditions."}, {"key": "hybrid", "label": "Hybrid", "description": "Combine reasoning across three to five successive editing instructions."}, {"key": "single", "label": "Single", "description": "Accuracy on single-image cases."}, {"key": "multi", "label": "Multi", "description": "Accuracy on multi-image cases. Not evaluated for models without multi-image support."}, {"key": "total", "label": "Total", "description": "Accuracy on the complete benchmark. Not evaluated for single-image-only models."}], "subcategory_columns": [{"key": "temporal_common_sense_knowledge", "label": "Common-Sense Knowledge", "dimension": "temporal", "case_count": 85, "multi_image_case_count": 0, "code": "CSK", "description": "Temporal · Common-Sense Knowledge — accuracy (%)"}, {"key": "temporal_context_knowledge", "label": "Context Knowledge", "dimension": "temporal", "case_count": 52, "multi_image_case_count": 28, "code": "CtxK", "description": "Temporal · Context Knowledge — accuracy (%)"}, {"key": "temporal_disciplinary_knowledge", "label": "Disciplinary Knowledge", "dimension": "temporal", "case_count": 63, "multi_image_case_count": 4, "code": "DK", "description": "Temporal · Disciplinary Knowledge — accuracy (%)"}, {"key": "causal_common_sense_knowledge", "label": "Common-Sense Knowledge", "dimension": "causal", "case_count": 80, "multi_image_case_count": 1, "code": "CSK", "description": "Causal · Common-Sense Knowledge — accuracy (%)"}, {"key": "causal_context_knowledge", "label": "Context Knowledge", "dimension": "causal", "case_count": 40, "multi_image_case_count": 2, "code": "CtxK", "description": "Causal · Context Knowledge — accuracy (%)"}, {"key": "causal_disciplinary_knowledge", "label": "Disciplinary Knowledge", "dimension": "causal", "case_count": 80, "multi_image_case_count": 5, "code": "DK", "description": "Causal · Disciplinary Knowledge — accuracy (%)"}, {"key": "spatial_relation", "label": "Relation", "dimension": "spatial", "case_count": 106, "multi_image_case_count": 6, "code": "Rel.", "description": "Spatial · Relation — accuracy (%)"}, {"key": "spatial_structure", "label": "Structure", "dimension": "spatial", "case_count": 94, "multi_image_case_count": 12, "code": "Struct.", "description": "Spatial · Structure — accuracy (%)"}, {"key": "logical_explicit_rule_deduction", "label": "Explicit Rule Deduction", "dimension": "logical", "case_count": 123, "multi_image_case_count": 0, "code": "ERD", "description": "Logical · Explicit Rule Deduction — accuracy (%)"}, {"key": "logical_implicit_pattern_induction", "label": "Implicit Pattern Induction", "dimension": "logical", "case_count": 77, "multi_image_case_count": 20, "code": "IPI", "description": "Logical · Implicit Pattern Induction — accuracy (%)"}, {"key": "counterfactual_counterfactual_imagination", "label": "Counterfactual Imagination", "dimension": "counterfactual", "case_count": 70, "multi_image_case_count": 0, "code": "CFI", "description": "Counterfactual · Counterfactual Imagination — accuracy (%)"}, {"key": "counterfactual_anomaly_correction_and_generation", "label": "Anomaly Correction and Generation", "dimension": "counterfactual", "case_count": 30, "multi_image_case_count": 0, "code": "ACG", "description": "Counterfactual · Anomaly Correction and Generation — accuracy (%)"}], "task_type_columns": [{"key": "T01", "code": "T01", "label": "Life Progression", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 24, "multi_image_case_count": 0, "description": "Temporal · Life Progression — accuracy (%)"}, {"key": "T02", "code": "T02", "label": "Material Transformation", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 9, "multi_image_case_count": 0, "description": "Temporal · Material Transformation — accuracy (%)"}, {"key": "T03", "code": "T03", "label": "Natural Environmental Changes", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 13, "multi_image_case_count": 0, "description": "Temporal · Natural Environmental Changes — accuracy (%)"}, {"key": "T04", "code": "T04", "label": "Physical Aging", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 20, "multi_image_case_count": 0, "description": "Temporal · Physical Aging — accuracy (%)"}, {"key": "T05", "code": "T05", "label": "Social Activities", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 8, "multi_image_case_count": 0, "description": "Temporal · Social Activities — accuracy (%)"}, {"key": "T06", "code": "T06", "label": "Tool Evolution", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 7, "multi_image_case_count": 0, "description": "Temporal · Tool Evolution — accuracy (%)"}, {"key": "T07", "code": "T07", "label": "Urban Evolution", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Temporal · Urban Evolution — accuracy (%)"}, {"key": "T08", "code": "T08", "label": "Temporal State Transition", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 15, "multi_image_case_count": 4, "description": "Temporal · Temporal State Transition — accuracy (%)"}, {"key": "T09", "code": "T09", "label": "Precise Temporal Localization", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 14, "multi_image_case_count": 2, "description": "Temporal · Precise Temporal Localization — accuracy (%)"}, {"key": "T10", "code": "T10", "label": "Position Change", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 15, "multi_image_case_count": 14, "description": "Temporal · Position Change — accuracy (%)"}, {"key": "T11", "code": "T11", "label": "Action Sequence", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 8, "multi_image_case_count": 8, "description": "Temporal · Action Sequence — accuracy (%)"}, {"key": "T12", "code": "T12", "label": "Physics", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Temporal · Physics — accuracy (%)"}, {"key": "T13", "code": "T13", "label": "Chemistry", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 8, "multi_image_case_count": 4, "description": "Temporal · Chemistry — accuracy (%)"}, {"key": "T14", "code": "T14", "label": "Biology", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 9, "multi_image_case_count": 0, "description": "Temporal · Biology — accuracy (%)"}, {"key": "T15", "code": "T15", "label": "Astronomy", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 12, "multi_image_case_count": 0, "description": "Temporal · Astronomy — accuracy (%)"}, {"key": "T16", "code": "T16", "label": "Geography", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 18, "multi_image_case_count": 0, "description": "Temporal · Geography — accuracy (%)"}, {"key": "T17", "code": "T17", "label": "History", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 5, "multi_image_case_count": 0, "description": "Temporal · History — accuracy (%)"}, {"key": "T18", "code": "T18", "label": "Medicine", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Temporal · Medicine — accuracy (%)"}, {"key": "T19", "code": "T19", "label": "Computer Science", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 3, "multi_image_case_count": 0, "description": "Temporal · Computer Science — accuracy (%)"}, {"key": "C01", "code": "C01", "label": "Physical State Transition", "dimension": "causal", "subcategory": "causal_common_sense_knowledge", "case_count": 31, "multi_image_case_count": 0, "description": "Causal · Physical State Transition — accuracy (%)"}, {"key": "C02", "code": "C02", "label": "Structural Damage", "dimension": "causal", "subcategory": "causal_common_sense_knowledge", "case_count": 27, "multi_image_case_count": 0, "description": "Causal · Structural Damage — accuracy (%)"}, {"key": "C03", "code": "C03", "label": "Flexible Deformation", "dimension": "causal", "subcategory": "causal_common_sense_knowledge", "case_count": 22, "multi_image_case_count": 1, "description": "Causal · Flexible Deformation — accuracy (%)"}, {"key": "C04", "code": "C04", "label": "Magnitude Change", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Magnitude Change — accuracy (%)"}, {"key": "C05", "code": "C05", "label": "Reading Offset", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 2, "description": "Causal · Reading Offset — accuracy (%)"}, {"key": "C06", "code": "C06", "label": "Order Relation", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Order Relation — accuracy (%)"}, {"key": "C07", "code": "C07", "label": "Feature Mapping", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Feature Mapping — accuracy (%)"}, {"key": "C08", "code": "C08", "label": "Physics", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 25, "multi_image_case_count": 1, "description": "Causal · Physics — accuracy (%)"}, {"key": "C09", "code": "C09", "label": "Chemistry", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 23, "multi_image_case_count": 4, "description": "Causal · Chemistry — accuracy (%)"}, {"key": "C10", "code": "C10", "label": "Biology", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 12, "multi_image_case_count": 0, "description": "Causal · Biology — accuracy (%)"}, {"key": "C11", "code": "C11", "label": "Astronomy", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 3, "multi_image_case_count": 0, "description": "Causal · Astronomy — accuracy (%)"}, {"key": "C12", "code": "C12", "label": "Medicine", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Causal · Medicine — accuracy (%)"}, {"key": "C13", "code": "C13", "label": "Music Theory", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 3, "multi_image_case_count": 0, "description": "Causal · Music Theory — accuracy (%)"}, {"key": "C14", "code": "C14", "label": "Computer Science", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Computer Science — accuracy (%)"}, {"key": "S01", "code": "S01", "label": "Adjacency", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 11, "multi_image_case_count": 0, "description": "Spatial · Adjacency — accuracy (%)"}, {"key": "S02", "code": "S02", "label": "Direction", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 11, "multi_image_case_count": 0, "description": "Spatial · Direction — accuracy (%)"}, {"key": "S03", "code": "S03", "label": "Orientation", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 11, "multi_image_case_count": 0, "description": "Spatial · Orientation — accuracy (%)"}, {"key": "S04", "code": "S04", "label": "Projection", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 12, "multi_image_case_count": 0, "description": "Spatial · Projection — accuracy (%)"}, {"key": "S05", "code": "S05", "label": "Distance", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 13, "multi_image_case_count": 0, "description": "Spatial · Distance — accuracy (%)"}, {"key": "S06", "code": "S06", "label": "Size", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 15, "multi_image_case_count": 0, "description": "Spatial · Size — accuracy (%)"}, {"key": "S07", "code": "S07", "label": "Configuration", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 18, "multi_image_case_count": 0, "description": "Spatial · Configuration — accuracy (%)"}, {"key": "S08", "code": "S08", "label": "Viewing Scale", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 9, "multi_image_case_count": 0, "description": "Spatial · Viewing Scale — accuracy (%)"}, {"key": "S09", "code": "S09", "label": "Localization", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 6, "multi_image_case_count": 6, "description": "Spatial · Localization — accuracy (%)"}, {"key": "S10", "code": "S10", "label": "Part-Whole Perception", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 24, "multi_image_case_count": 0, "description": "Spatial · Part-Whole Perception — accuracy (%)"}, {"key": "S11", "code": "S11", "label": "Geometric Regularities Reasoning", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 15, "multi_image_case_count": 0, "description": "Spatial · Geometric Regularities Reasoning — accuracy (%)"}, {"key": "S12", "code": "S12", "label": "Viewpoint Generation", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 26, "multi_image_case_count": 0, "description": "Spatial · Viewpoint Generation — accuracy (%)"}, {"key": "S13", "code": "S13", "label": "Environmental Structure Reasoning", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 19, "multi_image_case_count": 2, "description": "Spatial · Environmental Structure Reasoning — accuracy (%)"}, {"key": "S14", "code": "S14", "label": "Egocentric Scene Reconstruction", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 10, "multi_image_case_count": 10, "description": "Spatial · Egocentric Scene Reconstruction — accuracy (%)"}, {"key": "L01", "code": "L01", "label": "Path Searching", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 24, "multi_image_case_count": 0, "description": "Logical · Path Searching — accuracy (%)"}, {"key": "L02", "code": "L02", "label": "Mathematical Derivation", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 27, "multi_image_case_count": 0, "description": "Logical · Mathematical Derivation — accuracy (%)"}, {"key": "L03", "code": "L03", "label": "Game Deduction", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 37, "multi_image_case_count": 0, "description": "Logical · Game Deduction — accuracy (%)"}, {"key": "L04", "code": "L04", "label": "Puzzle Solving", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 35, "multi_image_case_count": 0, "description": "Logical · Puzzle Solving — accuracy (%)"}, {"key": "L05", "code": "L05", "label": "Pattern Prediction", "dimension": "logical", "subcategory": "logical_implicit_pattern_induction", "case_count": 39, "multi_image_case_count": 0, "description": "Logical · Pattern Prediction — accuracy (%)"}, {"key": "L06", "code": "L06", "label": "Visual Oddity Detection", "dimension": "logical", "subcategory": "logical_implicit_pattern_induction", "case_count": 18, "multi_image_case_count": 0, "description": "Logical · Visual Oddity Detection — accuracy (%)"}, {"key": "L07", "code": "L07", "label": "Rule Transfer", "dimension": "logical", "subcategory": "logical_implicit_pattern_induction", "case_count": 20, "multi_image_case_count": 20, "description": "Logical · Rule Transfer — accuracy (%)"}, {"key": "F01", "code": "F01", "label": "Physical Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 23, "multi_image_case_count": 0, "description": "Counterfactual · Physical Counterfactual — accuracy (%)"}, {"key": "F02", "code": "F02", "label": "Chemical Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 9, "multi_image_case_count": 0, "description": "Counterfactual · Chemical Counterfactual — accuracy (%)"}, {"key": "F03", "code": "F03", "label": "Biological Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 8, "multi_image_case_count": 0, "description": "Counterfactual · Biological Counterfactual — accuracy (%)"}, {"key": "F04", "code": "F04", "label": "Astronomy Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 7, "multi_image_case_count": 0, "description": "Counterfactual · Astronomy Counterfactual — accuracy (%)"}, {"key": "F05", "code": "F05", "label": "Geography Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 8, "multi_image_case_count": 0, "description": "Counterfactual · Geography Counterfactual — accuracy (%)"}, {"key": "F06", "code": "F06", "label": "History Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 7, "multi_image_case_count": 0, "description": "Counterfactual · History Counterfactual — accuracy (%)"}, {"key": "F07", "code": "F07", "label": "Music Theory Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 4, "multi_image_case_count": 0, "description": "Counterfactual · Music Theory Counterfactual — accuracy (%)"}, {"key": "F08", "code": "F08", "label": "Computer Science Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 4, "multi_image_case_count": 0, "description": "Counterfactual · Computer Science Counterfactual — accuracy (%)"}, {"key": "F09", "code": "F09", "label": "Anatomical Errors", "dimension": "counterfactual", "subcategory": "counterfactual_anomaly_correction_and_generation", "case_count": 10, "multi_image_case_count": 0, "description": "Counterfactual · Anatomical Errors — accuracy (%)"}, {"key": "F10", "code": "F10", "label": "Structural Anomalies", "dimension": "counterfactual", "subcategory": "counterfactual_anomaly_correction_and_generation", "case_count": 11, "multi_image_case_count": 0, "description": "Counterfactual · Structural Anomalies — accuracy (%)"}, {"key": "F11", "code": "F11", "label": "Relational Anomalies", "dimension": "counterfactual", "subcategory": "counterfactual_anomaly_correction_and_generation", "case_count": 9, "multi_image_case_count": 0, "description": "Counterfactual · Relational Anomalies — accuracy (%)"}], "links": {"paper": "https://arxiv.org/abs/2610.12343", "data": "https://huggingface.co/datasets/VisionXLab/RISEBench-plusplus", "outputs": "https://huggingface.co/datasets/VisionXLab/RISEBench-plusplus_Outputs", "github": "https://github.com/VisionXLab/RISEBench/tree/main/RISEBench%2B%2B"}, "judges": {"instruction_reasoning": "Gemini-3-Flash", "appearance_consistency": "Gemini-3-Flash", "visual_plausibility": "Gemini-3.1-Flash-Lite"}, "results_by_language": {"en": {"models": [{"id": "gpt-image-2-5-sunburst", "name": "GPT-Image-2.5 Sunburst"}, {"id": "nano-banana-pro", "name": "Nano Banana Pro"}, {"id": "nano-banana-2", "name": "Nano Banana 2"}, {"id": "gpt-image-2", "name": "GPT-Image-2"}, {"id": "gpt-image-2-5-flare", "name": "GPT-Image-2.5 Flare"}, {"id": "luma-uni-1", "name": "Luma Uni-1"}, {"id": "qwen-image-3-0", "name": "Qwen-Image-3.0"}, {"id": "nano-banana-2-lite", "name": "Nano Banana 2 Lite"}, {"id": "flux-2-max", "name": "FLUX.2 Max"}, {"id": "gpt-image-1-5", "name": "GPT-Image-1.5"}, {"id": "flux-2-pro", "name": "FLUX.2 Pro"}, {"id": "nano-banana", "name": "Nano Banana"}, {"id": "hunyuanimage-3-5", "name": "HunyuanImage-3.5"}, {"id": "wan2-7-image-pro", "name": "Wan2.7-Image-Pro"}, {"id": "gpt-image-1", "name": "GPT-Image-1"}, {"id": "qwen-image-2-0", "name": "Qwen-Image-2.0"}, {"id": "seedream-4-5", "name": "Seedream 4.5"}, {"id": "seedream-5-0", "name": "Seedream 5.0"}, {"id": "step-image-edit-2", "name": "Step Image Edit 2"}, {"id": "hunyuanimage-3-0-instruct", "name": "HunyuanImage-3.0-Instruct"}, {"id": "qwen-image-edit-2511", "name": "Qwen-Image-Edit-2511"}, {"id": "qwen-image-2-1", "name": "Qwen-Image-2.1"}, {"id": "firered-image-edit-1-0", "name": "FireRed-Image-Edit-1.0"}, {"id": "firered-image-edit-1-1", "name": "FireRed-Image-Edit-1.1"}, {"id": "qwen-image-edit-2509", "name": "Qwen-Image-Edit-2509"}, {"id": "hidream-o1-image", "name": "HiDream-O1-Image"}, {"id": "flux-2-dev", "name": "FLUX.2 Dev"}, {"id": "flux-2-klein-9b", "name": "FLUX.2 Klein 9B"}, {"id": "joyai-image-edit-plus", "name": "JoyAI-Image-Edit-Plus"}, {"id": "sensenova-u1-a3b-mot-sft", "name": "SenseNova-U1-A3B-MoT-SFT"}, {"id": "unipic-3-0", "name": "UniPic 3.0"}, {"id": "bagel-w-cot", "name": "BAGEL (w/ CoT)"}, {"id": "sensenova-u1-8b-mot-sft", "name": "SenseNova-U1-8B-MoT-SFT"}, {"id": "flux-2-klein-4b", "name": "FLUX.2 Klein 4B"}, {"id": "uniworld-v2", "name": "UniWorld-V2"}, {"id": "bagel", "name": "BAGEL"}, {"id": "omnigen2", "name": "OmniGen2"}, {"id": "omnigen", "name": "OmniGen"}, {"id": "emu2-gen", "name": "Emu2-Gen"}, {"id": "joyai-image-edit", "name": "JoyAI-Image-Edit"}, {"id": "step1x-edit-thinking", "name": "Step1X-Edit (thinking)"}, {"id": "boogu-image-0-1-edit", "name": "Boogu-Image-0.1-Edit"}, {"id": "step1x-edit-thinking-reflection", "name": "Step1X-Edit (thinking + reflection)"}, {"id": "longcat-image-edit", "name": "LongCat-Image-Edit"}, {"id": "step1x-edit-base", "name": "Step1X-Edit (base)"}, {"id": "internvl-u-w-cot", "name": "InternVL-U (w/ CoT)"}, {"id": "flux-1-kontext-dev", "name": "FLUX.1 Kontext Dev"}, {"id": "llada-image", "name": "LLaDA-Image"}, {"id": "ovis-u1", "name": "Ovis-U1"}, {"id": "internvl-u", "name": "InternVL-U"}, {"id": "unipic2-sd3-5m-kontext-2b", "name": "UniPic2-SD3.5M-Kontext-2B"}, {"id": "lumina-dimoo", "name": "Lumina-DiMOO"}, {"id": "uniworld-v1", "name": "UniWorld-V1"}, {"id": "rise-agent-ours", "name": "RISE-Agent (Ours)"}, {"id": "mindbrush", "name": "MindBrush"}, {"id": "interleavethinker", "name": "InterleaveThinker"}, {"id": "intentedit", "name": "IntentEdit"}, {"id": "imagent", "name": "ImAgent"}]}, "zh": {"models": [{"id": "gpt-image-2-5-sunburst", "name": "GPT-Image-2.5 Sunburst"}, {"id": "nano-banana-pro", "name": "Nano Banana Pro"}, {"id": "nano-banana-2", "name": "Nano Banana 2"}, {"id": "luma-uni-1", "name": "Luma Uni-1"}, {"id": "gpt-image-2", "name": "GPT-Image-2"}, {"id": "qwen-image-3-0", "name": "Qwen-Image-3.0"}, {"id": "gpt-image-2-5-flare", "name": "GPT-Image-2.5 Flare"}, {"id": "flux-2-max", "name": "FLUX.2 Max"}, {"id": "nano-banana-2-lite", "name": "Nano Banana 2 Lite"}, {"id": "gpt-image-1-5", "name": "GPT-Image-1.5"}, {"id": "nano-banana", "name": "Nano Banana"}, {"id": "flux-2-pro", "name": "FLUX.2 Pro"}, {"id": "hunyuanimage-3-5", "name": "HunyuanImage-3.5"}, {"id": "wan2-7-image-pro", "name": "Wan2.7-Image-Pro"}, {"id": "qwen-image-2-0", "name": "Qwen-Image-2.0"}, {"id": "seedream-4-5", "name": "Seedream 4.5"}, {"id": "seedream-5-0", "name": "Seedream 5.0"}, {"id": "gpt-image-1", "name": "GPT-Image-1"}, {"id": "step-image-edit-2", "name": "Step Image Edit 2"}, {"id": "hunyuanimage-3-0-instruct", "name": "HunyuanImage-3.0-Instruct"}, {"id": "qwen-image-2-1", "name": "Qwen-Image-2.1"}, {"id": "firered-image-edit-1-1", "name": "FireRed-Image-Edit-1.1"}, {"id": "flux-2-dev", "name": "FLUX.2 Dev"}, {"id": "qwen-image-edit-2511", "name": "Qwen-Image-Edit-2511"}, {"id": "qwen-image-edit-2509", "name": "Qwen-Image-Edit-2509"}, {"id": "firered-image-edit-1-0", "name": "FireRed-Image-Edit-1.0"}, {"id": "sensenova-u1-a3b-mot-sft", "name": "SenseNova-U1-A3B-MoT-SFT"}, {"id": "joyai-image-edit-plus", "name": "JoyAI-Image-Edit-Plus"}, {"id": "flux-2-klein-9b", "name": "FLUX.2 Klein 9B"}, {"id": "bagel-w-cot", "name": "BAGEL (w/ CoT)"}, {"id": "hidream-o1-image", "name": "HiDream-O1-Image"}, {"id": "flux-2-klein-4b", "name": "FLUX.2 Klein 4B"}, {"id": "uniworld-v2", "name": "UniWorld-V2"}, {"id": "sensenova-u1-8b-mot-sft", "name": "SenseNova-U1-8B-MoT-SFT"}, {"id": "unipic-3-0", "name": "UniPic 3.0"}, {"id": "bagel", "name": "BAGEL"}, {"id": "omnigen2", "name": "OmniGen2"}, {"id": "omnigen", "name": "OmniGen"}, {"id": "emu2-gen", "name": "Emu2-Gen"}, {"id": "joyai-image-edit", "name": "JoyAI-Image-Edit"}, {"id": "boogu-image-0-1-edit", "name": "Boogu-Image-0.1-Edit"}, {"id": "step1x-edit-thinking-reflection", "name": "Step1X-Edit (thinking + reflection)"}, {"id": "step1x-edit-thinking", "name": "Step1X-Edit (thinking)"}, {"id": "step1x-edit-base", "name": "Step1X-Edit (base)"}, {"id": "longcat-image-edit", "name": "LongCat-Image-Edit"}, {"id": "flux-1-kontext-dev", "name": "FLUX.1 Kontext Dev"}, {"id": "llada-image", "name": "LLaDA-Image"}, {"id": "internvl-u-w-cot", "name": "InternVL-U (w/ CoT)"}, {"id": "ovis-u1", "name": "Ovis-U1"}, {"id": "internvl-u", "name": "InternVL-U"}, {"id": "lumina-dimoo", "name": "Lumina-DiMOO"}, {"id": "uniworld-v1", "name": "UniWorld-V1"}, {"id": "unipic2-sd3-5m-kontext-2b", "name": "UniPic2-SD3.5M-Kontext-2B"}, {"id": "rise-agent-ours", "name": "RISE-Agent (Ours)"}, {"id": "mindbrush", "name": "MindBrush"}, {"id": "interleavethinker", "name": "InterleaveThinker"}, {"id": "intentedit", "name": "IntentEdit"}, {"id": "imagent", "name": "ImAgent"}]}}}, {"id": "risebench", "name": "RISEBench", "case_count": 360, "available_result_languages": ["en"], "accuracy_unit": "%", "metric_unit": "/100", "score_decimals": 1, "default_sort": "total", "dimensions": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}], "metrics": [{"key": "instruction_reasoning", "label": "Instruction Reasoning", "description": "Whether the edit realizes the intended reasoning outcome."}, {"key": "appearance_consistency", "label": "Appearance Consistency", "description": "Whether content that should remain unchanged is preserved."}, {"key": "visual_plausibility", "label": "Visual Plausibility", "description": "Visual quality and plausibility; logical tasks are excluded."}], "accuracy_columns": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}, {"key": "total", "label": "Overall", "description": "Accuracy on the complete RISEBench-360 benchmark."}], "links": {"paper": "https://arxiv.org/abs/2504.02826", "data": "https://huggingface.co/datasets/PhoenixZ/RISEBench", "outputs": "https://huggingface.co/datasets/zpy777/RISEBench_Outputs", "github": "https://github.com/VisionXLab/RISEBench/tree/main/RISEBench"}, "judges": {"instruction_reasoning": "GPT-4o", "appearance_consistency": "GPT-4o", "visual_plausibility": "GPT-4o"}, "results_by_language": {"en": {"models": [{"id": "gpt-image-1-5", "name": "GPT-Image-1.5"}, {"id": "gpt-image-2", "name": "GPT-Image-2"}, {"id": "gemini-3-pro-image-preview-nano-banana-pro", "name": "Gemini-3-pro-image-preview (Nano Banana-pro)"}, {"id": "gemini-2-5-flash-image-nano-banana", "name": "Gemini-2.5-Flash-Image (Nano Banana)"}, {"id": "gpt-image-1", "name": "GPT-Image-1"}, {"id": "gpt-image-1-mini", "name": "GPT-Image-1-mini"}, {"id": "qwen-image-edit-2511", "name": "Qwen-Image-Edit-2511"}, {"id": "bagel-w-cot", "name": "BAGEL (w/ CoT)"}, {"id": "gemini-2-0-flash-exp", "name": "Gemini-2.0-Flash-exp"}, {"id": "seedream-4-0", "name": "Seedream-4.0"}, {"id": "gemini-2-0-flash-pre", "name": "Gemini-2.0-Flash-pre"}, {"id": "qwen-image-edit-2509", "name": "Qwen-Image-Edit-2509"}, {"id": "bagel", "name": "BAGEL"}, {"id": "flux-1-kontext-dev", "name": "FLUX.1-Kontext-Dev"}, {"id": "ovis-u1", "name": "Ovis-U1"}, {"id": "step1x-edit", "name": "Step1X-Edit"}, {"id": "omnigen", "name": "OmniGen"}, {"id": "emu2", "name": "EMU2"}, {"id": "hidream-edit", "name": "HiDream-Edit"}, {"id": "flux-1-canny", "name": "FLUX.1-Canny"}]}}}]}</script><script src="portal.js" defer></script></body></html>
|
dist/app.js
ADDED
|
@@ -0,0 +1,258 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
'use strict';
|
| 2 |
+
(() => {
|
| 3 |
+
let DATA = JSON.parse(document.getElementById('leaderboard-data').textContent);
|
| 4 |
+
const CITATIONS = JSON.parse(document.getElementById('citation-data').textContent);
|
| 5 |
+
const $ = (selector) => document.querySelector(selector);
|
| 6 |
+
const $$ = (selector) => [...document.querySelectorAll(selector)];
|
| 7 |
+
const esc = (value) => String(value ?? '').replace(/[&<>"']/g, (ch) => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[ch]));
|
| 8 |
+
const groupLabels = {closed:'Closed-source',open:'Open-source',agentic:'Agentic'};
|
| 9 |
+
const colors = ['#3283bf','#2d9a86','#9b75bd'];
|
| 10 |
+
const params = new URLSearchParams(location.search);
|
| 11 |
+
const initialBenchmark = DATA.benchmarks.find(b => b.id === params.get('benchmark')) || DATA.benchmarks[0];
|
| 12 |
+
const state = {benchmark:initialBenchmark.id,language:params.get('language')==='zh'?'zh':'en',view:'accuracy',dimension:'temporal',subcategory:'all',sort:'total',direction:'desc',group:'all',input:'all',query:'',selected:[],visible:[]};
|
| 13 |
+
let toastTimer;
|
| 14 |
+
const benchmarkMetadata = () => DATA.benchmarks.find(b => b.id === state.benchmark);
|
| 15 |
+
const languageCode = () => benchmarkMetadata().results_by_language[state.language] ? state.language : 'en';
|
| 16 |
+
const benchmark = () => ({...benchmarkMetadata(), ...benchmarkMetadata().results_by_language[languageCode()]});
|
| 17 |
+
const resultLanguageLabel = () => state.benchmark==='risebench-plusplus' ? benchmark().language : 'Original';
|
| 18 |
+
const modelById = id => benchmark().models.find(m => m.id === id);
|
| 19 |
+
const score = (model, key = state.sort) => model[state.view]?.[key] ?? null;
|
| 20 |
+
const fmt = value => value == null ? '—' : value.toFixed(1);
|
| 21 |
+
const summaryKeys = ['total','single','multi'];
|
| 22 |
+
const orderedAccuracyColumns = () => {
|
| 23 |
+
const columns=benchmark().accuracy_columns;
|
| 24 |
+
return benchmark().id==='risebench-plusplus'
|
| 25 |
+
? [...columns.filter(c=>!summaryKeys.includes(c.key)), ...summaryKeys.map(key=>columns.find(c=>c.key===key))]
|
| 26 |
+
: [columns.find(c=>c.key==='total'), ...columns.filter(c=>c.key!=='total')];
|
| 27 |
+
};
|
| 28 |
+
const isBreakdown = () => ['subcategories','task_types'].includes(state.view);
|
| 29 |
+
const viewLabel = () => ({accuracy:'Reasoning accuracy',metrics:'Evaluation scores',subcategories:'Subcategory accuracy',task_types:'Task-type accuracy'}[state.view]);
|
| 30 |
+
const availableColumns = () => {
|
| 31 |
+
const b=benchmark();
|
| 32 |
+
if(state.view==='accuracy')return orderedAccuracyColumns();
|
| 33 |
+
if(state.view==='metrics')return b.metrics;
|
| 34 |
+
return b[state.view==='subcategories'?'subcategory_columns':'task_type_columns'].filter(c=>(state.dimension==='all'||c.dimension===state.dimension)&&(state.view!=='task_types'||state.subcategory==='all'||c.subcategory===state.subcategory));
|
| 35 |
+
};
|
| 36 |
+
const qualifiedLabel = c => isBreakdown()?`${c.dimension[0].toUpperCase()+c.dimension.slice(1)} · ${c.label}`:c.label;
|
| 37 |
+
const scoreLabel = key => availableColumns().find(c=>c.key===key)?.label || key;
|
| 38 |
+
const isPlus = () => state.benchmark === 'risebench-plusplus';
|
| 39 |
+
function toast(message) {
|
| 40 |
+
clearTimeout(toastTimer); $('#toast').textContent = message; $('#toast').hidden = false;
|
| 41 |
+
toastTimer = setTimeout(() => {$('#toast').hidden = true;}, 3000);
|
| 42 |
+
}
|
| 43 |
+
function saveState() {
|
| 44 |
+
try {
|
| 45 |
+
const url = new URL(location.href); url.searchParams.set('benchmark',state.benchmark); url.searchParams.set('language',languageCode());
|
| 46 |
+
history.replaceState(null,'',url);
|
| 47 |
+
} catch (_) { /* Local file previews still work without history updates. */ }
|
| 48 |
+
}
|
| 49 |
+
function filteredModels() {
|
| 50 |
+
const q = state.query.trim().toLowerCase();
|
| 51 |
+
return benchmark().models.filter(m => (!q || m.name.toLowerCase().includes(q)) && (state.group==='all'||m.group===state.group) && (state.input==='all'||m.multi_image===(state.input==='multi'))).sort((a,b) => {
|
| 52 |
+
const av=score(a), bv=score(b);
|
| 53 |
+
if(av===null&&bv===null)return a.source_order-b.source_order;
|
| 54 |
+
if(av===null)return 1;
|
| 55 |
+
if(bv===null)return -1;
|
| 56 |
+
return (state.direction==='desc'?bv-av:av-bv)||a.source_order-b.source_order;
|
| 57 |
+
});
|
| 58 |
+
}
|
| 59 |
+
function rankOf(model) {
|
| 60 |
+
const value = score(model); if(value===null)return null;
|
| 61 |
+
return 1+benchmark().models.filter(m=>score(m)!==null&&score(m)>value).length;
|
| 62 |
+
}
|
| 63 |
+
function renderResources() {
|
| 64 |
+
const b=benchmark();
|
| 65 |
+
$('#hero-links').innerHTML=[['Paper','paper'],['Dataset','data'],['Outputs','outputs'],['Code','github']].map(([label,key])=>`<a href="${esc(b.links[key])}" target="_blank" rel="noopener noreferrer">${label} <span aria-hidden="true">↗</span></a>`).join('');
|
| 66 |
+
$('#submit-results-link').href='submit.html?'+new URLSearchParams({benchmark:state.benchmark,language:languageCode()});
|
| 67 |
+
$('#submit-results-link').setAttribute('aria-label','Submit results to '+b.name);
|
| 68 |
+
$('#board-options').hidden=b.available_result_languages.length<2;
|
| 69 |
+
$$('[data-language]').forEach(button=>button.setAttribute('aria-pressed',button.dataset.language===languageCode()));
|
| 70 |
+
$('#group-filters').innerHTML=isPlus()?['all','closed','open','agentic'].map(g=>`<button data-group="${g}" aria-pressed="${state.group===g}">${g==='all'?'All models':groupLabels[g]}<span>${g==='all'?b.models.length:b.models.filter(m=>m.group===g).length}</span></button>`).join(''):'<span class="caption-text">All models</span>';
|
| 71 |
+
$('.input-filter').hidden=!isPlus();
|
| 72 |
+
$$('[data-plus-only]').forEach(el=>el.hidden=!isPlus());
|
| 73 |
+
$('#page-citation-code').textContent=CITATIONS[state.benchmark];
|
| 74 |
+
$('#citation-benchmark').textContent=b.name;
|
| 75 |
+
$('#page-copy-citation').textContent='Copy BibTeX';
|
| 76 |
+
renderBreakdownControls();
|
| 77 |
+
renderColumns();
|
| 78 |
+
}
|
| 79 |
+
function renderBreakdownControls() {
|
| 80 |
+
$('#breakdown-controls').hidden=!isBreakdown();
|
| 81 |
+
if(!isBreakdown())return;
|
| 82 |
+
const b=benchmark(), dimensions=b.dimensions.filter(d=>b.subcategory_columns.some(c=>c.dimension===d.key));
|
| 83 |
+
$('#dimension-tabs').innerHTML=[{key:'all',label:'All dimensions'},...dimensions].map(d=>`<button data-dimension="${d.key}" aria-pressed="${state.dimension===d.key}">${esc(d.label)}</button>`).join('');
|
| 84 |
+
$('#subcategory-filter').hidden=state.view!=='task_types';
|
| 85 |
+
const subs=b.subcategory_columns.filter(c=>state.dimension==='all'||c.dimension===state.dimension);
|
| 86 |
+
$('#subcategory-select').innerHTML='<option value="all">All subcategories</option>'+subs.map(c=>`<option value="${c.key}">${esc((state.dimension==='all'?c.dimension[0].toUpperCase()+c.dimension.slice(1)+' · ':'')+c.label)}</option>`).join('');
|
| 87 |
+
$('#subcategory-select').value=state.subcategory;
|
| 88 |
+
}
|
| 89 |
+
function resetScoreColumns() {
|
| 90 |
+
state.visible=availableColumns().map(c=>c.key);state.sort=state.visible[0];state.direction='desc';
|
| 91 |
+
renderBreakdownControls();renderColumns();renderTable();$('.table-scroll').scrollLeft=0;
|
| 92 |
+
}
|
| 93 |
+
function renderColumns() {
|
| 94 |
+
$('#column-options').innerHTML='<div class="eyebrow muted" >VISIBLE SCORE COLUMNS</div>'+availableColumns().map(c=>`<label><input type="checkbox" data-column="${c.key}" ${state.visible.includes(c.key)?'checked':''}>${esc(qualifiedLabel(c))}</label>`).join('');
|
| 95 |
+
}
|
| 96 |
+
function renderTable() {
|
| 97 |
+
const b=benchmark(), models=filteredModels(), columns=availableColumns().filter(c=>state.visible.includes(c.key));
|
| 98 |
+
const minimumWidth=370+(isPlus()?86:0)+columns.length*(isBreakdown()?156:96);
|
| 99 |
+
$('#results-table').style.minWidth=minimumWidth+'px';
|
| 100 |
+
$('#results-table').classList.toggle('breakdown-table',isBreakdown());
|
| 101 |
+
$('#table-caption').textContent=b.name+' '+resultLanguageLabel()+' results, '+viewLabel()+(state.view==='metrics'?' (/100)':' (%)')+', sorted by '+scoreLabel(state.sort)+' '+state.direction;
|
| 102 |
+
const summaryClass=key=>isPlus()&&summaryKeys.includes(key)?'summary-result':'';
|
| 103 |
+
const sortableHeader=c=>`<th scope="col" class="${summaryClass(c.key)} ${state.sort===c.key?'active-sort':''}" aria-sort="${state.sort===c.key?(state.direction==='desc'?'descending':'ascending'):'none'}"><button data-sort="${c.key}" title="${esc(c.description)} — sort ${state.sort===c.key&&state.direction==='desc'?'ascending':'descending'}"><span>${c.key==='counterfactual'?'Counter-<br>factual':c.key==='instruction_reasoning'?'Instruction<br>Reasoning':c.key==='appearance_consistency'?'Appearance<br>Consistency':c.key==='visual_plausibility'?'Visual<br>Plausibility':esc(c.label)}</span><span class="sort-icon" aria-hidden="true">${state.sort===c.key?(state.direction==='desc'?'↓':'↑'):'↕'}</span></button></th>`;
|
| 104 |
+
const rowSpan=isBreakdown()?' rowspan="2"':'';
|
| 105 |
+
const modelHeaders=`<th scope="col" class="select-cell"${rowSpan}><span class="sr-only">Compare</span></th><th scope="col" class="rank-cell"${rowSpan} title="Global rank on the currently sorted score">#</th><th scope="col" class="model-cell"${rowSpan}>Model <span class="muted" style="font-weight:400">/ method</span></th>${isPlus()?`<th scope="col" style="width:86px"${rowSpan}>Input</th>`:''}`;
|
| 106 |
+
const groups=[];
|
| 107 |
+
if(isBreakdown())columns.forEach(c=>{
|
| 108 |
+
const dimension=c.dimension[0].toUpperCase()+c.dimension.slice(1);
|
| 109 |
+
const label=state.view==='task_types'?(state.dimension==='all'?dimension+' · ':'')+b.subcategory_columns.find(s=>s.key===c.subcategory).label:dimension;
|
| 110 |
+
const key=state.view==='task_types'?c.subcategory:c.dimension;
|
| 111 |
+
if(groups.at(-1)?.key===key)groups.at(-1).count++;else groups.push({key,label,count:1,dimension:c.dimension});
|
| 112 |
+
});
|
| 113 |
+
$('#table-head').innerHTML=isBreakdown()?`<tr>${modelHeaders}${groups.map(g=>`<th scope="colgroup" colspan="${g.count}" class="dimension-band dim-${g.dimension}">${esc(g.label)}</th>`).join('')}</tr><tr>${columns.map(sortableHeader).join('')}</tr>`:`<tr>${modelHeaders}${columns.map(sortableHeader).join('')}</tr>`;
|
| 114 |
+
$('#table-body').innerHTML=models.map(m=>{
|
| 115 |
+
const rank=rankOf(m), ours=m.id==='rise-agent-ours';
|
| 116 |
+
const cells=columns.map(c=>{const v=score(m,c.key), featured=isPlus()&&summaryKeys.includes(c.key), tint=v==null?0:(featured ? .065+(v/100)*.10 : .02+(v/100)*.055);return `<td class="score-cell ${summaryClass(c.key)} ${c.key==='total'?'overall':''} ${v===null?'missing':''}" style="background-color:rgba(88,118,158,${tint.toFixed(4)})" title="${esc(c.label)}: ${v===null?'Not evaluated':fmt(v)+(state.view==='metrics'?' / 100':'%')}">${fmt(v)}${c.key==='total'&&v!==null?`<span class="score-meter" aria-hidden="true"><i style="width:${v}%"></i></span>`:''}</td>`;}).join('');
|
| 117 |
+
return `<tr class="${ours?'ours ':''}${state.selected.includes(m.id)?'selected':''}"><td class="select-cell"><input type="checkbox" data-select="${esc(m.id)}" aria-label="Compare ${esc(m.name)}" ${state.selected.includes(m.id)?'checked':''}></td><td class="rank-cell">${rank===null?'—':`<span class="${rank<=3?'rank-top rank-'+rank:''}">${rank}</span>`}</td><th scope="row" class="model-cell" style="position:sticky;top:auto"><button class="model-button" data-model="${esc(m.id)}">${esc(m.name)}</button><span class="model-meta">${m.group?`<span class="group-dot ${m.group}"></span>${groupLabels[m.group]}`:''}${ours?'<span class="ours-badge">OURS</span>':''}</span></th>${isPlus()?`<td><span class="input-pill ${m.multi_image?'multi':''}" title="${m.multi_image?'Supports multiple input images':'Single-image only'}">${m.multi_image?'Multi':'Single'}</span></td>`:''}${cells}</tr>`;
|
| 118 |
+
}).join('');
|
| 119 |
+
$('#empty-state').hidden=models.length>0; $('#results-table').hidden=models.length===0;
|
| 120 |
+
$('#result-count').innerHTML=`<strong>${models.length}</strong>${models.length<b.models.length?' / '+b.models.length:''} models`;
|
| 121 |
+
if(isBreakdown())$('#result-count').innerHTML+=`<span class="context-separator">·</span>${columns.length} ${state.view==='subcategories'?'subcategories':'task types'}`;
|
| 122 |
+
$('#reset-filters').hidden=!(state.query||state.group!=='all'||state.input!=='all');
|
| 123 |
+
$$('#group-filters button').forEach(el=>el.setAttribute('aria-pressed',el.dataset.group===state.group));
|
| 124 |
+
renderTray();
|
| 125 |
+
}
|
| 126 |
+
function renderTray() {
|
| 127 |
+
$('#compare-tray').hidden=state.selected.length===0;
|
| 128 |
+
$('#compare-count').textContent=state.selected.length+' / 3 models selected';
|
| 129 |
+
$('#compare-chips').innerHTML=state.selected.map(id=>`<span class="compare-chip">${esc(modelById(id).name)}<button data-remove="${esc(id)}" aria-label="Remove ${esc(modelById(id).name)} from comparison">×</button></span>`).join('');
|
| 130 |
+
$('#compare-open').disabled=state.selected.length<2;
|
| 131 |
+
updateTraySpacing();
|
| 132 |
+
}
|
| 133 |
+
function updateTraySpacing() {
|
| 134 |
+
document.body.style.paddingBottom=state.selected.length?($('#compare-tray').offsetHeight+48)+'px':'';
|
| 135 |
+
}
|
| 136 |
+
if ('ResizeObserver' in window) new ResizeObserver(updateTraySpacing).observe($('#compare-tray'));
|
| 137 |
+
window.addEventListener('resize',updateTraySpacing);
|
| 138 |
+
function toggleSelected(id,checked) {
|
| 139 |
+
if(checked&&state.selected.length>=3){toast('Compare up to 3 models at a time. Remove one to add another.');renderTable();return;}
|
| 140 |
+
state.selected=checked?[...state.selected,id]:state.selected.filter(x=>x!==id);renderTable();
|
| 141 |
+
}
|
| 142 |
+
function resetFilters() {
|
| 143 |
+
state.query='';state.group='all';state.input='all';
|
| 144 |
+
$('#model-search').value='';$('#input-filter').value='all';renderTable();
|
| 145 |
+
}
|
| 146 |
+
function switchBenchmark(id) {
|
| 147 |
+
state.benchmark=id;state.selected=[];state.group='all';state.input='all';state.view='accuracy';state.sort='total';state.direction='desc';
|
| 148 |
+
state.query='';$('#model-search').value='';$('#input-filter').value='all';
|
| 149 |
+
state.visible=availableColumns().map(c=>c.key);
|
| 150 |
+
$$('[data-benchmark]').forEach(btn=>btn.setAttribute('aria-pressed',btn.dataset.benchmark===id));
|
| 151 |
+
$$('[data-view]').forEach(btn=>btn.setAttribute('aria-pressed',btn.dataset.view===state.view));
|
| 152 |
+
renderResources();renderTable();saveState();
|
| 153 |
+
}
|
| 154 |
+
function switchLanguage(language) {
|
| 155 |
+
if(!benchmarkMetadata().results_by_language[language] || language===languageCode())return;
|
| 156 |
+
state.language=language;state.selected=[];
|
| 157 |
+
renderResources();renderTable();saveState();
|
| 158 |
+
}
|
| 159 |
+
function switchView(view) {
|
| 160 |
+
if(!isPlus()&&['subcategories','task_types'].includes(view))return;
|
| 161 |
+
state.view=view;
|
| 162 |
+
if(view==='task_types')state.subcategory=benchmark().subcategory_columns.find(c=>state.dimension==='all'||c.dimension===state.dimension).key;
|
| 163 |
+
state.sort=isBreakdown()?availableColumns()[0].key:view==='accuracy'?'total':'instruction_reasoning';state.direction='desc';state.visible=availableColumns().map(c=>c.key);
|
| 164 |
+
$$('[data-view]').forEach(btn=>btn.setAttribute('aria-pressed',btn.dataset.view===view));
|
| 165 |
+
renderBreakdownControls();renderColumns();renderTable();$('.table-scroll').scrollLeft=0;
|
| 166 |
+
}
|
| 167 |
+
function download(name,content,type) {
|
| 168 |
+
const url=URL.createObjectURL(new Blob([content],{type}));const a=document.createElement('a');a.href=url;a.download=name;document.body.appendChild(a);a.click();a.remove();setTimeout(()=>URL.revokeObjectURL(url),1000);
|
| 169 |
+
}
|
| 170 |
+
function exportCSV(models,name='filtered') {
|
| 171 |
+
const b=benchmark(), mainFields=[...(isPlus()?orderedAccuracyColumns():b.accuracy_columns).map(c=>({type:'accuracy',...c})),...b.metrics.map(c=>({type:'metrics',...c}))];
|
| 172 |
+
const fields=isBreakdown()?[...(name==='comparison'?mainFields:[]),...availableColumns().filter(c=>state.visible.includes(c.key)).map(c=>({type:state.view,...c,label:qualifiedLabel(c)}))]:mainFields;
|
| 173 |
+
const safeCSV=value=>{let t=String(value??'');if(/^\s*[=+@-]|^[\t\r\n]/.test(t))t="'"+t;return '"'+t.replace(/"/g,'""')+'"';};
|
| 174 |
+
const rows=[['Benchmark','Result language','Model','Category','Multi-image support',...fields.map(c=>c.label+(c.type==='metrics'?' (/100)':' (%)'))],...models.map(m=>[b.name,b.language,m.name,groupLabels[m.group]||'Not specified',m.multi_image===null?'Not specified':m.multi_image?'Yes':'No',...fields.map(c=>m[c.type][c.key]===null?'':fmt(m[c.type][c.key]))])];
|
| 175 |
+
download(`${b.id}-${languageCode()}-${state.view}-${name}-results.csv`,'\uFEFF'+rows.map(r=>r.map(safeCSV).join(',')).join('\r\n'),'text/csv;charset=utf-8');toast(`Exported ${models.length} models · ${resultLanguageLabel()} results.`);
|
| 176 |
+
}
|
| 177 |
+
function radar(models) {
|
| 178 |
+
const dims=benchmark().dimensions, cx=205,cy=156,r=98,n=dims.length;
|
| 179 |
+
const point=(i,radius)=>{const a=-Math.PI/2+i*2*Math.PI/n;return [cx+Math.cos(a)*radius,cy+Math.sin(a)*radius];};
|
| 180 |
+
const polygon=radius=>dims.map((_,i)=>point(i,radius).map(x=>x.toFixed(1)).join(',')).join(' ');
|
| 181 |
+
const rings=[20,40,60,80,100].map(v=>`<polygon points="${polygon(r*v/100)}" fill="none" stroke="#dce7ef" stroke-width=".8"/><text class="radar-value" x="${cx+4}" y="${cy-r*v/100-3}">${v}</text>`).join('');
|
| 182 |
+
const lines=dims.map((d,i)=>{const p=point(i,r),l=point(i,r+24);return `<line x1="${cx}" y1="${cy}" x2="${p[0]}" y2="${p[1]}" stroke="#e3ecf3"/><text x="${l[0]}" y="${l[1]+3}" class="radar-label" text-anchor="${Math.abs(l[0]-cx)<1?'middle':l[0]>cx?'start':'end'}">${esc(d.label)}</text>`;}).join('');
|
| 183 |
+
const plots=models.map((m,j)=>{const points=dims.map((d,i)=>point(i,r*(m.accuracy[d.key]??0)/100));return `<polygon points="${points.map(p=>p.join(',')).join(' ')}" fill="${colors[j]}" fill-opacity=".08" stroke="${colors[j]}" stroke-width="2"/>`+points.map(p=>`<circle cx="${p[0]}" cy="${p[1]}" r="2.5" fill="${colors[j]}" stroke="white" stroke-width="1"/>`).join('');}).join('');
|
| 184 |
+
return `<svg class="radar" viewBox="0 0 410 305" role="img" aria-label="Reasoning-dimension accuracy comparison on a shared 0 to 100 percent scale. Exact values are listed in the table below.">${rings}${lines}${plots}</svg>`;
|
| 185 |
+
}
|
| 186 |
+
function showDialog(eyebrow,html) {
|
| 187 |
+
$('#dialog-eyebrow').textContent=eyebrow;$('#dialog-content').innerHTML=html;
|
| 188 |
+
$('#detail-dialog').showModal();$('#detail-dialog').scrollTop=0;
|
| 189 |
+
}
|
| 190 |
+
function showModels(ids) {
|
| 191 |
+
const b=benchmark(), models=ids.map(modelById).filter(Boolean);if(!models.length)return;
|
| 192 |
+
const mixed=isPlus()&&new Set(models.map(m=>m.multi_image)).size>1;
|
| 193 |
+
const tableSection=(title,fields,type)=>`<tr class="comparison-section"><td colspan="${models.length+1}">${title}</td></tr>`+fields.map(c=>{const vals=models.map(m=>m[type]?.[c.key] ?? null);const max=Math.max(...vals.filter(v=>v!==null));return `<tr><td>${esc(c.label)}</td>${vals.map(v=>`<td class="${v!==null&&v===max&&models.length>1?'best-value':''}">${fmt(v)}${v!==null&&type!=='metrics'?'%':''}</td>`).join('')}</tr>`;}).join('');
|
| 194 |
+
showDialog(b.name+' · '+resultLanguageLabel().toUpperCase()+' RESULTS',`<h2 class="dialog-title" id="dialog-title">${models.length===1?esc(models[0].name):'Model comparison'}</h2>${mixed?'<p class="comparison-warning">These models use different evaluation subsets: single-image only and full benchmark.</p>':''}<div class="comparison-layout">${radar(models)}<div class="compare-summaries">${models.map((m,i)=>`<div class="compare-summary"><div><h4><span class="series-dot" style="background:${colors[i]}"></span>${esc(m.name)}</h4><p>${esc(groupLabels[m.group]||b.name)}${isPlus()?' · '+(m.multi_image?'Multi-image supported':'Single-image only'):''}</p></div><strong style="color:${colors[i]}">${fmt(m.accuracy.total)}<small> ${m.accuracy.total!==null?'%':''}<br>${isPlus()?'Total':'Overall'}</small></strong></div>`).join('')}${models.some(m=>m.accuracy.total===null)?'<p class="caption-text">Single-image-only models have no Total score.</p>':''}</div></div><div class="comparison-table-wrap"><table class="comparison-table"><thead><tr><th>Metric</th>${models.map((m,i)=>`<th><span class="series-dot" style="background:${colors[i]}"></span>${esc(m.name)}</th>`).join('')}</tr></thead><tbody>${tableSection('REASONING ACCURACY (%)',isPlus()?orderedAccuracyColumns():b.accuracy_columns,'accuracy')}${tableSection('EVALUATION SCORES (/100)',b.metrics,'metrics')}${isBreakdown()?tableSection(viewLabel().toUpperCase()+' (%)',availableColumns().filter(c=>state.visible.includes(c.key)).map(c=>({...c,label:qualifiedLabel(c)})),state.view):''}</tbody></table></div><div class="dialog-actions"><button class="outline-button" id="dialog-export">Export ${models.length===1?'model':'comparison'} CSV ↓</button></div>`);
|
| 195 |
+
$('#dialog-export').addEventListener('click',()=>exportCSV(models,'comparison'));
|
| 196 |
+
}
|
| 197 |
+
async function copyCitation(text,button) {
|
| 198 |
+
try {await navigator.clipboard.writeText(text);button.textContent='Copied ✓';toast('BibTeX copied.');}
|
| 199 |
+
catch(_){const area=document.createElement('textarea');area.value=text;($('#detail-dialog').open?$('#dialog-content'):document.body).appendChild(area);area.select();const copied=document.execCommand('copy');area.remove();toast(copied?'BibTeX copied.':'Select and copy the citation below.');}
|
| 200 |
+
}
|
| 201 |
+
function showCitation() {
|
| 202 |
+
const citation=CITATIONS[state.benchmark];
|
| 203 |
+
showDialog('CITATION',`<h2 class="dialog-title" id="dialog-title">Cite ${esc(benchmark().name)}</h2><pre class="citation-code"><code>${esc(citation)}</code></pre><div class="dialog-actions"><button class="primary-button" id="copy-citation">Copy BibTeX</button><button class="outline-button" id="save-citation">Download .bib ↓</button></div>`);
|
| 204 |
+
$('#copy-citation').addEventListener('click',e=>copyCitation(citation,e.currentTarget));
|
| 205 |
+
$('#save-citation').addEventListener('click',()=>download(state.benchmark+'.bib',citation+'\n','text/plain;charset=utf-8'));
|
| 206 |
+
}
|
| 207 |
+
document.addEventListener('click',event=>{
|
| 208 |
+
const button=event.target.closest('button');if(!button)return;
|
| 209 |
+
if(button.dataset.benchmark)switchBenchmark(button.dataset.benchmark);
|
| 210 |
+
if(button.dataset.view)switchView(button.dataset.view);
|
| 211 |
+
if(button.dataset.language)switchLanguage(button.dataset.language);
|
| 212 |
+
if(button.dataset.dimension){state.dimension=button.dataset.dimension;state.subcategory='all';resetScoreColumns();}
|
| 213 |
+
if(button.dataset.group){state.group=button.dataset.group;renderTable();}
|
| 214 |
+
if(button.dataset.sort){state.direction=state.sort===button.dataset.sort&&state.direction==='desc'?'asc':'desc';state.sort=button.dataset.sort;renderTable();}
|
| 215 |
+
if(button.dataset.model)showModels([button.dataset.model]);
|
| 216 |
+
if(button.dataset.remove)toggleSelected(button.dataset.remove,false);
|
| 217 |
+
});
|
| 218 |
+
document.addEventListener('change',event=>{
|
| 219 |
+
const input=event.target;
|
| 220 |
+
if(input.dataset.select)toggleSelected(input.dataset.select,input.checked);
|
| 221 |
+
if(input.dataset.column){
|
| 222 |
+
if(!input.checked&&state.visible.length===1){input.checked=true;toast('Keep at least one score column visible.');return;}
|
| 223 |
+
state.visible=input.checked?[...state.visible,input.dataset.column]:state.visible.filter(c=>c!==input.dataset.column);
|
| 224 |
+
if(!state.visible.includes(state.sort)){state.sort=availableColumns().find(c=>state.visible.includes(c.key)).key;state.direction='desc';}
|
| 225 |
+
renderTable();
|
| 226 |
+
}
|
| 227 |
+
});
|
| 228 |
+
$('#model-search').addEventListener('input',e=>{state.query=e.target.value;renderTable();});
|
| 229 |
+
$('#input-filter').addEventListener('change',e=>{state.input=e.target.value;renderTable();});
|
| 230 |
+
$('#subcategory-select').addEventListener('change',e=>{state.subcategory=e.target.value;resetScoreColumns();});
|
| 231 |
+
$('#page-copy-citation').addEventListener('click',e=>copyCitation(CITATIONS[state.benchmark],e.currentTarget));
|
| 232 |
+
$('#page-save-citation').addEventListener('click',()=>download(state.benchmark+'.bib',CITATIONS[state.benchmark]+'\n','text/plain;charset=utf-8'));
|
| 233 |
+
$('#reset-filters').addEventListener('click',resetFilters);$('#empty-reset').addEventListener('click',resetFilters);
|
| 234 |
+
$('#download-csv').addEventListener('click',()=>exportCSV(filteredModels()));
|
| 235 |
+
$('#compare-open').addEventListener('click',()=>showModels(state.selected));
|
| 236 |
+
$('#clear-compare').addEventListener('click',()=>{state.selected=[];renderTable();});
|
| 237 |
+
$('.dialog-close').addEventListener('click',()=>$('#detail-dialog').close());
|
| 238 |
+
$('#detail-dialog').addEventListener('click',e=>{if(e.target===$('#detail-dialog')){const r=e.target.getBoundingClientRect();if(e.clientX<r.left||e.clientX>r.right||e.clientY<r.top||e.clientY>r.bottom)e.target.close();}});
|
| 239 |
+
$('#citation-button').addEventListener('click',showCitation);
|
| 240 |
+
document.addEventListener('click',e=>{if(!$('#column-menu').contains(e.target))$('#column-menu').open=false;});
|
| 241 |
+
document.addEventListener('keydown',e=>{
|
| 242 |
+
if(e.key==='/'&&!['INPUT','TEXTAREA','SELECT'].includes(document.activeElement.tagName)&&!$('#detail-dialog').open){e.preventDefault();$('#model-search').focus();}
|
| 243 |
+
const tab=e.target.closest('[data-benchmark], [data-view], [data-language]');
|
| 244 |
+
if(tab&&['ArrowLeft','ArrowRight','Home','End'].includes(e.key)){
|
| 245 |
+
e.preventDefault();const siblings=[...tab.parentElement.querySelectorAll('[data-benchmark], [data-view], [data-language]')].filter(el=>!el.hidden),i=siblings.indexOf(tab);
|
| 246 |
+
const n=e.key==='Home'?0:e.key==='End'?siblings.length-1:(i+(e.key==='ArrowRight'?1:-1)+siblings.length)%siblings.length;
|
| 247 |
+
siblings[n].click();siblings[n].focus();
|
| 248 |
+
}
|
| 249 |
+
});
|
| 250 |
+
switchBenchmark(state.benchmark);
|
| 251 |
+
if(location.protocol!=='file:')fetch('/api/leaderboard',{cache:'no-store'}).then(r=>r.ok?r.json():null).then(data=>{
|
| 252 |
+
if(!data?.benchmarks)return;
|
| 253 |
+
DATA=data;
|
| 254 |
+
state.selected=state.selected.filter(id=>modelById(id));
|
| 255 |
+
renderResources();renderTable();
|
| 256 |
+
$('#json-download').href='/api/leaderboard';
|
| 257 |
+
}).catch(()=>{});
|
| 258 |
+
})();
|
dist/assets/benchmark-overview.png
ADDED
|
Git LFS Details
|
dist/assets/favicon.svg
ADDED
|
|
dist/assets/rise-agent.png
ADDED
|
Git LFS Details
|
dist/data/leaderboard.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dist/index.html
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dist/portal.css
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
.portal-width { width: min(1120px, calc(100% - 80px)); margin: auto; padding-bottom: 36px; }
|
| 2 |
+
.review-width { width: min(1420px, calc(100% - 80px)); }
|
| 3 |
+
.portal-nav { display: flex; justify-content: space-between; align-items: center; gap: 20px; padding: 28px 0; border-bottom: 1px solid #e1e7ee; }
|
| 4 |
+
.wordmark { font-size: 23px; font-weight: 750; letter-spacing: -.8px; color: #2d435b; }
|
| 5 |
+
.wordmark span { color: #617eaf; }
|
| 6 |
+
.portal-nav > div { display: flex; gap: 25px; align-items: center; font-size: 14px; color: #71819a; }
|
| 7 |
+
.portal-nav [aria-current] { color: #345777; font-weight: 650; }
|
| 8 |
+
.portal-heading { padding: 44px 0 30px; }
|
| 9 |
+
.portal-heading h1 { font-size: clamp(30px, 4vw, 43px); letter-spacing: -1.2px; line-height: 1.2; margin: 0 0 14px; font-weight: 650; color: #233b55; }
|
| 10 |
+
.portal-heading p { margin: 0; color: #79899b; font-size: 16px; }
|
| 11 |
+
.portal-card { padding: 30px; border: 1px solid #dfe6ef; background: white; box-shadow: 0 5px 28px #1f385105; border-radius: 17px; margin-bottom: 24px; }
|
| 12 |
+
.portal-card h2 { font-size: 20px; color: #304861; font-weight: 650; margin: 0; letter-spacing: -.25px; }
|
| 13 |
+
.card-heading { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 14px; margin-bottom: 24px; }
|
| 14 |
+
.card-heading > span, .field-note { font-size: 13px; color: #8b98a7; }
|
| 15 |
+
.field-note { margin-top: -12px; margin-bottom: 20px; }
|
| 16 |
+
.form-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 23px 26px; }
|
| 17 |
+
.portal-width label:not(.upload-zone):not(.confirmation) { display: block; font-size: 14px; color: #4b6077; font-weight: 550; }
|
| 18 |
+
.portal-width input:not([type=checkbox]):not([type=file]), .portal-width select, .portal-width textarea { display: block; width: 100%; border: 1px solid #d5dfea; border-radius: 9px; padding: 12px 14px; font: inherit; font-size: 15px; line-height: 1.5; color: #2e4661; background: #fcfdff; margin-top: 8px; min-width: 0; }
|
| 19 |
+
.portal-width textarea { resize: vertical; }
|
| 20 |
+
.portal-width select { appearance: none; -webkit-appearance: none; padding-right: 46px; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cpath d='m4 6 4 4 4-4' fill='none' stroke='%237589a2' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 16px center; background-size: 16px; }
|
| 21 |
+
.portal-width input[readonly] { background: #f2f5f8; color: #657990; }
|
| 22 |
+
.portal-width input::placeholder, .portal-width textarea::placeholder { color: #a0acba; }
|
| 23 |
+
.portal-width input:focus, .portal-width select:focus, .portal-width textarea:focus { outline: 2px solid #dce6f3; outline-offset: 1px; border-color: #8aa4c7; }
|
| 24 |
+
.portal-width small { display: block; margin-top: 7px; color: #8a97a7; font-size: 12px; font-weight: 400; }
|
| 25 |
+
.optional { color: #9aa6b5; font-size: 11px; font-weight: 450; margin-left: 7px; }
|
| 26 |
+
.full-width { grid-column: 1 / -1; }
|
| 27 |
+
.upload-zone { display: flex; position: relative; flex-direction: column; align-items: center; justify-content: center; gap: 8px; min-height: 190px; padding: 28px; background: #f8faff; border: 1px dashed #b9cce3; border-radius: 12px; text-align: center; cursor: pointer; color: #506c8f; }
|
| 28 |
+
.upload-zone:hover, .upload-zone.dragging { background: #f0f5fc; border-color: #7f9dc1; }
|
| 29 |
+
.upload-zone input { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; }
|
| 30 |
+
.upload-zone:focus-within { outline: 2px solid #7598c5; outline-offset: 3px; }
|
| 31 |
+
.upload-zone svg { width: 28px; height: 28px; stroke: #7b98bb; fill: none; stroke-width: 1.5; margin-bottom: 9px; }
|
| 32 |
+
.upload-zone strong { font-size: 16px; font-weight: 550; }
|
| 33 |
+
.upload-zone > span { font-size: 12px; color: #899bb2; }
|
| 34 |
+
.file-preview { padding: 14px 17px; border-radius: 9px; background: #eef5f4; color: #49706c; margin-top: 14px; font-size: 14px; }
|
| 35 |
+
.artifacts { margin-top: 27px; }
|
| 36 |
+
.confirmation { display: flex; align-items: flex-start; gap: 12px; padding-top: 25px; font-size: 13px; color: #728399; font-weight: 400; line-height: 1.7; }
|
| 37 |
+
.confirmation input { margin-top: 4px; }
|
| 38 |
+
.form-bottom { display: flex; align-items: center; justify-content: space-between; gap: 20px; margin-top: 23px; }
|
| 39 |
+
.portal-width .primary-button { background: #3d648e; border-radius: 9px; font-size: 15px; font-weight: 550; padding: 12px 22px; white-space: nowrap; }
|
| 40 |
+
.portal-width .primary-button:hover { background: #2c507a; }
|
| 41 |
+
.portal-width .outline-button { color: #5d748f; border-color: #d5dfeb; font-size: 14px; }
|
| 42 |
+
.form-message { margin: 0; font-size: 14px; color: #647e89; line-height: 1.65; overflow-wrap: anywhere; }
|
| 43 |
+
.form-message.error { color: #aa4a55; }
|
| 44 |
+
.notice { padding: 14px 18px; border: 1px solid #e1dded; background: #f4f1fa; color: #77708e; border-radius: 10px; font-size: 14px; margin: 0 0 24px; }
|
| 45 |
+
.receipt-card { background: #f1f7fc; border-color: #d1e0f0; }
|
| 46 |
+
.receipt-card p { color: #6f8399; font-size: 14px; }
|
| 47 |
+
.receipt-fields { display: grid; gap: 12px; margin: 24px 0; }
|
| 48 |
+
.receipt-fields code { display: block; overflow-wrap: anywhere; background: #ffffffa8; padding: 12px; border: 1px solid #dfe6ed; border-radius: 7px; color: #506580; font-size: 13px; }
|
| 49 |
+
.receipt-fields small { margin-bottom: 6px; }
|
| 50 |
+
.status-badge { display: inline-block; border-radius: 5px; padding: 3px 8px; background: #eff2f7; color: #6e8099; font-size: 11px; font-weight: 600; }
|
| 51 |
+
.status-badge.pending { background: #fff4dd; color: #a38249; }
|
| 52 |
+
.status-badge.approved { background: #eaf3ed; color: #5d8a70; }
|
| 53 |
+
.status-badge.rejected, .status-badge.withdrawn { background: #f7edef; color: #a6717b; }
|
| 54 |
+
.login-card { max-width: 510px; }
|
| 55 |
+
.login-card h2 { margin-bottom: 22px; }
|
| 56 |
+
.login-card .form-message { margin: 16px 0; }
|
| 57 |
+
.review-toolbar { display: flex; gap: 18px; justify-content: space-between; align-items: center; margin-bottom: 24px; }
|
| 58 |
+
.review-filters { display: flex; gap: 6px; flex-wrap: wrap; }
|
| 59 |
+
.review-filters button { padding: 8px 12px; border: 1px solid transparent; border-radius: 7px; color: #8190a4; font-size: 14px; }
|
| 60 |
+
.review-filters button[aria-pressed=true] { background: #e9eff8; color: #45678d; border-color: #d1ddef; }
|
| 61 |
+
.review-filters span { margin-left: 6px; font-size: 12px; }
|
| 62 |
+
.review-layout { display: grid; grid-template-columns: 300px minmax(0, 1fr); gap: 24px; }
|
| 63 |
+
.review-list { display: flex; flex-direction: column; gap: 12px; }
|
| 64 |
+
.submission-item { display: block; text-align: left; width: 100%; padding: 17px; border: 1px solid #dfe5ef; border-radius: 11px; background: white; }
|
| 65 |
+
.submission-item[aria-pressed=true] { border-color: #91adce; background: #f1f6fd; box-shadow: 0 0 0 2px #e6edf7; }
|
| 66 |
+
.submission-item strong { display: block; font-size: 15px; font-weight: 600; color: #3f5773; line-height: 1.5; overflow-wrap: anywhere; }
|
| 67 |
+
.submission-item p { font-size: 12px; color: #8896a9; margin: 6px 0 10px; }
|
| 68 |
+
.review-detail { min-height: 310px; }
|
| 69 |
+
.review-empty { text-align: center; padding: 48px 15px; color: #8b9aad; }
|
| 70 |
+
.review-empty p { font-size: 14px; }
|
| 71 |
+
.review-meta { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px; margin: 23px 0; font-size: 14px; }
|
| 72 |
+
.review-meta dt { font-size: 11px; text-transform: uppercase; letter-spacing: .8px; color: #96a3b4; margin-bottom: 5px; }
|
| 73 |
+
.review-meta dd { margin: 0; color: #546c84; overflow-wrap: anywhere; }
|
| 74 |
+
.review-meta a { color: #4675a5; text-decoration: underline; text-underline-offset: 3px; }
|
| 75 |
+
.review-notes { white-space: pre-wrap; color: #7f8fa3; background: #f6f8fb; padding: 14px; border-radius: 8px; font-size: 13px; margin-bottom: 24px; }
|
| 76 |
+
.review-scores { width: 100%; border-collapse: collapse; margin: 20px 0 26px; font-size: 14px; }
|
| 77 |
+
.review-scores th, .review-scores td { padding: 10px 12px; border-bottom: 1px solid #e7ecf2; text-align: right; color: #526a85; }
|
| 78 |
+
.review-scores th:first-child, .review-scores td:first-child { text-align: left; }
|
| 79 |
+
.review-scores th { font-weight: 550; color: #8898aa; font-size: 12px; background: #f7f9fc; }
|
| 80 |
+
.review-scores .score-section th { color: #7085a0; background: #edf2f9; padding-block: 8px; }
|
| 81 |
+
.changed-score { color: #405f8e !important; font-weight: 700; background: #f1f5fb; }
|
| 82 |
+
.review-actions { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 22px; }
|
| 83 |
+
.reject-button { color: #9f6470 !important; border-color: #e7cfd5 !important; }
|
| 84 |
+
.history-list { color: #8292a4; font-size: 12px; padding-left: 20px; }
|
| 85 |
+
.submit-link { color: #456a93 !important; }
|
| 86 |
+
@media (max-width: 900px) { .review-layout { grid-template-columns: 1fr; } .review-list { display: grid; grid-template-columns: repeat(2,minmax(0,1fr)); } }
|
| 87 |
+
@media (max-width: 640px) { .portal-width { width: calc(100% - 32px); } .portal-nav { padding-block: 22px; } .portal-nav > div { gap: 13px; font-size: 12px; } .wordmark { font-size: 20px; } .portal-heading { padding-top: 32px; } .portal-card { padding: 21px 17px; } .form-grid, .review-meta, .review-list { grid-template-columns: 1fr; } .form-bottom { flex-direction: column; align-items: stretch; } .review-toolbar { flex-wrap: wrap; } .card-heading > span { font-size: 11px; } .review-scores th, .review-scores td { padding: 9px 6px; font-size: 12px; } }
|
dist/portal.js
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
'use strict';
|
| 2 |
+
(() => {
|
| 3 |
+
const $=s=>document.querySelector(s), $$=s=>[...document.querySelectorAll(s)];
|
| 4 |
+
const schema=JSON.parse($('#submission-schema').textContent);
|
| 5 |
+
const esc=v=>String(v??'').replace(/[&<>"']/g,c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]));
|
| 6 |
+
const labels={pending:'Pending review',approved:'Approved',rejected:'Returned',withdrawn:'Withdrawn'};
|
| 7 |
+
const language=code=>code==='zh'?'Chinese':'English';
|
| 8 |
+
const format=value=>value==null?'—':value.toFixed(1);
|
| 9 |
+
const bById=id=>schema.benchmarks.find(b=>b.id===id);
|
| 10 |
+
const message=(selector,value,error=false)=>{const el=$(selector);el.textContent=value;el.classList.toggle('error',error);};
|
| 11 |
+
let config=null, token=sessionStorage.getItem('rise-review-session')||'';
|
| 12 |
+
async function api(path,body,admin=false) {
|
| 13 |
+
const response=await fetch(path,{method:body===undefined?'GET':'POST',cache:'no-store',headers:{...(body===undefined?{}:{'Content-Type':'application/json'}),...(admin?{Authorization:'Bearer '+token}:{})},...(body===undefined?{}:{body:JSON.stringify(body)})});
|
| 14 |
+
let data;try{data=await response.json();}catch(_){throw new Error('The submission service is not available.');}
|
| 15 |
+
if(!response.ok){const e=new Error(typeof data.detail==='string'?data.detail:'The request could not be completed.');e.status=response.status;throw e;}
|
| 16 |
+
return data;
|
| 17 |
+
}
|
| 18 |
+
function download(filename,data) {
|
| 19 |
+
const url=URL.createObjectURL(new Blob([JSON.stringify(data,null,2)+'\n'],{type:'application/json'}));
|
| 20 |
+
const a=document.createElement('a');a.href=url;a.download=filename;document.body.appendChild(a);a.click();a.remove();setTimeout(()=>URL.revokeObjectURL(url),1000);
|
| 21 |
+
}
|
| 22 |
+
async function connect() {
|
| 23 |
+
try{
|
| 24 |
+
config=await api('/api/config');
|
| 25 |
+
if(config.local_preview){$('#service-notice').hidden=false;$('#service-notice').textContent='Local preview · submissions and review decisions stay on this computer.';}
|
| 26 |
+
}catch(_){$('#service-notice').hidden=false;$('#service-notice').textContent='The submission service is offline. You can browse the form and download a template.';}
|
| 27 |
+
return config;
|
| 28 |
+
}
|
| 29 |
+
function makeTemplate(b) {
|
| 30 |
+
const data={accuracy:Object.fromEntries(b.accuracy_columns.map(c=>[c.label,null])),metrics:Object.fromEntries(b.metrics.map(c=>[c.label,null]))};
|
| 31 |
+
for(const [field,columns] of [['subcategories','subcategory_columns'],['task_types','task_type_columns']])if(b[columns]){
|
| 32 |
+
data[field]={};for(const c of b[columns]){const d=c.dimension[0].toUpperCase()+c.dimension.slice(1);(data[field][d]??={})[c.label]=null;}
|
| 33 |
+
}
|
| 34 |
+
return data;
|
| 35 |
+
}
|
| 36 |
+
if(document.body.dataset.page==='submit') {
|
| 37 |
+
const form=$('#submission-form');let result=null,receipt=null,fileSequence=0;
|
| 38 |
+
const entryParams=new URLSearchParams(location.search);
|
| 39 |
+
if(bById(entryParams.get('benchmark')))form.elements.benchmark.value=entryParams.get('benchmark');
|
| 40 |
+
if(['en','zh'].includes(entryParams.get('language')))form.elements.language.value=entryParams.get('language');
|
| 41 |
+
let models=schema,plusInputSupport=form.elements.multi_image.value;
|
| 42 |
+
const currentBenchmark=()=>bById(form.elements.benchmark.value);
|
| 43 |
+
function updateRevision() {
|
| 44 |
+
const b=models.benchmarks.find(b=>b.id===form.elements.benchmark.value);
|
| 45 |
+
const list=b.results_by_language[form.elements.language.value]?.models||[];
|
| 46 |
+
$('#submission-revision').innerHTML='<option value="">New result</option>'+list.map(m=>`<option value="${esc(m.id)}">${esc(m.name)}</option>`).join('');
|
| 47 |
+
}
|
| 48 |
+
function updateBenchmark() {
|
| 49 |
+
const singleImageOnly=currentBenchmark().id==='risebench';
|
| 50 |
+
form.elements.multi_image.value=singleImageOnly?'false':plusInputSupport;
|
| 51 |
+
form.elements.multi_image.hidden=singleImageOnly;
|
| 52 |
+
form.elements.multi_image.disabled=singleImageOnly;
|
| 53 |
+
$('#single-image-input').hidden=!singleImageOnly;
|
| 54 |
+
const selected=form.elements.language.value;
|
| 55 |
+
$('#submission-language').innerHTML=currentBenchmark().available_result_languages.map(code=>`<option value="${code}">${language(code)}</option>`).join('');
|
| 56 |
+
if(currentBenchmark().available_result_languages.includes(selected))form.elements.language.value=selected;
|
| 57 |
+
updateRevision();
|
| 58 |
+
}
|
| 59 |
+
$('#submission-benchmark').addEventListener('change',updateBenchmark);
|
| 60 |
+
form.elements.multi_image.addEventListener('change',()=>{plusInputSupport=form.elements.multi_image.value;});
|
| 61 |
+
$('#submission-language').addEventListener('change',updateRevision);
|
| 62 |
+
$('#submission-revision').addEventListener('change',()=>{const option=$('#submission-revision').selectedOptions[0];if(option.value)form.elements.model_name.value=option.textContent;});
|
| 63 |
+
$('#download-template').addEventListener('click',()=>download(currentBenchmark().id+'-results-template.json',makeTemplate(currentBenchmark())));
|
| 64 |
+
async function readFile(file) {
|
| 65 |
+
const sequence=++fileSequence;result=null;$('#file-preview').hidden=true;$('#result-file').setCustomValidity('');
|
| 66 |
+
if(!file)return;
|
| 67 |
+
try{
|
| 68 |
+
if(!file.name.toLowerCase().endsWith('.json')||file.size>200000)throw new Error('Choose a JSON file no larger than 200 KB.');
|
| 69 |
+
const value=JSON.parse(await file.text());
|
| 70 |
+
if(sequence!==fileSequence)return;
|
| 71 |
+
if(!value||Array.isArray(value)||typeof value!=='object'||!value.accuracy)throw new Error('Use the result JSON template, including its accuracy section.');
|
| 72 |
+
result=value;$('#upload-title').textContent=file.name;$('#upload-caption').textContent=(file.size/1024).toFixed(1)+' KB · JSON loaded';
|
| 73 |
+
const count=JSON.stringify(value).match(/:\s*\d+(?:\.\d+)?/g)?.length||0;
|
| 74 |
+
$('#file-preview').hidden=false;$('#file-preview').textContent=`${count} score values loaded. Fields and benchmark compatibility will be checked on submission.`;
|
| 75 |
+
message('#submission-message','');
|
| 76 |
+
}catch(error){$('#result-file').setCustomValidity(error.message);message('#submission-message',error.message,true);}
|
| 77 |
+
}
|
| 78 |
+
$('#result-file').addEventListener('change',e=>readFile(e.target.files[0]));
|
| 79 |
+
const zone=$('#upload-zone');zone.addEventListener('dragover',e=>{e.preventDefault();zone.classList.add('dragging');});zone.addEventListener('dragleave',()=>zone.classList.remove('dragging'));
|
| 80 |
+
zone.addEventListener('drop',e=>{e.preventDefault();zone.classList.remove('dragging');if(e.dataTransfer.files.length!==1){message('#submission-message','Choose one result JSON file.',true);return;}$('#result-file').files=e.dataTransfer.files;readFile(e.dataTransfer.files[0]);});
|
| 81 |
+
form.addEventListener('submit',async e=>{
|
| 82 |
+
e.preventDefault();if(!result){message('#submission-message','Choose a result JSON file first.',true);return;}
|
| 83 |
+
if(!config){message('#submission-message','The submission service is offline.',true);return;}
|
| 84 |
+
const button=$('#submit-results');button.disabled=true;message('#submission-message','Validating and submitting…');
|
| 85 |
+
const body=Object.fromEntries(new FormData(form));body.multi_image=currentBenchmark().id!=='risebench'&&form.elements.multi_image.value==='true';body.full_dataset=body.full_dataset==='on';body.results=result;
|
| 86 |
+
try{
|
| 87 |
+
receipt=await api('/api/submissions',body);
|
| 88 |
+
const card=$('#submission-receipt');card.hidden=false;
|
| 89 |
+
card.innerHTML=`<span class="status-badge pending">Pending review</span><h2 style="margin-top:16px">Results received.</h2><p>Save this receipt to check the review status. Results will appear on the leaderboard only after approval.</p><div class="receipt-fields"><div><small>Submission ID</small><code>${esc(receipt.submission_id)}</code></div><div><small>Private receipt key</small><code>${esc(receipt.status_token)}</code></div></div><button type="button" id="save-receipt" class="outline-button">Save receipt ↓</button>`;
|
| 90 |
+
$('#save-receipt').addEventListener('click',()=>download('rise-submission-receipt.json',receipt));
|
| 91 |
+
$('#status-form').elements.submission_id.value=receipt.submission_id;$('#status-form').elements.status_token.value=receipt.status_token;
|
| 92 |
+
form.hidden=true;card.scrollIntoView({behavior:'smooth',block:'start'});message('#submission-message','');
|
| 93 |
+
}catch(error){message('#submission-message',error.message,true);}finally{button.disabled=false;}
|
| 94 |
+
});
|
| 95 |
+
$('#status-form').addEventListener('submit',async e=>{e.preventDefault();try{const r=await api('/api/submission-status',Object.fromEntries(new FormData(e.currentTarget)));message('#status-result',`${r.model_name} — ${labels[r.status]}. ${r.review_note||''}`);}catch(error){message('#status-result',error.message,true);}});
|
| 96 |
+
updateBenchmark();connect().then(async()=>{if(!config){$('#submit-results').disabled=true;return;}try{models=await api('/api/leaderboard');updateRevision();}catch(_){}});
|
| 97 |
+
} else {
|
| 98 |
+
let records=[],filter='pending',selected=null,live=schema;
|
| 99 |
+
const current=()=>records.find(r=>r.id===selected);
|
| 100 |
+
function signOutView() {
|
| 101 |
+
token='';sessionStorage.removeItem('rise-review-session');records=[];selected=null;
|
| 102 |
+
$('#login-panel').hidden=false;$('#review-workspace').hidden=true;$('#sign-out').hidden=true;
|
| 103 |
+
$('#review-list').innerHTML='';$('#review-detail').innerHTML='';
|
| 104 |
+
}
|
| 105 |
+
async function loadQueue() {
|
| 106 |
+
try{
|
| 107 |
+
[records,live]=await Promise.all([api('/api/admin/submissions',undefined,true),api('/api/leaderboard')]);
|
| 108 |
+
$('#login-panel').hidden=true;$('#review-workspace').hidden=false;$('#sign-out').hidden=false;
|
| 109 |
+
$('#pending-count').textContent=records.filter(r=>r.status==='pending').length;
|
| 110 |
+
message('#queue-message','');renderQueue();
|
| 111 |
+
}catch(error){if(error.status===401)signOutView();message(token?'#queue-message':'#login-message',error.message,true);}
|
| 112 |
+
}
|
| 113 |
+
function renderQueue() {
|
| 114 |
+
const items=records.filter(r=>filter==='all'||r.status===filter);
|
| 115 |
+
if(!items.some(r=>r.id===selected))selected=items[0]?.id||null;
|
| 116 |
+
$('#review-list').innerHTML=items.length?items.map(r=>`<button class="submission-item" data-record="${r.id}" aria-pressed="${selected===r.id}"><strong>${esc(r.payload.model_name)}</strong><p>${esc(bById(r.payload.benchmark).name)} · ${language(r.payload.language)}${r.payload.revision_of?' · Update':''}</p><span class="status-badge ${r.status}">${labels[r.status]}</span></button>`).join(''):'<div class="review-empty"><h2>No submissions</h2><p>New results will appear here.</p></div>';
|
| 117 |
+
renderDetail();
|
| 118 |
+
}
|
| 119 |
+
function scoreTable(record) {
|
| 120 |
+
const p=record.payload,b=bById(p.benchmark);
|
| 121 |
+
const previous=p.revision_of?live.benchmarks.find(x=>x.id===p.benchmark).results_by_language[p.language].models.find(m=>m.id===p.revision_of):null;
|
| 122 |
+
const sections=[['Reasoning accuracy','accuracy',b.accuracy_columns],['Evaluation scores','metrics',b.metrics],['Subcategory accuracy','subcategories',b.subcategory_columns||[]],['Task-type accuracy','task_types',b.task_type_columns||[]]];
|
| 123 |
+
return `<table class="review-scores"><thead><tr><th>Score</th>${previous?'<th>Published</th>':''}<th>Submitted</th></tr></thead><tbody>`+sections.map(([label,field,columns])=>{
|
| 124 |
+
const visible=columns.filter(c=>p[field]?.[c.key]!=null||field==='accuracy');
|
| 125 |
+
if(!visible.length)return '';
|
| 126 |
+
return `<tr class="score-section"><th colspan="${previous?3:2}">${label}</th></tr>`+visible.map(c=>{const value=p[field]?.[c.key],old=previous?.[field]?.[c.key];return `<tr><td>${esc((c.dimension?c.dimension[0].toUpperCase()+c.dimension.slice(1)+' · ':'')+c.label)}</td>${previous?`<td>${format(old)}</td>`:''}<td class="${previous&&old!==value?'changed-score':''}">${format(value)}</td></tr>`;}).join('');
|
| 127 |
+
}).join('')+'</tbody></table>';
|
| 128 |
+
}
|
| 129 |
+
function renderDetail() {
|
| 130 |
+
const r=current();if(!r){$('#review-detail').innerHTML='<div class="review-empty"><h2>Ready for review</h2><p>Select a submission to inspect its results.</p></div>';return;}
|
| 131 |
+
const p=r.payload,active=['pending','approved'].includes(r.status);
|
| 132 |
+
$('#review-detail').innerHTML=`<div class="card-heading"><h2>${esc(p.model_name)}</h2><span class="status-badge ${r.status}">${labels[r.status]}</span></div><dl class="review-meta"><div><dt>Benchmark</dt><dd>${esc(bById(p.benchmark).name)} · ${language(p.language)}</dd></div><div><dt>Input support</dt><dd>${p.multi_image?'Multiple input images':'Single input image'}</dd></div><div><dt>Team</dt><dd>${esc(p.team||'Not specified')}</dd></div><div><dt>Contact · private</dt><dd>${esc(p.email)}</dd></div><div><dt>Project</dt><dd><a href="${esc(p.project_url)}" target="_blank" rel="noopener noreferrer">Open project ↗</a></dd></div><div><dt>Evaluation artifacts</dt><dd><a href="${esc(p.evidence_url)}" target="_blank" rel="noopener noreferrer">Inspect results ↗</a></dd></div><div><dt>Submitted</dt><dd>${esc(new Date(r.submitted_at).toLocaleString())}</dd></div><div><dt>Model category</dt><dd>${esc({open:'Open-source',closed:'Closed-source',agentic:'Agentic method'}[p.group])}</dd></div></dl>${p.revision_of?'<p class="notice">This update replaces an existing result. Verify the submitter’s authority before approval.</p>':''}${p.notes?`<div class="review-notes">${esc(p.notes)}</div>`:''}${scoreTable(r)}<button class="outline-button" id="download-review-json">Download submission ↓</button>${active?`<form id="review-form"><label style="margin-top:24px">Review note<textarea id="review-note" rows="3" maxlength="3000" placeholder="Required when returning or withdrawing results; visible to the submitter"></textarea></label><label class="confirmation"><input id="review-confirmed" type="checkbox" required><span>${r.status==='pending'?'I have checked the evaluation artifacts, full-dataset protocol, and submitter’s authority.':'I confirm this approved result should be withdrawn from the leaderboard.'}</span></label><p class="form-message" id="review-message" role="status"></p><div class="review-actions">${r.status==='pending'?'<button type="submit" class="primary-button" value="approve">Approve & publish</button><button type="submit" class="outline-button reject-button" value="reject">Return to submitter</button>':'<button type="submit" class="outline-button reject-button" value="withdraw">Withdraw result</button>'}</div></form>`:''}${r.history.length?`<h3 style="font-size:14px;margin-top:28px">Review history</h3><ul class="history-list">${r.history.map(h=>`<li>${esc(h.decision)} · ${esc(new Date(h.at).toLocaleString())}${h.note?' — '+esc(h.note):''}</li>`).join('')}</ul>`:''}`;
|
| 133 |
+
$('#download-review-json').addEventListener('click',()=>download('rise-submission-'+r.id+'.json',r));
|
| 134 |
+
$('#review-form')?.addEventListener('submit',async e=>{
|
| 135 |
+
e.preventDefault();const decision=e.submitter.value,note=$('#review-note').value.trim();
|
| 136 |
+
if(decision!=='approve'&&!note){message('#review-message','Add a review note explaining this decision.',true);return;}
|
| 137 |
+
$$('#review-form button').forEach(b=>b.disabled=true);
|
| 138 |
+
try{await api('/api/admin/submissions/'+r.id+'/review',{decision,note,revision:r.revision,confirmed:$('#review-confirmed').checked},true);await loadQueue();message('#queue-message',decision==='approve'?'Approved. The result is now on the leaderboard.':decision==='reject'?'Returned. The submitter can read your note using their receipt.':'Withdrawn from the leaderboard.');}
|
| 139 |
+
catch(error){message('#review-message',error.message,true);$$('#review-form button').forEach(b=>b.disabled=false);}
|
| 140 |
+
});
|
| 141 |
+
}
|
| 142 |
+
document.addEventListener('click',e=>{const button=e.target.closest('button');if(!button)return;if(button.dataset.record){selected=button.dataset.record;renderQueue();}if(button.dataset.status){filter=button.dataset.status;$$('[data-status]').forEach(b=>b.setAttribute('aria-pressed',b.dataset.status===filter));renderQueue();}});
|
| 143 |
+
$('#login-form').addEventListener('submit',async e=>{e.preventDefault();$('#login-button').disabled=true;try{const r=await api('/api/admin/session',{password:$('#admin-passphrase').value});token=r.token;sessionStorage.setItem('rise-review-session',token);$('#admin-passphrase').value='';await loadQueue();}catch(error){message('#login-message',error.message,true);}finally{$('#login-button').disabled=false;}});
|
| 144 |
+
$('#sign-out').addEventListener('click',async()=>{try{await api('/api/admin/logout',{},true);}finally{signOutView();}});
|
| 145 |
+
$('#refresh-queue').addEventListener('click',loadQueue);
|
| 146 |
+
connect().then(()=>{if(!config){$('#login-button').disabled=true;return;}if(config.local_preview){$('#passphrase-label').hidden=true;$('#admin-passphrase').required=false;$('#login-button').textContent='Open local review';}if(token)loadQueue();});
|
| 147 |
+
}
|
| 148 |
+
})();
|
dist/styles.css
ADDED
|
@@ -0,0 +1,390 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
:root {
|
| 2 |
+
--ink: #152c3b;
|
| 3 |
+
--muted: #627581;
|
| 4 |
+
--blue: #167b79;
|
| 5 |
+
--teal: #167b79;
|
| 6 |
+
--navy: #163a48;
|
| 7 |
+
--line: #dfe7e8;
|
| 8 |
+
--surface: #fff;
|
| 9 |
+
--canvas: #f7f9f9;
|
| 10 |
+
--soft: #edf6f4;
|
| 11 |
+
--shadow: 0 6px 32px #153c4410;
|
| 12 |
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Inter, Arial, sans-serif;
|
| 13 |
+
color: var(--ink);
|
| 14 |
+
font-size: 16px;
|
| 15 |
+
font-synthesis: none;
|
| 16 |
+
}
|
| 17 |
+
* { box-sizing: border-box; }
|
| 18 |
+
html { scroll-behavior: smooth; scroll-padding-top: 28px; }
|
| 19 |
+
body { margin: 0; background: var(--canvas); line-height: 1.65; -webkit-font-smoothing: antialiased; }
|
| 20 |
+
button, input, select, summary { font: inherit; -webkit-tap-highlight-color: transparent; }
|
| 21 |
+
button, summary, select { cursor: pointer; }
|
| 22 |
+
button { border: 0; background: none; color: inherit; }
|
| 23 |
+
button:disabled { cursor: not-allowed; opacity: .45; }
|
| 24 |
+
a { color: inherit; text-decoration: none; }
|
| 25 |
+
a:hover { color: var(--blue); }
|
| 26 |
+
:focus-visible { outline: 2px solid var(--blue); outline-offset: 4px; border-radius: 4px; }
|
| 27 |
+
[hidden] { display: none !important; }
|
| 28 |
+
.sr-only { position: absolute; width: 1px; height: 1px; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; }
|
| 29 |
+
.skip-link { position: fixed; top: -100px; left: 20px; padding: 12px 20px; background: white; z-index: 99; }
|
| 30 |
+
.skip-link:focus { top: 12px; }
|
| 31 |
+
.page-width { width: min(1536px, calc(100% - 96px)); margin-inline: auto; }
|
| 32 |
+
.muted { color: var(--muted); }
|
| 33 |
+
.divider { margin: 0 8px; color: #b1c0c4; }
|
| 34 |
+
|
| 35 |
+
/* Compact page heading */
|
| 36 |
+
main { padding-bottom: 48px; }
|
| 37 |
+
.leaderboard-header { display: flex; align-items: center; justify-content: space-between; gap: 24px 40px; flex-wrap: wrap; padding-block: 36px 30px; }
|
| 38 |
+
.leaderboard-header h1 { font-size: clamp(28px, 2.5vw, 36px); font-weight: 650; line-height: 1.25; letter-spacing: -1.1px; margin: 0; }
|
| 39 |
+
.resource-links { display: flex; gap: 20px; flex-wrap: wrap; align-items: center; }
|
| 40 |
+
.resource-links a { display: inline-flex; align-items: center; gap: 6px; min-height: 40px; font-size: 15px; font-weight: 550; color: #58717f; }
|
| 41 |
+
.resource-links a:hover { color: var(--blue); text-decoration: underline; text-underline-offset: 4px; }
|
| 42 |
+
.resource-links span { font-size: 14px; color: #8b9eaa; }
|
| 43 |
+
.eyebrow { font-size: 12px; letter-spacing: 1.4px; font-weight: 700; color: var(--blue); display: flex; align-items: center; gap: 9px; line-height: 1.6; }
|
| 44 |
+
.eyebrow.muted { color: var(--muted); }
|
| 45 |
+
|
| 46 |
+
/* Benchmark switcher and context */
|
| 47 |
+
.board-section { scroll-margin-top: 24px; }
|
| 48 |
+
.benchmark-bar { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 20px; padding-bottom: 22px; }
|
| 49 |
+
.benchmark-actions { display: flex; align-items: center; justify-content: flex-end; flex-wrap: wrap; gap: 24px; max-width: 100%; margin-left: auto; }
|
| 50 |
+
.submit-results-button { display: inline-flex; align-items: center; justify-content: center; gap: 11px; min-height: 52px; padding: 12px 22px; border: 1px solid #34577d; border-radius: 11px; background: #3b6088; color: #fff; font-size: 16px; font-weight: 650; white-space: nowrap; box-shadow: 0 4px 12px #2d527923; transition: background .15s, box-shadow .15s; }
|
| 51 |
+
.submit-results-button:hover { background: #2d4e74; color: #fff; box-shadow: 0 6px 16px #2d52792b; }
|
| 52 |
+
.submit-results-button:focus-visible { outline-color: #456c99; }
|
| 53 |
+
.submit-results-button .button-icon { width: 20px; height: 20px; }
|
| 54 |
+
.benchmark-tabs { display: inline-flex; gap: 6px; padding: 6px; background: #eaf0f0; border: 1px solid #dde6e7; border-radius: 14px; }
|
| 55 |
+
.benchmark-tabs button { display: flex; align-items: center; justify-content: center; padding: 10px 22px; min-height: 50px; border: 1px solid transparent; border-radius: 10px; font-size: 20px; font-weight: 650; color: #637982; letter-spacing: -.5px; transition: background .15s, color .15s; }
|
| 56 |
+
.benchmark-tabs button:hover { color: var(--ink); }
|
| 57 |
+
.benchmark-tabs button[aria-pressed=true] { background: white; color: var(--ink); border-color: #d8e5e3; box-shadow: 0 2px 6px #193b4810; }
|
| 58 |
+
.plus { color: var(--teal); }
|
| 59 |
+
.text-button { padding: 0; color: var(--blue); font-size: 14px; font-weight: 600; white-space: nowrap; }
|
| 60 |
+
.text-button:hover, .text-link:hover { text-decoration: underline; text-underline-offset: 4px; }
|
| 61 |
+
|
| 62 |
+
/* Instruction language is a result setting, shared by both score views. */
|
| 63 |
+
.board-options { display: flex; align-items: center; margin-left: auto; }
|
| 64 |
+
.result-language { display: flex; align-items: center; gap: 13px; flex-shrink: 0; margin-left: auto; }
|
| 65 |
+
.result-language > span { font-size: 13px; color: #627886; }
|
| 66 |
+
.language-tabs { display: flex; gap: 3px; padding: 4px; background: #eaf0f5; border: 1px solid #dde5ed; border-radius: 11px; }
|
| 67 |
+
.language-tabs button { min-height: 38px; min-width: 75px; padding: 6px 16px; border: 1px solid transparent; border-radius: 7px; font-size: 14px; font-weight: 550; line-height: 1.5; color: #718599; }
|
| 68 |
+
.language-tabs button:hover { color: #355777; background: #ffffff65; }
|
| 69 |
+
.language-tabs button[aria-pressed=true] { background: #fff; color: #355777; border-color: #d5e0eb; box-shadow: 0 1px 4px #2649630d; font-weight: 650; }
|
| 70 |
+
|
| 71 |
+
@media (max-width: 540px) {
|
| 72 |
+
.board-options { width: 100%; margin-top: 14px; }
|
| 73 |
+
.result-language { width: 100%; justify-content: space-between; }
|
| 74 |
+
.language-tabs button { min-height: 40px; padding-inline: 13px; min-width: 70px; }
|
| 75 |
+
}
|
| 76 |
+
|
| 77 |
+
/* Results toolbar */
|
| 78 |
+
.board-card { background: white; border: 1px solid #d8e2e4; border-radius: 18px; box-shadow: var(--shadow); overflow: visible; }
|
| 79 |
+
.view-row { display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid var(--line); padding: 18px 24px; gap: 20px; }
|
| 80 |
+
.view-tabs { display: flex; align-items: center; padding: 4px; gap: 4px; background: #f0f4f4; border-radius: 11px; }
|
| 81 |
+
.view-tabs button { font-size: 15px; font-weight: 600; color: #667b86; min-height: 42px; padding: 9px 16px; border: 1px solid transparent; border-radius: 8px; white-space: nowrap; }
|
| 82 |
+
.view-tabs button[aria-pressed=true] { color: #186760; background: white; border-color: #dce7e4; box-shadow: 0 1px 4px #213c4310; }
|
| 83 |
+
.view-tabs button > span { font-size: 12px; font-weight: 500; color: #6b8388; margin-left: 6px; }
|
| 84 |
+
.view-actions { display: flex; gap: 10px; align-items: center; }
|
| 85 |
+
.quiet-button, .outline-button { display: inline-flex; align-items: center; justify-content: center; gap: 9px; font-size: 15px; font-weight: 550; padding: 10px 14px; min-height: 44px; border-radius: 9px; white-space: nowrap; transition: background .15s, border-color .15s; }
|
| 86 |
+
.quiet-button { color: #516c78; }
|
| 87 |
+
.quiet-button:hover { background: #edf4f3; color: #1e635e; }
|
| 88 |
+
.view-actions .quiet-button { border: 1px solid #dce5e7; background: white; }
|
| 89 |
+
.view-actions .quiet-button:hover { border-color: #a8c9c5; background: #f6faf9; }
|
| 90 |
+
.button-icon { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 1.65; stroke-linecap: round; stroke-linejoin: round; flex-shrink: 0; }
|
| 91 |
+
.outline-button { border: 1px solid #c8d8db; background: white; padding: 11px 18px; }
|
| 92 |
+
.outline-button:hover { border-color: var(--teal); background: #f4faf8; }
|
| 93 |
+
.column-menu { position: relative; }
|
| 94 |
+
.column-menu summary { list-style: none; }
|
| 95 |
+
.column-menu summary::-webkit-details-marker { display: none; }
|
| 96 |
+
.column-popover { position: absolute; top: calc(100% + 12px); right: 0; background: white; border: 1px solid #d6e3e2; border-radius: 14px; padding: 14px; box-shadow: 0 12px 44px #173b4926; width: 264px; z-index: 20; }
|
| 97 |
+
.column-popover .eyebrow { padding: 5px 8px 12px; font-size: 11px; }
|
| 98 |
+
.column-popover label { display: flex; align-items: center; font-size: 15px; gap: 12px; padding: 8px; border-radius: 6px; }
|
| 99 |
+
.column-popover label:hover { background: #edf6f3; }
|
| 100 |
+
input[type=checkbox] { accent-color: var(--teal); width: 17px; height: 17px; margin: 0; cursor: pointer; flex-shrink: 0; vertical-align: middle; }
|
| 101 |
+
.filter-row { display: flex; align-items: center; gap: 18px; flex-wrap: wrap; padding: 22px 24px 16px; }
|
| 102 |
+
.search-box { display: flex; align-items: center; border: 1px solid #cedcdf; border-radius: 10px; height: 46px; width: 270px; padding: 0 13px; gap: 10px; flex-shrink: 0; background: #fff; transition: box-shadow .15s, border-color .15s; }
|
| 103 |
+
.search-box svg { width: 19px; height: 19px; fill: none; stroke: #728d96; stroke-width: 1.7; flex-shrink: 0; }
|
| 104 |
+
.search-box input { min-width: 0; width: 100%; border: 0; outline: none; font-size: 16px; background: transparent; color: var(--ink); padding: 0; }
|
| 105 |
+
.search-box input::placeholder { color: #7a8d96; }
|
| 106 |
+
.search-box:focus-within { border-color: var(--teal); box-shadow: 0 0 0 3px #167b7912; }
|
| 107 |
+
.search-box kbd { border: 1px solid #dfe7e9; border-radius: 4px; padding: 0 6px; color: #8b9da4; font: 13px/22px ui-monospace, monospace; }
|
| 108 |
+
.group-filters { display: flex; align-items: center; gap: 5px; flex-wrap: wrap; }
|
| 109 |
+
.group-filters button { display: inline-flex; align-items: center; justify-content: center; gap: 8px; padding: 9px 11px; min-height: 42px; border-radius: 8px; font-size: 14px; font-weight: 550; color: #667f89; border: 1px solid transparent; white-space: nowrap; }
|
| 110 |
+
.group-filters button span { font-size: 12px; min-width: 23px; padding: 1px 5px; line-height: 1.5; text-align: center; background: #edf2f3; color: #6b838d; border-radius: 5px; font-variant-numeric: tabular-nums; }
|
| 111 |
+
.group-filters button:hover { background: #f2f7f6; color: var(--ink); }
|
| 112 |
+
.group-filters button[aria-pressed=true] { color: #1d6c63; background: #eaf5f0; border-color: #cee5dc; }
|
| 113 |
+
.group-filters button[aria-pressed=true] span { background: #d5eae1; color: #317867; }
|
| 114 |
+
.input-filter { margin-left: auto; position: relative; flex-shrink: 0; }
|
| 115 |
+
.input-filter:after { content: ""; width: 7px; height: 7px; border: solid #62828a; border-width: 0 1.7px 1.7px 0; transform: rotate(45deg); position: absolute; right: 17px; top: 18px; pointer-events: none; }
|
| 116 |
+
.input-filter select { appearance: none; -webkit-appearance: none; display: block; width: 228px; height: 46px; border: 1px solid #cedcdf; border-radius: 10px; padding: 0 40px 0 15px; background: white; color: #476572; font-size: 15px; font-weight: 500; line-height: normal; outline: none; transition: border-color .15s, box-shadow .15s; }
|
| 117 |
+
.input-filter select:hover { border-color: #97b9b5; }
|
| 118 |
+
.input-filter select:focus-visible { border-color: var(--teal); box-shadow: 0 0 0 3px #167b7917; outline: none; }
|
| 119 |
+
.table-context { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; padding: 0 26px 20px; color: #788e97; font-size: 13px; }
|
| 120 |
+
.table-context > #result-count { color: #58727c; }
|
| 121 |
+
.table-context strong { color: #244d59; font-weight: 650; }
|
| 122 |
+
.sort-hint { margin-left: auto; }
|
| 123 |
+
|
| 124 |
+
/* Wide, readable score table. Row headers and data cells share geometry. */
|
| 125 |
+
.table-scroll { overflow: auto; scrollbar-width: thin; scrollbar-color: #adc9c5 #f2f7f5; border-top: 1px solid var(--line); }
|
| 126 |
+
.table-scroll:focus-visible { outline-offset: -2px; }
|
| 127 |
+
.table-scroll table { width: 100%; border-collapse: separate; border-spacing: 0; table-layout: fixed; font-size: 16px; }
|
| 128 |
+
.table-scroll thead th { height: 72px; background: #f2f6f6; color: #526d77; font-weight: 600; border-bottom: 1px solid #d7e3e3; text-align: center; padding: 10px 8px; vertical-align: middle; font-size: 14px; }
|
| 129 |
+
.table-scroll thead th button { font-size: 14px; font-weight: 600; line-height: 1.4; width: 100%; display: flex; align-items: center; justify-content: center; gap: 5px; padding: 8px 0; }
|
| 130 |
+
.sort-icon { font-size: 12px; color: #afc0c4; }
|
| 131 |
+
.table-scroll th[aria-sort=ascending] .sort-icon, .table-scroll th[aria-sort=descending] .sort-icon { color: var(--teal); }
|
| 132 |
+
.table-scroll thead th.active-sort { background: #e6f2ed; color: #1c7868; }
|
| 133 |
+
.table-scroll thead th.summary-result { background: #e9eef5; color: #45617e; }
|
| 134 |
+
.table-scroll thead th.summary-result.active-sort { background: #dfe8f2; color: #355777; }
|
| 135 |
+
.table-scroll thead th.summary-result.active-sort .sort-icon { color: #52769b; }
|
| 136 |
+
.table-scroll tbody td, .table-scroll tbody th { padding: 14px 8px; border-bottom: 1px solid #e8eeee; height: 72px; vertical-align: middle; background: white; }
|
| 137 |
+
.table-scroll td { text-align: center; font-variant-numeric: tabular-nums; }
|
| 138 |
+
.table-scroll tbody tr:last-child > * { border-bottom: 0; }
|
| 139 |
+
.table-scroll tbody tr:hover td { box-shadow: inset 0 0 0 100px #17866e06; }
|
| 140 |
+
.table-scroll .select-cell { width: 42px; padding-inline: 6px; }
|
| 141 |
+
.table-scroll .rank-cell { width: 48px; color: #7f929a; font-size: 14px; }
|
| 142 |
+
.table-scroll td.rank-cell .rank-top { display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 30px; font-weight: 650; border-radius: 50%; background: #eef3f4; color: #557681; }
|
| 143 |
+
.table-scroll td.rank-cell .rank-1 { background: #fff2d7; color: #9c712a; }
|
| 144 |
+
.table-scroll td.rank-cell .rank-2 { background: #edf1f5; color: #657b91; }
|
| 145 |
+
.table-scroll td.rank-cell .rank-3 { background: #f7eae0; color: #9c7355; }
|
| 146 |
+
.table-scroll .model-cell { text-align: left; padding-left: 14px; width: 280px; position: sticky; left: 0; z-index: 3; background: white; border-right: 1px solid #e3ebeb; }
|
| 147 |
+
.table-scroll thead th.model-cell { background: #f2f6f6; z-index: 4; font-size: 14px; }
|
| 148 |
+
.table-scroll tbody th.model-cell { padding: 14px; }
|
| 149 |
+
.table-scroll .model-button { padding: 0; max-width: 100%; width: auto; text-align: left; display: block; font-size: 15px; font-weight: 600; color: #203f4c; line-height: 1.4; }
|
| 150 |
+
.model-button:hover { color: var(--teal); text-decoration: underline; text-underline-offset: 4px; }
|
| 151 |
+
.model-meta { display: flex; align-items: center; gap: 6px; margin-top: 6px; font-size: 11px; font-weight: 450; color: #798e96; line-height: 1.3; }
|
| 152 |
+
.group-dot { width: 5px; height: 5px; border-radius: 50%; background: #7993b0; }
|
| 153 |
+
.group-dot.open { background: #509b82; }
|
| 154 |
+
.group-dot.agentic { background: #9c80b5; }
|
| 155 |
+
.ours-badge { font-size: 9px; font-weight: 650; letter-spacing: .5px; color: #30745a; background: #e1f1e9; padding: 2px 5px; border-radius: 4px; margin-left: 3px; }
|
| 156 |
+
.input-pill { display: inline-block; font-size: 11px; padding: 3px 7px; border: 1px solid #e0e8eb; border-radius: 6px; color: #788d97; white-space: nowrap; background: #fafcfc; }
|
| 157 |
+
.input-pill.multi { color: #447f7c; background: #edf6f3; border-color: #d7eae5; }
|
| 158 |
+
.score-cell { color: #365765; font-weight: 500; }
|
| 159 |
+
.score-cell.summary-result { font-size: 17px; font-weight: 650; color: #3c5976; }
|
| 160 |
+
.score-cell.overall { font-weight: 700; color: #355777; position: relative; font-size: 17px; }
|
| 161 |
+
.score-cell .score-meter { position: absolute; left: 50%; bottom: 12px; transform: translateX(-50%); display: block; height: 3px; width: 44px; margin: 0; background: #7c98b51a; border-radius: 5px; overflow: hidden; }
|
| 162 |
+
.score-meter i { display: block; height: 3px; background: #92abc4; border-radius: 5px; }
|
| 163 |
+
.score-cell.missing { color: #aebec3; font-weight: 400; background: #fcfdfd !important; }
|
| 164 |
+
.score-cell.summary-result.missing { color: #9aaabd; background: #f3f5f9 !important; }
|
| 165 |
+
.table-scroll tbody tr:hover th.model-cell { background: #f5faf8; }
|
| 166 |
+
.table-scroll tbody tr.selected th.model-cell { background: #eaf5f0; box-shadow: inset 3px 0 #31947b; }
|
| 167 |
+
.table-scroll tbody tr.ours th.model-cell { background: #f0f8f3; }
|
| 168 |
+
.table-scroll tr.ours .model-button { color: #24754f; }
|
| 169 |
+
.table-footer { padding: 8px 20px; display: flex; align-items: center; justify-content: space-between; gap: 15px; font-size: 13px; color: #728b94; border-top: 1px solid var(--line); }
|
| 170 |
+
.footer-actions { display: flex; gap: 6px; align-items: center; }
|
| 171 |
+
.footer-actions .quiet-button { font-size: 13px; min-height: 38px; padding: 6px 10px; }
|
| 172 |
+
.empty-state { padding: 60px 20px; text-align: center; }
|
| 173 |
+
.empty-state > span { font-size: 40px; color: #a2c0c1; }
|
| 174 |
+
.empty-state h3 { font-size: 22px; margin: 5px; }
|
| 175 |
+
.empty-state p { font-size: 16px; color: var(--muted); margin: 0 0 24px; }
|
| 176 |
+
.primary-button { background: var(--teal); color: white; font-size: 15px; font-weight: 600; padding: 11px 19px; min-height: 46px; border-radius: 9px; display: inline-flex; align-items: center; justify-content: center; gap: 10px; box-shadow: 0 2px 4px #167b7910; }
|
| 177 |
+
.primary-button:hover:not(:disabled) { background: #106b67; color: white; }
|
| 178 |
+
|
| 179 |
+
.caption-text { font-size: 13px; color: #728991; margin: 10px 0 0; }
|
| 180 |
+
|
| 181 |
+
/* Comparisons and dialogs */
|
| 182 |
+
.compare-tray { position: fixed; bottom: 24px; left: 50%; transform: translateX(-50%); width: min(1040px, calc(100% - 40px)); padding: 18px 22px; background: #fffffff5; backdrop-filter: blur(14px); border: 1px solid #c4dbd6; box-shadow: 0 12px 60px #163c4929; border-radius: 16px; z-index: 25; display: flex; justify-content: space-between; align-items: center; gap: 20px; }
|
| 183 |
+
.compare-tray > div:first-child { min-width: 0; }
|
| 184 |
+
.compare-tray strong { font-size: 13px; color: #527981; }
|
| 185 |
+
.compare-tray #compare-chips { display: flex; flex-wrap: wrap; gap: 7px; margin-top: 8px; }
|
| 186 |
+
.compare-chip { display: inline-flex; gap: 8px; align-items: center; background: #edf5f1; color: #45776d; font-size: 12px; border-radius: 6px; padding: 4px 9px; }
|
| 187 |
+
.compare-chip button { font-size: 18px; padding: 0 2px; line-height: 1; min-width: 20px; min-height: 24px; }
|
| 188 |
+
.tray-actions { display: flex; gap: 12px; flex-shrink: 0; }
|
| 189 |
+
dialog { padding: 28px 36px 36px; border: 1px solid #d6e3e3; border-radius: 20px; width: min(1060px, calc(100% - 40px)); max-height: 90vh; color: var(--ink); box-shadow: 0 25px 100px #12333f50; overflow: auto; }
|
| 190 |
+
dialog::backdrop { background: #15384070; backdrop-filter: blur(5px); }
|
| 191 |
+
.dialog-top { display: flex; justify-content: space-between; align-items: center; gap: 20px; }
|
| 192 |
+
.dialog-close { font-size: 27px; color: #6a8892; padding: 0; line-height: 1; background: #f0f5f4; border-radius: 50%; width: 38px; height: 38px; flex-shrink: 0; }
|
| 193 |
+
.dialog-close:hover { background: #e1efea; }
|
| 194 |
+
.dialog-title { font-size: 30px; margin: 18px 0 7px; line-height: 1.35; letter-spacing: -.6px; }
|
| 195 |
+
.dialog-subtitle { font-size: 15px; color: var(--muted); margin: 0 0 24px; }
|
| 196 |
+
.comparison-layout { display: grid; grid-template-columns: 1fr 1fr; align-items: center; gap: 20px; }
|
| 197 |
+
.radar { max-height: 380px; width: 100%; overflow: visible; }
|
| 198 |
+
.radar-label { font: 10.5px -apple-system,sans-serif; fill: #557782; }
|
| 199 |
+
.radar-value { font: 8px ui-monospace,monospace; fill: #90a5ad; }
|
| 200 |
+
.compare-summaries { display: flex; flex-direction: column; gap: 14px; }
|
| 201 |
+
.compare-summary { padding: 16px 18px; background: #f3f8f6; border: 1px solid #e0ebe6; border-radius: 10px; display: flex; justify-content: space-between; align-items: center; gap: 14px; }
|
| 202 |
+
.compare-summary h4 { font-size: 15px; margin: 0 0 7px; line-height: 1.5; }
|
| 203 |
+
.compare-summary p { font-size: 12px; color: var(--muted); margin: 0; }
|
| 204 |
+
.compare-summary strong { font-size: 30px; font-weight: 650; font-variant-numeric: tabular-nums; white-space: nowrap; }
|
| 205 |
+
.compare-summary strong small { font-size: 11px; font-weight: 400; color: var(--muted); }
|
| 206 |
+
.series-dot { width: 7px; height: 7px; display: inline-block; border-radius: 50%; margin-right: 6px; }
|
| 207 |
+
.comparison-warning { padding: 13px 16px; border: 1px solid #e8ddbb; background: #fffbef; color: #8b7742; font-size: 13px; border-radius: 8px; margin: 18px 0; }
|
| 208 |
+
.comparison-table-wrap { overflow: auto; }
|
| 209 |
+
.comparison-table { width: 100%; border-collapse: collapse; font-size: 15px; margin-top: 20px; }
|
| 210 |
+
.comparison-table th, .comparison-table td { padding: 13px 12px; text-align: center; border-bottom: 1px solid #e3ebeb; font-variant-numeric: tabular-nums; min-width: 125px; }
|
| 211 |
+
.comparison-table th { font-size: 14px; background: #f0f6f3; font-weight: 600; }
|
| 212 |
+
.comparison-table th:first-child, .comparison-table td:first-child { text-align: left; min-width: 190px; }
|
| 213 |
+
.comparison-table .best-value { font-weight: 750; color: var(--teal); }
|
| 214 |
+
.comparison-section td { font-size: 11px; font-weight: 700; letter-spacing: 1px; color: #78948f; padding-top: 24px; background: #fcfefd; }
|
| 215 |
+
.dialog-actions { display: flex; gap: 12px; margin-top: 26px; justify-content: flex-end; flex-wrap: wrap; }
|
| 216 |
+
.citation-code { background: #f3f7f5; border: 1px solid #dfe8e3; border-radius: 10px; padding: 22px; font: 13px/1.85 ui-monospace,SFMono-Regular,monospace; white-space: pre-wrap; overflow-wrap: anywhere; }
|
| 217 |
+
.toast { position: fixed; bottom: 132px; left: 50%; transform: translateX(-50%); padding: 12px 22px; background: #234e58; color: #fff; font-size: 14px; border-radius: 10px; box-shadow: 0 5px 25px #17324d20; z-index: 100; text-align: center; max-width: 90%; }
|
| 218 |
+
.noscript { margin: 30px; text-align: center; }
|
| 219 |
+
.noscript a { text-decoration: underline; }
|
| 220 |
+
|
| 221 |
+
/* Maintain readable text at smaller widths; only the score table scrolls. */
|
| 222 |
+
@media (max-width: 1350px) {
|
| 223 |
+
.page-width { width: calc(100% - 64px); }
|
| 224 |
+
.filter-row { gap: 14px; }
|
| 225 |
+
.search-box { width: 240px; }
|
| 226 |
+
.group-filters { gap: 2px; }
|
| 227 |
+
.group-filters button { padding-inline: 9px; }
|
| 228 |
+
.input-filter select { width: 218px; }
|
| 229 |
+
}
|
| 230 |
+
@media (max-width: 1100px) {
|
| 231 |
+
.filter-row .search-box { width: 270px; }
|
| 232 |
+
.group-filters { order: 3; width: 100%; gap: 8px; }
|
| 233 |
+
.input-filter { margin-left: auto; }
|
| 234 |
+
.sort-hint { margin-left: 0; }
|
| 235 |
+
.view-row { padding-inline: 18px; gap: 12px; }
|
| 236 |
+
.view-tabs button { padding-inline: 12px; }
|
| 237 |
+
.view-actions { gap: 6px; }
|
| 238 |
+
.view-actions .quiet-button { padding-inline: 12px; font-size: 14px; }
|
| 239 |
+
}
|
| 240 |
+
@media (max-width: 820px) {
|
| 241 |
+
.page-width { width: calc(100% - 40px); }
|
| 242 |
+
.benchmark-tabs button { padding-inline: 16px; font-size: 19px; }
|
| 243 |
+
.view-row { flex-wrap: wrap; padding: 16px 20px; gap: 14px; }
|
| 244 |
+
.view-actions { margin-left: auto; }
|
| 245 |
+
.sort-hint { width: 100%; }
|
| 246 |
+
.table-context { padding-inline: 22px; }
|
| 247 |
+
.caption-text { text-align: left; max-width: none; }
|
| 248 |
+
.comparison-layout { grid-template-columns: 1fr; gap: 24px; }
|
| 249 |
+
.radar { max-height: 320px; }
|
| 250 |
+
.table-footer { flex-wrap: wrap; }
|
| 251 |
+
.compare-tray { padding: 16px; gap: 12px; }
|
| 252 |
+
.tray-actions { flex-direction: column-reverse; gap: 5px; }
|
| 253 |
+
.tray-actions .quiet-button { min-height: 30px; padding: 2px 12px; }
|
| 254 |
+
}
|
| 255 |
+
@media (max-width: 540px) {
|
| 256 |
+
.page-width { width: calc(100% - 32px); }
|
| 257 |
+
.leaderboard-header { padding-block: 26px 22px; gap: 12px; }
|
| 258 |
+
.leaderboard-header h1 { font-size: 28px; letter-spacing: -.7px; }
|
| 259 |
+
.resource-links { gap: 20px; }
|
| 260 |
+
.resource-links a { font-size: 14px; min-height: 36px; }
|
| 261 |
+
.benchmark-bar { display: block; padding-bottom: 18px; }
|
| 262 |
+
.benchmark-actions { flex-direction: column; align-items: stretch; gap: 16px; margin-top: 16px; }
|
| 263 |
+
.benchmark-actions .board-options { margin-top: 0; }
|
| 264 |
+
.submit-results-button { width: 100%; }
|
| 265 |
+
.benchmark-tabs { width: 100%; gap: 4px; padding: 5px; }
|
| 266 |
+
.benchmark-tabs button { flex: 1; padding: 9px 10px; min-height: 48px; font-size: 19px; }
|
| 267 |
+
.board-card { border-radius: 13px; }
|
| 268 |
+
.view-row { padding: 14px; gap: 14px; }
|
| 269 |
+
.view-tabs { width: 100%; gap: 2px; }
|
| 270 |
+
.view-tabs button { flex: 1 1 0; min-width: 0; white-space: normal; font-size: 14px; padding: 8px; min-height: 48px; line-height: 1.4; }
|
| 271 |
+
.view-tabs button > span { display: none; }
|
| 272 |
+
.view-actions { width: 100%; gap: 8px; justify-content: flex-end; }
|
| 273 |
+
.view-actions .quiet-button { font-size: 14px; min-height: 42px; padding: 7px 12px; }
|
| 274 |
+
.filter-row { padding: 16px 14px 14px; gap: 14px; }
|
| 275 |
+
.filter-row .search-box { width: 100%; }
|
| 276 |
+
.input-filter { width: 100%; order: 3; }
|
| 277 |
+
.input-filter select { width: 100%; font-size: 16px; }
|
| 278 |
+
.group-filters { order: 2; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 7px; }
|
| 279 |
+
.group-filters button { padding: 8px 10px; justify-content: space-between; font-size: 13px; border-color: #e2e9e9; }
|
| 280 |
+
.table-context { padding: 0 15px 16px; font-size: 12px; gap: 6px; }
|
| 281 |
+
.sort-hint { font-size: 12px; line-height: 1.8; }
|
| 282 |
+
.sort-hint .divider { margin-inline: 4px; }
|
| 283 |
+
.table-scroll .model-cell { width: 190px; }
|
| 284 |
+
.table-scroll tbody th.model-cell { padding: 14px 10px; }
|
| 285 |
+
.table-scroll .model-button { font-size: 15px; }
|
| 286 |
+
.table-footer { padding: 8px 14px; gap: 10px; font-size: 12px; }
|
| 287 |
+
.table-footer .divider { margin-inline: 4px; }
|
| 288 |
+
.compare-tray { width: calc(100% - 20px); bottom: 10px; padding: 12px; gap: 8px; align-items: start; }
|
| 289 |
+
.compare-tray #compare-chips { gap: 4px; }
|
| 290 |
+
.compare-chip { font-size: 11px; padding: 3px 7px; }
|
| 291 |
+
.compare-tray strong { font-size: 12px; }
|
| 292 |
+
.tray-actions .primary-button { font-size: 13px; padding: 9px 12px; }
|
| 293 |
+
.tray-actions .quiet-button { font-size: 13px; }
|
| 294 |
+
dialog { width: calc(100% - 20px); padding: 20px; border-radius: 15px; max-height: 92vh; }
|
| 295 |
+
.dialog-title { font-size: 26px; }
|
| 296 |
+
.dialog-subtitle { font-size: 14px; }
|
| 297 |
+
.dialog-top .eyebrow { font-size: 10px; letter-spacing: 1px; }
|
| 298 |
+
.compare-summary { padding: 13px; }
|
| 299 |
+
.compare-summary h4 { font-size: 14px; }
|
| 300 |
+
.comparison-table { font-size: 14px; }
|
| 301 |
+
.comparison-table th { font-size: 13px; }
|
| 302 |
+
.comparison-table th:first-child, .comparison-table td:first-child { min-width: 165px; }
|
| 303 |
+
.citation-code { padding: 15px; font-size: 12px; }
|
| 304 |
+
.dialog-actions { justify-content: flex-start; }
|
| 305 |
+
.dialog-actions .primary-button, .dialog-actions .outline-button { font-size: 14px; }
|
| 306 |
+
.toast { bottom: 175px; font-size: 13px; }
|
| 307 |
+
}
|
| 308 |
+
@media (max-width: 380px) {
|
| 309 |
+
.group-filters button { min-width: 0; padding-inline: 8px; gap: 5px; font-size: 12px; }
|
| 310 |
+
.group-filters button span { min-width: 20px; font-size: 11px; padding-inline: 4px; }
|
| 311 |
+
}
|
| 312 |
+
@media (prefers-reduced-motion: reduce) {
|
| 313 |
+
html { scroll-behavior: auto; }
|
| 314 |
+
* { animation: none !important; transition: none !important; }
|
| 315 |
+
}
|
| 316 |
+
|
| 317 |
+
/* Fine-grained results keep the same model rows, with a scoped score header. */
|
| 318 |
+
.view-row { flex-wrap: wrap; }
|
| 319 |
+
.view-actions { margin-left: auto; }
|
| 320 |
+
.breakdown-controls { padding: 18px 24px; border-bottom: 1px solid #e1e8ef; background: #f8fafd; display: flex; flex-wrap: wrap; gap: 18px 24px; align-items: center; }
|
| 321 |
+
.dimension-tabs { display: flex; flex-wrap: wrap; gap: 6px; }
|
| 322 |
+
.dimension-tabs button { padding: 7px 12px; min-height: 38px; border-radius: 7px; font-size: 14px; font-weight: 550; color: #718197; border: 1px solid transparent; }
|
| 323 |
+
.dimension-tabs button:hover { background: #eef2f8; color: #315778; }
|
| 324 |
+
.dimension-tabs button[aria-pressed=true] { background: #e8eef8; border-color: #cfdcef; color: #345980; }
|
| 325 |
+
.subcategory-filter { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; font-size: 13px; color: #78899d; }
|
| 326 |
+
.subcategory-filter select { color: #3f5771; background: white; border: 1px solid #d0dce7; border-radius: 8px; padding: 8px 32px 8px 12px; min-height: 40px; max-width: 100%; font-size: 14px; }
|
| 327 |
+
.context-separator { padding: 0 10px; color: #a6b3bf; }
|
| 328 |
+
.column-popover { max-height: min(65vh, 540px); overflow-y: auto; width: 300px; }
|
| 329 |
+
.column-popover label { font-size: 14px; line-height: 1.5; }
|
| 330 |
+
.table-scroll .breakdown-table thead th { height: 110px; background: #f4f7fb; color: #506680; }
|
| 331 |
+
.table-scroll .breakdown-table thead th.active-sort { background: #e8eff9; color: #355d8a; }
|
| 332 |
+
.table-scroll .breakdown-table thead th.dimension-band { height: 38px; padding: 7px 12px; font-size: 12px; font-weight: 650; letter-spacing: .25px; color: #5e7088; border-bottom-color: #fff; }
|
| 333 |
+
.table-scroll .breakdown-table .dimension-band.dim-temporal { background: #edf0fb; }
|
| 334 |
+
.table-scroll .breakdown-table .dimension-band.dim-causal { background: #eff3e9; }
|
| 335 |
+
.table-scroll .breakdown-table .dimension-band.dim-spatial { background: #eaf2f5; }
|
| 336 |
+
.table-scroll .breakdown-table .dimension-band.dim-logical { background: #eef0f8; }
|
| 337 |
+
.table-scroll .breakdown-table .dimension-band.dim-counterfactual { background: #fbf0e7; }
|
| 338 |
+
|
| 339 |
+
/* Paper figures and citation form a quiet, visual closing section. */
|
| 340 |
+
.research-section { margin-top: 84px; }
|
| 341 |
+
.figure-section { margin-bottom: 72px; scroll-margin-top: 32px; }
|
| 342 |
+
.section-heading { display: flex; align-items: end; justify-content: space-between; flex-wrap: wrap; gap: 18px 30px; margin-bottom: 25px; }
|
| 343 |
+
.section-kicker { display: block; font-size: 11px; font-weight: 650; letter-spacing: 1.8px; color: #8a99ae; margin-bottom: 9px; }
|
| 344 |
+
.section-heading h2 { margin: 0; font-size: 34px; line-height: 1.2; font-weight: 650; letter-spacing: -.9px; color: #273d55; }
|
| 345 |
+
.section-heading .plus { color: #537da9; }
|
| 346 |
+
.section-note { color: #8592a3; font-size: 15px; padding-bottom: 3px; }
|
| 347 |
+
.research-figure { margin: 0; padding: 24px; border: 1px solid #e0e6ee; border-radius: 20px; background: white; box-shadow: 0 8px 36px #23395308; }
|
| 348 |
+
.research-figure a { display: block; position: relative; border-radius: 10px; overflow: hidden; }
|
| 349 |
+
.research-figure img { display: block; width: 100%; height: auto; }
|
| 350 |
+
.figure-expand { position: absolute; bottom: 14px; right: 14px; padding: 8px 14px; background: #ffffffee; box-shadow: 0 2px 15px #20395612; border: 1px solid #dce5ef; border-radius: 8px; color: #526983; font-size: 12px; opacity: 0; transition: opacity .2s; }
|
| 351 |
+
.research-figure a:hover .figure-expand, .research-figure a:focus-visible .figure-expand { opacity: 1; }
|
| 352 |
+
.citation-section { padding: 34px; background: linear-gradient(125deg, #eff3fa, #f7f8fb 70%, #f2f0fa); border: 1px solid #dee5ef; border-radius: 20px; scroll-margin-top: 32px; }
|
| 353 |
+
.citation-section .section-heading { align-items: center; margin-bottom: 22px; }
|
| 354 |
+
.citation-section h2 { font-size: 29px; }
|
| 355 |
+
.citation-actions { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
|
| 356 |
+
.citation-actions button { font-size: 14px; color: #526a86; }
|
| 357 |
+
.citation-actions .outline-button { border-color: #d4dfe9; }
|
| 358 |
+
.page-citation { margin: 0; padding: 26px; border: 1px solid #e1e7f0; background: #ffffffba; color: #5d6e83; font-size: 13px; line-height: 1.85; border-radius: 12px; white-space: pre-wrap; overflow-wrap: anywhere; }
|
| 359 |
+
.page-footer { display: flex; justify-content: space-between; align-items: center; gap: 20px; color: #8b9bad; margin-top: 36px; font-size: 13px; }
|
| 360 |
+
.page-footer > span { font-weight: 650; letter-spacing: -.2px; color: #6d819a; }
|
| 361 |
+
.page-footer a { padding-block: 8px; }
|
| 362 |
+
@media (max-width: 1100px) {
|
| 363 |
+
.view-tabs button { padding-inline: 11px; font-size: 14px; }
|
| 364 |
+
.view-tabs button > span { margin-left: 3px; }
|
| 365 |
+
}
|
| 366 |
+
@media (max-width: 820px) {
|
| 367 |
+
.research-section { margin-top: 56px; }
|
| 368 |
+
.figure-section { margin-bottom: 48px; }
|
| 369 |
+
.section-heading h2 { font-size: 28px; }
|
| 370 |
+
.section-note { font-size: 14px; }
|
| 371 |
+
.research-figure { padding: 14px; border-radius: 14px; }
|
| 372 |
+
.citation-section { padding: 24px; }
|
| 373 |
+
}
|
| 374 |
+
@media (max-width: 540px) {
|
| 375 |
+
.view-tabs { display: flex; flex-wrap: wrap; }
|
| 376 |
+
.view-tabs button { flex-basis: 45%; font-size: 14px; }
|
| 377 |
+
.breakdown-controls { padding: 14px; gap: 14px; }
|
| 378 |
+
.dimension-tabs { gap: 4px; }
|
| 379 |
+
.dimension-tabs button { padding-inline: 9px; font-size: 13px; }
|
| 380 |
+
.subcategory-filter { width: 100%; gap: 6px; }
|
| 381 |
+
.subcategory-filter select { width: 100%; }
|
| 382 |
+
.footer-actions { flex-wrap: wrap; gap: 2px; }
|
| 383 |
+
.footer-actions .quiet-button { padding-inline: 8px; font-size: 12px; }
|
| 384 |
+
.section-heading { gap: 12px; margin-bottom: 20px; }
|
| 385 |
+
.section-kicker { font-size: 10px; }
|
| 386 |
+
.research-figure { padding: 8px; border-radius: 12px; }
|
| 387 |
+
.citation-section { padding: 20px 16px; }
|
| 388 |
+
.citation-actions { width: 100%; }
|
| 389 |
+
.page-citation { padding: 15px; font-size: 12px; }
|
| 390 |
+
}
|
dist/submit.html
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Submit results · RISEBench</title><link rel="icon" href="assets/favicon.svg"><link rel="stylesheet" href="styles.css"><link rel="stylesheet" href="portal.css"></head>
|
| 3 |
+
<body data-page="submit"><main class="portal-width">
|
| 4 |
+
<nav class="portal-nav" aria-label="Main navigation"><a class="wordmark" href="index.html">RISEBench</a><div><a href="index.html">Leaderboard</a><a href="submit.html" aria-current="page">Submit results</a></div></nav>
|
| 5 |
+
<header class="portal-heading"><span class="section-kicker">COMMUNITY EVALUATIONS</span><h1>Submit your results.</h1><p>Submit evaluations for RISEBench or RISEBench++.</p></header>
|
| 6 |
+
<p class="notice" id="service-notice" hidden></p>
|
| 7 |
+
<form id="submission-form">
|
| 8 |
+
<section class="portal-card"><div class="card-heading"><h2>Model details</h2><span>Required unless marked optional</span></div>
|
| 9 |
+
<div class="form-grid">
|
| 10 |
+
<label>Model name<input name="model_name" required maxlength="160" placeholder="Your model name"></label>
|
| 11 |
+
<label>Project, paper or model repository<input name="project_url" type="url" required maxlength="1000" placeholder="https://"></label>
|
| 12 |
+
<label>Team <span class="optional">Optional</span><input name="team" maxlength="120" placeholder="Your team or organization"></label>
|
| 13 |
+
<label>Contact email <span class="optional">Private</span><input name="email" type="email" required maxlength="254" placeholder="name@organization.com"><small>Visible only to reviewers.</small></label>
|
| 14 |
+
<label>Benchmark<select name="benchmark" id="submission-benchmark"><option value="risebench-plusplus">RISEBench++</option><option value="risebench">RISEBench</option></select></label>
|
| 15 |
+
<label>Instruction language<select name="language" id="submission-language"><option value="en">English</option><option value="zh">Chinese</option></select></label>
|
| 16 |
+
<label>Model category<select name="group" required><option value="open">Open-source</option><option value="closed">Closed-source</option><option value="agentic">Agentic method</option></select></label>
|
| 17 |
+
<label>Input support<select name="multi_image"><option value="true">Multiple input images supported</option><option value="false">Single input image only</option></select><input id="single-image-input" type="text" value="Single input image" readonly hidden></label>
|
| 18 |
+
<label class="full-width">Update an existing result <span class="optional">Optional</span><select name="revision_of" id="submission-revision"><option value="">New result</option></select></label>
|
| 19 |
+
</div>
|
| 20 |
+
</section>
|
| 21 |
+
<section class="portal-card"><div class="card-heading"><h2>Evaluation results</h2><button type="button" id="download-template" class="outline-button">Download JSON template ↓</button></div>
|
| 22 |
+
<p class="field-note">Use full benchmark results on a 0–100 scale. Leave unevaluated fields null.</p>
|
| 23 |
+
<label class="upload-zone" id="upload-zone"><input type="file" id="result-file" accept=".json,application/json" required><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 16V3m-5 5 5-5 5 5M4 15v6h16v-6"/></svg><strong id="upload-title">Choose a result JSON or drop it here</strong><span id="upload-caption">One JSON file · up to 200 KB</span></label>
|
| 24 |
+
<div class="file-preview" id="file-preview" hidden></div>
|
| 25 |
+
<div class="form-grid artifacts"><label class="full-width">Evaluation artifacts<input name="evidence_url" type="url" required maxlength="1000" placeholder="https://huggingface.co/datasets/your-team/evaluation-results"><small>Link to generated outputs and detailed evaluation results so reviewers can verify the scores.</small></label>
|
| 26 |
+
<label class="full-width">Notes for reviewers <span class="optional">Optional · private</span><textarea name="notes" rows="3" maxlength="3000" placeholder="Evaluation configuration, model version, or details of an update"></textarea></label></div>
|
| 27 |
+
<label class="confirmation"><input name="full_dataset" type="checkbox" required><span>These scores use the full benchmark and the official evaluation protocol. I am authorized to submit this model's results.</span></label>
|
| 28 |
+
<div class="form-bottom"><p class="form-message" id="submission-message" role="status"></p><button class="primary-button" id="submit-results" type="submit">Submit for review <span aria-hidden="true">→</span></button></div>
|
| 29 |
+
</section>
|
| 30 |
+
</form>
|
| 31 |
+
<section class="portal-card receipt-card" id="submission-receipt" hidden aria-live="polite"></section>
|
| 32 |
+
<section class="portal-card status-card"><div class="card-heading"><h2>Check a submission</h2><span>Your receipt keeps this private</span></div><form id="status-form"><div class="form-grid"><label>Submission ID<input name="submission_id" required autocomplete="off"></label><label>Receipt key<input name="status_token" type="password" required autocomplete="off"></label></div><div class="form-bottom"><p id="status-result" class="form-message" role="status"></p><button class="outline-button" type="submit">Check status</button></div></form></section>
|
| 33 |
+
<footer class="page-footer"><a href="index.html">← Back to leaderboard</a><a href="admin.html">Reviewer sign in</a></footer>
|
| 34 |
+
</main><script id="submission-schema" type="application/json">{"benchmarks": [{"id": "risebench-plusplus", "name": "RISEBench++", "case_count": 1000, "available_result_languages": ["en", "zh"], "accuracy_unit": "%", "metric_unit": "/100", "score_decimals": 1, "default_sort": "total", "dimensions": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}, {"key": "counterfactual", "label": "Counterfactual", "description": "Visualize outcomes under hypothetical or contrary-to-fact conditions."}, {"key": "hybrid", "label": "Hybrid", "description": "Combine reasoning across three to five successive editing instructions."}], "metrics": [{"key": "instruction_reasoning", "label": "Instruction Reasoning", "description": "Whether the edit realizes the intended reasoning outcome."}, {"key": "appearance_consistency", "label": "Appearance Consistency", "description": "Whether content that should remain unchanged is preserved."}, {"key": "visual_plausibility", "label": "Visual Plausibility", "description": "Visual quality and plausibility; logical tasks are excluded."}], "accuracy_columns": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}, {"key": "counterfactual", "label": "Counterfactual", "description": "Visualize outcomes under hypothetical or contrary-to-fact conditions."}, {"key": "hybrid", "label": "Hybrid", "description": "Combine reasoning across three to five successive editing instructions."}, {"key": "single", "label": "Single", "description": "Accuracy on single-image cases."}, {"key": "multi", "label": "Multi", "description": "Accuracy on multi-image cases. Not evaluated for models without multi-image support."}, {"key": "total", "label": "Total", "description": "Accuracy on the complete benchmark. Not evaluated for single-image-only models."}], "subcategory_columns": [{"key": "temporal_common_sense_knowledge", "label": "Common-Sense Knowledge", "dimension": "temporal", "case_count": 85, "multi_image_case_count": 0, "code": "CSK", "description": "Temporal · Common-Sense Knowledge — accuracy (%)"}, {"key": "temporal_context_knowledge", "label": "Context Knowledge", "dimension": "temporal", "case_count": 52, "multi_image_case_count": 28, "code": "CtxK", "description": "Temporal · Context Knowledge — accuracy (%)"}, {"key": "temporal_disciplinary_knowledge", "label": "Disciplinary Knowledge", "dimension": "temporal", "case_count": 63, "multi_image_case_count": 4, "code": "DK", "description": "Temporal · Disciplinary Knowledge — accuracy (%)"}, {"key": "causal_common_sense_knowledge", "label": "Common-Sense Knowledge", "dimension": "causal", "case_count": 80, "multi_image_case_count": 1, "code": "CSK", "description": "Causal · Common-Sense Knowledge — accuracy (%)"}, {"key": "causal_context_knowledge", "label": "Context Knowledge", "dimension": "causal", "case_count": 40, "multi_image_case_count": 2, "code": "CtxK", "description": "Causal · Context Knowledge — accuracy (%)"}, {"key": "causal_disciplinary_knowledge", "label": "Disciplinary Knowledge", "dimension": "causal", "case_count": 80, "multi_image_case_count": 5, "code": "DK", "description": "Causal · Disciplinary Knowledge — accuracy (%)"}, {"key": "spatial_relation", "label": "Relation", "dimension": "spatial", "case_count": 106, "multi_image_case_count": 6, "code": "Rel.", "description": "Spatial · Relation — accuracy (%)"}, {"key": "spatial_structure", "label": "Structure", "dimension": "spatial", "case_count": 94, "multi_image_case_count": 12, "code": "Struct.", "description": "Spatial · Structure — accuracy (%)"}, {"key": "logical_explicit_rule_deduction", "label": "Explicit Rule Deduction", "dimension": "logical", "case_count": 123, "multi_image_case_count": 0, "code": "ERD", "description": "Logical · Explicit Rule Deduction — accuracy (%)"}, {"key": "logical_implicit_pattern_induction", "label": "Implicit Pattern Induction", "dimension": "logical", "case_count": 77, "multi_image_case_count": 20, "code": "IPI", "description": "Logical · Implicit Pattern Induction — accuracy (%)"}, {"key": "counterfactual_counterfactual_imagination", "label": "Counterfactual Imagination", "dimension": "counterfactual", "case_count": 70, "multi_image_case_count": 0, "code": "CFI", "description": "Counterfactual · Counterfactual Imagination — accuracy (%)"}, {"key": "counterfactual_anomaly_correction_and_generation", "label": "Anomaly Correction and Generation", "dimension": "counterfactual", "case_count": 30, "multi_image_case_count": 0, "code": "ACG", "description": "Counterfactual · Anomaly Correction and Generation — accuracy (%)"}], "task_type_columns": [{"key": "T01", "code": "T01", "label": "Life Progression", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 24, "multi_image_case_count": 0, "description": "Temporal · Life Progression — accuracy (%)"}, {"key": "T02", "code": "T02", "label": "Material Transformation", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 9, "multi_image_case_count": 0, "description": "Temporal · Material Transformation — accuracy (%)"}, {"key": "T03", "code": "T03", "label": "Natural Environmental Changes", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 13, "multi_image_case_count": 0, "description": "Temporal · Natural Environmental Changes — accuracy (%)"}, {"key": "T04", "code": "T04", "label": "Physical Aging", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 20, "multi_image_case_count": 0, "description": "Temporal · Physical Aging — accuracy (%)"}, {"key": "T05", "code": "T05", "label": "Social Activities", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 8, "multi_image_case_count": 0, "description": "Temporal · Social Activities — accuracy (%)"}, {"key": "T06", "code": "T06", "label": "Tool Evolution", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 7, "multi_image_case_count": 0, "description": "Temporal · Tool Evolution — accuracy (%)"}, {"key": "T07", "code": "T07", "label": "Urban Evolution", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Temporal · Urban Evolution — accuracy (%)"}, {"key": "T08", "code": "T08", "label": "Temporal State Transition", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 15, "multi_image_case_count": 4, "description": "Temporal · Temporal State Transition — accuracy (%)"}, {"key": "T09", "code": "T09", "label": "Precise Temporal Localization", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 14, "multi_image_case_count": 2, "description": "Temporal · Precise Temporal Localization — accuracy (%)"}, {"key": "T10", "code": "T10", "label": "Position Change", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 15, "multi_image_case_count": 14, "description": "Temporal · Position Change — accuracy (%)"}, {"key": "T11", "code": "T11", "label": "Action Sequence", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 8, "multi_image_case_count": 8, "description": "Temporal · Action Sequence — accuracy (%)"}, {"key": "T12", "code": "T12", "label": "Physics", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Temporal · Physics — accuracy (%)"}, {"key": "T13", "code": "T13", "label": "Chemistry", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 8, "multi_image_case_count": 4, "description": "Temporal · Chemistry — accuracy (%)"}, {"key": "T14", "code": "T14", "label": "Biology", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 9, "multi_image_case_count": 0, "description": "Temporal · Biology — accuracy (%)"}, {"key": "T15", "code": "T15", "label": "Astronomy", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 12, "multi_image_case_count": 0, "description": "Temporal · Astronomy — accuracy (%)"}, {"key": "T16", "code": "T16", "label": "Geography", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 18, "multi_image_case_count": 0, "description": "Temporal · Geography — accuracy (%)"}, {"key": "T17", "code": "T17", "label": "History", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 5, "multi_image_case_count": 0, "description": "Temporal · History — accuracy (%)"}, {"key": "T18", "code": "T18", "label": "Medicine", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Temporal · Medicine — accuracy (%)"}, {"key": "T19", "code": "T19", "label": "Computer Science", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 3, "multi_image_case_count": 0, "description": "Temporal · Computer Science — accuracy (%)"}, {"key": "C01", "code": "C01", "label": "Physical State Transition", "dimension": "causal", "subcategory": "causal_common_sense_knowledge", "case_count": 31, "multi_image_case_count": 0, "description": "Causal · Physical State Transition — accuracy (%)"}, {"key": "C02", "code": "C02", "label": "Structural Damage", "dimension": "causal", "subcategory": "causal_common_sense_knowledge", "case_count": 27, "multi_image_case_count": 0, "description": "Causal · Structural Damage — accuracy (%)"}, {"key": "C03", "code": "C03", "label": "Flexible Deformation", "dimension": "causal", "subcategory": "causal_common_sense_knowledge", "case_count": 22, "multi_image_case_count": 1, "description": "Causal · Flexible Deformation — accuracy (%)"}, {"key": "C04", "code": "C04", "label": "Magnitude Change", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Magnitude Change — accuracy (%)"}, {"key": "C05", "code": "C05", "label": "Reading Offset", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 2, "description": "Causal · Reading Offset — accuracy (%)"}, {"key": "C06", "code": "C06", "label": "Order Relation", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Order Relation — accuracy (%)"}, {"key": "C07", "code": "C07", "label": "Feature Mapping", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Feature Mapping — accuracy (%)"}, {"key": "C08", "code": "C08", "label": "Physics", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 25, "multi_image_case_count": 1, "description": "Causal · Physics — accuracy (%)"}, {"key": "C09", "code": "C09", "label": "Chemistry", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 23, "multi_image_case_count": 4, "description": "Causal · Chemistry — accuracy (%)"}, {"key": "C10", "code": "C10", "label": "Biology", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 12, "multi_image_case_count": 0, "description": "Causal · Biology — accuracy (%)"}, {"key": "C11", "code": "C11", "label": "Astronomy", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 3, "multi_image_case_count": 0, "description": "Causal · Astronomy — accuracy (%)"}, {"key": "C12", "code": "C12", "label": "Medicine", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Causal · Medicine — accuracy (%)"}, {"key": "C13", "code": "C13", "label": "Music Theory", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 3, "multi_image_case_count": 0, "description": "Causal · Music Theory — accuracy (%)"}, {"key": "C14", "code": "C14", "label": "Computer Science", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Computer Science — accuracy (%)"}, {"key": "S01", "code": "S01", "label": "Adjacency", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 11, "multi_image_case_count": 0, "description": "Spatial · Adjacency — accuracy (%)"}, {"key": "S02", "code": "S02", "label": "Direction", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 11, "multi_image_case_count": 0, "description": "Spatial · Direction — accuracy (%)"}, {"key": "S03", "code": "S03", "label": "Orientation", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 11, "multi_image_case_count": 0, "description": "Spatial · Orientation — accuracy (%)"}, {"key": "S04", "code": "S04", "label": "Projection", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 12, "multi_image_case_count": 0, "description": "Spatial · Projection — accuracy (%)"}, {"key": "S05", "code": "S05", "label": "Distance", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 13, "multi_image_case_count": 0, "description": "Spatial · Distance — accuracy (%)"}, {"key": "S06", "code": "S06", "label": "Size", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 15, "multi_image_case_count": 0, "description": "Spatial · Size — accuracy (%)"}, {"key": "S07", "code": "S07", "label": "Configuration", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 18, "multi_image_case_count": 0, "description": "Spatial · Configuration — accuracy (%)"}, {"key": "S08", "code": "S08", "label": "Viewing Scale", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 9, "multi_image_case_count": 0, "description": "Spatial · Viewing Scale — accuracy (%)"}, {"key": "S09", "code": "S09", "label": "Localization", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 6, "multi_image_case_count": 6, "description": "Spatial · Localization — accuracy (%)"}, {"key": "S10", "code": "S10", "label": "Part-Whole Perception", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 24, "multi_image_case_count": 0, "description": "Spatial · Part-Whole Perception — accuracy (%)"}, {"key": "S11", "code": "S11", "label": "Geometric Regularities Reasoning", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 15, "multi_image_case_count": 0, "description": "Spatial · Geometric Regularities Reasoning — accuracy (%)"}, {"key": "S12", "code": "S12", "label": "Viewpoint Generation", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 26, "multi_image_case_count": 0, "description": "Spatial · Viewpoint Generation — accuracy (%)"}, {"key": "S13", "code": "S13", "label": "Environmental Structure Reasoning", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 19, "multi_image_case_count": 2, "description": "Spatial · Environmental Structure Reasoning — accuracy (%)"}, {"key": "S14", "code": "S14", "label": "Egocentric Scene Reconstruction", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 10, "multi_image_case_count": 10, "description": "Spatial · Egocentric Scene Reconstruction — accuracy (%)"}, {"key": "L01", "code": "L01", "label": "Path Searching", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 24, "multi_image_case_count": 0, "description": "Logical · Path Searching — accuracy (%)"}, {"key": "L02", "code": "L02", "label": "Mathematical Derivation", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 27, "multi_image_case_count": 0, "description": "Logical · Mathematical Derivation — accuracy (%)"}, {"key": "L03", "code": "L03", "label": "Game Deduction", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 37, "multi_image_case_count": 0, "description": "Logical · Game Deduction — accuracy (%)"}, {"key": "L04", "code": "L04", "label": "Puzzle Solving", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 35, "multi_image_case_count": 0, "description": "Logical · Puzzle Solving — accuracy (%)"}, {"key": "L05", "code": "L05", "label": "Pattern Prediction", "dimension": "logical", "subcategory": "logical_implicit_pattern_induction", "case_count": 39, "multi_image_case_count": 0, "description": "Logical · Pattern Prediction — accuracy (%)"}, {"key": "L06", "code": "L06", "label": "Visual Oddity Detection", "dimension": "logical", "subcategory": "logical_implicit_pattern_induction", "case_count": 18, "multi_image_case_count": 0, "description": "Logical · Visual Oddity Detection — accuracy (%)"}, {"key": "L07", "code": "L07", "label": "Rule Transfer", "dimension": "logical", "subcategory": "logical_implicit_pattern_induction", "case_count": 20, "multi_image_case_count": 20, "description": "Logical · Rule Transfer — accuracy (%)"}, {"key": "F01", "code": "F01", "label": "Physical Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 23, "multi_image_case_count": 0, "description": "Counterfactual · Physical Counterfactual — accuracy (%)"}, {"key": "F02", "code": "F02", "label": "Chemical Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 9, "multi_image_case_count": 0, "description": "Counterfactual · Chemical Counterfactual — accuracy (%)"}, {"key": "F03", "code": "F03", "label": "Biological Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 8, "multi_image_case_count": 0, "description": "Counterfactual · Biological Counterfactual — accuracy (%)"}, {"key": "F04", "code": "F04", "label": "Astronomy Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 7, "multi_image_case_count": 0, "description": "Counterfactual · Astronomy Counterfactual — accuracy (%)"}, {"key": "F05", "code": "F05", "label": "Geography Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 8, "multi_image_case_count": 0, "description": "Counterfactual · Geography Counterfactual — accuracy (%)"}, {"key": "F06", "code": "F06", "label": "History Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 7, "multi_image_case_count": 0, "description": "Counterfactual · History Counterfactual — accuracy (%)"}, {"key": "F07", "code": "F07", "label": "Music Theory Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 4, "multi_image_case_count": 0, "description": "Counterfactual · Music Theory Counterfactual — accuracy (%)"}, {"key": "F08", "code": "F08", "label": "Computer Science Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 4, "multi_image_case_count": 0, "description": "Counterfactual · Computer Science Counterfactual — accuracy (%)"}, {"key": "F09", "code": "F09", "label": "Anatomical Errors", "dimension": "counterfactual", "subcategory": "counterfactual_anomaly_correction_and_generation", "case_count": 10, "multi_image_case_count": 0, "description": "Counterfactual · Anatomical Errors — accuracy (%)"}, {"key": "F10", "code": "F10", "label": "Structural Anomalies", "dimension": "counterfactual", "subcategory": "counterfactual_anomaly_correction_and_generation", "case_count": 11, "multi_image_case_count": 0, "description": "Counterfactual · Structural Anomalies — accuracy (%)"}, {"key": "F11", "code": "F11", "label": "Relational Anomalies", "dimension": "counterfactual", "subcategory": "counterfactual_anomaly_correction_and_generation", "case_count": 9, "multi_image_case_count": 0, "description": "Counterfactual · Relational Anomalies — accuracy (%)"}], "links": {"paper": "https://arxiv.org/abs/2610.12343", "data": "https://huggingface.co/datasets/VisionXLab/RISEBench-plusplus", "outputs": "https://huggingface.co/datasets/VisionXLab/RISEBench-plusplus_Outputs", "github": "https://github.com/VisionXLab/RISEBench/tree/main/RISEBench%2B%2B"}, "judges": {"instruction_reasoning": "Gemini-3-Flash", "appearance_consistency": "Gemini-3-Flash", "visual_plausibility": "Gemini-3.1-Flash-Lite"}, "results_by_language": {"en": {"models": [{"id": "gpt-image-2-5-sunburst", "name": "GPT-Image-2.5 Sunburst"}, {"id": "nano-banana-pro", "name": "Nano Banana Pro"}, {"id": "nano-banana-2", "name": "Nano Banana 2"}, {"id": "gpt-image-2", "name": "GPT-Image-2"}, {"id": "gpt-image-2-5-flare", "name": "GPT-Image-2.5 Flare"}, {"id": "luma-uni-1", "name": "Luma Uni-1"}, {"id": "qwen-image-3-0", "name": "Qwen-Image-3.0"}, {"id": "nano-banana-2-lite", "name": "Nano Banana 2 Lite"}, {"id": "flux-2-max", "name": "FLUX.2 Max"}, {"id": "gpt-image-1-5", "name": "GPT-Image-1.5"}, {"id": "flux-2-pro", "name": "FLUX.2 Pro"}, {"id": "nano-banana", "name": "Nano Banana"}, {"id": "hunyuanimage-3-5", "name": "HunyuanImage-3.5"}, {"id": "wan2-7-image-pro", "name": "Wan2.7-Image-Pro"}, {"id": "gpt-image-1", "name": "GPT-Image-1"}, {"id": "qwen-image-2-0", "name": "Qwen-Image-2.0"}, {"id": "seedream-4-5", "name": "Seedream 4.5"}, {"id": "seedream-5-0", "name": "Seedream 5.0"}, {"id": "step-image-edit-2", "name": "Step Image Edit 2"}, {"id": "hunyuanimage-3-0-instruct", "name": "HunyuanImage-3.0-Instruct"}, {"id": "qwen-image-edit-2511", "name": "Qwen-Image-Edit-2511"}, {"id": "qwen-image-2-1", "name": "Qwen-Image-2.1"}, {"id": "firered-image-edit-1-0", "name": "FireRed-Image-Edit-1.0"}, {"id": "firered-image-edit-1-1", "name": "FireRed-Image-Edit-1.1"}, {"id": "qwen-image-edit-2509", "name": "Qwen-Image-Edit-2509"}, {"id": "hidream-o1-image", "name": "HiDream-O1-Image"}, {"id": "flux-2-dev", "name": "FLUX.2 Dev"}, {"id": "flux-2-klein-9b", "name": "FLUX.2 Klein 9B"}, {"id": "joyai-image-edit-plus", "name": "JoyAI-Image-Edit-Plus"}, {"id": "sensenova-u1-a3b-mot-sft", "name": "SenseNova-U1-A3B-MoT-SFT"}, {"id": "unipic-3-0", "name": "UniPic 3.0"}, {"id": "bagel-w-cot", "name": "BAGEL (w/ CoT)"}, {"id": "sensenova-u1-8b-mot-sft", "name": "SenseNova-U1-8B-MoT-SFT"}, {"id": "flux-2-klein-4b", "name": "FLUX.2 Klein 4B"}, {"id": "uniworld-v2", "name": "UniWorld-V2"}, {"id": "bagel", "name": "BAGEL"}, {"id": "omnigen2", "name": "OmniGen2"}, {"id": "omnigen", "name": "OmniGen"}, {"id": "emu2-gen", "name": "Emu2-Gen"}, {"id": "joyai-image-edit", "name": "JoyAI-Image-Edit"}, {"id": "step1x-edit-thinking", "name": "Step1X-Edit (thinking)"}, {"id": "boogu-image-0-1-edit", "name": "Boogu-Image-0.1-Edit"}, {"id": "step1x-edit-thinking-reflection", "name": "Step1X-Edit (thinking + reflection)"}, {"id": "longcat-image-edit", "name": "LongCat-Image-Edit"}, {"id": "step1x-edit-base", "name": "Step1X-Edit (base)"}, {"id": "internvl-u-w-cot", "name": "InternVL-U (w/ CoT)"}, {"id": "flux-1-kontext-dev", "name": "FLUX.1 Kontext Dev"}, {"id": "llada-image", "name": "LLaDA-Image"}, {"id": "ovis-u1", "name": "Ovis-U1"}, {"id": "internvl-u", "name": "InternVL-U"}, {"id": "unipic2-sd3-5m-kontext-2b", "name": "UniPic2-SD3.5M-Kontext-2B"}, {"id": "lumina-dimoo", "name": "Lumina-DiMOO"}, {"id": "uniworld-v1", "name": "UniWorld-V1"}, {"id": "rise-agent-ours", "name": "RISE-Agent (Ours)"}, {"id": "mindbrush", "name": "MindBrush"}, {"id": "interleavethinker", "name": "InterleaveThinker"}, {"id": "intentedit", "name": "IntentEdit"}, {"id": "imagent", "name": "ImAgent"}]}, "zh": {"models": [{"id": "gpt-image-2-5-sunburst", "name": "GPT-Image-2.5 Sunburst"}, {"id": "nano-banana-pro", "name": "Nano Banana Pro"}, {"id": "nano-banana-2", "name": "Nano Banana 2"}, {"id": "luma-uni-1", "name": "Luma Uni-1"}, {"id": "gpt-image-2", "name": "GPT-Image-2"}, {"id": "qwen-image-3-0", "name": "Qwen-Image-3.0"}, {"id": "gpt-image-2-5-flare", "name": "GPT-Image-2.5 Flare"}, {"id": "flux-2-max", "name": "FLUX.2 Max"}, {"id": "nano-banana-2-lite", "name": "Nano Banana 2 Lite"}, {"id": "gpt-image-1-5", "name": "GPT-Image-1.5"}, {"id": "nano-banana", "name": "Nano Banana"}, {"id": "flux-2-pro", "name": "FLUX.2 Pro"}, {"id": "hunyuanimage-3-5", "name": "HunyuanImage-3.5"}, {"id": "wan2-7-image-pro", "name": "Wan2.7-Image-Pro"}, {"id": "qwen-image-2-0", "name": "Qwen-Image-2.0"}, {"id": "seedream-4-5", "name": "Seedream 4.5"}, {"id": "seedream-5-0", "name": "Seedream 5.0"}, {"id": "gpt-image-1", "name": "GPT-Image-1"}, {"id": "step-image-edit-2", "name": "Step Image Edit 2"}, {"id": "hunyuanimage-3-0-instruct", "name": "HunyuanImage-3.0-Instruct"}, {"id": "qwen-image-2-1", "name": "Qwen-Image-2.1"}, {"id": "firered-image-edit-1-1", "name": "FireRed-Image-Edit-1.1"}, {"id": "flux-2-dev", "name": "FLUX.2 Dev"}, {"id": "qwen-image-edit-2511", "name": "Qwen-Image-Edit-2511"}, {"id": "qwen-image-edit-2509", "name": "Qwen-Image-Edit-2509"}, {"id": "firered-image-edit-1-0", "name": "FireRed-Image-Edit-1.0"}, {"id": "sensenova-u1-a3b-mot-sft", "name": "SenseNova-U1-A3B-MoT-SFT"}, {"id": "joyai-image-edit-plus", "name": "JoyAI-Image-Edit-Plus"}, {"id": "flux-2-klein-9b", "name": "FLUX.2 Klein 9B"}, {"id": "bagel-w-cot", "name": "BAGEL (w/ CoT)"}, {"id": "hidream-o1-image", "name": "HiDream-O1-Image"}, {"id": "flux-2-klein-4b", "name": "FLUX.2 Klein 4B"}, {"id": "uniworld-v2", "name": "UniWorld-V2"}, {"id": "sensenova-u1-8b-mot-sft", "name": "SenseNova-U1-8B-MoT-SFT"}, {"id": "unipic-3-0", "name": "UniPic 3.0"}, {"id": "bagel", "name": "BAGEL"}, {"id": "omnigen2", "name": "OmniGen2"}, {"id": "omnigen", "name": "OmniGen"}, {"id": "emu2-gen", "name": "Emu2-Gen"}, {"id": "joyai-image-edit", "name": "JoyAI-Image-Edit"}, {"id": "boogu-image-0-1-edit", "name": "Boogu-Image-0.1-Edit"}, {"id": "step1x-edit-thinking-reflection", "name": "Step1X-Edit (thinking + reflection)"}, {"id": "step1x-edit-thinking", "name": "Step1X-Edit (thinking)"}, {"id": "step1x-edit-base", "name": "Step1X-Edit (base)"}, {"id": "longcat-image-edit", "name": "LongCat-Image-Edit"}, {"id": "flux-1-kontext-dev", "name": "FLUX.1 Kontext Dev"}, {"id": "llada-image", "name": "LLaDA-Image"}, {"id": "internvl-u-w-cot", "name": "InternVL-U (w/ CoT)"}, {"id": "ovis-u1", "name": "Ovis-U1"}, {"id": "internvl-u", "name": "InternVL-U"}, {"id": "lumina-dimoo", "name": "Lumina-DiMOO"}, {"id": "uniworld-v1", "name": "UniWorld-V1"}, {"id": "unipic2-sd3-5m-kontext-2b", "name": "UniPic2-SD3.5M-Kontext-2B"}, {"id": "rise-agent-ours", "name": "RISE-Agent (Ours)"}, {"id": "mindbrush", "name": "MindBrush"}, {"id": "interleavethinker", "name": "InterleaveThinker"}, {"id": "intentedit", "name": "IntentEdit"}, {"id": "imagent", "name": "ImAgent"}]}}}, {"id": "risebench", "name": "RISEBench", "case_count": 360, "available_result_languages": ["en"], "accuracy_unit": "%", "metric_unit": "/100", "score_decimals": 1, "default_sort": "total", "dimensions": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}], "metrics": [{"key": "instruction_reasoning", "label": "Instruction Reasoning", "description": "Whether the edit realizes the intended reasoning outcome."}, {"key": "appearance_consistency", "label": "Appearance Consistency", "description": "Whether content that should remain unchanged is preserved."}, {"key": "visual_plausibility", "label": "Visual Plausibility", "description": "Visual quality and plausibility; logical tasks are excluded."}], "accuracy_columns": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}, {"key": "total", "label": "Overall", "description": "Accuracy on the complete RISEBench-360 benchmark."}], "links": {"paper": "https://arxiv.org/abs/2504.02826", "data": "https://huggingface.co/datasets/PhoenixZ/RISEBench", "outputs": "https://huggingface.co/datasets/zpy777/RISEBench_Outputs", "github": "https://github.com/VisionXLab/RISEBench/tree/main/RISEBench"}, "judges": {"instruction_reasoning": "GPT-4o", "appearance_consistency": "GPT-4o", "visual_plausibility": "GPT-4o"}, "results_by_language": {"en": {"models": [{"id": "gpt-image-1-5", "name": "GPT-Image-1.5"}, {"id": "gpt-image-2", "name": "GPT-Image-2"}, {"id": "gemini-3-pro-image-preview-nano-banana-pro", "name": "Gemini-3-pro-image-preview (Nano Banana-pro)"}, {"id": "gemini-2-5-flash-image-nano-banana", "name": "Gemini-2.5-Flash-Image (Nano Banana)"}, {"id": "gpt-image-1", "name": "GPT-Image-1"}, {"id": "gpt-image-1-mini", "name": "GPT-Image-1-mini"}, {"id": "qwen-image-edit-2511", "name": "Qwen-Image-Edit-2511"}, {"id": "bagel-w-cot", "name": "BAGEL (w/ CoT)"}, {"id": "gemini-2-0-flash-exp", "name": "Gemini-2.0-Flash-exp"}, {"id": "seedream-4-0", "name": "Seedream-4.0"}, {"id": "gemini-2-0-flash-pre", "name": "Gemini-2.0-Flash-pre"}, {"id": "qwen-image-edit-2509", "name": "Qwen-Image-Edit-2509"}, {"id": "bagel", "name": "BAGEL"}, {"id": "flux-1-kontext-dev", "name": "FLUX.1-Kontext-Dev"}, {"id": "ovis-u1", "name": "Ovis-U1"}, {"id": "step1x-edit", "name": "Step1X-Edit"}, {"id": "omnigen", "name": "OmniGen"}, {"id": "emu2", "name": "EMU2"}, {"id": "hidream-edit", "name": "HiDream-Edit"}, {"id": "flux-1-canny", "name": "FLUX.1-Canny"}]}}}]}</script><script src="portal.js" defer></script></body></html>
|
index.html
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
portal.css
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
.portal-width { width: min(1120px, calc(100% - 80px)); margin: auto; padding-bottom: 36px; }
|
| 2 |
+
.review-width { width: min(1420px, calc(100% - 80px)); }
|
| 3 |
+
.portal-nav { display: flex; justify-content: space-between; align-items: center; gap: 20px; padding: 28px 0; border-bottom: 1px solid #e1e7ee; }
|
| 4 |
+
.wordmark { font-size: 23px; font-weight: 750; letter-spacing: -.8px; color: #2d435b; }
|
| 5 |
+
.wordmark span { color: #617eaf; }
|
| 6 |
+
.portal-nav > div { display: flex; gap: 25px; align-items: center; font-size: 14px; color: #71819a; }
|
| 7 |
+
.portal-nav [aria-current] { color: #345777; font-weight: 650; }
|
| 8 |
+
.portal-heading { padding: 44px 0 30px; }
|
| 9 |
+
.portal-heading h1 { font-size: clamp(30px, 4vw, 43px); letter-spacing: -1.2px; line-height: 1.2; margin: 0 0 14px; font-weight: 650; color: #233b55; }
|
| 10 |
+
.portal-heading p { margin: 0; color: #79899b; font-size: 16px; }
|
| 11 |
+
.portal-card { padding: 30px; border: 1px solid #dfe6ef; background: white; box-shadow: 0 5px 28px #1f385105; border-radius: 17px; margin-bottom: 24px; }
|
| 12 |
+
.portal-card h2 { font-size: 20px; color: #304861; font-weight: 650; margin: 0; letter-spacing: -.25px; }
|
| 13 |
+
.card-heading { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 14px; margin-bottom: 24px; }
|
| 14 |
+
.card-heading > span, .field-note { font-size: 13px; color: #8b98a7; }
|
| 15 |
+
.field-note { margin-top: -12px; margin-bottom: 20px; }
|
| 16 |
+
.form-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 23px 26px; }
|
| 17 |
+
.portal-width label:not(.upload-zone):not(.confirmation) { display: block; font-size: 14px; color: #4b6077; font-weight: 550; }
|
| 18 |
+
.portal-width input:not([type=checkbox]):not([type=file]), .portal-width select, .portal-width textarea { display: block; width: 100%; border: 1px solid #d5dfea; border-radius: 9px; padding: 12px 14px; font: inherit; font-size: 15px; line-height: 1.5; color: #2e4661; background: #fcfdff; margin-top: 8px; min-width: 0; }
|
| 19 |
+
.portal-width textarea { resize: vertical; }
|
| 20 |
+
.portal-width select { appearance: none; -webkit-appearance: none; padding-right: 46px; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cpath d='m4 6 4 4 4-4' fill='none' stroke='%237589a2' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 16px center; background-size: 16px; }
|
| 21 |
+
.portal-width input[readonly] { background: #f2f5f8; color: #657990; }
|
| 22 |
+
.portal-width input::placeholder, .portal-width textarea::placeholder { color: #a0acba; }
|
| 23 |
+
.portal-width input:focus, .portal-width select:focus, .portal-width textarea:focus { outline: 2px solid #dce6f3; outline-offset: 1px; border-color: #8aa4c7; }
|
| 24 |
+
.portal-width small { display: block; margin-top: 7px; color: #8a97a7; font-size: 12px; font-weight: 400; }
|
| 25 |
+
.optional { color: #9aa6b5; font-size: 11px; font-weight: 450; margin-left: 7px; }
|
| 26 |
+
.full-width { grid-column: 1 / -1; }
|
| 27 |
+
.upload-zone { display: flex; position: relative; flex-direction: column; align-items: center; justify-content: center; gap: 8px; min-height: 190px; padding: 28px; background: #f8faff; border: 1px dashed #b9cce3; border-radius: 12px; text-align: center; cursor: pointer; color: #506c8f; }
|
| 28 |
+
.upload-zone:hover, .upload-zone.dragging { background: #f0f5fc; border-color: #7f9dc1; }
|
| 29 |
+
.upload-zone input { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; }
|
| 30 |
+
.upload-zone:focus-within { outline: 2px solid #7598c5; outline-offset: 3px; }
|
| 31 |
+
.upload-zone svg { width: 28px; height: 28px; stroke: #7b98bb; fill: none; stroke-width: 1.5; margin-bottom: 9px; }
|
| 32 |
+
.upload-zone strong { font-size: 16px; font-weight: 550; }
|
| 33 |
+
.upload-zone > span { font-size: 12px; color: #899bb2; }
|
| 34 |
+
.file-preview { padding: 14px 17px; border-radius: 9px; background: #eef5f4; color: #49706c; margin-top: 14px; font-size: 14px; }
|
| 35 |
+
.artifacts { margin-top: 27px; }
|
| 36 |
+
.confirmation { display: flex; align-items: flex-start; gap: 12px; padding-top: 25px; font-size: 13px; color: #728399; font-weight: 400; line-height: 1.7; }
|
| 37 |
+
.confirmation input { margin-top: 4px; }
|
| 38 |
+
.form-bottom { display: flex; align-items: center; justify-content: space-between; gap: 20px; margin-top: 23px; }
|
| 39 |
+
.portal-width .primary-button { background: #3d648e; border-radius: 9px; font-size: 15px; font-weight: 550; padding: 12px 22px; white-space: nowrap; }
|
| 40 |
+
.portal-width .primary-button:hover { background: #2c507a; }
|
| 41 |
+
.portal-width .outline-button { color: #5d748f; border-color: #d5dfeb; font-size: 14px; }
|
| 42 |
+
.form-message { margin: 0; font-size: 14px; color: #647e89; line-height: 1.65; overflow-wrap: anywhere; }
|
| 43 |
+
.form-message.error { color: #aa4a55; }
|
| 44 |
+
.notice { padding: 14px 18px; border: 1px solid #e1dded; background: #f4f1fa; color: #77708e; border-radius: 10px; font-size: 14px; margin: 0 0 24px; }
|
| 45 |
+
.receipt-card { background: #f1f7fc; border-color: #d1e0f0; }
|
| 46 |
+
.receipt-card p { color: #6f8399; font-size: 14px; }
|
| 47 |
+
.receipt-fields { display: grid; gap: 12px; margin: 24px 0; }
|
| 48 |
+
.receipt-fields code { display: block; overflow-wrap: anywhere; background: #ffffffa8; padding: 12px; border: 1px solid #dfe6ed; border-radius: 7px; color: #506580; font-size: 13px; }
|
| 49 |
+
.receipt-fields small { margin-bottom: 6px; }
|
| 50 |
+
.status-badge { display: inline-block; border-radius: 5px; padding: 3px 8px; background: #eff2f7; color: #6e8099; font-size: 11px; font-weight: 600; }
|
| 51 |
+
.status-badge.pending { background: #fff4dd; color: #a38249; }
|
| 52 |
+
.status-badge.approved { background: #eaf3ed; color: #5d8a70; }
|
| 53 |
+
.status-badge.rejected, .status-badge.withdrawn { background: #f7edef; color: #a6717b; }
|
| 54 |
+
.login-card { max-width: 510px; }
|
| 55 |
+
.login-card h2 { margin-bottom: 22px; }
|
| 56 |
+
.login-card .form-message { margin: 16px 0; }
|
| 57 |
+
.review-toolbar { display: flex; gap: 18px; justify-content: space-between; align-items: center; margin-bottom: 24px; }
|
| 58 |
+
.review-filters { display: flex; gap: 6px; flex-wrap: wrap; }
|
| 59 |
+
.review-filters button { padding: 8px 12px; border: 1px solid transparent; border-radius: 7px; color: #8190a4; font-size: 14px; }
|
| 60 |
+
.review-filters button[aria-pressed=true] { background: #e9eff8; color: #45678d; border-color: #d1ddef; }
|
| 61 |
+
.review-filters span { margin-left: 6px; font-size: 12px; }
|
| 62 |
+
.review-layout { display: grid; grid-template-columns: 300px minmax(0, 1fr); gap: 24px; }
|
| 63 |
+
.review-list { display: flex; flex-direction: column; gap: 12px; }
|
| 64 |
+
.submission-item { display: block; text-align: left; width: 100%; padding: 17px; border: 1px solid #dfe5ef; border-radius: 11px; background: white; }
|
| 65 |
+
.submission-item[aria-pressed=true] { border-color: #91adce; background: #f1f6fd; box-shadow: 0 0 0 2px #e6edf7; }
|
| 66 |
+
.submission-item strong { display: block; font-size: 15px; font-weight: 600; color: #3f5773; line-height: 1.5; overflow-wrap: anywhere; }
|
| 67 |
+
.submission-item p { font-size: 12px; color: #8896a9; margin: 6px 0 10px; }
|
| 68 |
+
.review-detail { min-height: 310px; }
|
| 69 |
+
.review-empty { text-align: center; padding: 48px 15px; color: #8b9aad; }
|
| 70 |
+
.review-empty p { font-size: 14px; }
|
| 71 |
+
.review-meta { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px; margin: 23px 0; font-size: 14px; }
|
| 72 |
+
.review-meta dt { font-size: 11px; text-transform: uppercase; letter-spacing: .8px; color: #96a3b4; margin-bottom: 5px; }
|
| 73 |
+
.review-meta dd { margin: 0; color: #546c84; overflow-wrap: anywhere; }
|
| 74 |
+
.review-meta a { color: #4675a5; text-decoration: underline; text-underline-offset: 3px; }
|
| 75 |
+
.review-notes { white-space: pre-wrap; color: #7f8fa3; background: #f6f8fb; padding: 14px; border-radius: 8px; font-size: 13px; margin-bottom: 24px; }
|
| 76 |
+
.review-scores { width: 100%; border-collapse: collapse; margin: 20px 0 26px; font-size: 14px; }
|
| 77 |
+
.review-scores th, .review-scores td { padding: 10px 12px; border-bottom: 1px solid #e7ecf2; text-align: right; color: #526a85; }
|
| 78 |
+
.review-scores th:first-child, .review-scores td:first-child { text-align: left; }
|
| 79 |
+
.review-scores th { font-weight: 550; color: #8898aa; font-size: 12px; background: #f7f9fc; }
|
| 80 |
+
.review-scores .score-section th { color: #7085a0; background: #edf2f9; padding-block: 8px; }
|
| 81 |
+
.changed-score { color: #405f8e !important; font-weight: 700; background: #f1f5fb; }
|
| 82 |
+
.review-actions { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 22px; }
|
| 83 |
+
.reject-button { color: #9f6470 !important; border-color: #e7cfd5 !important; }
|
| 84 |
+
.history-list { color: #8292a4; font-size: 12px; padding-left: 20px; }
|
| 85 |
+
.submit-link { color: #456a93 !important; }
|
| 86 |
+
@media (max-width: 900px) { .review-layout { grid-template-columns: 1fr; } .review-list { display: grid; grid-template-columns: repeat(2,minmax(0,1fr)); } }
|
| 87 |
+
@media (max-width: 640px) { .portal-width { width: calc(100% - 32px); } .portal-nav { padding-block: 22px; } .portal-nav > div { gap: 13px; font-size: 12px; } .wordmark { font-size: 20px; } .portal-heading { padding-top: 32px; } .portal-card { padding: 21px 17px; } .form-grid, .review-meta, .review-list { grid-template-columns: 1fr; } .form-bottom { flex-direction: column; align-items: stretch; } .review-toolbar { flex-wrap: wrap; } .card-heading > span { font-size: 11px; } .review-scores th, .review-scores td { padding: 9px 6px; font-size: 12px; } }
|
portal.js
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
'use strict';
|
| 2 |
+
(() => {
|
| 3 |
+
const $=s=>document.querySelector(s), $$=s=>[...document.querySelectorAll(s)];
|
| 4 |
+
const schema=JSON.parse($('#submission-schema').textContent);
|
| 5 |
+
const esc=v=>String(v??'').replace(/[&<>"']/g,c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]));
|
| 6 |
+
const labels={pending:'Pending review',approved:'Approved',rejected:'Returned',withdrawn:'Withdrawn'};
|
| 7 |
+
const language=code=>code==='zh'?'Chinese':'English';
|
| 8 |
+
const format=value=>value==null?'—':value.toFixed(1);
|
| 9 |
+
const bById=id=>schema.benchmarks.find(b=>b.id===id);
|
| 10 |
+
const message=(selector,value,error=false)=>{const el=$(selector);el.textContent=value;el.classList.toggle('error',error);};
|
| 11 |
+
let config=null, token=sessionStorage.getItem('rise-review-session')||'';
|
| 12 |
+
async function api(path,body,admin=false) {
|
| 13 |
+
const response=await fetch(path,{method:body===undefined?'GET':'POST',cache:'no-store',headers:{...(body===undefined?{}:{'Content-Type':'application/json'}),...(admin?{Authorization:'Bearer '+token}:{})},...(body===undefined?{}:{body:JSON.stringify(body)})});
|
| 14 |
+
let data;try{data=await response.json();}catch(_){throw new Error('The submission service is not available.');}
|
| 15 |
+
if(!response.ok){const e=new Error(typeof data.detail==='string'?data.detail:'The request could not be completed.');e.status=response.status;throw e;}
|
| 16 |
+
return data;
|
| 17 |
+
}
|
| 18 |
+
function download(filename,data) {
|
| 19 |
+
const url=URL.createObjectURL(new Blob([JSON.stringify(data,null,2)+'\n'],{type:'application/json'}));
|
| 20 |
+
const a=document.createElement('a');a.href=url;a.download=filename;document.body.appendChild(a);a.click();a.remove();setTimeout(()=>URL.revokeObjectURL(url),1000);
|
| 21 |
+
}
|
| 22 |
+
async function connect() {
|
| 23 |
+
try{
|
| 24 |
+
config=await api('/api/config');
|
| 25 |
+
if(config.local_preview){$('#service-notice').hidden=false;$('#service-notice').textContent='Local preview · submissions and review decisions stay on this computer.';}
|
| 26 |
+
}catch(_){$('#service-notice').hidden=false;$('#service-notice').textContent='The submission service is offline. You can browse the form and download a template.';}
|
| 27 |
+
return config;
|
| 28 |
+
}
|
| 29 |
+
function makeTemplate(b) {
|
| 30 |
+
const data={accuracy:Object.fromEntries(b.accuracy_columns.map(c=>[c.label,null])),metrics:Object.fromEntries(b.metrics.map(c=>[c.label,null]))};
|
| 31 |
+
for(const [field,columns] of [['subcategories','subcategory_columns'],['task_types','task_type_columns']])if(b[columns]){
|
| 32 |
+
data[field]={};for(const c of b[columns]){const d=c.dimension[0].toUpperCase()+c.dimension.slice(1);(data[field][d]??={})[c.label]=null;}
|
| 33 |
+
}
|
| 34 |
+
return data;
|
| 35 |
+
}
|
| 36 |
+
if(document.body.dataset.page==='submit') {
|
| 37 |
+
const form=$('#submission-form');let result=null,receipt=null,fileSequence=0;
|
| 38 |
+
const entryParams=new URLSearchParams(location.search);
|
| 39 |
+
if(bById(entryParams.get('benchmark')))form.elements.benchmark.value=entryParams.get('benchmark');
|
| 40 |
+
if(['en','zh'].includes(entryParams.get('language')))form.elements.language.value=entryParams.get('language');
|
| 41 |
+
let models=schema,plusInputSupport=form.elements.multi_image.value;
|
| 42 |
+
const currentBenchmark=()=>bById(form.elements.benchmark.value);
|
| 43 |
+
function updateRevision() {
|
| 44 |
+
const b=models.benchmarks.find(b=>b.id===form.elements.benchmark.value);
|
| 45 |
+
const list=b.results_by_language[form.elements.language.value]?.models||[];
|
| 46 |
+
$('#submission-revision').innerHTML='<option value="">New result</option>'+list.map(m=>`<option value="${esc(m.id)}">${esc(m.name)}</option>`).join('');
|
| 47 |
+
}
|
| 48 |
+
function updateBenchmark() {
|
| 49 |
+
const singleImageOnly=currentBenchmark().id==='risebench';
|
| 50 |
+
form.elements.multi_image.value=singleImageOnly?'false':plusInputSupport;
|
| 51 |
+
form.elements.multi_image.hidden=singleImageOnly;
|
| 52 |
+
form.elements.multi_image.disabled=singleImageOnly;
|
| 53 |
+
$('#single-image-input').hidden=!singleImageOnly;
|
| 54 |
+
const selected=form.elements.language.value;
|
| 55 |
+
$('#submission-language').innerHTML=currentBenchmark().available_result_languages.map(code=>`<option value="${code}">${language(code)}</option>`).join('');
|
| 56 |
+
if(currentBenchmark().available_result_languages.includes(selected))form.elements.language.value=selected;
|
| 57 |
+
updateRevision();
|
| 58 |
+
}
|
| 59 |
+
$('#submission-benchmark').addEventListener('change',updateBenchmark);
|
| 60 |
+
form.elements.multi_image.addEventListener('change',()=>{plusInputSupport=form.elements.multi_image.value;});
|
| 61 |
+
$('#submission-language').addEventListener('change',updateRevision);
|
| 62 |
+
$('#submission-revision').addEventListener('change',()=>{const option=$('#submission-revision').selectedOptions[0];if(option.value)form.elements.model_name.value=option.textContent;});
|
| 63 |
+
$('#download-template').addEventListener('click',()=>download(currentBenchmark().id+'-results-template.json',makeTemplate(currentBenchmark())));
|
| 64 |
+
async function readFile(file) {
|
| 65 |
+
const sequence=++fileSequence;result=null;$('#file-preview').hidden=true;$('#result-file').setCustomValidity('');
|
| 66 |
+
if(!file)return;
|
| 67 |
+
try{
|
| 68 |
+
if(!file.name.toLowerCase().endsWith('.json')||file.size>200000)throw new Error('Choose a JSON file no larger than 200 KB.');
|
| 69 |
+
const value=JSON.parse(await file.text());
|
| 70 |
+
if(sequence!==fileSequence)return;
|
| 71 |
+
if(!value||Array.isArray(value)||typeof value!=='object'||!value.accuracy)throw new Error('Use the result JSON template, including its accuracy section.');
|
| 72 |
+
result=value;$('#upload-title').textContent=file.name;$('#upload-caption').textContent=(file.size/1024).toFixed(1)+' KB · JSON loaded';
|
| 73 |
+
const count=JSON.stringify(value).match(/:\s*\d+(?:\.\d+)?/g)?.length||0;
|
| 74 |
+
$('#file-preview').hidden=false;$('#file-preview').textContent=`${count} score values loaded. Fields and benchmark compatibility will be checked on submission.`;
|
| 75 |
+
message('#submission-message','');
|
| 76 |
+
}catch(error){$('#result-file').setCustomValidity(error.message);message('#submission-message',error.message,true);}
|
| 77 |
+
}
|
| 78 |
+
$('#result-file').addEventListener('change',e=>readFile(e.target.files[0]));
|
| 79 |
+
const zone=$('#upload-zone');zone.addEventListener('dragover',e=>{e.preventDefault();zone.classList.add('dragging');});zone.addEventListener('dragleave',()=>zone.classList.remove('dragging'));
|
| 80 |
+
zone.addEventListener('drop',e=>{e.preventDefault();zone.classList.remove('dragging');if(e.dataTransfer.files.length!==1){message('#submission-message','Choose one result JSON file.',true);return;}$('#result-file').files=e.dataTransfer.files;readFile(e.dataTransfer.files[0]);});
|
| 81 |
+
form.addEventListener('submit',async e=>{
|
| 82 |
+
e.preventDefault();if(!result){message('#submission-message','Choose a result JSON file first.',true);return;}
|
| 83 |
+
if(!config){message('#submission-message','The submission service is offline.',true);return;}
|
| 84 |
+
const button=$('#submit-results');button.disabled=true;message('#submission-message','Validating and submitting…');
|
| 85 |
+
const body=Object.fromEntries(new FormData(form));body.multi_image=currentBenchmark().id!=='risebench'&&form.elements.multi_image.value==='true';body.full_dataset=body.full_dataset==='on';body.results=result;
|
| 86 |
+
try{
|
| 87 |
+
receipt=await api('/api/submissions',body);
|
| 88 |
+
const card=$('#submission-receipt');card.hidden=false;
|
| 89 |
+
card.innerHTML=`<span class="status-badge pending">Pending review</span><h2 style="margin-top:16px">Results received.</h2><p>Save this receipt to check the review status. Results will appear on the leaderboard only after approval.</p><div class="receipt-fields"><div><small>Submission ID</small><code>${esc(receipt.submission_id)}</code></div><div><small>Private receipt key</small><code>${esc(receipt.status_token)}</code></div></div><button type="button" id="save-receipt" class="outline-button">Save receipt ↓</button>`;
|
| 90 |
+
$('#save-receipt').addEventListener('click',()=>download('rise-submission-receipt.json',receipt));
|
| 91 |
+
$('#status-form').elements.submission_id.value=receipt.submission_id;$('#status-form').elements.status_token.value=receipt.status_token;
|
| 92 |
+
form.hidden=true;card.scrollIntoView({behavior:'smooth',block:'start'});message('#submission-message','');
|
| 93 |
+
}catch(error){message('#submission-message',error.message,true);}finally{button.disabled=false;}
|
| 94 |
+
});
|
| 95 |
+
$('#status-form').addEventListener('submit',async e=>{e.preventDefault();try{const r=await api('/api/submission-status',Object.fromEntries(new FormData(e.currentTarget)));message('#status-result',`${r.model_name} — ${labels[r.status]}. ${r.review_note||''}`);}catch(error){message('#status-result',error.message,true);}});
|
| 96 |
+
updateBenchmark();connect().then(async()=>{if(!config){$('#submit-results').disabled=true;return;}try{models=await api('/api/leaderboard');updateRevision();}catch(_){}});
|
| 97 |
+
} else {
|
| 98 |
+
let records=[],filter='pending',selected=null,live=schema;
|
| 99 |
+
const current=()=>records.find(r=>r.id===selected);
|
| 100 |
+
function signOutView() {
|
| 101 |
+
token='';sessionStorage.removeItem('rise-review-session');records=[];selected=null;
|
| 102 |
+
$('#login-panel').hidden=false;$('#review-workspace').hidden=true;$('#sign-out').hidden=true;
|
| 103 |
+
$('#review-list').innerHTML='';$('#review-detail').innerHTML='';
|
| 104 |
+
}
|
| 105 |
+
async function loadQueue() {
|
| 106 |
+
try{
|
| 107 |
+
[records,live]=await Promise.all([api('/api/admin/submissions',undefined,true),api('/api/leaderboard')]);
|
| 108 |
+
$('#login-panel').hidden=true;$('#review-workspace').hidden=false;$('#sign-out').hidden=false;
|
| 109 |
+
$('#pending-count').textContent=records.filter(r=>r.status==='pending').length;
|
| 110 |
+
message('#queue-message','');renderQueue();
|
| 111 |
+
}catch(error){if(error.status===401)signOutView();message(token?'#queue-message':'#login-message',error.message,true);}
|
| 112 |
+
}
|
| 113 |
+
function renderQueue() {
|
| 114 |
+
const items=records.filter(r=>filter==='all'||r.status===filter);
|
| 115 |
+
if(!items.some(r=>r.id===selected))selected=items[0]?.id||null;
|
| 116 |
+
$('#review-list').innerHTML=items.length?items.map(r=>`<button class="submission-item" data-record="${r.id}" aria-pressed="${selected===r.id}"><strong>${esc(r.payload.model_name)}</strong><p>${esc(bById(r.payload.benchmark).name)} · ${language(r.payload.language)}${r.payload.revision_of?' · Update':''}</p><span class="status-badge ${r.status}">${labels[r.status]}</span></button>`).join(''):'<div class="review-empty"><h2>No submissions</h2><p>New results will appear here.</p></div>';
|
| 117 |
+
renderDetail();
|
| 118 |
+
}
|
| 119 |
+
function scoreTable(record) {
|
| 120 |
+
const p=record.payload,b=bById(p.benchmark);
|
| 121 |
+
const previous=p.revision_of?live.benchmarks.find(x=>x.id===p.benchmark).results_by_language[p.language].models.find(m=>m.id===p.revision_of):null;
|
| 122 |
+
const sections=[['Reasoning accuracy','accuracy',b.accuracy_columns],['Evaluation scores','metrics',b.metrics],['Subcategory accuracy','subcategories',b.subcategory_columns||[]],['Task-type accuracy','task_types',b.task_type_columns||[]]];
|
| 123 |
+
return `<table class="review-scores"><thead><tr><th>Score</th>${previous?'<th>Published</th>':''}<th>Submitted</th></tr></thead><tbody>`+sections.map(([label,field,columns])=>{
|
| 124 |
+
const visible=columns.filter(c=>p[field]?.[c.key]!=null||field==='accuracy');
|
| 125 |
+
if(!visible.length)return '';
|
| 126 |
+
return `<tr class="score-section"><th colspan="${previous?3:2}">${label}</th></tr>`+visible.map(c=>{const value=p[field]?.[c.key],old=previous?.[field]?.[c.key];return `<tr><td>${esc((c.dimension?c.dimension[0].toUpperCase()+c.dimension.slice(1)+' · ':'')+c.label)}</td>${previous?`<td>${format(old)}</td>`:''}<td class="${previous&&old!==value?'changed-score':''}">${format(value)}</td></tr>`;}).join('');
|
| 127 |
+
}).join('')+'</tbody></table>';
|
| 128 |
+
}
|
| 129 |
+
function renderDetail() {
|
| 130 |
+
const r=current();if(!r){$('#review-detail').innerHTML='<div class="review-empty"><h2>Ready for review</h2><p>Select a submission to inspect its results.</p></div>';return;}
|
| 131 |
+
const p=r.payload,active=['pending','approved'].includes(r.status);
|
| 132 |
+
$('#review-detail').innerHTML=`<div class="card-heading"><h2>${esc(p.model_name)}</h2><span class="status-badge ${r.status}">${labels[r.status]}</span></div><dl class="review-meta"><div><dt>Benchmark</dt><dd>${esc(bById(p.benchmark).name)} · ${language(p.language)}</dd></div><div><dt>Input support</dt><dd>${p.multi_image?'Multiple input images':'Single input image'}</dd></div><div><dt>Team</dt><dd>${esc(p.team||'Not specified')}</dd></div><div><dt>Contact · private</dt><dd>${esc(p.email)}</dd></div><div><dt>Project</dt><dd><a href="${esc(p.project_url)}" target="_blank" rel="noopener noreferrer">Open project ↗</a></dd></div><div><dt>Evaluation artifacts</dt><dd><a href="${esc(p.evidence_url)}" target="_blank" rel="noopener noreferrer">Inspect results ↗</a></dd></div><div><dt>Submitted</dt><dd>${esc(new Date(r.submitted_at).toLocaleString())}</dd></div><div><dt>Model category</dt><dd>${esc({open:'Open-source',closed:'Closed-source',agentic:'Agentic method'}[p.group])}</dd></div></dl>${p.revision_of?'<p class="notice">This update replaces an existing result. Verify the submitter’s authority before approval.</p>':''}${p.notes?`<div class="review-notes">${esc(p.notes)}</div>`:''}${scoreTable(r)}<button class="outline-button" id="download-review-json">Download submission ↓</button>${active?`<form id="review-form"><label style="margin-top:24px">Review note<textarea id="review-note" rows="3" maxlength="3000" placeholder="Required when returning or withdrawing results; visible to the submitter"></textarea></label><label class="confirmation"><input id="review-confirmed" type="checkbox" required><span>${r.status==='pending'?'I have checked the evaluation artifacts, full-dataset protocol, and submitter’s authority.':'I confirm this approved result should be withdrawn from the leaderboard.'}</span></label><p class="form-message" id="review-message" role="status"></p><div class="review-actions">${r.status==='pending'?'<button type="submit" class="primary-button" value="approve">Approve & publish</button><button type="submit" class="outline-button reject-button" value="reject">Return to submitter</button>':'<button type="submit" class="outline-button reject-button" value="withdraw">Withdraw result</button>'}</div></form>`:''}${r.history.length?`<h3 style="font-size:14px;margin-top:28px">Review history</h3><ul class="history-list">${r.history.map(h=>`<li>${esc(h.decision)} · ${esc(new Date(h.at).toLocaleString())}${h.note?' — '+esc(h.note):''}</li>`).join('')}</ul>`:''}`;
|
| 133 |
+
$('#download-review-json').addEventListener('click',()=>download('rise-submission-'+r.id+'.json',r));
|
| 134 |
+
$('#review-form')?.addEventListener('submit',async e=>{
|
| 135 |
+
e.preventDefault();const decision=e.submitter.value,note=$('#review-note').value.trim();
|
| 136 |
+
if(decision!=='approve'&&!note){message('#review-message','Add a review note explaining this decision.',true);return;}
|
| 137 |
+
$$('#review-form button').forEach(b=>b.disabled=true);
|
| 138 |
+
try{await api('/api/admin/submissions/'+r.id+'/review',{decision,note,revision:r.revision,confirmed:$('#review-confirmed').checked},true);await loadQueue();message('#queue-message',decision==='approve'?'Approved. The result is now on the leaderboard.':decision==='reject'?'Returned. The submitter can read your note using their receipt.':'Withdrawn from the leaderboard.');}
|
| 139 |
+
catch(error){message('#review-message',error.message,true);$$('#review-form button').forEach(b=>b.disabled=false);}
|
| 140 |
+
});
|
| 141 |
+
}
|
| 142 |
+
document.addEventListener('click',e=>{const button=e.target.closest('button');if(!button)return;if(button.dataset.record){selected=button.dataset.record;renderQueue();}if(button.dataset.status){filter=button.dataset.status;$$('[data-status]').forEach(b=>b.setAttribute('aria-pressed',b.dataset.status===filter));renderQueue();}});
|
| 143 |
+
$('#login-form').addEventListener('submit',async e=>{e.preventDefault();$('#login-button').disabled=true;try{const r=await api('/api/admin/session',{password:$('#admin-passphrase').value});token=r.token;sessionStorage.setItem('rise-review-session',token);$('#admin-passphrase').value='';await loadQueue();}catch(error){message('#login-message',error.message,true);}finally{$('#login-button').disabled=false;}});
|
| 144 |
+
$('#sign-out').addEventListener('click',async()=>{try{await api('/api/admin/logout',{},true);}finally{signOutView();}});
|
| 145 |
+
$('#refresh-queue').addEventListener('click',loadQueue);
|
| 146 |
+
connect().then(()=>{if(!config){$('#login-button').disabled=true;return;}if(config.local_preview){$('#passphrase-label').hidden=true;$('#admin-passphrase').required=false;$('#login-button').textContent='Open local review';}if(token)loadQueue();});
|
| 147 |
+
}
|
| 148 |
+
})();
|
pyproject.toml
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[build-system]
|
| 2 |
+
requires = ["setuptools>=68"]
|
| 3 |
+
build-backend = "setuptools.build_meta"
|
| 4 |
+
|
| 5 |
+
[project]
|
| 6 |
+
name = "rise-leaderboard"
|
| 7 |
+
version = "0.1.0"
|
| 8 |
+
requires-python = ">=3.9"
|
| 9 |
+
dependencies = ["fastapi==0.128.8", "uvicorn==0.39.0", "huggingface_hub==1.8.0"]
|
| 10 |
+
|
| 11 |
+
[project.optional-dependencies]
|
| 12 |
+
test = ["httpx==0.28.1"]
|
| 13 |
+
|
| 14 |
+
[tool.setuptools]
|
| 15 |
+
packages = ["server"]
|
scripts/serve.py
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""Run a loopback-only local review preview, or a configured production service."""
|
| 3 |
+
import argparse
|
| 4 |
+
import sys
|
| 5 |
+
from pathlib import Path
|
| 6 |
+
|
| 7 |
+
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
|
| 8 |
+
import uvicorn
|
| 9 |
+
from server.app import create_app, Settings
|
| 10 |
+
|
| 11 |
+
if __name__ == "__main__":
|
| 12 |
+
parser = argparse.ArgumentParser(description=__doc__)
|
| 13 |
+
parser.add_argument("--local", action="store_true", help="Loopback-only preview; local review needs no passphrase")
|
| 14 |
+
parser.add_argument("--port", type=int, default=7860)
|
| 15 |
+
args = parser.parse_args()
|
| 16 |
+
app = create_app(Settings(local=args.local))
|
| 17 |
+
print(f"Leaderboard: http://127.0.0.1:{args.port}")
|
| 18 |
+
print(f"Submit: http://127.0.0.1:{args.port}/submit.html")
|
| 19 |
+
print(f"Review: http://127.0.0.1:{args.port}/admin.html")
|
| 20 |
+
uvicorn.run(app, host="127.0.0.1" if args.local else "0.0.0.0", port=args.port,
|
| 21 |
+
proxy_headers=not args.local, access_log=False)
|
server/__init__.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
"""Submission and moderation service for the RISE leaderboard."""
|
server/app.py
ADDED
|
@@ -0,0 +1,267 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Private submissions, explicit moderation, and approved-only leaderboard data."""
|
| 2 |
+
import copy
|
| 3 |
+
import hashlib
|
| 4 |
+
import json
|
| 5 |
+
import logging
|
| 6 |
+
import os
|
| 7 |
+
import secrets
|
| 8 |
+
import threading
|
| 9 |
+
import time
|
| 10 |
+
import uuid
|
| 11 |
+
from collections import defaultdict, deque
|
| 12 |
+
from datetime import datetime, timezone
|
| 13 |
+
from pathlib import Path
|
| 14 |
+
from urllib.parse import urlsplit
|
| 15 |
+
|
| 16 |
+
from fastapi import FastAPI, HTTPException, Request
|
| 17 |
+
from fastapi.responses import JSONResponse
|
| 18 |
+
from fastapi.staticfiles import StaticFiles
|
| 19 |
+
|
| 20 |
+
from .storage import HubStore, LocalStore
|
| 21 |
+
from .validation import Invalid, public_leaderboard, template, text, validate_submission
|
| 22 |
+
|
| 23 |
+
ROOT = Path(__file__).resolve().parents[1]
|
| 24 |
+
MAX_BODY = 262144
|
| 25 |
+
SESSION_SECONDS = 8 * 3600
|
| 26 |
+
|
| 27 |
+
|
| 28 |
+
def now():
|
| 29 |
+
return datetime.now(timezone.utc).isoformat()
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
def digest(value):
|
| 33 |
+
return hashlib.sha256(value.encode()).hexdigest()
|
| 34 |
+
|
| 35 |
+
|
| 36 |
+
def strict_json(raw):
|
| 37 |
+
def pairs(items):
|
| 38 |
+
result = {}
|
| 39 |
+
for key, value in items:
|
| 40 |
+
if key in result:
|
| 41 |
+
raise ValueError("Duplicate JSON keys are not allowed.")
|
| 42 |
+
result[key] = value
|
| 43 |
+
return result
|
| 44 |
+
def invalid_constant(value):
|
| 45 |
+
raise ValueError("Non-finite JSON numbers are not allowed.")
|
| 46 |
+
return json.loads(raw, object_pairs_hook=pairs, parse_constant=invalid_constant)
|
| 47 |
+
|
| 48 |
+
|
| 49 |
+
class Settings:
|
| 50 |
+
def __init__(self, local=False, state_dir=None):
|
| 51 |
+
self.local = local
|
| 52 |
+
self.password = os.environ.get("RISE_ADMIN_PASSWORD", "")
|
| 53 |
+
self.origin = os.environ.get("RISE_PUBLIC_ORIGIN", "").rstrip("/")
|
| 54 |
+
self.repo = os.environ.get("RISE_SUBMISSIONS_REPO", "")
|
| 55 |
+
self.token = os.environ.get("RISE_STORAGE_TOKEN", "")
|
| 56 |
+
self.state_dir = Path(state_dir or ROOT / ".local")
|
| 57 |
+
if not local:
|
| 58 |
+
if len(self.password) < 20:
|
| 59 |
+
raise RuntimeError("Set RISE_ADMIN_PASSWORD to a private passphrase of at least 20 characters.")
|
| 60 |
+
if not self.origin.startswith("https://") or urlsplit(self.origin).path:
|
| 61 |
+
raise RuntimeError("Set RISE_PUBLIC_ORIGIN to the https origin of the Space app.")
|
| 62 |
+
if not self.repo or not self.token:
|
| 63 |
+
raise RuntimeError("Set RISE_SUBMISSIONS_REPO and RISE_STORAGE_TOKEN for durable private storage.")
|
| 64 |
+
|
| 65 |
+
|
| 66 |
+
def create_app(settings=None, store=None, base=None):
|
| 67 |
+
settings = settings or Settings()
|
| 68 |
+
store = store or (LocalStore(settings.state_dir) if settings.local else HubStore(settings.repo, settings.token))
|
| 69 |
+
base = base or json.loads((ROOT / "dist/data/leaderboard.json").read_text())
|
| 70 |
+
app = FastAPI(docs_url=None, redoc_url=None, openapi_url=None)
|
| 71 |
+
sessions, attempts = {}, defaultdict(deque)
|
| 72 |
+
security_lock = threading.Lock()
|
| 73 |
+
|
| 74 |
+
def rate_limit(request, scope, limit, window=3600):
|
| 75 |
+
# Do not trust arbitrary X-Forwarded-For values. Uvicorn decides which proxy to trust.
|
| 76 |
+
address = request.client.host if request.client else "unknown"
|
| 77 |
+
key = (scope, address)
|
| 78 |
+
stamp = time.monotonic()
|
| 79 |
+
with security_lock:
|
| 80 |
+
for stale in [k for k, values in attempts.items() if not values or stamp-values[-1] > window]:
|
| 81 |
+
attempts.pop(stale, None)
|
| 82 |
+
queue = attempts[key]
|
| 83 |
+
while queue and stamp-queue[0] > window:
|
| 84 |
+
queue.popleft()
|
| 85 |
+
if len(queue) >= limit:
|
| 86 |
+
raise HTTPException(429, "Too many requests. Please try again later.")
|
| 87 |
+
queue.append(stamp)
|
| 88 |
+
|
| 89 |
+
def require_admin(request):
|
| 90 |
+
token = request.headers.get("authorization", "").removeprefix("Bearer ")
|
| 91 |
+
with security_lock:
|
| 92 |
+
for key in [key for key, expiry in sessions.items() if expiry <= time.monotonic()]:
|
| 93 |
+
sessions.pop(key, None)
|
| 94 |
+
if not token or sessions.get(digest(token), 0) <= time.monotonic():
|
| 95 |
+
raise HTTPException(401, "Sign in to review submissions.")
|
| 96 |
+
return token
|
| 97 |
+
|
| 98 |
+
def payload(request):
|
| 99 |
+
value = getattr(request.state, "json", None)
|
| 100 |
+
if not isinstance(value, dict):
|
| 101 |
+
raise HTTPException(400, "Expected a JSON object.")
|
| 102 |
+
return value
|
| 103 |
+
|
| 104 |
+
@app.exception_handler(Invalid)
|
| 105 |
+
async def validation_error(request, error):
|
| 106 |
+
return JSONResponse({"detail": str(error)}, status_code=422)
|
| 107 |
+
|
| 108 |
+
@app.middleware("http")
|
| 109 |
+
async def guard(request, call_next):
|
| 110 |
+
host = request.url.hostname
|
| 111 |
+
if settings.local:
|
| 112 |
+
if host not in {"127.0.0.1", "localhost", "testserver"} or request.client.host not in {"127.0.0.1", "::1", "testclient"}:
|
| 113 |
+
return JSONResponse({"detail": "Local preview is available only on this computer."}, status_code=403)
|
| 114 |
+
elif host != urlsplit(settings.origin).hostname:
|
| 115 |
+
return JSONResponse({"detail": "Invalid host."}, status_code=400)
|
| 116 |
+
if request.method == "POST":
|
| 117 |
+
origin = request.headers.get("origin")
|
| 118 |
+
expected = str(request.base_url).rstrip("/") if settings.local else settings.origin
|
| 119 |
+
if origin and origin != expected:
|
| 120 |
+
return JSONResponse({"detail": "Cross-origin submissions are not accepted."}, status_code=403)
|
| 121 |
+
if request.headers.get("content-type", "").split(";")[0] != "application/json":
|
| 122 |
+
return JSONResponse({"detail": "Use application/json."}, status_code=415)
|
| 123 |
+
content = bytearray()
|
| 124 |
+
async for chunk in request.stream():
|
| 125 |
+
content.extend(chunk)
|
| 126 |
+
if len(content) > MAX_BODY:
|
| 127 |
+
return JSONResponse({"detail": "Submission exceeds the 256 KB limit."}, status_code=413)
|
| 128 |
+
try:
|
| 129 |
+
request.state.json = strict_json(content)
|
| 130 |
+
except (ValueError, UnicodeError, RecursionError):
|
| 131 |
+
return JSONResponse({"detail": "Invalid JSON. Check syntax, duplicate fields and numeric values."}, status_code=400)
|
| 132 |
+
try:
|
| 133 |
+
response = await call_next(request)
|
| 134 |
+
except Exception:
|
| 135 |
+
# Never include credentials, private repository details or payloads in errors/logs.
|
| 136 |
+
logging.getLogger("rise").error("Submission service operation failed; private storage may be unavailable.")
|
| 137 |
+
return JSONResponse({"detail": "The submission service is temporarily unavailable. Nothing was published."}, status_code=503)
|
| 138 |
+
response.headers["X-Content-Type-Options"] = "nosniff"
|
| 139 |
+
response.headers["Referrer-Policy"] = "no-referrer"
|
| 140 |
+
response.headers["Permissions-Policy"] = "camera=(), microphone=(), geolocation=()"
|
| 141 |
+
response.headers["Content-Security-Policy"] = "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; connect-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'self' https://huggingface.co"
|
| 142 |
+
if request.url.path.startswith('/api/'):
|
| 143 |
+
response.headers["Cache-Control"] = "no-store"
|
| 144 |
+
return response
|
| 145 |
+
|
| 146 |
+
@app.get("/api/config")
|
| 147 |
+
def config():
|
| 148 |
+
return {"available": True, "local_preview": settings.local, "max_file_bytes": 200000}
|
| 149 |
+
|
| 150 |
+
@app.get("/api/leaderboard")
|
| 151 |
+
def leaderboard():
|
| 152 |
+
return public_leaderboard(base, store.read())
|
| 153 |
+
|
| 154 |
+
@app.get("/api/template")
|
| 155 |
+
def get_template(benchmark: str = "risebench-plusplus"):
|
| 156 |
+
b = next((b for b in base["benchmarks"] if b["id"] == benchmark), None)
|
| 157 |
+
if not b:
|
| 158 |
+
raise HTTPException(404, "Unknown benchmark.")
|
| 159 |
+
return JSONResponse(template(b), headers={"Content-Disposition": 'attachment; filename="rise-results-template.json"'})
|
| 160 |
+
|
| 161 |
+
@app.post("/api/submissions", status_code=201)
|
| 162 |
+
def submit(request: Request):
|
| 163 |
+
rate_limit(request, "submit", 10)
|
| 164 |
+
normalized = validate_submission(payload(request), base)
|
| 165 |
+
ident, token = uuid.uuid4().hex, secrets.token_urlsafe(32)
|
| 166 |
+
fingerprint = digest(json.dumps(normalized, sort_keys=True))
|
| 167 |
+
record = {"id": ident, "status": "pending", "revision": 1, "submitted_at": now(),
|
| 168 |
+
"reviewed_at": None, "review_note": "", "history": [], "payload": normalized,
|
| 169 |
+
"receipt_hash": digest(token), "fingerprint": fingerprint}
|
| 170 |
+
def add(state):
|
| 171 |
+
if len(state["submissions"]) >= 5000:
|
| 172 |
+
raise HTTPException(503, "The submission queue is full. Please contact the benchmark team.")
|
| 173 |
+
if any(r["fingerprint"] == fingerprint and r["status"] in {"pending", "approved"} for r in state["submissions"].values()):
|
| 174 |
+
raise HTTPException(409, "These results have already been submitted.")
|
| 175 |
+
live = public_leaderboard(base, state)
|
| 176 |
+
b = next(b for b in live["benchmarks"] if b["id"] == normalized["benchmark"])
|
| 177 |
+
models = b["results_by_language"][normalized["language"]]["models"]
|
| 178 |
+
if normalized["revision_of"]:
|
| 179 |
+
target = next((m for m in models if m["id"] == normalized["revision_of"]), None)
|
| 180 |
+
if not target or target["name"] != normalized["model_name"]:
|
| 181 |
+
raise Invalid("An update must select the existing model and keep its model name.")
|
| 182 |
+
elif any(m["name"].casefold() == normalized["model_name"].casefold() for m in models):
|
| 183 |
+
raise Invalid("This model already exists. Select it under Update an existing result.")
|
| 184 |
+
state["submissions"][ident] = record
|
| 185 |
+
store.mutate(add)
|
| 186 |
+
return {"submission_id": ident, "status_token": token, "status": "pending", "submitted_at": record["submitted_at"]}
|
| 187 |
+
|
| 188 |
+
@app.post("/api/submission-status")
|
| 189 |
+
def submission_status(request: Request):
|
| 190 |
+
rate_limit(request, "status", 120)
|
| 191 |
+
body = payload(request)
|
| 192 |
+
ident, token = body.get("submission_id", ""), body.get("status_token", "")
|
| 193 |
+
if not isinstance(ident, str) or not isinstance(token, str):
|
| 194 |
+
raise HTTPException(404, "Submission not found or receipt key incorrect.")
|
| 195 |
+
record = store.read()["submissions"].get(ident)
|
| 196 |
+
if not record or not secrets.compare_digest(record["receipt_hash"], digest(token)):
|
| 197 |
+
raise HTTPException(404, "Submission not found or receipt key incorrect.")
|
| 198 |
+
return {"submission_id": ident, "status": record["status"], "model_name": record["payload"]["model_name"],
|
| 199 |
+
"submitted_at": record["submitted_at"], "review_note": record["review_note"]}
|
| 200 |
+
|
| 201 |
+
@app.post("/api/admin/session")
|
| 202 |
+
def login(request: Request):
|
| 203 |
+
rate_limit(request, "login", 10, 900)
|
| 204 |
+
candidate = payload(request).get("password", "")
|
| 205 |
+
if not isinstance(candidate, str) or (not settings.local and not secrets.compare_digest(candidate.encode(), settings.password.encode())):
|
| 206 |
+
raise HTTPException(401, "Incorrect administrator passphrase.")
|
| 207 |
+
token = secrets.token_urlsafe(40)
|
| 208 |
+
with security_lock:
|
| 209 |
+
sessions[digest(token)] = time.monotonic() + SESSION_SECONDS
|
| 210 |
+
return {"token": token, "expires_in": SESSION_SECONDS}
|
| 211 |
+
|
| 212 |
+
@app.post("/api/admin/logout")
|
| 213 |
+
def logout(request: Request):
|
| 214 |
+
token = require_admin(request)
|
| 215 |
+
with security_lock:
|
| 216 |
+
sessions.pop(digest(token), None)
|
| 217 |
+
return {"ok": True}
|
| 218 |
+
|
| 219 |
+
@app.get("/api/admin/submissions")
|
| 220 |
+
def submissions(request: Request):
|
| 221 |
+
require_admin(request)
|
| 222 |
+
return [{key: copy.deepcopy(value) for key, value in record.items() if key not in {"receipt_hash", "fingerprint"}}
|
| 223 |
+
for record in sorted(store.read()["submissions"].values(), key=lambda r: r["submitted_at"], reverse=True)]
|
| 224 |
+
|
| 225 |
+
@app.post("/api/admin/submissions/{ident}/review")
|
| 226 |
+
def review(ident: str, request: Request):
|
| 227 |
+
require_admin(request)
|
| 228 |
+
body = payload(request)
|
| 229 |
+
decision = body.get("decision")
|
| 230 |
+
if decision not in {"approve", "reject", "withdraw"}:
|
| 231 |
+
raise Invalid("Choose approve, reject or withdraw.")
|
| 232 |
+
note = text(body.get("note", ""), "Review note", 3000, decision != "approve")
|
| 233 |
+
if body.get("confirmed") is not True:
|
| 234 |
+
raise Invalid("Confirm the review decision before applying it.")
|
| 235 |
+
def update(state):
|
| 236 |
+
record = state["submissions"].get(ident)
|
| 237 |
+
if not record:
|
| 238 |
+
raise HTTPException(404, "Submission not found.")
|
| 239 |
+
if type(body.get("revision")) is not int or body["revision"] != record["revision"]:
|
| 240 |
+
raise HTTPException(409, "This submission changed. Refresh before reviewing again.")
|
| 241 |
+
if decision in {"approve", "reject"} and record["status"] != "pending":
|
| 242 |
+
raise HTTPException(409, "Only pending results can be approved or rejected.")
|
| 243 |
+
if decision == "withdraw" and record["status"] != "approved":
|
| 244 |
+
raise HTTPException(409, "Only approved results can be withdrawn.")
|
| 245 |
+
p = record["payload"]
|
| 246 |
+
if decision == "withdraw" and not p["revision_of"]:
|
| 247 |
+
if any(r["status"] == "approved" and r["payload"]["revision_of"] == "community-" + ident
|
| 248 |
+
for r in state["submissions"].values()):
|
| 249 |
+
raise HTTPException(409, "Withdraw this model's approved updates before withdrawing its original submission.")
|
| 250 |
+
if decision == "approve":
|
| 251 |
+
current = public_leaderboard(base, state)
|
| 252 |
+
b = next(b for b in current["benchmarks"] if b["id"] == p["benchmark"])
|
| 253 |
+
models = b["results_by_language"][p["language"]]["models"]
|
| 254 |
+
if p["revision_of"] and not any(m["id"] == p["revision_of"] for m in models):
|
| 255 |
+
raise HTTPException(409, "The result being updated is no longer published.")
|
| 256 |
+
if not p["revision_of"] and any(m["name"].casefold() == p["model_name"].casefold() for m in models):
|
| 257 |
+
raise HTTPException(409, "A result for this model was already approved. Review it as an update.")
|
| 258 |
+
record["status"] = {"approve": "approved", "reject": "rejected", "withdraw": "withdrawn"}[decision]
|
| 259 |
+
record["revision"] += 1
|
| 260 |
+
record["reviewed_at"], record["review_note"] = now(), note
|
| 261 |
+
record["history"].append({"decision": decision, "at": record["reviewed_at"], "note": note})
|
| 262 |
+
return {"id": ident, "status": record["status"], "revision": record["revision"]}
|
| 263 |
+
return store.mutate(update)
|
| 264 |
+
|
| 265 |
+
# Mount only the allowlisted build directory; private state and Python source stay outside it.
|
| 266 |
+
app.mount("/", StaticFiles(directory=ROOT / "dist", html=True), name="site")
|
| 267 |
+
return app
|
server/storage.py
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Private, atomic state storage. Nothing here is served as a static asset."""
|
| 2 |
+
import copy
|
| 3 |
+
import json
|
| 4 |
+
import os
|
| 5 |
+
import threading
|
| 6 |
+
from pathlib import Path
|
| 7 |
+
|
| 8 |
+
|
| 9 |
+
def empty_state():
|
| 10 |
+
return {"version": 1, "submissions": {}}
|
| 11 |
+
|
| 12 |
+
|
| 13 |
+
class LocalStore:
|
| 14 |
+
def __init__(self, directory):
|
| 15 |
+
self.directory = Path(directory)
|
| 16 |
+
self.directory.mkdir(parents=True, exist_ok=True, mode=0o700)
|
| 17 |
+
self.path = self.directory / "submissions.json"
|
| 18 |
+
self.lock = threading.RLock()
|
| 19 |
+
|
| 20 |
+
def _read(self):
|
| 21 |
+
return json.loads(self.path.read_text()) if self.path.exists() else empty_state()
|
| 22 |
+
|
| 23 |
+
def read(self):
|
| 24 |
+
with self.lock:
|
| 25 |
+
return self._read()
|
| 26 |
+
|
| 27 |
+
def mutate(self, action):
|
| 28 |
+
# The service uses one worker; a file lock also protects separate local processes.
|
| 29 |
+
import fcntl
|
| 30 |
+
with self.lock, open(self.directory / ".write.lock", "a") as lockfile:
|
| 31 |
+
fcntl.flock(lockfile, fcntl.LOCK_EX)
|
| 32 |
+
state = self._read()
|
| 33 |
+
result = action(state)
|
| 34 |
+
temp = self.directory / (".state-" + os.urandom(8).hex())
|
| 35 |
+
try:
|
| 36 |
+
with open(temp, "x", encoding="utf-8") as file:
|
| 37 |
+
os.chmod(temp, 0o600)
|
| 38 |
+
json.dump(state, file, ensure_ascii=False, allow_nan=False)
|
| 39 |
+
file.flush()
|
| 40 |
+
os.fsync(file.fileno())
|
| 41 |
+
os.replace(temp, self.path)
|
| 42 |
+
finally:
|
| 43 |
+
temp.unlink(missing_ok=True)
|
| 44 |
+
return result
|
| 45 |
+
|
| 46 |
+
|
| 47 |
+
class HubStore:
|
| 48 |
+
"""Use an existing PRIVATE dataset; reject concurrent conflicting commits."""
|
| 49 |
+
def __init__(self, repo_id, token):
|
| 50 |
+
from huggingface_hub import HfApi
|
| 51 |
+
self.repo_id, self.token = repo_id, token
|
| 52 |
+
self.api = HfApi(token=token)
|
| 53 |
+
self.lock = threading.RLock()
|
| 54 |
+
self._load() # Fail closed if the repository is missing or public.
|
| 55 |
+
|
| 56 |
+
def _load(self):
|
| 57 |
+
from huggingface_hub import hf_hub_download
|
| 58 |
+
from huggingface_hub.errors import EntryNotFoundError
|
| 59 |
+
info = self.api.repo_info(self.repo_id, repo_type="dataset")
|
| 60 |
+
if not info.private:
|
| 61 |
+
raise RuntimeError("Submission storage must be a private Hugging Face dataset.")
|
| 62 |
+
try:
|
| 63 |
+
filename = hf_hub_download(self.repo_id, "submissions.json", repo_type="dataset",
|
| 64 |
+
revision=info.sha, token=self.token)
|
| 65 |
+
state = json.loads(Path(filename).read_text())
|
| 66 |
+
except EntryNotFoundError:
|
| 67 |
+
state = empty_state()
|
| 68 |
+
return state, info.sha
|
| 69 |
+
|
| 70 |
+
def read(self):
|
| 71 |
+
with self.lock:
|
| 72 |
+
return self._load()[0]
|
| 73 |
+
|
| 74 |
+
def mutate(self, action):
|
| 75 |
+
from huggingface_hub.errors import HfHubHTTPError
|
| 76 |
+
with self.lock:
|
| 77 |
+
for attempt in range(3):
|
| 78 |
+
state, revision = self._load()
|
| 79 |
+
result = action(state)
|
| 80 |
+
payload = json.dumps(state, ensure_ascii=False, allow_nan=False).encode()
|
| 81 |
+
try:
|
| 82 |
+
self.api.upload_file(path_or_fileobj=payload, path_in_repo="submissions.json",
|
| 83 |
+
repo_id=self.repo_id, repo_type="dataset", parent_commit=revision,
|
| 84 |
+
commit_message="Update private leaderboard moderation state")
|
| 85 |
+
return copy.deepcopy(result)
|
| 86 |
+
except HfHubHTTPError as error:
|
| 87 |
+
if error.response.status_code not in (409, 412) or attempt == 2:
|
| 88 |
+
raise
|
server/validation.py
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Accept named score fields only; never execute or extract uploaded files."""
|
| 2 |
+
import copy
|
| 3 |
+
import math
|
| 4 |
+
import re
|
| 5 |
+
from urllib.parse import urlsplit
|
| 6 |
+
|
| 7 |
+
|
| 8 |
+
class Invalid(ValueError):
|
| 9 |
+
pass
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
def text(value, label, maximum=200, required=True):
|
| 13 |
+
if not isinstance(value, str) or len(value.strip()) > maximum:
|
| 14 |
+
raise Invalid(f"{label} must be text, at most {maximum} characters.")
|
| 15 |
+
value = value.strip()
|
| 16 |
+
if (required and not value) or any(ord(c) < 32 and c not in '\n\t' for c in value):
|
| 17 |
+
raise Invalid(f"Please provide a valid {label.lower()}.")
|
| 18 |
+
return value
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
def url(value, label):
|
| 22 |
+
value = text(value, label, 1000)
|
| 23 |
+
try:
|
| 24 |
+
parsed = urlsplit(value)
|
| 25 |
+
if parsed.scheme != "https" or not parsed.hostname or parsed.username or parsed.password:
|
| 26 |
+
raise ValueError()
|
| 27 |
+
except ValueError:
|
| 28 |
+
raise Invalid(f"{label} must be an https:// link without credentials.")
|
| 29 |
+
return value
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
def score(value, label):
|
| 33 |
+
if value is None:
|
| 34 |
+
return None
|
| 35 |
+
if type(value) not in (int, float) or not math.isfinite(value) or not 0 <= value <= 100:
|
| 36 |
+
raise Invalid(f"{label} must be a number between 0 and 100, or null.")
|
| 37 |
+
if abs(value * 10 - round(value * 10)) > 1e-7:
|
| 38 |
+
raise Invalid(f"{label} must use at most one decimal place, as in the published tables.")
|
| 39 |
+
return float(value)
|
| 40 |
+
|
| 41 |
+
|
| 42 |
+
def simple_scores(raw, columns, label):
|
| 43 |
+
if not isinstance(raw, dict):
|
| 44 |
+
raise Invalid(f"{label} must be an object with named scores.")
|
| 45 |
+
lookup = {c["label"]: c["key"] for c in columns}
|
| 46 |
+
lookup.update({c["key"]: c["key"] for c in columns})
|
| 47 |
+
result = {c["key"]: None for c in columns}
|
| 48 |
+
seen = set()
|
| 49 |
+
for key, value in raw.items():
|
| 50 |
+
if key not in lookup or lookup[key] in seen:
|
| 51 |
+
raise Invalid(f"Unknown or duplicate {label} field: {key}")
|
| 52 |
+
seen.add(lookup[key])
|
| 53 |
+
result[lookup[key]] = score(value, key)
|
| 54 |
+
return result
|
| 55 |
+
|
| 56 |
+
|
| 57 |
+
def nested_scores(raw, columns, label):
|
| 58 |
+
if not isinstance(raw, dict):
|
| 59 |
+
raise Invalid(f"{label} must group full score names by reasoning dimension.")
|
| 60 |
+
result = {c["key"]: None for c in columns}
|
| 61 |
+
seen = set()
|
| 62 |
+
for dimension, values in raw.items():
|
| 63 |
+
subset = [c for c in columns if c["dimension"].casefold() == dimension.casefold()]
|
| 64 |
+
if not subset or dimension.casefold() in seen:
|
| 65 |
+
raise Invalid(f"Unknown or duplicate {label} dimension: {dimension}")
|
| 66 |
+
seen.add(dimension.casefold())
|
| 67 |
+
result.update(simple_scores(values, subset, label))
|
| 68 |
+
return result
|
| 69 |
+
|
| 70 |
+
|
| 71 |
+
def validate_submission(raw, data):
|
| 72 |
+
if not isinstance(raw, dict):
|
| 73 |
+
raise Invalid("The submission must be a JSON object.")
|
| 74 |
+
allowed = {"model_name", "project_url", "evidence_url", "team", "email", "group", "benchmark",
|
| 75 |
+
"language", "multi_image", "revision_of", "notes", "full_dataset", "results"}
|
| 76 |
+
if set(raw) - allowed:
|
| 77 |
+
raise Invalid("Unknown submission fields: " + ", ".join(sorted(set(raw) - allowed)))
|
| 78 |
+
benchmark = next((b for b in data["benchmarks"] if b["id"] == raw.get("benchmark")), None)
|
| 79 |
+
if not benchmark or raw.get("language") not in benchmark["results_by_language"]:
|
| 80 |
+
raise Invalid("Select a supported benchmark and instruction language.")
|
| 81 |
+
if raw.get("full_dataset") is not True:
|
| 82 |
+
raise Invalid("Confirm that results use the full benchmark, not the demonstration data.")
|
| 83 |
+
if type(raw.get("multi_image")) is not bool:
|
| 84 |
+
raise Invalid("Select whether the model supports multiple input images.")
|
| 85 |
+
if benchmark["id"] == "risebench" and raw["multi_image"]:
|
| 86 |
+
raise Invalid("RISEBench evaluates single-image inputs only.")
|
| 87 |
+
if raw.get("group") not in {"closed", "open", "agentic"}:
|
| 88 |
+
raise Invalid("Select a model category.")
|
| 89 |
+
result = {key: raw[key] for key in ("benchmark", "language", "group", "multi_image")}
|
| 90 |
+
for key, label, size, required in [("model_name", "Model name", 160, True), ("team", "Team", 120, False),
|
| 91 |
+
("notes", "Notes", 3000, False), ("revision_of", "Existing model identifier", 160, False)]:
|
| 92 |
+
result[key] = text(raw.get(key, ""), label, size, required)
|
| 93 |
+
result["project_url"] = url(raw.get("project_url"), "Project link")
|
| 94 |
+
result["evidence_url"] = url(raw.get("evidence_url"), "Evaluation artifacts link")
|
| 95 |
+
result["email"] = text(raw.get("email"), "Contact email", 254)
|
| 96 |
+
if not re.fullmatch(r"[^\s@]+@[^\s@]+\.[^\s@]+", result["email"]):
|
| 97 |
+
raise Invalid("Provide a valid contact email.")
|
| 98 |
+
uploaded = raw.get("results")
|
| 99 |
+
if not isinstance(uploaded, dict) or set(uploaded) - {"accuracy", "metrics", "subcategories", "task_types"}:
|
| 100 |
+
raise Invalid("Upload a result JSON matching the downloadable template.")
|
| 101 |
+
result["accuracy"] = simple_scores(uploaded.get("accuracy"), benchmark["accuracy_columns"], "accuracy")
|
| 102 |
+
required_keys = [d["key"] for d in benchmark["dimensions"]]
|
| 103 |
+
if benchmark["id"] == "risebench-plusplus":
|
| 104 |
+
required_keys += ["single"] + (["multi", "total"] if result["multi_image"] else [])
|
| 105 |
+
if not result["multi_image"] and any(result["accuracy"][key] is not None for key in ("multi", "total")):
|
| 106 |
+
raise Invalid("Single-image-only models must leave Total and Multi null.")
|
| 107 |
+
else:
|
| 108 |
+
required_keys += ["total"]
|
| 109 |
+
if any(result["accuracy"][key] is None for key in required_keys):
|
| 110 |
+
raise Invalid("Fill in every reasoning-dimension accuracy and the applicable summary scores.")
|
| 111 |
+
result["metrics"] = simple_scores(uploaded.get("metrics", {}), benchmark["metrics"], "evaluation score")
|
| 112 |
+
for field, columns in (("subcategories", "subcategory_columns"), ("task_types", "task_type_columns")):
|
| 113 |
+
if columns not in benchmark:
|
| 114 |
+
if uploaded.get(field):
|
| 115 |
+
raise Invalid("Fine-grained submissions are supported only for RISEBench++.")
|
| 116 |
+
continue
|
| 117 |
+
result[field] = nested_scores(uploaded.get(field, {}), benchmark[columns], field)
|
| 118 |
+
if benchmark["id"] == "risebench-plusplus" and not result["multi_image"]:
|
| 119 |
+
for column in benchmark["task_type_columns"]:
|
| 120 |
+
if column["case_count"] == column["multi_image_case_count"] and result["task_types"][column["key"]] is not None:
|
| 121 |
+
raise Invalid(f"{column['label']} is a multi-image-only task; leave it null for this model.")
|
| 122 |
+
result["full_dataset"] = True
|
| 123 |
+
return result
|
| 124 |
+
|
| 125 |
+
|
| 126 |
+
def template(benchmark):
|
| 127 |
+
result = {"accuracy": {c["label"]: None for c in benchmark["accuracy_columns"]},
|
| 128 |
+
"metrics": {c["label"]: None for c in benchmark["metrics"]}}
|
| 129 |
+
for field, key in (("subcategories", "subcategory_columns"), ("task_types", "task_type_columns")):
|
| 130 |
+
if key in benchmark:
|
| 131 |
+
result[field] = {}
|
| 132 |
+
for c in benchmark[key]:
|
| 133 |
+
result[field].setdefault(c["dimension"].title(), {})[c["label"]] = None
|
| 134 |
+
return result
|
| 135 |
+
|
| 136 |
+
|
| 137 |
+
def public_leaderboard(base, state):
|
| 138 |
+
data = copy.deepcopy(base)
|
| 139 |
+
for b in data["benchmarks"]:
|
| 140 |
+
for language, entry in b["results_by_language"].items():
|
| 141 |
+
models = {m["id"]: m for m in entry["models"]}
|
| 142 |
+
approved = sorted((r for r in state["submissions"].values() if r["status"] == "approved"
|
| 143 |
+
and r["payload"]["benchmark"] == b["id"] and r["payload"]["language"] == language),
|
| 144 |
+
key=lambda r: r["reviewed_at"])
|
| 145 |
+
for record in approved:
|
| 146 |
+
p = record["payload"]
|
| 147 |
+
model_id = p["revision_of"] or "community-" + record["id"]
|
| 148 |
+
previous = models.get(model_id)
|
| 149 |
+
model = {"id": model_id, "name": p["model_name"], "group": p["group"], "multi_image": p["multi_image"],
|
| 150 |
+
"source_order": previous["source_order"] if previous else len(models) + 1}
|
| 151 |
+
# An explicit public allowlist: no email, notes, receipt tokens or review history.
|
| 152 |
+
for field in ("accuracy", "metrics", "subcategories", "task_types"):
|
| 153 |
+
if field in p:
|
| 154 |
+
model[field] = copy.deepcopy(p[field])
|
| 155 |
+
models[model_id] = model
|
| 156 |
+
entry["models"] = list(models.values())
|
| 157 |
+
entry["model_count"] = len(models)
|
| 158 |
+
for group in entry["groups"]:
|
| 159 |
+
group["count"] = sum(m["group"] == group["id"] for m in models.values())
|
| 160 |
+
return data
|
styles.css
CHANGED
|
@@ -46,6 +46,11 @@ main { padding-bottom: 48px; }
|
|
| 46 |
/* Benchmark switcher and context */
|
| 47 |
.board-section { scroll-margin-top: 24px; }
|
| 48 |
.benchmark-bar { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 20px; padding-bottom: 22px; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 49 |
.benchmark-tabs { display: inline-flex; gap: 6px; padding: 6px; background: #eaf0f0; border: 1px solid #dde6e7; border-radius: 14px; }
|
| 50 |
.benchmark-tabs button { display: flex; align-items: center; justify-content: center; padding: 10px 22px; min-height: 50px; border: 1px solid transparent; border-radius: 10px; font-size: 20px; font-weight: 650; color: #637982; letter-spacing: -.5px; transition: background .15s, color .15s; }
|
| 51 |
.benchmark-tabs button:hover { color: var(--ink); }
|
|
@@ -254,6 +259,9 @@ dialog::backdrop { background: #15384070; backdrop-filter: blur(5px); }
|
|
| 254 |
.resource-links { gap: 20px; }
|
| 255 |
.resource-links a { font-size: 14px; min-height: 36px; }
|
| 256 |
.benchmark-bar { display: block; padding-bottom: 18px; }
|
|
|
|
|
|
|
|
|
|
| 257 |
.benchmark-tabs { width: 100%; gap: 4px; padding: 5px; }
|
| 258 |
.benchmark-tabs button { flex: 1; padding: 9px 10px; min-height: 48px; font-size: 19px; }
|
| 259 |
.board-card { border-radius: 13px; }
|
|
@@ -305,3 +313,78 @@ dialog::backdrop { background: #15384070; backdrop-filter: blur(5px); }
|
|
| 305 |
html { scroll-behavior: auto; }
|
| 306 |
* { animation: none !important; transition: none !important; }
|
| 307 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
/* Benchmark switcher and context */
|
| 47 |
.board-section { scroll-margin-top: 24px; }
|
| 48 |
.benchmark-bar { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 20px; padding-bottom: 22px; }
|
| 49 |
+
.benchmark-actions { display: flex; align-items: center; justify-content: flex-end; flex-wrap: wrap; gap: 24px; max-width: 100%; margin-left: auto; }
|
| 50 |
+
.submit-results-button { display: inline-flex; align-items: center; justify-content: center; gap: 11px; min-height: 52px; padding: 12px 22px; border: 1px solid #34577d; border-radius: 11px; background: #3b6088; color: #fff; font-size: 16px; font-weight: 650; white-space: nowrap; box-shadow: 0 4px 12px #2d527923; transition: background .15s, box-shadow .15s; }
|
| 51 |
+
.submit-results-button:hover { background: #2d4e74; color: #fff; box-shadow: 0 6px 16px #2d52792b; }
|
| 52 |
+
.submit-results-button:focus-visible { outline-color: #456c99; }
|
| 53 |
+
.submit-results-button .button-icon { width: 20px; height: 20px; }
|
| 54 |
.benchmark-tabs { display: inline-flex; gap: 6px; padding: 6px; background: #eaf0f0; border: 1px solid #dde6e7; border-radius: 14px; }
|
| 55 |
.benchmark-tabs button { display: flex; align-items: center; justify-content: center; padding: 10px 22px; min-height: 50px; border: 1px solid transparent; border-radius: 10px; font-size: 20px; font-weight: 650; color: #637982; letter-spacing: -.5px; transition: background .15s, color .15s; }
|
| 56 |
.benchmark-tabs button:hover { color: var(--ink); }
|
|
|
|
| 259 |
.resource-links { gap: 20px; }
|
| 260 |
.resource-links a { font-size: 14px; min-height: 36px; }
|
| 261 |
.benchmark-bar { display: block; padding-bottom: 18px; }
|
| 262 |
+
.benchmark-actions { flex-direction: column; align-items: stretch; gap: 16px; margin-top: 16px; }
|
| 263 |
+
.benchmark-actions .board-options { margin-top: 0; }
|
| 264 |
+
.submit-results-button { width: 100%; }
|
| 265 |
.benchmark-tabs { width: 100%; gap: 4px; padding: 5px; }
|
| 266 |
.benchmark-tabs button { flex: 1; padding: 9px 10px; min-height: 48px; font-size: 19px; }
|
| 267 |
.board-card { border-radius: 13px; }
|
|
|
|
| 313 |
html { scroll-behavior: auto; }
|
| 314 |
* { animation: none !important; transition: none !important; }
|
| 315 |
}
|
| 316 |
+
|
| 317 |
+
/* Fine-grained results keep the same model rows, with a scoped score header. */
|
| 318 |
+
.view-row { flex-wrap: wrap; }
|
| 319 |
+
.view-actions { margin-left: auto; }
|
| 320 |
+
.breakdown-controls { padding: 18px 24px; border-bottom: 1px solid #e1e8ef; background: #f8fafd; display: flex; flex-wrap: wrap; gap: 18px 24px; align-items: center; }
|
| 321 |
+
.dimension-tabs { display: flex; flex-wrap: wrap; gap: 6px; }
|
| 322 |
+
.dimension-tabs button { padding: 7px 12px; min-height: 38px; border-radius: 7px; font-size: 14px; font-weight: 550; color: #718197; border: 1px solid transparent; }
|
| 323 |
+
.dimension-tabs button:hover { background: #eef2f8; color: #315778; }
|
| 324 |
+
.dimension-tabs button[aria-pressed=true] { background: #e8eef8; border-color: #cfdcef; color: #345980; }
|
| 325 |
+
.subcategory-filter { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; font-size: 13px; color: #78899d; }
|
| 326 |
+
.subcategory-filter select { color: #3f5771; background: white; border: 1px solid #d0dce7; border-radius: 8px; padding: 8px 32px 8px 12px; min-height: 40px; max-width: 100%; font-size: 14px; }
|
| 327 |
+
.context-separator { padding: 0 10px; color: #a6b3bf; }
|
| 328 |
+
.column-popover { max-height: min(65vh, 540px); overflow-y: auto; width: 300px; }
|
| 329 |
+
.column-popover label { font-size: 14px; line-height: 1.5; }
|
| 330 |
+
.table-scroll .breakdown-table thead th { height: 110px; background: #f4f7fb; color: #506680; }
|
| 331 |
+
.table-scroll .breakdown-table thead th.active-sort { background: #e8eff9; color: #355d8a; }
|
| 332 |
+
.table-scroll .breakdown-table thead th.dimension-band { height: 38px; padding: 7px 12px; font-size: 12px; font-weight: 650; letter-spacing: .25px; color: #5e7088; border-bottom-color: #fff; }
|
| 333 |
+
.table-scroll .breakdown-table .dimension-band.dim-temporal { background: #edf0fb; }
|
| 334 |
+
.table-scroll .breakdown-table .dimension-band.dim-causal { background: #eff3e9; }
|
| 335 |
+
.table-scroll .breakdown-table .dimension-band.dim-spatial { background: #eaf2f5; }
|
| 336 |
+
.table-scroll .breakdown-table .dimension-band.dim-logical { background: #eef0f8; }
|
| 337 |
+
.table-scroll .breakdown-table .dimension-band.dim-counterfactual { background: #fbf0e7; }
|
| 338 |
+
|
| 339 |
+
/* Paper figures and citation form a quiet, visual closing section. */
|
| 340 |
+
.research-section { margin-top: 84px; }
|
| 341 |
+
.figure-section { margin-bottom: 72px; scroll-margin-top: 32px; }
|
| 342 |
+
.section-heading { display: flex; align-items: end; justify-content: space-between; flex-wrap: wrap; gap: 18px 30px; margin-bottom: 25px; }
|
| 343 |
+
.section-kicker { display: block; font-size: 11px; font-weight: 650; letter-spacing: 1.8px; color: #8a99ae; margin-bottom: 9px; }
|
| 344 |
+
.section-heading h2 { margin: 0; font-size: 34px; line-height: 1.2; font-weight: 650; letter-spacing: -.9px; color: #273d55; }
|
| 345 |
+
.section-heading .plus { color: #537da9; }
|
| 346 |
+
.section-note { color: #8592a3; font-size: 15px; padding-bottom: 3px; }
|
| 347 |
+
.research-figure { margin: 0; padding: 24px; border: 1px solid #e0e6ee; border-radius: 20px; background: white; box-shadow: 0 8px 36px #23395308; }
|
| 348 |
+
.research-figure a { display: block; position: relative; border-radius: 10px; overflow: hidden; }
|
| 349 |
+
.research-figure img { display: block; width: 100%; height: auto; }
|
| 350 |
+
.figure-expand { position: absolute; bottom: 14px; right: 14px; padding: 8px 14px; background: #ffffffee; box-shadow: 0 2px 15px #20395612; border: 1px solid #dce5ef; border-radius: 8px; color: #526983; font-size: 12px; opacity: 0; transition: opacity .2s; }
|
| 351 |
+
.research-figure a:hover .figure-expand, .research-figure a:focus-visible .figure-expand { opacity: 1; }
|
| 352 |
+
.citation-section { padding: 34px; background: linear-gradient(125deg, #eff3fa, #f7f8fb 70%, #f2f0fa); border: 1px solid #dee5ef; border-radius: 20px; scroll-margin-top: 32px; }
|
| 353 |
+
.citation-section .section-heading { align-items: center; margin-bottom: 22px; }
|
| 354 |
+
.citation-section h2 { font-size: 29px; }
|
| 355 |
+
.citation-actions { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
|
| 356 |
+
.citation-actions button { font-size: 14px; color: #526a86; }
|
| 357 |
+
.citation-actions .outline-button { border-color: #d4dfe9; }
|
| 358 |
+
.page-citation { margin: 0; padding: 26px; border: 1px solid #e1e7f0; background: #ffffffba; color: #5d6e83; font-size: 13px; line-height: 1.85; border-radius: 12px; white-space: pre-wrap; overflow-wrap: anywhere; }
|
| 359 |
+
.page-footer { display: flex; justify-content: space-between; align-items: center; gap: 20px; color: #8b9bad; margin-top: 36px; font-size: 13px; }
|
| 360 |
+
.page-footer > span { font-weight: 650; letter-spacing: -.2px; color: #6d819a; }
|
| 361 |
+
.page-footer a { padding-block: 8px; }
|
| 362 |
+
@media (max-width: 1100px) {
|
| 363 |
+
.view-tabs button { padding-inline: 11px; font-size: 14px; }
|
| 364 |
+
.view-tabs button > span { margin-left: 3px; }
|
| 365 |
+
}
|
| 366 |
+
@media (max-width: 820px) {
|
| 367 |
+
.research-section { margin-top: 56px; }
|
| 368 |
+
.figure-section { margin-bottom: 48px; }
|
| 369 |
+
.section-heading h2 { font-size: 28px; }
|
| 370 |
+
.section-note { font-size: 14px; }
|
| 371 |
+
.research-figure { padding: 14px; border-radius: 14px; }
|
| 372 |
+
.citation-section { padding: 24px; }
|
| 373 |
+
}
|
| 374 |
+
@media (max-width: 540px) {
|
| 375 |
+
.view-tabs { display: flex; flex-wrap: wrap; }
|
| 376 |
+
.view-tabs button { flex-basis: 45%; font-size: 14px; }
|
| 377 |
+
.breakdown-controls { padding: 14px; gap: 14px; }
|
| 378 |
+
.dimension-tabs { gap: 4px; }
|
| 379 |
+
.dimension-tabs button { padding-inline: 9px; font-size: 13px; }
|
| 380 |
+
.subcategory-filter { width: 100%; gap: 6px; }
|
| 381 |
+
.subcategory-filter select { width: 100%; }
|
| 382 |
+
.footer-actions { flex-wrap: wrap; gap: 2px; }
|
| 383 |
+
.footer-actions .quiet-button { padding-inline: 8px; font-size: 12px; }
|
| 384 |
+
.section-heading { gap: 12px; margin-bottom: 20px; }
|
| 385 |
+
.section-kicker { font-size: 10px; }
|
| 386 |
+
.research-figure { padding: 8px; border-radius: 12px; }
|
| 387 |
+
.citation-section { padding: 20px 16px; }
|
| 388 |
+
.citation-actions { width: 100%; }
|
| 389 |
+
.page-citation { padding: 15px; font-size: 12px; }
|
| 390 |
+
}
|
submit.html
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Submit results · RISEBench</title><link rel="icon" href="assets/favicon.svg"><link rel="stylesheet" href="styles.css"><link rel="stylesheet" href="portal.css"></head>
|
| 3 |
+
<body data-page="submit"><main class="portal-width">
|
| 4 |
+
<nav class="portal-nav" aria-label="Main navigation"><a class="wordmark" href="index.html">RISEBench</a><div><a href="index.html">Leaderboard</a><a href="submit.html" aria-current="page">Submit results</a></div></nav>
|
| 5 |
+
<header class="portal-heading"><span class="section-kicker">COMMUNITY EVALUATIONS</span><h1>Submit your results.</h1><p>Submit evaluations for RISEBench or RISEBench++.</p></header>
|
| 6 |
+
<p class="notice" id="service-notice" hidden></p>
|
| 7 |
+
<form id="submission-form">
|
| 8 |
+
<section class="portal-card"><div class="card-heading"><h2>Model details</h2><span>Required unless marked optional</span></div>
|
| 9 |
+
<div class="form-grid">
|
| 10 |
+
<label>Model name<input name="model_name" required maxlength="160" placeholder="Your model name"></label>
|
| 11 |
+
<label>Project, paper or model repository<input name="project_url" type="url" required maxlength="1000" placeholder="https://"></label>
|
| 12 |
+
<label>Team <span class="optional">Optional</span><input name="team" maxlength="120" placeholder="Your team or organization"></label>
|
| 13 |
+
<label>Contact email <span class="optional">Private</span><input name="email" type="email" required maxlength="254" placeholder="name@organization.com"><small>Visible only to reviewers.</small></label>
|
| 14 |
+
<label>Benchmark<select name="benchmark" id="submission-benchmark"><option value="risebench-plusplus">RISEBench++</option><option value="risebench">RISEBench</option></select></label>
|
| 15 |
+
<label>Instruction language<select name="language" id="submission-language"><option value="en">English</option><option value="zh">Chinese</option></select></label>
|
| 16 |
+
<label>Model category<select name="group" required><option value="open">Open-source</option><option value="closed">Closed-source</option><option value="agentic">Agentic method</option></select></label>
|
| 17 |
+
<label>Input support<select name="multi_image"><option value="true">Multiple input images supported</option><option value="false">Single input image only</option></select><input id="single-image-input" type="text" value="Single input image" readonly hidden></label>
|
| 18 |
+
<label class="full-width">Update an existing result <span class="optional">Optional</span><select name="revision_of" id="submission-revision"><option value="">New result</option></select></label>
|
| 19 |
+
</div>
|
| 20 |
+
</section>
|
| 21 |
+
<section class="portal-card"><div class="card-heading"><h2>Evaluation results</h2><button type="button" id="download-template" class="outline-button">Download JSON template ↓</button></div>
|
| 22 |
+
<p class="field-note">Use full benchmark results on a 0–100 scale. Leave unevaluated fields null.</p>
|
| 23 |
+
<label class="upload-zone" id="upload-zone"><input type="file" id="result-file" accept=".json,application/json" required><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 16V3m-5 5 5-5 5 5M4 15v6h16v-6"/></svg><strong id="upload-title">Choose a result JSON or drop it here</strong><span id="upload-caption">One JSON file · up to 200 KB</span></label>
|
| 24 |
+
<div class="file-preview" id="file-preview" hidden></div>
|
| 25 |
+
<div class="form-grid artifacts"><label class="full-width">Evaluation artifacts<input name="evidence_url" type="url" required maxlength="1000" placeholder="https://huggingface.co/datasets/your-team/evaluation-results"><small>Link to generated outputs and detailed evaluation results so reviewers can verify the scores.</small></label>
|
| 26 |
+
<label class="full-width">Notes for reviewers <span class="optional">Optional · private</span><textarea name="notes" rows="3" maxlength="3000" placeholder="Evaluation configuration, model version, or details of an update"></textarea></label></div>
|
| 27 |
+
<label class="confirmation"><input name="full_dataset" type="checkbox" required><span>These scores use the full benchmark and the official evaluation protocol. I am authorized to submit this model's results.</span></label>
|
| 28 |
+
<div class="form-bottom"><p class="form-message" id="submission-message" role="status"></p><button class="primary-button" id="submit-results" type="submit">Submit for review <span aria-hidden="true">→</span></button></div>
|
| 29 |
+
</section>
|
| 30 |
+
</form>
|
| 31 |
+
<section class="portal-card receipt-card" id="submission-receipt" hidden aria-live="polite"></section>
|
| 32 |
+
<section class="portal-card status-card"><div class="card-heading"><h2>Check a submission</h2><span>Your receipt keeps this private</span></div><form id="status-form"><div class="form-grid"><label>Submission ID<input name="submission_id" required autocomplete="off"></label><label>Receipt key<input name="status_token" type="password" required autocomplete="off"></label></div><div class="form-bottom"><p id="status-result" class="form-message" role="status"></p><button class="outline-button" type="submit">Check status</button></div></form></section>
|
| 33 |
+
<footer class="page-footer"><a href="index.html">← Back to leaderboard</a><a href="admin.html">Reviewer sign in</a></footer>
|
| 34 |
+
</main><script id="submission-schema" type="application/json">{"benchmarks": [{"id": "risebench-plusplus", "name": "RISEBench++", "case_count": 1000, "available_result_languages": ["en", "zh"], "accuracy_unit": "%", "metric_unit": "/100", "score_decimals": 1, "default_sort": "total", "dimensions": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}, {"key": "counterfactual", "label": "Counterfactual", "description": "Visualize outcomes under hypothetical or contrary-to-fact conditions."}, {"key": "hybrid", "label": "Hybrid", "description": "Combine reasoning across three to five successive editing instructions."}], "metrics": [{"key": "instruction_reasoning", "label": "Instruction Reasoning", "description": "Whether the edit realizes the intended reasoning outcome."}, {"key": "appearance_consistency", "label": "Appearance Consistency", "description": "Whether content that should remain unchanged is preserved."}, {"key": "visual_plausibility", "label": "Visual Plausibility", "description": "Visual quality and plausibility; logical tasks are excluded."}], "accuracy_columns": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}, {"key": "counterfactual", "label": "Counterfactual", "description": "Visualize outcomes under hypothetical or contrary-to-fact conditions."}, {"key": "hybrid", "label": "Hybrid", "description": "Combine reasoning across three to five successive editing instructions."}, {"key": "single", "label": "Single", "description": "Accuracy on single-image cases."}, {"key": "multi", "label": "Multi", "description": "Accuracy on multi-image cases. Not evaluated for models without multi-image support."}, {"key": "total", "label": "Total", "description": "Accuracy on the complete benchmark. Not evaluated for single-image-only models."}], "subcategory_columns": [{"key": "temporal_common_sense_knowledge", "label": "Common-Sense Knowledge", "dimension": "temporal", "case_count": 85, "multi_image_case_count": 0, "code": "CSK", "description": "Temporal · Common-Sense Knowledge — accuracy (%)"}, {"key": "temporal_context_knowledge", "label": "Context Knowledge", "dimension": "temporal", "case_count": 52, "multi_image_case_count": 28, "code": "CtxK", "description": "Temporal · Context Knowledge — accuracy (%)"}, {"key": "temporal_disciplinary_knowledge", "label": "Disciplinary Knowledge", "dimension": "temporal", "case_count": 63, "multi_image_case_count": 4, "code": "DK", "description": "Temporal · Disciplinary Knowledge — accuracy (%)"}, {"key": "causal_common_sense_knowledge", "label": "Common-Sense Knowledge", "dimension": "causal", "case_count": 80, "multi_image_case_count": 1, "code": "CSK", "description": "Causal · Common-Sense Knowledge — accuracy (%)"}, {"key": "causal_context_knowledge", "label": "Context Knowledge", "dimension": "causal", "case_count": 40, "multi_image_case_count": 2, "code": "CtxK", "description": "Causal · Context Knowledge — accuracy (%)"}, {"key": "causal_disciplinary_knowledge", "label": "Disciplinary Knowledge", "dimension": "causal", "case_count": 80, "multi_image_case_count": 5, "code": "DK", "description": "Causal · Disciplinary Knowledge — accuracy (%)"}, {"key": "spatial_relation", "label": "Relation", "dimension": "spatial", "case_count": 106, "multi_image_case_count": 6, "code": "Rel.", "description": "Spatial · Relation — accuracy (%)"}, {"key": "spatial_structure", "label": "Structure", "dimension": "spatial", "case_count": 94, "multi_image_case_count": 12, "code": "Struct.", "description": "Spatial · Structure — accuracy (%)"}, {"key": "logical_explicit_rule_deduction", "label": "Explicit Rule Deduction", "dimension": "logical", "case_count": 123, "multi_image_case_count": 0, "code": "ERD", "description": "Logical · Explicit Rule Deduction — accuracy (%)"}, {"key": "logical_implicit_pattern_induction", "label": "Implicit Pattern Induction", "dimension": "logical", "case_count": 77, "multi_image_case_count": 20, "code": "IPI", "description": "Logical · Implicit Pattern Induction — accuracy (%)"}, {"key": "counterfactual_counterfactual_imagination", "label": "Counterfactual Imagination", "dimension": "counterfactual", "case_count": 70, "multi_image_case_count": 0, "code": "CFI", "description": "Counterfactual · Counterfactual Imagination — accuracy (%)"}, {"key": "counterfactual_anomaly_correction_and_generation", "label": "Anomaly Correction and Generation", "dimension": "counterfactual", "case_count": 30, "multi_image_case_count": 0, "code": "ACG", "description": "Counterfactual · Anomaly Correction and Generation — accuracy (%)"}], "task_type_columns": [{"key": "T01", "code": "T01", "label": "Life Progression", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 24, "multi_image_case_count": 0, "description": "Temporal · Life Progression — accuracy (%)"}, {"key": "T02", "code": "T02", "label": "Material Transformation", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 9, "multi_image_case_count": 0, "description": "Temporal · Material Transformation — accuracy (%)"}, {"key": "T03", "code": "T03", "label": "Natural Environmental Changes", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 13, "multi_image_case_count": 0, "description": "Temporal · Natural Environmental Changes — accuracy (%)"}, {"key": "T04", "code": "T04", "label": "Physical Aging", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 20, "multi_image_case_count": 0, "description": "Temporal · Physical Aging — accuracy (%)"}, {"key": "T05", "code": "T05", "label": "Social Activities", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 8, "multi_image_case_count": 0, "description": "Temporal · Social Activities — accuracy (%)"}, {"key": "T06", "code": "T06", "label": "Tool Evolution", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 7, "multi_image_case_count": 0, "description": "Temporal · Tool Evolution — accuracy (%)"}, {"key": "T07", "code": "T07", "label": "Urban Evolution", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Temporal · Urban Evolution — accuracy (%)"}, {"key": "T08", "code": "T08", "label": "Temporal State Transition", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 15, "multi_image_case_count": 4, "description": "Temporal · Temporal State Transition — accuracy (%)"}, {"key": "T09", "code": "T09", "label": "Precise Temporal Localization", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 14, "multi_image_case_count": 2, "description": "Temporal · Precise Temporal Localization — accuracy (%)"}, {"key": "T10", "code": "T10", "label": "Position Change", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 15, "multi_image_case_count": 14, "description": "Temporal · Position Change — accuracy (%)"}, {"key": "T11", "code": "T11", "label": "Action Sequence", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 8, "multi_image_case_count": 8, "description": "Temporal · Action Sequence — accuracy (%)"}, {"key": "T12", "code": "T12", "label": "Physics", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Temporal · Physics — accuracy (%)"}, {"key": "T13", "code": "T13", "label": "Chemistry", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 8, "multi_image_case_count": 4, "description": "Temporal · Chemistry — accuracy (%)"}, {"key": "T14", "code": "T14", "label": "Biology", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 9, "multi_image_case_count": 0, "description": "Temporal · Biology — accuracy (%)"}, {"key": "T15", "code": "T15", "label": "Astronomy", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 12, "multi_image_case_count": 0, "description": "Temporal · Astronomy — accuracy (%)"}, {"key": "T16", "code": "T16", "label": "Geography", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 18, "multi_image_case_count": 0, "description": "Temporal · Geography — accuracy (%)"}, {"key": "T17", "code": "T17", "label": "History", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 5, "multi_image_case_count": 0, "description": "Temporal · History — accuracy (%)"}, {"key": "T18", "code": "T18", "label": "Medicine", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Temporal · Medicine — accuracy (%)"}, {"key": "T19", "code": "T19", "label": "Computer Science", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 3, "multi_image_case_count": 0, "description": "Temporal · Computer Science — accuracy (%)"}, {"key": "C01", "code": "C01", "label": "Physical State Transition", "dimension": "causal", "subcategory": "causal_common_sense_knowledge", "case_count": 31, "multi_image_case_count": 0, "description": "Causal · Physical State Transition — accuracy (%)"}, {"key": "C02", "code": "C02", "label": "Structural Damage", "dimension": "causal", "subcategory": "causal_common_sense_knowledge", "case_count": 27, "multi_image_case_count": 0, "description": "Causal · Structural Damage — accuracy (%)"}, {"key": "C03", "code": "C03", "label": "Flexible Deformation", "dimension": "causal", "subcategory": "causal_common_sense_knowledge", "case_count": 22, "multi_image_case_count": 1, "description": "Causal · Flexible Deformation — accuracy (%)"}, {"key": "C04", "code": "C04", "label": "Magnitude Change", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Magnitude Change — accuracy (%)"}, {"key": "C05", "code": "C05", "label": "Reading Offset", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 2, "description": "Causal · Reading Offset — accuracy (%)"}, {"key": "C06", "code": "C06", "label": "Order Relation", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Order Relation — accuracy (%)"}, {"key": "C07", "code": "C07", "label": "Feature Mapping", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Feature Mapping — accuracy (%)"}, {"key": "C08", "code": "C08", "label": "Physics", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 25, "multi_image_case_count": 1, "description": "Causal · Physics — accuracy (%)"}, {"key": "C09", "code": "C09", "label": "Chemistry", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 23, "multi_image_case_count": 4, "description": "Causal · Chemistry — accuracy (%)"}, {"key": "C10", "code": "C10", "label": "Biology", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 12, "multi_image_case_count": 0, "description": "Causal · Biology — accuracy (%)"}, {"key": "C11", "code": "C11", "label": "Astronomy", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 3, "multi_image_case_count": 0, "description": "Causal · Astronomy — accuracy (%)"}, {"key": "C12", "code": "C12", "label": "Medicine", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Causal · Medicine — accuracy (%)"}, {"key": "C13", "code": "C13", "label": "Music Theory", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 3, "multi_image_case_count": 0, "description": "Causal · Music Theory — accuracy (%)"}, {"key": "C14", "code": "C14", "label": "Computer Science", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Computer Science — accuracy (%)"}, {"key": "S01", "code": "S01", "label": "Adjacency", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 11, "multi_image_case_count": 0, "description": "Spatial · Adjacency — accuracy (%)"}, {"key": "S02", "code": "S02", "label": "Direction", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 11, "multi_image_case_count": 0, "description": "Spatial · Direction — accuracy (%)"}, {"key": "S03", "code": "S03", "label": "Orientation", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 11, "multi_image_case_count": 0, "description": "Spatial · Orientation — accuracy (%)"}, {"key": "S04", "code": "S04", "label": "Projection", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 12, "multi_image_case_count": 0, "description": "Spatial · Projection — accuracy (%)"}, {"key": "S05", "code": "S05", "label": "Distance", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 13, "multi_image_case_count": 0, "description": "Spatial · Distance — accuracy (%)"}, {"key": "S06", "code": "S06", "label": "Size", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 15, "multi_image_case_count": 0, "description": "Spatial · Size — accuracy (%)"}, {"key": "S07", "code": "S07", "label": "Configuration", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 18, "multi_image_case_count": 0, "description": "Spatial · Configuration — accuracy (%)"}, {"key": "S08", "code": "S08", "label": "Viewing Scale", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 9, "multi_image_case_count": 0, "description": "Spatial · Viewing Scale — accuracy (%)"}, {"key": "S09", "code": "S09", "label": "Localization", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 6, "multi_image_case_count": 6, "description": "Spatial · Localization — accuracy (%)"}, {"key": "S10", "code": "S10", "label": "Part-Whole Perception", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 24, "multi_image_case_count": 0, "description": "Spatial · Part-Whole Perception — accuracy (%)"}, {"key": "S11", "code": "S11", "label": "Geometric Regularities Reasoning", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 15, "multi_image_case_count": 0, "description": "Spatial · Geometric Regularities Reasoning — accuracy (%)"}, {"key": "S12", "code": "S12", "label": "Viewpoint Generation", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 26, "multi_image_case_count": 0, "description": "Spatial · Viewpoint Generation — accuracy (%)"}, {"key": "S13", "code": "S13", "label": "Environmental Structure Reasoning", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 19, "multi_image_case_count": 2, "description": "Spatial · Environmental Structure Reasoning — accuracy (%)"}, {"key": "S14", "code": "S14", "label": "Egocentric Scene Reconstruction", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 10, "multi_image_case_count": 10, "description": "Spatial · Egocentric Scene Reconstruction — accuracy (%)"}, {"key": "L01", "code": "L01", "label": "Path Searching", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 24, "multi_image_case_count": 0, "description": "Logical · Path Searching — accuracy (%)"}, {"key": "L02", "code": "L02", "label": "Mathematical Derivation", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 27, "multi_image_case_count": 0, "description": "Logical · Mathematical Derivation — accuracy (%)"}, {"key": "L03", "code": "L03", "label": "Game Deduction", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 37, "multi_image_case_count": 0, "description": "Logical · Game Deduction — accuracy (%)"}, {"key": "L04", "code": "L04", "label": "Puzzle Solving", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 35, "multi_image_case_count": 0, "description": "Logical · Puzzle Solving — accuracy (%)"}, {"key": "L05", "code": "L05", "label": "Pattern Prediction", "dimension": "logical", "subcategory": "logical_implicit_pattern_induction", "case_count": 39, "multi_image_case_count": 0, "description": "Logical · Pattern Prediction — accuracy (%)"}, {"key": "L06", "code": "L06", "label": "Visual Oddity Detection", "dimension": "logical", "subcategory": "logical_implicit_pattern_induction", "case_count": 18, "multi_image_case_count": 0, "description": "Logical · Visual Oddity Detection — accuracy (%)"}, {"key": "L07", "code": "L07", "label": "Rule Transfer", "dimension": "logical", "subcategory": "logical_implicit_pattern_induction", "case_count": 20, "multi_image_case_count": 20, "description": "Logical · Rule Transfer — accuracy (%)"}, {"key": "F01", "code": "F01", "label": "Physical Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 23, "multi_image_case_count": 0, "description": "Counterfactual · Physical Counterfactual — accuracy (%)"}, {"key": "F02", "code": "F02", "label": "Chemical Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 9, "multi_image_case_count": 0, "description": "Counterfactual · Chemical Counterfactual — accuracy (%)"}, {"key": "F03", "code": "F03", "label": "Biological Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 8, "multi_image_case_count": 0, "description": "Counterfactual · Biological Counterfactual — accuracy (%)"}, {"key": "F04", "code": "F04", "label": "Astronomy Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 7, "multi_image_case_count": 0, "description": "Counterfactual · Astronomy Counterfactual — accuracy (%)"}, {"key": "F05", "code": "F05", "label": "Geography Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 8, "multi_image_case_count": 0, "description": "Counterfactual · Geography Counterfactual — accuracy (%)"}, {"key": "F06", "code": "F06", "label": "History Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 7, "multi_image_case_count": 0, "description": "Counterfactual · History Counterfactual — accuracy (%)"}, {"key": "F07", "code": "F07", "label": "Music Theory Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 4, "multi_image_case_count": 0, "description": "Counterfactual · Music Theory Counterfactual — accuracy (%)"}, {"key": "F08", "code": "F08", "label": "Computer Science Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 4, "multi_image_case_count": 0, "description": "Counterfactual · Computer Science Counterfactual — accuracy (%)"}, {"key": "F09", "code": "F09", "label": "Anatomical Errors", "dimension": "counterfactual", "subcategory": "counterfactual_anomaly_correction_and_generation", "case_count": 10, "multi_image_case_count": 0, "description": "Counterfactual · Anatomical Errors — accuracy (%)"}, {"key": "F10", "code": "F10", "label": "Structural Anomalies", "dimension": "counterfactual", "subcategory": "counterfactual_anomaly_correction_and_generation", "case_count": 11, "multi_image_case_count": 0, "description": "Counterfactual · Structural Anomalies — accuracy (%)"}, {"key": "F11", "code": "F11", "label": "Relational Anomalies", "dimension": "counterfactual", "subcategory": "counterfactual_anomaly_correction_and_generation", "case_count": 9, "multi_image_case_count": 0, "description": "Counterfactual · Relational Anomalies — accuracy (%)"}], "links": {"paper": "https://arxiv.org/abs/2610.12343", "data": "https://huggingface.co/datasets/VisionXLab/RISEBench-plusplus", "outputs": "https://huggingface.co/datasets/VisionXLab/RISEBench-plusplus_Outputs", "github": "https://github.com/VisionXLab/RISEBench/tree/main/RISEBench%2B%2B"}, "judges": {"instruction_reasoning": "Gemini-3-Flash", "appearance_consistency": "Gemini-3-Flash", "visual_plausibility": "Gemini-3.1-Flash-Lite"}, "results_by_language": {"en": {"models": [{"id": "gpt-image-2-5-sunburst", "name": "GPT-Image-2.5 Sunburst"}, {"id": "nano-banana-pro", "name": "Nano Banana Pro"}, {"id": "nano-banana-2", "name": "Nano Banana 2"}, {"id": "gpt-image-2", "name": "GPT-Image-2"}, {"id": "gpt-image-2-5-flare", "name": "GPT-Image-2.5 Flare"}, {"id": "luma-uni-1", "name": "Luma Uni-1"}, {"id": "qwen-image-3-0", "name": "Qwen-Image-3.0"}, {"id": "nano-banana-2-lite", "name": "Nano Banana 2 Lite"}, {"id": "flux-2-max", "name": "FLUX.2 Max"}, {"id": "gpt-image-1-5", "name": "GPT-Image-1.5"}, {"id": "flux-2-pro", "name": "FLUX.2 Pro"}, {"id": "nano-banana", "name": "Nano Banana"}, {"id": "hunyuanimage-3-5", "name": "HunyuanImage-3.5"}, {"id": "wan2-7-image-pro", "name": "Wan2.7-Image-Pro"}, {"id": "gpt-image-1", "name": "GPT-Image-1"}, {"id": "qwen-image-2-0", "name": "Qwen-Image-2.0"}, {"id": "seedream-4-5", "name": "Seedream 4.5"}, {"id": "seedream-5-0", "name": "Seedream 5.0"}, {"id": "step-image-edit-2", "name": "Step Image Edit 2"}, {"id": "hunyuanimage-3-0-instruct", "name": "HunyuanImage-3.0-Instruct"}, {"id": "qwen-image-edit-2511", "name": "Qwen-Image-Edit-2511"}, {"id": "qwen-image-2-1", "name": "Qwen-Image-2.1"}, {"id": "firered-image-edit-1-0", "name": "FireRed-Image-Edit-1.0"}, {"id": "firered-image-edit-1-1", "name": "FireRed-Image-Edit-1.1"}, {"id": "qwen-image-edit-2509", "name": "Qwen-Image-Edit-2509"}, {"id": "hidream-o1-image", "name": "HiDream-O1-Image"}, {"id": "flux-2-dev", "name": "FLUX.2 Dev"}, {"id": "flux-2-klein-9b", "name": "FLUX.2 Klein 9B"}, {"id": "joyai-image-edit-plus", "name": "JoyAI-Image-Edit-Plus"}, {"id": "sensenova-u1-a3b-mot-sft", "name": "SenseNova-U1-A3B-MoT-SFT"}, {"id": "unipic-3-0", "name": "UniPic 3.0"}, {"id": "bagel-w-cot", "name": "BAGEL (w/ CoT)"}, {"id": "sensenova-u1-8b-mot-sft", "name": "SenseNova-U1-8B-MoT-SFT"}, {"id": "flux-2-klein-4b", "name": "FLUX.2 Klein 4B"}, {"id": "uniworld-v2", "name": "UniWorld-V2"}, {"id": "bagel", "name": "BAGEL"}, {"id": "omnigen2", "name": "OmniGen2"}, {"id": "omnigen", "name": "OmniGen"}, {"id": "emu2-gen", "name": "Emu2-Gen"}, {"id": "joyai-image-edit", "name": "JoyAI-Image-Edit"}, {"id": "step1x-edit-thinking", "name": "Step1X-Edit (thinking)"}, {"id": "boogu-image-0-1-edit", "name": "Boogu-Image-0.1-Edit"}, {"id": "step1x-edit-thinking-reflection", "name": "Step1X-Edit (thinking + reflection)"}, {"id": "longcat-image-edit", "name": "LongCat-Image-Edit"}, {"id": "step1x-edit-base", "name": "Step1X-Edit (base)"}, {"id": "internvl-u-w-cot", "name": "InternVL-U (w/ CoT)"}, {"id": "flux-1-kontext-dev", "name": "FLUX.1 Kontext Dev"}, {"id": "llada-image", "name": "LLaDA-Image"}, {"id": "ovis-u1", "name": "Ovis-U1"}, {"id": "internvl-u", "name": "InternVL-U"}, {"id": "unipic2-sd3-5m-kontext-2b", "name": "UniPic2-SD3.5M-Kontext-2B"}, {"id": "lumina-dimoo", "name": "Lumina-DiMOO"}, {"id": "uniworld-v1", "name": "UniWorld-V1"}, {"id": "rise-agent-ours", "name": "RISE-Agent (Ours)"}, {"id": "mindbrush", "name": "MindBrush"}, {"id": "interleavethinker", "name": "InterleaveThinker"}, {"id": "intentedit", "name": "IntentEdit"}, {"id": "imagent", "name": "ImAgent"}]}, "zh": {"models": [{"id": "gpt-image-2-5-sunburst", "name": "GPT-Image-2.5 Sunburst"}, {"id": "nano-banana-pro", "name": "Nano Banana Pro"}, {"id": "nano-banana-2", "name": "Nano Banana 2"}, {"id": "luma-uni-1", "name": "Luma Uni-1"}, {"id": "gpt-image-2", "name": "GPT-Image-2"}, {"id": "qwen-image-3-0", "name": "Qwen-Image-3.0"}, {"id": "gpt-image-2-5-flare", "name": "GPT-Image-2.5 Flare"}, {"id": "flux-2-max", "name": "FLUX.2 Max"}, {"id": "nano-banana-2-lite", "name": "Nano Banana 2 Lite"}, {"id": "gpt-image-1-5", "name": "GPT-Image-1.5"}, {"id": "nano-banana", "name": "Nano Banana"}, {"id": "flux-2-pro", "name": "FLUX.2 Pro"}, {"id": "hunyuanimage-3-5", "name": "HunyuanImage-3.5"}, {"id": "wan2-7-image-pro", "name": "Wan2.7-Image-Pro"}, {"id": "qwen-image-2-0", "name": "Qwen-Image-2.0"}, {"id": "seedream-4-5", "name": "Seedream 4.5"}, {"id": "seedream-5-0", "name": "Seedream 5.0"}, {"id": "gpt-image-1", "name": "GPT-Image-1"}, {"id": "step-image-edit-2", "name": "Step Image Edit 2"}, {"id": "hunyuanimage-3-0-instruct", "name": "HunyuanImage-3.0-Instruct"}, {"id": "qwen-image-2-1", "name": "Qwen-Image-2.1"}, {"id": "firered-image-edit-1-1", "name": "FireRed-Image-Edit-1.1"}, {"id": "flux-2-dev", "name": "FLUX.2 Dev"}, {"id": "qwen-image-edit-2511", "name": "Qwen-Image-Edit-2511"}, {"id": "qwen-image-edit-2509", "name": "Qwen-Image-Edit-2509"}, {"id": "firered-image-edit-1-0", "name": "FireRed-Image-Edit-1.0"}, {"id": "sensenova-u1-a3b-mot-sft", "name": "SenseNova-U1-A3B-MoT-SFT"}, {"id": "joyai-image-edit-plus", "name": "JoyAI-Image-Edit-Plus"}, {"id": "flux-2-klein-9b", "name": "FLUX.2 Klein 9B"}, {"id": "bagel-w-cot", "name": "BAGEL (w/ CoT)"}, {"id": "hidream-o1-image", "name": "HiDream-O1-Image"}, {"id": "flux-2-klein-4b", "name": "FLUX.2 Klein 4B"}, {"id": "uniworld-v2", "name": "UniWorld-V2"}, {"id": "sensenova-u1-8b-mot-sft", "name": "SenseNova-U1-8B-MoT-SFT"}, {"id": "unipic-3-0", "name": "UniPic 3.0"}, {"id": "bagel", "name": "BAGEL"}, {"id": "omnigen2", "name": "OmniGen2"}, {"id": "omnigen", "name": "OmniGen"}, {"id": "emu2-gen", "name": "Emu2-Gen"}, {"id": "joyai-image-edit", "name": "JoyAI-Image-Edit"}, {"id": "boogu-image-0-1-edit", "name": "Boogu-Image-0.1-Edit"}, {"id": "step1x-edit-thinking-reflection", "name": "Step1X-Edit (thinking + reflection)"}, {"id": "step1x-edit-thinking", "name": "Step1X-Edit (thinking)"}, {"id": "step1x-edit-base", "name": "Step1X-Edit (base)"}, {"id": "longcat-image-edit", "name": "LongCat-Image-Edit"}, {"id": "flux-1-kontext-dev", "name": "FLUX.1 Kontext Dev"}, {"id": "llada-image", "name": "LLaDA-Image"}, {"id": "internvl-u-w-cot", "name": "InternVL-U (w/ CoT)"}, {"id": "ovis-u1", "name": "Ovis-U1"}, {"id": "internvl-u", "name": "InternVL-U"}, {"id": "lumina-dimoo", "name": "Lumina-DiMOO"}, {"id": "uniworld-v1", "name": "UniWorld-V1"}, {"id": "unipic2-sd3-5m-kontext-2b", "name": "UniPic2-SD3.5M-Kontext-2B"}, {"id": "rise-agent-ours", "name": "RISE-Agent (Ours)"}, {"id": "mindbrush", "name": "MindBrush"}, {"id": "interleavethinker", "name": "InterleaveThinker"}, {"id": "intentedit", "name": "IntentEdit"}, {"id": "imagent", "name": "ImAgent"}]}}}, {"id": "risebench", "name": "RISEBench", "case_count": 360, "available_result_languages": ["en"], "accuracy_unit": "%", "metric_unit": "/100", "score_decimals": 1, "default_sort": "total", "dimensions": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}], "metrics": [{"key": "instruction_reasoning", "label": "Instruction Reasoning", "description": "Whether the edit realizes the intended reasoning outcome."}, {"key": "appearance_consistency", "label": "Appearance Consistency", "description": "Whether content that should remain unchanged is preserved."}, {"key": "visual_plausibility", "label": "Visual Plausibility", "description": "Visual quality and plausibility; logical tasks are excluded."}], "accuracy_columns": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}, {"key": "total", "label": "Overall", "description": "Accuracy on the complete RISEBench-360 benchmark."}], "links": {"paper": "https://arxiv.org/abs/2504.02826", "data": "https://huggingface.co/datasets/PhoenixZ/RISEBench", "outputs": "https://huggingface.co/datasets/zpy777/RISEBench_Outputs", "github": "https://github.com/VisionXLab/RISEBench/tree/main/RISEBench"}, "judges": {"instruction_reasoning": "GPT-4o", "appearance_consistency": "GPT-4o", "visual_plausibility": "GPT-4o"}, "results_by_language": {"en": {"models": [{"id": "gpt-image-1-5", "name": "GPT-Image-1.5"}, {"id": "gpt-image-2", "name": "GPT-Image-2"}, {"id": "gemini-3-pro-image-preview-nano-banana-pro", "name": "Gemini-3-pro-image-preview (Nano Banana-pro)"}, {"id": "gemini-2-5-flash-image-nano-banana", "name": "Gemini-2.5-Flash-Image (Nano Banana)"}, {"id": "gpt-image-1", "name": "GPT-Image-1"}, {"id": "gpt-image-1-mini", "name": "GPT-Image-1-mini"}, {"id": "qwen-image-edit-2511", "name": "Qwen-Image-Edit-2511"}, {"id": "bagel-w-cot", "name": "BAGEL (w/ CoT)"}, {"id": "gemini-2-0-flash-exp", "name": "Gemini-2.0-Flash-exp"}, {"id": "seedream-4-0", "name": "Seedream-4.0"}, {"id": "gemini-2-0-flash-pre", "name": "Gemini-2.0-Flash-pre"}, {"id": "qwen-image-edit-2509", "name": "Qwen-Image-Edit-2509"}, {"id": "bagel", "name": "BAGEL"}, {"id": "flux-1-kontext-dev", "name": "FLUX.1-Kontext-Dev"}, {"id": "ovis-u1", "name": "Ovis-U1"}, {"id": "step1x-edit", "name": "Step1X-Edit"}, {"id": "omnigen", "name": "OmniGen"}, {"id": "emu2", "name": "EMU2"}, {"id": "hidream-edit", "name": "HiDream-Edit"}, {"id": "flux-1-canny", "name": "FLUX.1-Canny"}]}}}]}</script><script src="portal.js" defer></script></body></html>
|