Publish free leaderboard only; defer submissions and moderation
Browse files- Dockerfile +0 -12
- README.md +0 -5
- admin.html +0 -11
- app.js +3 -3
- dist/README.md +0 -18
- dist/admin.html +0 -11
- dist/app.js +0 -258
- dist/assets/benchmark-overview.png +0 -3
- dist/assets/favicon.svg +0 -1
- dist/assets/rise-agent.png +0 -3
- dist/data/leaderboard.json +0 -0
- dist/index.html +0 -0
- dist/portal.css +0 -91
- dist/portal.js +0 -158
- dist/styles.css +0 -390
- dist/submit.html +0 -34
- index.html +0 -1
- portal.css +0 -91
- portal.js +0 -158
- pyproject.toml +0 -15
- scripts/serve.py +0 -21
- server/__init__.py +0 -1
- server/app.py +0 -258
- server/auth.py +0 -195
- server/storage.py +0 -88
- server/validation.py +0 -160
- submit.html +0 -34
Dockerfile
DELETED
|
@@ -1,12 +0,0 @@
|
|
| 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"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
README.md
CHANGED
|
@@ -4,11 +4,6 @@ emoji: 📈
|
|
| 4 |
colorFrom: blue
|
| 5 |
colorTo: gray
|
| 6 |
sdk: static
|
| 7 |
-
hf_oauth: true
|
| 8 |
-
hf_oauth_expiration_minutes: 480
|
| 9 |
-
hf_oauth_scopes:
|
| 10 |
-
- read-memberships
|
| 11 |
-
hf_oauth_authorized_org: VisionXLab
|
| 12 |
app_file: index.html
|
| 13 |
pinned: false
|
| 14 |
fullWidth: true
|
|
|
|
| 4 |
colorFrom: blue
|
| 5 |
colorTo: gray
|
| 6 |
sdk: static
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 7 |
app_file: index.html
|
| 8 |
pinned: false
|
| 9 |
fullWidth: true
|
admin.html
DELETED
|
@@ -1,11 +0,0 @@
|
|
| 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><p class="login-caption" id="login-caption">VisionXLab members can sign in with their Hugging Face account.</p><p class="form-message" id="login-message" role="status"></p><a class="primary-button hf-login" id="hf-login" href="https://visionxlab-risebench-leaderboard.hf.space/api/admin/login" target="_blank" rel="noopener noreferrer" hidden>Sign in with Hugging Face ↗</a><form id="login-form" hidden><button type="submit" class="primary-button" id="login-button">Open local review</button></form></section>
|
| 8 |
-
<p class="review-identity" id="review-identity" hidden></p>
|
| 9 |
-
<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>
|
| 10 |
-
<footer class="page-footer"><a href="index.html">← Back to leaderboard</a><span>Private review workspace</span></footer>
|
| 11 |
-
</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
|
@@ -63,8 +63,8 @@
|
|
| 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')
|
| 67 |
-
|
| 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>';
|
|
@@ -248,7 +248,7 @@
|
|
| 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));
|
|
|
|
| 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 |
+
const submitLink=$('#submit-results-link');
|
| 67 |
+
if(submitLink){submitLink.href='submit.html?'+new URLSearchParams({benchmark:state.benchmark,language:languageCode()});submitLink.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>';
|
|
|
|
| 248 |
}
|
| 249 |
});
|
| 250 |
switchBenchmark(state.benchmark);
|
| 251 |
+
if($('#submit-results-link')&&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));
|
dist/README.md
DELETED
|
@@ -1,18 +0,0 @@
|
|
| 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
DELETED
|
@@ -1,11 +0,0 @@
|
|
| 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><p class="login-caption" id="login-caption">VisionXLab members can sign in with their Hugging Face account.</p><p class="form-message" id="login-message" role="status"></p><a class="primary-button hf-login" id="hf-login" href="https://visionxlab-risebench-leaderboard.hf.space/api/admin/login" target="_blank" rel="noopener noreferrer" hidden>Sign in with Hugging Face ↗</a><form id="login-form" hidden><button type="submit" class="primary-button" id="login-button">Open local review</button></form></section>
|
| 8 |
-
<p class="review-identity" id="review-identity" hidden></p>
|
| 9 |
-
<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>
|
| 10 |
-
<footer class="page-footer"><a href="index.html">← Back to leaderboard</a><span>Private review workspace</span></footer>
|
| 11 |
-
</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
DELETED
|
@@ -1,258 +0,0 @@
|
|
| 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
DELETED
Git LFS Details
|
dist/assets/favicon.svg
DELETED
dist/assets/rise-agent.png
DELETED
Git LFS Details
|
dist/data/leaderboard.json
DELETED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dist/index.html
DELETED
|
The diff for this file is too large to render.
See raw diff
|
|
|
dist/portal.css
DELETED
|
@@ -1,91 +0,0 @@
|
|
| 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 |
-
.login-caption { color: #667991; font-size: 16px; line-height: 1.7; }
|
| 58 |
-
.hf-login { display: inline-flex; color: #fff; text-decoration: none; align-items: center; }
|
| 59 |
-
.hf-login[hidden] { display: none; }
|
| 60 |
-
.review-identity { color: #64758b; font-size: 14px; margin: 0 0 20px; }
|
| 61 |
-
.review-toolbar { display: flex; gap: 18px; justify-content: space-between; align-items: center; margin-bottom: 24px; }
|
| 62 |
-
.review-filters { display: flex; gap: 6px; flex-wrap: wrap; }
|
| 63 |
-
.review-filters button { padding: 8px 12px; border: 1px solid transparent; border-radius: 7px; color: #8190a4; font-size: 14px; }
|
| 64 |
-
.review-filters button[aria-pressed=true] { background: #e9eff8; color: #45678d; border-color: #d1ddef; }
|
| 65 |
-
.review-filters span { margin-left: 6px; font-size: 12px; }
|
| 66 |
-
.review-layout { display: grid; grid-template-columns: 300px minmax(0, 1fr); gap: 24px; }
|
| 67 |
-
.review-list { display: flex; flex-direction: column; gap: 12px; }
|
| 68 |
-
.submission-item { display: block; text-align: left; width: 100%; padding: 17px; border: 1px solid #dfe5ef; border-radius: 11px; background: white; }
|
| 69 |
-
.submission-item[aria-pressed=true] { border-color: #91adce; background: #f1f6fd; box-shadow: 0 0 0 2px #e6edf7; }
|
| 70 |
-
.submission-item strong { display: block; font-size: 15px; font-weight: 600; color: #3f5773; line-height: 1.5; overflow-wrap: anywhere; }
|
| 71 |
-
.submission-item p { font-size: 12px; color: #8896a9; margin: 6px 0 10px; }
|
| 72 |
-
.review-detail { min-height: 310px; }
|
| 73 |
-
.review-empty { text-align: center; padding: 48px 15px; color: #8b9aad; }
|
| 74 |
-
.review-empty p { font-size: 14px; }
|
| 75 |
-
.review-meta { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px; margin: 23px 0; font-size: 14px; }
|
| 76 |
-
.review-meta dt { font-size: 11px; text-transform: uppercase; letter-spacing: .8px; color: #96a3b4; margin-bottom: 5px; }
|
| 77 |
-
.review-meta dd { margin: 0; color: #546c84; overflow-wrap: anywhere; }
|
| 78 |
-
.review-meta a { color: #4675a5; text-decoration: underline; text-underline-offset: 3px; }
|
| 79 |
-
.review-notes { white-space: pre-wrap; color: #7f8fa3; background: #f6f8fb; padding: 14px; border-radius: 8px; font-size: 13px; margin-bottom: 24px; }
|
| 80 |
-
.review-scores { width: 100%; border-collapse: collapse; margin: 20px 0 26px; font-size: 14px; }
|
| 81 |
-
.review-scores th, .review-scores td { padding: 10px 12px; border-bottom: 1px solid #e7ecf2; text-align: right; color: #526a85; }
|
| 82 |
-
.review-scores th:first-child, .review-scores td:first-child { text-align: left; }
|
| 83 |
-
.review-scores th { font-weight: 550; color: #8898aa; font-size: 12px; background: #f7f9fc; }
|
| 84 |
-
.review-scores .score-section th { color: #7085a0; background: #edf2f9; padding-block: 8px; }
|
| 85 |
-
.changed-score { color: #405f8e !important; font-weight: 700; background: #f1f5fb; }
|
| 86 |
-
.review-actions { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 22px; }
|
| 87 |
-
.reject-button { color: #9f6470 !important; border-color: #e7cfd5 !important; }
|
| 88 |
-
.history-list { color: #8292a4; font-size: 12px; padding-left: 20px; }
|
| 89 |
-
.submit-link { color: #456a93 !important; }
|
| 90 |
-
@media (max-width: 900px) { .review-layout { grid-template-columns: 1fr; } .review-list { display: grid; grid-template-columns: repeat(2,minmax(0,1fr)); } }
|
| 91 |
-
@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
DELETED
|
@@ -1,158 +0,0 @@
|
|
| 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.available){config=null;$('#service-notice').hidden=false;$('#service-notice').textContent='Submissions are not open yet. You can browse the form and download a template.';return null;}
|
| 26 |
-
if(config.local_preview){$('#service-notice').hidden=false;$('#service-notice').textContent='Local preview · submissions and review decisions stay on this computer.';}
|
| 27 |
-
}catch(_){config=null;$('#service-notice').hidden=false;$('#service-notice').textContent='The submission service is offline. You can browse the form and download a template.';}
|
| 28 |
-
return config;
|
| 29 |
-
}
|
| 30 |
-
function makeTemplate(b) {
|
| 31 |
-
const data={accuracy:Object.fromEntries(b.accuracy_columns.map(c=>[c.label,null])),metrics:Object.fromEntries(b.metrics.map(c=>[c.label,null]))};
|
| 32 |
-
for(const [field,columns] of [['subcategories','subcategory_columns'],['task_types','task_type_columns']])if(b[columns]){
|
| 33 |
-
data[field]={};for(const c of b[columns]){const d=c.dimension[0].toUpperCase()+c.dimension.slice(1);(data[field][d]??={})[c.label]=null;}
|
| 34 |
-
}
|
| 35 |
-
return data;
|
| 36 |
-
}
|
| 37 |
-
if(document.body.dataset.page==='submit') {
|
| 38 |
-
const form=$('#submission-form');let result=null,receipt=null,fileSequence=0;
|
| 39 |
-
const entryParams=new URLSearchParams(location.search);
|
| 40 |
-
if(bById(entryParams.get('benchmark')))form.elements.benchmark.value=entryParams.get('benchmark');
|
| 41 |
-
if(['en','zh'].includes(entryParams.get('language')))form.elements.language.value=entryParams.get('language');
|
| 42 |
-
let models=schema,plusInputSupport=form.elements.multi_image.value;
|
| 43 |
-
const currentBenchmark=()=>bById(form.elements.benchmark.value);
|
| 44 |
-
function updateRevision() {
|
| 45 |
-
const b=models.benchmarks.find(b=>b.id===form.elements.benchmark.value);
|
| 46 |
-
const list=b.results_by_language[form.elements.language.value]?.models||[];
|
| 47 |
-
$('#submission-revision').innerHTML='<option value="">New result</option>'+list.map(m=>`<option value="${esc(m.id)}">${esc(m.name)}</option>`).join('');
|
| 48 |
-
}
|
| 49 |
-
function updateBenchmark() {
|
| 50 |
-
const singleImageOnly=currentBenchmark().id==='risebench';
|
| 51 |
-
form.elements.multi_image.value=singleImageOnly?'false':plusInputSupport;
|
| 52 |
-
form.elements.multi_image.hidden=singleImageOnly;
|
| 53 |
-
form.elements.multi_image.disabled=singleImageOnly;
|
| 54 |
-
$('#single-image-input').hidden=!singleImageOnly;
|
| 55 |
-
const selected=form.elements.language.value;
|
| 56 |
-
$('#submission-language').innerHTML=currentBenchmark().available_result_languages.map(code=>`<option value="${code}">${language(code)}</option>`).join('');
|
| 57 |
-
if(currentBenchmark().available_result_languages.includes(selected))form.elements.language.value=selected;
|
| 58 |
-
updateRevision();
|
| 59 |
-
}
|
| 60 |
-
$('#submission-benchmark').addEventListener('change',updateBenchmark);
|
| 61 |
-
form.elements.multi_image.addEventListener('change',()=>{plusInputSupport=form.elements.multi_image.value;});
|
| 62 |
-
$('#submission-language').addEventListener('change',updateRevision);
|
| 63 |
-
$('#submission-revision').addEventListener('change',()=>{const option=$('#submission-revision').selectedOptions[0];if(option.value)form.elements.model_name.value=option.textContent;});
|
| 64 |
-
$('#download-template').addEventListener('click',()=>download(currentBenchmark().id+'-results-template.json',makeTemplate(currentBenchmark())));
|
| 65 |
-
async function readFile(file) {
|
| 66 |
-
const sequence=++fileSequence;result=null;$('#file-preview').hidden=true;$('#result-file').setCustomValidity('');
|
| 67 |
-
if(!file)return;
|
| 68 |
-
try{
|
| 69 |
-
if(!file.name.toLowerCase().endsWith('.json')||file.size>200000)throw new Error('Choose a JSON file no larger than 200 KB.');
|
| 70 |
-
const value=JSON.parse(await file.text());
|
| 71 |
-
if(sequence!==fileSequence)return;
|
| 72 |
-
if(!value||Array.isArray(value)||typeof value!=='object'||!value.accuracy)throw new Error('Use the result JSON template, including its accuracy section.');
|
| 73 |
-
result=value;$('#upload-title').textContent=file.name;$('#upload-caption').textContent=(file.size/1024).toFixed(1)+' KB · JSON loaded';
|
| 74 |
-
const count=JSON.stringify(value).match(/:\s*\d+(?:\.\d+)?/g)?.length||0;
|
| 75 |
-
$('#file-preview').hidden=false;$('#file-preview').textContent=`${count} score values loaded. Fields and benchmark compatibility will be checked on submission.`;
|
| 76 |
-
message('#submission-message','');
|
| 77 |
-
}catch(error){$('#result-file').setCustomValidity(error.message);message('#submission-message',error.message,true);}
|
| 78 |
-
}
|
| 79 |
-
$('#result-file').addEventListener('change',e=>readFile(e.target.files[0]));
|
| 80 |
-
const zone=$('#upload-zone');zone.addEventListener('dragover',e=>{e.preventDefault();zone.classList.add('dragging');});zone.addEventListener('dragleave',()=>zone.classList.remove('dragging'));
|
| 81 |
-
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]);});
|
| 82 |
-
form.addEventListener('submit',async e=>{
|
| 83 |
-
e.preventDefault();if(!result){message('#submission-message','Choose a result JSON file first.',true);return;}
|
| 84 |
-
if(!config){message('#submission-message','The submission service is offline.',true);return;}
|
| 85 |
-
const button=$('#submit-results');button.disabled=true;message('#submission-message','Validating and submitting…');
|
| 86 |
-
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;
|
| 87 |
-
try{
|
| 88 |
-
receipt=await api('/api/submissions',body);
|
| 89 |
-
const card=$('#submission-receipt');card.hidden=false;
|
| 90 |
-
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>`;
|
| 91 |
-
$('#save-receipt').addEventListener('click',()=>download('rise-submission-receipt.json',receipt));
|
| 92 |
-
$('#status-form').elements.submission_id.value=receipt.submission_id;$('#status-form').elements.status_token.value=receipt.status_token;
|
| 93 |
-
form.hidden=true;card.scrollIntoView({behavior:'smooth',block:'start'});message('#submission-message','');
|
| 94 |
-
}catch(error){message('#submission-message',error.message,true);}finally{button.disabled=false;}
|
| 95 |
-
});
|
| 96 |
-
$('#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);}});
|
| 97 |
-
updateBenchmark();connect().then(async()=>{if(!config){$('#submit-results').disabled=true;return;}try{models=await api('/api/leaderboard');updateRevision();}catch(_){}});
|
| 98 |
-
} else {
|
| 99 |
-
let records=[],filter='pending',selected=null,live=schema;
|
| 100 |
-
const current=()=>records.find(r=>r.id===selected);
|
| 101 |
-
function signOutView() {
|
| 102 |
-
token='';sessionStorage.removeItem('rise-review-session');records=[];selected=null;
|
| 103 |
-
$('#login-panel').hidden=false;$('#review-workspace').hidden=true;$('#sign-out').hidden=true;$('#review-identity').hidden=true;
|
| 104 |
-
$('#review-list').innerHTML='';$('#review-detail').innerHTML='';
|
| 105 |
-
}
|
| 106 |
-
async function loadQueue() {
|
| 107 |
-
try{
|
| 108 |
-
let reviewer;[records,live,reviewer]=await Promise.all([api('/api/admin/submissions',undefined,true),api('/api/leaderboard'),api('/api/admin/me',undefined,true)]);
|
| 109 |
-
$('#login-panel').hidden=true;$('#review-workspace').hidden=false;$('#sign-out').hidden=false;
|
| 110 |
-
$('#review-identity').hidden=false;$('#review-identity').textContent=`Signed in as ${reviewer.username}${reviewer.organization?' · '+reviewer.organization:''}`;
|
| 111 |
-
$('#pending-count').textContent=records.filter(r=>r.status==='pending').length;
|
| 112 |
-
message('#queue-message','');renderQueue();
|
| 113 |
-
}catch(error){if(error.status===401||error.status===403)signOutView();message($('#review-workspace').hidden?'#login-message':'#queue-message',error.message,true);}
|
| 114 |
-
}
|
| 115 |
-
function renderQueue() {
|
| 116 |
-
const items=records.filter(r=>filter==='all'||r.status===filter);
|
| 117 |
-
if(!items.some(r=>r.id===selected))selected=items[0]?.id||null;
|
| 118 |
-
$('#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>';
|
| 119 |
-
renderDetail();
|
| 120 |
-
}
|
| 121 |
-
function scoreTable(record) {
|
| 122 |
-
const p=record.payload,b=bById(p.benchmark);
|
| 123 |
-
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;
|
| 124 |
-
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||[]]];
|
| 125 |
-
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])=>{
|
| 126 |
-
const visible=columns.filter(c=>p[field]?.[c.key]!=null||field==='accuracy');
|
| 127 |
-
if(!visible.length)return '';
|
| 128 |
-
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('');
|
| 129 |
-
}).join('')+'</tbody></table>';
|
| 130 |
-
}
|
| 131 |
-
function renderDetail() {
|
| 132 |
-
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;}
|
| 133 |
-
const p=r.payload,active=['pending','approved'].includes(r.status);
|
| 134 |
-
$('#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.reviewer?' · '+esc(h.reviewer):''}${h.note?' — '+esc(h.note):''}</li>`).join('')}</ul>`:''}`;
|
| 135 |
-
$('#download-review-json').addEventListener('click',()=>download('rise-submission-'+r.id+'.json',r));
|
| 136 |
-
$('#review-form')?.addEventListener('submit',async e=>{
|
| 137 |
-
e.preventDefault();const decision=e.submitter.value,note=$('#review-note').value.trim();
|
| 138 |
-
if(decision!=='approve'&&!note){message('#review-message','Add a review note explaining this decision.',true);return;}
|
| 139 |
-
$$('#review-form button').forEach(b=>b.disabled=true);
|
| 140 |
-
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.');}
|
| 141 |
-
catch(error){message('#review-message',error.message,true);$$('#review-form button').forEach(b=>b.disabled=false);}
|
| 142 |
-
});
|
| 143 |
-
}
|
| 144 |
-
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();}});
|
| 145 |
-
$('#login-form').addEventListener('submit',async e=>{e.preventDefault();$('#login-button').disabled=true;try{const r=await api('/api/admin/session',{});token=r.token;sessionStorage.setItem('rise-review-session',token);await loadQueue();}catch(error){message('#login-message',error.message,true);}finally{$('#login-button').disabled=false;}});
|
| 146 |
-
$('#sign-out').addEventListener('click',async()=>{try{await api('/api/admin/logout',{},true);}finally{signOutView();}});
|
| 147 |
-
$('#refresh-queue').addEventListener('click',loadQueue);
|
| 148 |
-
connect().then(async()=>{
|
| 149 |
-
if(!config){$('#login-caption').textContent='Administrator sign-in is not available yet.';return;}
|
| 150 |
-
$('#login-form').hidden=!config.local_preview;$('#hf-login').hidden=config.local_preview;
|
| 151 |
-
if(config.local_preview){$('#login-caption').textContent='Open the review workspace for this local preview.';if(token)loadQueue();return;}
|
| 152 |
-
token='';sessionStorage.removeItem('rise-review-session');$('#hf-login').href=config.admin_login_url;
|
| 153 |
-
const error=new URLSearchParams(location.search).get('login_error');
|
| 154 |
-
if(error){message('#login-message',({membership:'Only current VisionXLab members can review submissions.',state:'This sign-in attempt expired. Please try again.',cancelled:'Sign-in was cancelled.',signin:'Could not complete Hugging Face sign-in. Please try again.'})[error]||'Please sign in again.',true);history.replaceState(null,'',location.pathname);return;}
|
| 155 |
-
try{await api('/api/admin/me');await loadQueue();}catch(error){if(error.status!==401)message('#login-message',error.message,true);}
|
| 156 |
-
});
|
| 157 |
-
}
|
| 158 |
-
})();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dist/styles.css
DELETED
|
@@ -1,390 +0,0 @@
|
|
| 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
DELETED
|
@@ -1,34 +0,0 @@
|
|
| 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
|
@@ -21,7 +21,6 @@
|
|
| 21 |
<div class="benchmark-tabs" role="group" aria-label="Choose benchmark"><button id="tab-plus" aria-pressed="true" data-benchmark="risebench-plusplus">RISEBench<span class="plus">++</span></button><button id="tab-base" aria-pressed="false" data-benchmark="risebench">RISEBench</button></div>
|
| 22 |
<div class="benchmark-actions">
|
| 23 |
<div class="board-options" id="board-options"><div class="result-language"><span id="language-label">Instruction language</span><div class="language-tabs" role="group" aria-labelledby="language-label"><button data-language="en" aria-pressed="true" aria-label="English instruction results">English</button><button data-language="zh" aria-pressed="false" aria-label="Chinese instruction results"><span lang="zh-Hans">中文</span></button></div></div></div>
|
| 24 |
-
<a id="submit-results-link" class="submit-results-button" href="submit.html"><svg class="button-icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 16V3m-5 5 5-5 5 5M4 15v6h16v-6"/></svg>Submit results<span aria-hidden="true">→</span></a>
|
| 25 |
</div>
|
| 26 |
</div>
|
| 27 |
<div class="board-card">
|
|
|
|
| 21 |
<div class="benchmark-tabs" role="group" aria-label="Choose benchmark"><button id="tab-plus" aria-pressed="true" data-benchmark="risebench-plusplus">RISEBench<span class="plus">++</span></button><button id="tab-base" aria-pressed="false" data-benchmark="risebench">RISEBench</button></div>
|
| 22 |
<div class="benchmark-actions">
|
| 23 |
<div class="board-options" id="board-options"><div class="result-language"><span id="language-label">Instruction language</span><div class="language-tabs" role="group" aria-labelledby="language-label"><button data-language="en" aria-pressed="true" aria-label="English instruction results">English</button><button data-language="zh" aria-pressed="false" aria-label="Chinese instruction results"><span lang="zh-Hans">中文</span></button></div></div></div>
|
|
|
|
| 24 |
</div>
|
| 25 |
</div>
|
| 26 |
<div class="board-card">
|
portal.css
DELETED
|
@@ -1,91 +0,0 @@
|
|
| 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 |
-
.login-caption { color: #667991; font-size: 16px; line-height: 1.7; }
|
| 58 |
-
.hf-login { display: inline-flex; color: #fff; text-decoration: none; align-items: center; }
|
| 59 |
-
.hf-login[hidden] { display: none; }
|
| 60 |
-
.review-identity { color: #64758b; font-size: 14px; margin: 0 0 20px; }
|
| 61 |
-
.review-toolbar { display: flex; gap: 18px; justify-content: space-between; align-items: center; margin-bottom: 24px; }
|
| 62 |
-
.review-filters { display: flex; gap: 6px; flex-wrap: wrap; }
|
| 63 |
-
.review-filters button { padding: 8px 12px; border: 1px solid transparent; border-radius: 7px; color: #8190a4; font-size: 14px; }
|
| 64 |
-
.review-filters button[aria-pressed=true] { background: #e9eff8; color: #45678d; border-color: #d1ddef; }
|
| 65 |
-
.review-filters span { margin-left: 6px; font-size: 12px; }
|
| 66 |
-
.review-layout { display: grid; grid-template-columns: 300px minmax(0, 1fr); gap: 24px; }
|
| 67 |
-
.review-list { display: flex; flex-direction: column; gap: 12px; }
|
| 68 |
-
.submission-item { display: block; text-align: left; width: 100%; padding: 17px; border: 1px solid #dfe5ef; border-radius: 11px; background: white; }
|
| 69 |
-
.submission-item[aria-pressed=true] { border-color: #91adce; background: #f1f6fd; box-shadow: 0 0 0 2px #e6edf7; }
|
| 70 |
-
.submission-item strong { display: block; font-size: 15px; font-weight: 600; color: #3f5773; line-height: 1.5; overflow-wrap: anywhere; }
|
| 71 |
-
.submission-item p { font-size: 12px; color: #8896a9; margin: 6px 0 10px; }
|
| 72 |
-
.review-detail { min-height: 310px; }
|
| 73 |
-
.review-empty { text-align: center; padding: 48px 15px; color: #8b9aad; }
|
| 74 |
-
.review-empty p { font-size: 14px; }
|
| 75 |
-
.review-meta { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px; margin: 23px 0; font-size: 14px; }
|
| 76 |
-
.review-meta dt { font-size: 11px; text-transform: uppercase; letter-spacing: .8px; color: #96a3b4; margin-bottom: 5px; }
|
| 77 |
-
.review-meta dd { margin: 0; color: #546c84; overflow-wrap: anywhere; }
|
| 78 |
-
.review-meta a { color: #4675a5; text-decoration: underline; text-underline-offset: 3px; }
|
| 79 |
-
.review-notes { white-space: pre-wrap; color: #7f8fa3; background: #f6f8fb; padding: 14px; border-radius: 8px; font-size: 13px; margin-bottom: 24px; }
|
| 80 |
-
.review-scores { width: 100%; border-collapse: collapse; margin: 20px 0 26px; font-size: 14px; }
|
| 81 |
-
.review-scores th, .review-scores td { padding: 10px 12px; border-bottom: 1px solid #e7ecf2; text-align: right; color: #526a85; }
|
| 82 |
-
.review-scores th:first-child, .review-scores td:first-child { text-align: left; }
|
| 83 |
-
.review-scores th { font-weight: 550; color: #8898aa; font-size: 12px; background: #f7f9fc; }
|
| 84 |
-
.review-scores .score-section th { color: #7085a0; background: #edf2f9; padding-block: 8px; }
|
| 85 |
-
.changed-score { color: #405f8e !important; font-weight: 700; background: #f1f5fb; }
|
| 86 |
-
.review-actions { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 22px; }
|
| 87 |
-
.reject-button { color: #9f6470 !important; border-color: #e7cfd5 !important; }
|
| 88 |
-
.history-list { color: #8292a4; font-size: 12px; padding-left: 20px; }
|
| 89 |
-
.submit-link { color: #456a93 !important; }
|
| 90 |
-
@media (max-width: 900px) { .review-layout { grid-template-columns: 1fr; } .review-list { display: grid; grid-template-columns: repeat(2,minmax(0,1fr)); } }
|
| 91 |
-
@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
DELETED
|
@@ -1,158 +0,0 @@
|
|
| 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.available){config=null;$('#service-notice').hidden=false;$('#service-notice').textContent='Submissions are not open yet. You can browse the form and download a template.';return null;}
|
| 26 |
-
if(config.local_preview){$('#service-notice').hidden=false;$('#service-notice').textContent='Local preview · submissions and review decisions stay on this computer.';}
|
| 27 |
-
}catch(_){config=null;$('#service-notice').hidden=false;$('#service-notice').textContent='The submission service is offline. You can browse the form and download a template.';}
|
| 28 |
-
return config;
|
| 29 |
-
}
|
| 30 |
-
function makeTemplate(b) {
|
| 31 |
-
const data={accuracy:Object.fromEntries(b.accuracy_columns.map(c=>[c.label,null])),metrics:Object.fromEntries(b.metrics.map(c=>[c.label,null]))};
|
| 32 |
-
for(const [field,columns] of [['subcategories','subcategory_columns'],['task_types','task_type_columns']])if(b[columns]){
|
| 33 |
-
data[field]={};for(const c of b[columns]){const d=c.dimension[0].toUpperCase()+c.dimension.slice(1);(data[field][d]??={})[c.label]=null;}
|
| 34 |
-
}
|
| 35 |
-
return data;
|
| 36 |
-
}
|
| 37 |
-
if(document.body.dataset.page==='submit') {
|
| 38 |
-
const form=$('#submission-form');let result=null,receipt=null,fileSequence=0;
|
| 39 |
-
const entryParams=new URLSearchParams(location.search);
|
| 40 |
-
if(bById(entryParams.get('benchmark')))form.elements.benchmark.value=entryParams.get('benchmark');
|
| 41 |
-
if(['en','zh'].includes(entryParams.get('language')))form.elements.language.value=entryParams.get('language');
|
| 42 |
-
let models=schema,plusInputSupport=form.elements.multi_image.value;
|
| 43 |
-
const currentBenchmark=()=>bById(form.elements.benchmark.value);
|
| 44 |
-
function updateRevision() {
|
| 45 |
-
const b=models.benchmarks.find(b=>b.id===form.elements.benchmark.value);
|
| 46 |
-
const list=b.results_by_language[form.elements.language.value]?.models||[];
|
| 47 |
-
$('#submission-revision').innerHTML='<option value="">New result</option>'+list.map(m=>`<option value="${esc(m.id)}">${esc(m.name)}</option>`).join('');
|
| 48 |
-
}
|
| 49 |
-
function updateBenchmark() {
|
| 50 |
-
const singleImageOnly=currentBenchmark().id==='risebench';
|
| 51 |
-
form.elements.multi_image.value=singleImageOnly?'false':plusInputSupport;
|
| 52 |
-
form.elements.multi_image.hidden=singleImageOnly;
|
| 53 |
-
form.elements.multi_image.disabled=singleImageOnly;
|
| 54 |
-
$('#single-image-input').hidden=!singleImageOnly;
|
| 55 |
-
const selected=form.elements.language.value;
|
| 56 |
-
$('#submission-language').innerHTML=currentBenchmark().available_result_languages.map(code=>`<option value="${code}">${language(code)}</option>`).join('');
|
| 57 |
-
if(currentBenchmark().available_result_languages.includes(selected))form.elements.language.value=selected;
|
| 58 |
-
updateRevision();
|
| 59 |
-
}
|
| 60 |
-
$('#submission-benchmark').addEventListener('change',updateBenchmark);
|
| 61 |
-
form.elements.multi_image.addEventListener('change',()=>{plusInputSupport=form.elements.multi_image.value;});
|
| 62 |
-
$('#submission-language').addEventListener('change',updateRevision);
|
| 63 |
-
$('#submission-revision').addEventListener('change',()=>{const option=$('#submission-revision').selectedOptions[0];if(option.value)form.elements.model_name.value=option.textContent;});
|
| 64 |
-
$('#download-template').addEventListener('click',()=>download(currentBenchmark().id+'-results-template.json',makeTemplate(currentBenchmark())));
|
| 65 |
-
async function readFile(file) {
|
| 66 |
-
const sequence=++fileSequence;result=null;$('#file-preview').hidden=true;$('#result-file').setCustomValidity('');
|
| 67 |
-
if(!file)return;
|
| 68 |
-
try{
|
| 69 |
-
if(!file.name.toLowerCase().endsWith('.json')||file.size>200000)throw new Error('Choose a JSON file no larger than 200 KB.');
|
| 70 |
-
const value=JSON.parse(await file.text());
|
| 71 |
-
if(sequence!==fileSequence)return;
|
| 72 |
-
if(!value||Array.isArray(value)||typeof value!=='object'||!value.accuracy)throw new Error('Use the result JSON template, including its accuracy section.');
|
| 73 |
-
result=value;$('#upload-title').textContent=file.name;$('#upload-caption').textContent=(file.size/1024).toFixed(1)+' KB · JSON loaded';
|
| 74 |
-
const count=JSON.stringify(value).match(/:\s*\d+(?:\.\d+)?/g)?.length||0;
|
| 75 |
-
$('#file-preview').hidden=false;$('#file-preview').textContent=`${count} score values loaded. Fields and benchmark compatibility will be checked on submission.`;
|
| 76 |
-
message('#submission-message','');
|
| 77 |
-
}catch(error){$('#result-file').setCustomValidity(error.message);message('#submission-message',error.message,true);}
|
| 78 |
-
}
|
| 79 |
-
$('#result-file').addEventListener('change',e=>readFile(e.target.files[0]));
|
| 80 |
-
const zone=$('#upload-zone');zone.addEventListener('dragover',e=>{e.preventDefault();zone.classList.add('dragging');});zone.addEventListener('dragleave',()=>zone.classList.remove('dragging'));
|
| 81 |
-
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]);});
|
| 82 |
-
form.addEventListener('submit',async e=>{
|
| 83 |
-
e.preventDefault();if(!result){message('#submission-message','Choose a result JSON file first.',true);return;}
|
| 84 |
-
if(!config){message('#submission-message','The submission service is offline.',true);return;}
|
| 85 |
-
const button=$('#submit-results');button.disabled=true;message('#submission-message','Validating and submitting…');
|
| 86 |
-
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;
|
| 87 |
-
try{
|
| 88 |
-
receipt=await api('/api/submissions',body);
|
| 89 |
-
const card=$('#submission-receipt');card.hidden=false;
|
| 90 |
-
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>`;
|
| 91 |
-
$('#save-receipt').addEventListener('click',()=>download('rise-submission-receipt.json',receipt));
|
| 92 |
-
$('#status-form').elements.submission_id.value=receipt.submission_id;$('#status-form').elements.status_token.value=receipt.status_token;
|
| 93 |
-
form.hidden=true;card.scrollIntoView({behavior:'smooth',block:'start'});message('#submission-message','');
|
| 94 |
-
}catch(error){message('#submission-message',error.message,true);}finally{button.disabled=false;}
|
| 95 |
-
});
|
| 96 |
-
$('#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);}});
|
| 97 |
-
updateBenchmark();connect().then(async()=>{if(!config){$('#submit-results').disabled=true;return;}try{models=await api('/api/leaderboard');updateRevision();}catch(_){}});
|
| 98 |
-
} else {
|
| 99 |
-
let records=[],filter='pending',selected=null,live=schema;
|
| 100 |
-
const current=()=>records.find(r=>r.id===selected);
|
| 101 |
-
function signOutView() {
|
| 102 |
-
token='';sessionStorage.removeItem('rise-review-session');records=[];selected=null;
|
| 103 |
-
$('#login-panel').hidden=false;$('#review-workspace').hidden=true;$('#sign-out').hidden=true;$('#review-identity').hidden=true;
|
| 104 |
-
$('#review-list').innerHTML='';$('#review-detail').innerHTML='';
|
| 105 |
-
}
|
| 106 |
-
async function loadQueue() {
|
| 107 |
-
try{
|
| 108 |
-
let reviewer;[records,live,reviewer]=await Promise.all([api('/api/admin/submissions',undefined,true),api('/api/leaderboard'),api('/api/admin/me',undefined,true)]);
|
| 109 |
-
$('#login-panel').hidden=true;$('#review-workspace').hidden=false;$('#sign-out').hidden=false;
|
| 110 |
-
$('#review-identity').hidden=false;$('#review-identity').textContent=`Signed in as ${reviewer.username}${reviewer.organization?' · '+reviewer.organization:''}`;
|
| 111 |
-
$('#pending-count').textContent=records.filter(r=>r.status==='pending').length;
|
| 112 |
-
message('#queue-message','');renderQueue();
|
| 113 |
-
}catch(error){if(error.status===401||error.status===403)signOutView();message($('#review-workspace').hidden?'#login-message':'#queue-message',error.message,true);}
|
| 114 |
-
}
|
| 115 |
-
function renderQueue() {
|
| 116 |
-
const items=records.filter(r=>filter==='all'||r.status===filter);
|
| 117 |
-
if(!items.some(r=>r.id===selected))selected=items[0]?.id||null;
|
| 118 |
-
$('#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>';
|
| 119 |
-
renderDetail();
|
| 120 |
-
}
|
| 121 |
-
function scoreTable(record) {
|
| 122 |
-
const p=record.payload,b=bById(p.benchmark);
|
| 123 |
-
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;
|
| 124 |
-
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||[]]];
|
| 125 |
-
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])=>{
|
| 126 |
-
const visible=columns.filter(c=>p[field]?.[c.key]!=null||field==='accuracy');
|
| 127 |
-
if(!visible.length)return '';
|
| 128 |
-
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('');
|
| 129 |
-
}).join('')+'</tbody></table>';
|
| 130 |
-
}
|
| 131 |
-
function renderDetail() {
|
| 132 |
-
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;}
|
| 133 |
-
const p=r.payload,active=['pending','approved'].includes(r.status);
|
| 134 |
-
$('#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.reviewer?' · '+esc(h.reviewer):''}${h.note?' — '+esc(h.note):''}</li>`).join('')}</ul>`:''}`;
|
| 135 |
-
$('#download-review-json').addEventListener('click',()=>download('rise-submission-'+r.id+'.json',r));
|
| 136 |
-
$('#review-form')?.addEventListener('submit',async e=>{
|
| 137 |
-
e.preventDefault();const decision=e.submitter.value,note=$('#review-note').value.trim();
|
| 138 |
-
if(decision!=='approve'&&!note){message('#review-message','Add a review note explaining this decision.',true);return;}
|
| 139 |
-
$$('#review-form button').forEach(b=>b.disabled=true);
|
| 140 |
-
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.');}
|
| 141 |
-
catch(error){message('#review-message',error.message,true);$$('#review-form button').forEach(b=>b.disabled=false);}
|
| 142 |
-
});
|
| 143 |
-
}
|
| 144 |
-
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();}});
|
| 145 |
-
$('#login-form').addEventListener('submit',async e=>{e.preventDefault();$('#login-button').disabled=true;try{const r=await api('/api/admin/session',{});token=r.token;sessionStorage.setItem('rise-review-session',token);await loadQueue();}catch(error){message('#login-message',error.message,true);}finally{$('#login-button').disabled=false;}});
|
| 146 |
-
$('#sign-out').addEventListener('click',async()=>{try{await api('/api/admin/logout',{},true);}finally{signOutView();}});
|
| 147 |
-
$('#refresh-queue').addEventListener('click',loadQueue);
|
| 148 |
-
connect().then(async()=>{
|
| 149 |
-
if(!config){$('#login-caption').textContent='Administrator sign-in is not available yet.';return;}
|
| 150 |
-
$('#login-form').hidden=!config.local_preview;$('#hf-login').hidden=config.local_preview;
|
| 151 |
-
if(config.local_preview){$('#login-caption').textContent='Open the review workspace for this local preview.';if(token)loadQueue();return;}
|
| 152 |
-
token='';sessionStorage.removeItem('rise-review-session');$('#hf-login').href=config.admin_login_url;
|
| 153 |
-
const error=new URLSearchParams(location.search).get('login_error');
|
| 154 |
-
if(error){message('#login-message',({membership:'Only current VisionXLab members can review submissions.',state:'This sign-in attempt expired. Please try again.',cancelled:'Sign-in was cancelled.',signin:'Could not complete Hugging Face sign-in. Please try again.'})[error]||'Please sign in again.',true);history.replaceState(null,'',location.pathname);return;}
|
| 155 |
-
try{await api('/api/admin/me');await loadQueue();}catch(error){if(error.status!==401)message('#login-message',error.message,true);}
|
| 156 |
-
});
|
| 157 |
-
}
|
| 158 |
-
})();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pyproject.toml
DELETED
|
@@ -1,15 +0,0 @@
|
|
| 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", "httpx==0.28.1"]
|
| 10 |
-
|
| 11 |
-
[project.optional-dependencies]
|
| 12 |
-
test = ["httpx==0.28.1"]
|
| 13 |
-
|
| 14 |
-
[tool.setuptools]
|
| 15 |
-
packages = ["server"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
scripts/serve.py
DELETED
|
@@ -1,21 +0,0 @@
|
|
| 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
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
"""Submission and moderation service for the RISE leaderboard."""
|
|
|
|
|
|
server/app.py
DELETED
|
@@ -1,258 +0,0 @@
|
|
| 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 .auth import AdminAuth
|
| 21 |
-
from .storage import HubStore, LocalStore
|
| 22 |
-
from .validation import Invalid, public_leaderboard, template, text, validate_submission
|
| 23 |
-
|
| 24 |
-
ROOT = Path(__file__).resolve().parents[1]
|
| 25 |
-
MAX_BODY = 262144
|
| 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.admin_org = "VisionXLab"
|
| 53 |
-
self.oauth_client_id = os.environ.get("OAUTH_CLIENT_ID", "")
|
| 54 |
-
self.oauth_client_secret = os.environ.get("OAUTH_CLIENT_SECRET", "")
|
| 55 |
-
self.origin = os.environ.get("RISE_PUBLIC_ORIGIN", "").rstrip("/")
|
| 56 |
-
self.repo = os.environ.get("RISE_SUBMISSIONS_REPO", "")
|
| 57 |
-
self.token = os.environ.get("RISE_STORAGE_TOKEN", "")
|
| 58 |
-
self.state_dir = Path(state_dir or ROOT / ".local")
|
| 59 |
-
if not local:
|
| 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 |
-
|
| 63 |
-
|
| 64 |
-
def create_app(settings=None, store=None, base=None):
|
| 65 |
-
settings = settings or Settings()
|
| 66 |
-
if store is None:
|
| 67 |
-
if settings.local:
|
| 68 |
-
store = LocalStore(settings.state_dir)
|
| 69 |
-
elif settings.repo and settings.token:
|
| 70 |
-
try:
|
| 71 |
-
store = HubStore(settings.repo, settings.token)
|
| 72 |
-
except Exception:
|
| 73 |
-
logging.getLogger("rise").error("Private storage initialization failed; submissions and review are disabled.")
|
| 74 |
-
service_ready = store is not None and (settings.local or bool(
|
| 75 |
-
getattr(settings, "oauth_client_id", "") and getattr(settings, "oauth_client_secret", "")))
|
| 76 |
-
if not service_ready:
|
| 77 |
-
logging.getLogger("rise").warning("Serving the public leaderboard only; configure private storage and Hugging Face OAuth to enable submissions.")
|
| 78 |
-
base = base or json.loads((ROOT / "dist/data/leaderboard.json").read_text())
|
| 79 |
-
app = FastAPI(docs_url=None, redoc_url=None, openapi_url=None)
|
| 80 |
-
auth, attempts = AdminAuth(settings), defaultdict(deque)
|
| 81 |
-
security_lock = threading.Lock()
|
| 82 |
-
|
| 83 |
-
def rate_limit(request, scope, limit, window=3600):
|
| 84 |
-
# Do not trust arbitrary X-Forwarded-For values. Uvicorn decides which proxy to trust.
|
| 85 |
-
address = request.client.host if request.client else "unknown"
|
| 86 |
-
key = (scope, address)
|
| 87 |
-
stamp = time.monotonic()
|
| 88 |
-
with security_lock:
|
| 89 |
-
for stale in [k for k, values in attempts.items() if not values or stamp-values[-1] > window]:
|
| 90 |
-
attempts.pop(stale, None)
|
| 91 |
-
queue = attempts[key]
|
| 92 |
-
while queue and stamp-queue[0] > window:
|
| 93 |
-
queue.popleft()
|
| 94 |
-
if len(queue) >= limit:
|
| 95 |
-
raise HTTPException(429, "Too many requests. Please try again later.")
|
| 96 |
-
queue.append(stamp)
|
| 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 not service_ready and (request.url.path.startswith("/api/admin/") or request.url.path in {
|
| 117 |
-
"/api/submissions", "/api/submission-status"}):
|
| 118 |
-
return JSONResponse({"detail": "Submissions and review are not available yet."}, status_code=503,
|
| 119 |
-
headers={"Cache-Control": "no-store"})
|
| 120 |
-
if request.method == "POST":
|
| 121 |
-
origin = request.headers.get("origin")
|
| 122 |
-
expected = str(request.base_url).rstrip("/") if settings.local else settings.origin
|
| 123 |
-
if (origin and origin != expected) or (not settings.local and request.url.path.startswith("/api/admin/") and origin != expected):
|
| 124 |
-
return JSONResponse({"detail": "Cross-origin submissions are not accepted."}, status_code=403)
|
| 125 |
-
if request.headers.get("content-type", "").split(";")[0] != "application/json":
|
| 126 |
-
return JSONResponse({"detail": "Use application/json."}, status_code=415)
|
| 127 |
-
content = bytearray()
|
| 128 |
-
async for chunk in request.stream():
|
| 129 |
-
content.extend(chunk)
|
| 130 |
-
if len(content) > MAX_BODY:
|
| 131 |
-
return JSONResponse({"detail": "Submission exceeds the 256 KB limit."}, status_code=413)
|
| 132 |
-
try:
|
| 133 |
-
request.state.json = strict_json(content)
|
| 134 |
-
except (ValueError, UnicodeError, RecursionError):
|
| 135 |
-
return JSONResponse({"detail": "Invalid JSON. Check syntax, duplicate fields and numeric values."}, status_code=400)
|
| 136 |
-
try:
|
| 137 |
-
response = await call_next(request)
|
| 138 |
-
except Exception:
|
| 139 |
-
# Never include credentials, private repository details or payloads in errors/logs.
|
| 140 |
-
logging.getLogger("rise").error("Submission service operation failed; private storage may be unavailable.")
|
| 141 |
-
return JSONResponse({"detail": "The submission service is temporarily unavailable. Nothing was published."}, status_code=503)
|
| 142 |
-
response.headers["X-Content-Type-Options"] = "nosniff"
|
| 143 |
-
response.headers["Referrer-Policy"] = "no-referrer"
|
| 144 |
-
response.headers["Permissions-Policy"] = "camera=(), microphone=(), geolocation=()"
|
| 145 |
-
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"
|
| 146 |
-
if request.url.path.startswith('/api/') or request.url.path == '/admin.html':
|
| 147 |
-
response.headers["Cache-Control"] = "no-store"
|
| 148 |
-
return response
|
| 149 |
-
|
| 150 |
-
@app.get("/api/config")
|
| 151 |
-
def config():
|
| 152 |
-
return {"available": service_ready, "local_preview": settings.local, "max_file_bytes": 200000,
|
| 153 |
-
"admin_auth": "local" if settings.local else "huggingface", "admin_organization": settings.admin_org,
|
| 154 |
-
"admin_login_url": settings.origin + "/api/admin/login" if not settings.local else ""}
|
| 155 |
-
|
| 156 |
-
@app.get("/api/leaderboard")
|
| 157 |
-
def leaderboard():
|
| 158 |
-
return public_leaderboard(base, store.read()) if store is not None else copy.deepcopy(base)
|
| 159 |
-
|
| 160 |
-
@app.get("/api/template")
|
| 161 |
-
def get_template(benchmark: str = "risebench-plusplus"):
|
| 162 |
-
b = next((b for b in base["benchmarks"] if b["id"] == benchmark), None)
|
| 163 |
-
if not b:
|
| 164 |
-
raise HTTPException(404, "Unknown benchmark.")
|
| 165 |
-
return JSONResponse(template(b), headers={"Content-Disposition": 'attachment; filename="rise-results-template.json"'})
|
| 166 |
-
|
| 167 |
-
@app.post("/api/submissions", status_code=201)
|
| 168 |
-
def submit(request: Request):
|
| 169 |
-
rate_limit(request, "submit", 10)
|
| 170 |
-
normalized = validate_submission(payload(request), base)
|
| 171 |
-
ident, token = uuid.uuid4().hex, secrets.token_urlsafe(32)
|
| 172 |
-
fingerprint = digest(json.dumps(normalized, sort_keys=True))
|
| 173 |
-
record = {"id": ident, "status": "pending", "revision": 1, "submitted_at": now(),
|
| 174 |
-
"reviewed_at": None, "review_note": "", "history": [], "payload": normalized,
|
| 175 |
-
"receipt_hash": digest(token), "fingerprint": fingerprint}
|
| 176 |
-
def add(state):
|
| 177 |
-
if len(state["submissions"]) >= 5000:
|
| 178 |
-
raise HTTPException(503, "The submission queue is full. Please contact the benchmark team.")
|
| 179 |
-
if any(r["fingerprint"] == fingerprint and r["status"] in {"pending", "approved"} for r in state["submissions"].values()):
|
| 180 |
-
raise HTTPException(409, "These results have already been submitted.")
|
| 181 |
-
live = public_leaderboard(base, state)
|
| 182 |
-
b = next(b for b in live["benchmarks"] if b["id"] == normalized["benchmark"])
|
| 183 |
-
models = b["results_by_language"][normalized["language"]]["models"]
|
| 184 |
-
if normalized["revision_of"]:
|
| 185 |
-
target = next((m for m in models if m["id"] == normalized["revision_of"]), None)
|
| 186 |
-
if not target or target["name"] != normalized["model_name"]:
|
| 187 |
-
raise Invalid("An update must select the existing model and keep its model name.")
|
| 188 |
-
elif any(m["name"].casefold() == normalized["model_name"].casefold() for m in models):
|
| 189 |
-
raise Invalid("This model already exists. Select it under Update an existing result.")
|
| 190 |
-
state["submissions"][ident] = record
|
| 191 |
-
store.mutate(add)
|
| 192 |
-
return {"submission_id": ident, "status_token": token, "status": "pending", "submitted_at": record["submitted_at"]}
|
| 193 |
-
|
| 194 |
-
@app.post("/api/submission-status")
|
| 195 |
-
def submission_status(request: Request):
|
| 196 |
-
rate_limit(request, "status", 120)
|
| 197 |
-
body = payload(request)
|
| 198 |
-
ident, token = body.get("submission_id", ""), body.get("status_token", "")
|
| 199 |
-
if not isinstance(ident, str) or not isinstance(token, str):
|
| 200 |
-
raise HTTPException(404, "Submission not found or receipt key incorrect.")
|
| 201 |
-
record = store.read()["submissions"].get(ident)
|
| 202 |
-
if not record or not secrets.compare_digest(record["receipt_hash"], digest(token)):
|
| 203 |
-
raise HTTPException(404, "Submission not found or receipt key incorrect.")
|
| 204 |
-
return {"submission_id": ident, "status": record["status"], "model_name": record["payload"]["model_name"],
|
| 205 |
-
"submitted_at": record["submitted_at"], "review_note": record["review_note"]}
|
| 206 |
-
|
| 207 |
-
auth.attach(app, rate_limit)
|
| 208 |
-
|
| 209 |
-
@app.get("/api/admin/submissions")
|
| 210 |
-
def submissions(request: Request):
|
| 211 |
-
auth.require(request)
|
| 212 |
-
return [{key: copy.deepcopy(value) for key, value in record.items() if key not in {"receipt_hash", "fingerprint"}}
|
| 213 |
-
for record in sorted(store.read()["submissions"].values(), key=lambda r: r["submitted_at"], reverse=True)]
|
| 214 |
-
|
| 215 |
-
@app.post("/api/admin/submissions/{ident}/review")
|
| 216 |
-
def review(ident: str, request: Request):
|
| 217 |
-
reviewer = auth.require(request)
|
| 218 |
-
body = payload(request)
|
| 219 |
-
decision = body.get("decision")
|
| 220 |
-
if decision not in {"approve", "reject", "withdraw"}:
|
| 221 |
-
raise Invalid("Choose approve, reject or withdraw.")
|
| 222 |
-
note = text(body.get("note", ""), "Review note", 3000, decision != "approve")
|
| 223 |
-
if body.get("confirmed") is not True:
|
| 224 |
-
raise Invalid("Confirm the review decision before applying it.")
|
| 225 |
-
def update(state):
|
| 226 |
-
record = state["submissions"].get(ident)
|
| 227 |
-
if not record:
|
| 228 |
-
raise HTTPException(404, "Submission not found.")
|
| 229 |
-
if type(body.get("revision")) is not int or body["revision"] != record["revision"]:
|
| 230 |
-
raise HTTPException(409, "This submission changed. Refresh before reviewing again.")
|
| 231 |
-
if decision in {"approve", "reject"} and record["status"] != "pending":
|
| 232 |
-
raise HTTPException(409, "Only pending results can be approved or rejected.")
|
| 233 |
-
if decision == "withdraw" and record["status"] != "approved":
|
| 234 |
-
raise HTTPException(409, "Only approved results can be withdrawn.")
|
| 235 |
-
p = record["payload"]
|
| 236 |
-
if decision == "withdraw" and not p["revision_of"]:
|
| 237 |
-
if any(r["status"] == "approved" and r["payload"]["revision_of"] == "community-" + ident
|
| 238 |
-
for r in state["submissions"].values()):
|
| 239 |
-
raise HTTPException(409, "Withdraw this model's approved updates before withdrawing its original submission.")
|
| 240 |
-
if decision == "approve":
|
| 241 |
-
current = public_leaderboard(base, state)
|
| 242 |
-
b = next(b for b in current["benchmarks"] if b["id"] == p["benchmark"])
|
| 243 |
-
models = b["results_by_language"][p["language"]]["models"]
|
| 244 |
-
if p["revision_of"] and not any(m["id"] == p["revision_of"] for m in models):
|
| 245 |
-
raise HTTPException(409, "The result being updated is no longer published.")
|
| 246 |
-
if not p["revision_of"] and any(m["name"].casefold() == p["model_name"].casefold() for m in models):
|
| 247 |
-
raise HTTPException(409, "A result for this model was already approved. Review it as an update.")
|
| 248 |
-
record["status"] = {"approve": "approved", "reject": "rejected", "withdraw": "withdrawn"}[decision]
|
| 249 |
-
record["revision"] += 1
|
| 250 |
-
record["reviewed_at"], record["review_note"] = now(), note
|
| 251 |
-
record["history"].append({"decision": decision, "at": record["reviewed_at"], "note": note,
|
| 252 |
-
"reviewer": reviewer["username"], "reviewer_id": reviewer["subject"]})
|
| 253 |
-
return {"id": ident, "status": record["status"], "revision": record["revision"]}
|
| 254 |
-
return store.mutate(update)
|
| 255 |
-
|
| 256 |
-
# Mount only the allowlisted build directory; private state and Python source stay outside it.
|
| 257 |
-
app.mount("/", StaticFiles(directory=ROOT / "dist", html=True), name="site")
|
| 258 |
-
return app
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
server/auth.py
DELETED
|
@@ -1,195 +0,0 @@
|
|
| 1 |
-
"""Hugging Face OAuth with server-side sessions and live organization checks."""
|
| 2 |
-
import base64
|
| 3 |
-
import hashlib
|
| 4 |
-
import math
|
| 5 |
-
import secrets
|
| 6 |
-
import threading
|
| 7 |
-
import time
|
| 8 |
-
from urllib.parse import urlencode
|
| 9 |
-
|
| 10 |
-
import httpx
|
| 11 |
-
from fastapi import HTTPException, Request
|
| 12 |
-
from fastapi.responses import JSONResponse, RedirectResponse
|
| 13 |
-
|
| 14 |
-
HF_ORIGIN = "https://huggingface.co"
|
| 15 |
-
SESSION_COOKIE = "__Host-rise_admin"
|
| 16 |
-
STATE_COOKIE = "__Host-rise_oauth"
|
| 17 |
-
SESSION_SECONDS = 8 * 3600
|
| 18 |
-
SCOPES = "openid profile read-memberships"
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
def digest(value):
|
| 22 |
-
return hashlib.sha256(value.encode()).hexdigest()
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
def hf_userinfo(access_token):
|
| 26 |
-
try:
|
| 27 |
-
response = httpx.get(HF_ORIGIN + "/oauth/userinfo",
|
| 28 |
-
headers={"Authorization": "Bearer " + access_token}, timeout=15)
|
| 29 |
-
if response.status_code in (401, 403):
|
| 30 |
-
raise HTTPException(401, "Hugging Face sign-in expired. Please sign in again.")
|
| 31 |
-
response.raise_for_status()
|
| 32 |
-
result = response.json()
|
| 33 |
-
if not isinstance(result, dict):
|
| 34 |
-
raise ValueError("Invalid profile")
|
| 35 |
-
return result
|
| 36 |
-
except (httpx.HTTPError, ValueError):
|
| 37 |
-
raise HTTPException(503, "Hugging Face membership verification is temporarily unavailable.") from None
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
def member_identity(profile, organization):
|
| 41 |
-
subject, username = profile.get("sub"), profile.get("preferred_username")
|
| 42 |
-
if not isinstance(subject, str) or not subject or not isinstance(username, str) or not username:
|
| 43 |
-
raise HTTPException(403, "Unable to verify the Hugging Face account.")
|
| 44 |
-
# Current OAuth responses use `orgs`; some provider versions use `organizations`.
|
| 45 |
-
orgs = profile.get("orgs", profile.get("organizations", []))
|
| 46 |
-
if not isinstance(orgs, list):
|
| 47 |
-
orgs = []
|
| 48 |
-
for org in orgs:
|
| 49 |
-
if (isinstance(org, dict) and org.get("preferred_username", "").casefold() == organization.casefold()
|
| 50 |
-
and org.get("roleInOrg") in {"read", "contributor", "write", "admin"}
|
| 51 |
-
and not org.get("securityRestrictions")):
|
| 52 |
-
return {"subject": subject, "username": username, "organization": organization}
|
| 53 |
-
raise HTTPException(403, "Only current " + organization + " members can review submissions.")
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
def exchange_code(settings, code, verifier):
|
| 57 |
-
try:
|
| 58 |
-
response = httpx.post(HF_ORIGIN + "/oauth/token",
|
| 59 |
-
auth=(settings.oauth_client_id, settings.oauth_client_secret),
|
| 60 |
-
data={"client_id": settings.oauth_client_id, "grant_type": "authorization_code",
|
| 61 |
-
"code": code, "code_verifier": verifier,
|
| 62 |
-
"redirect_uri": settings.origin + "/api/admin/callback"}, timeout=20)
|
| 63 |
-
response.raise_for_status()
|
| 64 |
-
value = response.json()
|
| 65 |
-
token, lifetime = value.get("access_token"), value.get("expires_in")
|
| 66 |
-
if (not isinstance(token, str) or not token or type(lifetime) not in (int, float)
|
| 67 |
-
or not math.isfinite(lifetime) or lifetime <= 0
|
| 68 |
-
or "read-memberships" not in value.get("scope", "").split()):
|
| 69 |
-
raise ValueError("Invalid OAuth response")
|
| 70 |
-
return token, min(lifetime, SESSION_SECONDS)
|
| 71 |
-
except (httpx.HTTPError, ValueError, AttributeError):
|
| 72 |
-
raise HTTPException(401, "Could not complete Hugging Face sign-in. Please try again.") from None
|
| 73 |
-
|
| 74 |
-
|
| 75 |
-
class AdminAuth:
|
| 76 |
-
def __init__(self, settings):
|
| 77 |
-
self.settings = settings
|
| 78 |
-
self.sessions, self.pending = {}, {}
|
| 79 |
-
self.lock = threading.RLock()
|
| 80 |
-
|
| 81 |
-
def cleanup(self):
|
| 82 |
-
stamp = time.monotonic()
|
| 83 |
-
for collection in (self.sessions, self.pending):
|
| 84 |
-
for key in [key for key, value in collection.items() if value["expires"] <= stamp]:
|
| 85 |
-
collection.pop(key, None)
|
| 86 |
-
|
| 87 |
-
def issue(self, identity, access_token="", lifetime=SESSION_SECONDS):
|
| 88 |
-
token = secrets.token_urlsafe(40)
|
| 89 |
-
with self.lock:
|
| 90 |
-
self.cleanup()
|
| 91 |
-
if len(self.sessions) >= 1000:
|
| 92 |
-
raise HTTPException(503, "Too many active review sessions. Please try again later.")
|
| 93 |
-
self.sessions[digest(token)] = {"identity": identity, "access_token": access_token,
|
| 94 |
-
"expires": time.monotonic() + lifetime}
|
| 95 |
-
return token
|
| 96 |
-
|
| 97 |
-
def session_key(self, request):
|
| 98 |
-
if self.settings.local:
|
| 99 |
-
return request.headers.get("authorization", "").removeprefix("Bearer ")
|
| 100 |
-
return request.cookies.get(SESSION_COOKIE, "")
|
| 101 |
-
|
| 102 |
-
def require(self, request):
|
| 103 |
-
key = digest(self.session_key(request))
|
| 104 |
-
with self.lock:
|
| 105 |
-
self.cleanup()
|
| 106 |
-
session = self.sessions.get(key)
|
| 107 |
-
if not session:
|
| 108 |
-
raise HTTPException(401, "Sign in to review submissions.")
|
| 109 |
-
identity = session["identity"]
|
| 110 |
-
if not self.settings.local:
|
| 111 |
-
try:
|
| 112 |
-
current = member_identity(hf_userinfo(session["access_token"]), self.settings.admin_org)
|
| 113 |
-
if current["subject"] != identity["subject"]:
|
| 114 |
-
raise HTTPException(401, "Account verification failed. Please sign in again.")
|
| 115 |
-
identity = current
|
| 116 |
-
except HTTPException as error:
|
| 117 |
-
if error.status_code in (401, 403):
|
| 118 |
-
with self.lock:
|
| 119 |
-
self.sessions.pop(key, None)
|
| 120 |
-
raise
|
| 121 |
-
# A simultaneous logout must not revive an already removed session.
|
| 122 |
-
with self.lock:
|
| 123 |
-
if key not in self.sessions:
|
| 124 |
-
raise HTTPException(401, "Sign in to review submissions.")
|
| 125 |
-
return identity
|
| 126 |
-
|
| 127 |
-
def attach(self, app, rate_limit):
|
| 128 |
-
settings = self.settings
|
| 129 |
-
|
| 130 |
-
@app.post("/api/admin/session")
|
| 131 |
-
def local_login(request: Request):
|
| 132 |
-
rate_limit(request, "login", 10, 900)
|
| 133 |
-
if not settings.local:
|
| 134 |
-
raise HTTPException(403, "Use Sign in with Hugging Face. Password login is disabled.")
|
| 135 |
-
token = self.issue({"subject": "local-preview", "username": "Local reviewer", "organization": ""})
|
| 136 |
-
return {"token": token, "expires_in": SESSION_SECONDS}
|
| 137 |
-
|
| 138 |
-
@app.get("/api/admin/login")
|
| 139 |
-
def login(request: Request):
|
| 140 |
-
if settings.local:
|
| 141 |
-
raise HTTPException(400, "Use Open local review in the local preview.")
|
| 142 |
-
rate_limit(request, "oauth-login", 20, 900)
|
| 143 |
-
state, binding, verifier = (secrets.token_urlsafe(40) for _ in range(3))
|
| 144 |
-
with self.lock:
|
| 145 |
-
self.cleanup()
|
| 146 |
-
if len(self.pending) >= 1000:
|
| 147 |
-
raise HTTPException(503, "Too many sign-in attempts. Please try again later.")
|
| 148 |
-
self.pending[digest(state)] = {"binding": digest(binding), "verifier": verifier,
|
| 149 |
-
"expires": time.monotonic() + 600}
|
| 150 |
-
challenge = base64.urlsafe_b64encode(hashlib.sha256(verifier.encode()).digest()).rstrip(b"=").decode()
|
| 151 |
-
response = RedirectResponse(HF_ORIGIN + "/oauth/authorize?" + urlencode({
|
| 152 |
-
"client_id": settings.oauth_client_id, "response_type": "code", "scope": SCOPES,
|
| 153 |
-
"redirect_uri": settings.origin + "/api/admin/callback", "state": state,
|
| 154 |
-
"code_challenge": challenge, "code_challenge_method": "S256"}), status_code=302)
|
| 155 |
-
response.set_cookie(STATE_COOKIE, binding, max_age=600, secure=True, httponly=True, samesite="lax")
|
| 156 |
-
return response
|
| 157 |
-
|
| 158 |
-
@app.get("/api/admin/callback")
|
| 159 |
-
def callback(request: Request):
|
| 160 |
-
if settings.local:
|
| 161 |
-
raise HTTPException(400, "OAuth is available only in the deployed Space.")
|
| 162 |
-
state, code = request.query_params.get("state", ""), request.query_params.get("code", "")
|
| 163 |
-
with self.lock:
|
| 164 |
-
self.cleanup()
|
| 165 |
-
pending = self.pending.pop(digest(state), None)
|
| 166 |
-
error, session = "state", None
|
| 167 |
-
if (pending and state and secrets.compare_digest(pending["binding"], digest(request.cookies.get(STATE_COOKIE, "")))
|
| 168 |
-
and len(request.query_params.getlist("state")) == 1 and len(request.query_params.getlist("code")) <= 1):
|
| 169 |
-
error = "cancelled" if request.query_params.get("error") else "signin"
|
| 170 |
-
if code and not request.query_params.get("error"):
|
| 171 |
-
try:
|
| 172 |
-
access_token, lifetime = exchange_code(settings, code, pending["verifier"])
|
| 173 |
-
identity = member_identity(hf_userinfo(access_token), settings.admin_org)
|
| 174 |
-
session = self.issue(identity, access_token, lifetime)
|
| 175 |
-
except HTTPException as failure:
|
| 176 |
-
error = "membership" if failure.status_code == 403 else "signin"
|
| 177 |
-
response = RedirectResponse("/admin.html" + ("" if session else "?login_error=" + error), status_code=303)
|
| 178 |
-
response.delete_cookie(STATE_COOKIE, secure=True, httponly=True, samesite="lax")
|
| 179 |
-
if session:
|
| 180 |
-
with self.lock:
|
| 181 |
-
self.sessions.pop(digest(request.cookies.get(SESSION_COOKIE, "")), None)
|
| 182 |
-
response.set_cookie(SESSION_COOKIE, session, max_age=int(lifetime), secure=True, httponly=True, samesite="lax")
|
| 183 |
-
return response
|
| 184 |
-
|
| 185 |
-
@app.get("/api/admin/me")
|
| 186 |
-
def me(request: Request):
|
| 187 |
-
return self.require(request)
|
| 188 |
-
|
| 189 |
-
@app.post("/api/admin/logout")
|
| 190 |
-
def logout(request: Request):
|
| 191 |
-
with self.lock:
|
| 192 |
-
self.sessions.pop(digest(self.session_key(request)), None)
|
| 193 |
-
response = JSONResponse({"ok": True})
|
| 194 |
-
response.delete_cookie(SESSION_COOKIE, secure=True, httponly=True, samesite="lax")
|
| 195 |
-
return response
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
server/storage.py
DELETED
|
@@ -1,88 +0,0 @@
|
|
| 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
DELETED
|
@@ -1,160 +0,0 @@
|
|
| 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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
submit.html
DELETED
|
@@ -1,34 +0,0 @@
|
|
| 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>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|