renjianzhexuejia commited on
Commit
5b76229
·
verified ·
1 Parent(s): 9a06ef9

Publish free leaderboard only; defer submissions and moderation

Browse files
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').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>';
@@ -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) => ({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[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

  • SHA256: 59575c79a544844ba500b0eac449ecf6134c39b41b6f341503c684954366ea01
  • Pointer size: 132 Bytes
  • Size of remote file: 2.15 MB
dist/assets/favicon.svg DELETED
dist/assets/rise-agent.png DELETED

Git LFS Details

  • SHA256: 7c9b6540c4980c7e16ccf54f6ed9cb120281ab201255fd0ab5609c43c476afc4
  • Pointer size: 132 Bytes
  • Size of remote file: 1.57 MB
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=>({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[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=>({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[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>