minette-kaunismaki commited on
Commit
30ce35a
·
1 Parent(s): b925621

prompt-samples (#6)

Browse files

- video edit prompt samples (cc9cf93e1d03e5ece0cded717c4f2572536dc614)

app.py CHANGED
@@ -1783,6 +1783,9 @@ button.theme-toggle[data-mode="light"] .theme-icon-moon { display: block !import
1783
  max-width: 100% !important;
1784
  }
1785
  .compare-cell { min-width: 0; }
 
 
 
1786
  .compare-model-label {
1787
  margin-bottom: 6px;
1788
  color: var(--pruna-lavender);
@@ -1790,15 +1793,23 @@ button.theme-toggle[data-mode="light"] .theme-icon-moon { display: block !import
1790
  font-weight: 700;
1791
  word-break: break-word;
1792
  }
1793
- .compare-cell img {
 
1794
  display: block;
1795
  width: 100%;
1796
- aspect-ratio: 1 / 1;
1797
- object-fit: cover;
1798
  border-radius: 12px;
1799
  border: 1px solid var(--pruna-border);
1800
  background: var(--pruna-bg-elevated);
1801
  }
 
 
 
 
 
 
 
 
 
1802
  .compare-empty,
1803
  .pareto-note-copy {
1804
  margin: 0;
@@ -2157,14 +2168,20 @@ def load_sample_comparison_data(folder):
2157
  return None
2158
 
2159
  prompts = {}
 
2160
  with prompts_path.open() as handle:
2161
  for line in handle:
2162
  if not line.strip():
2163
  continue
2164
  row = json.loads(line)
2165
- prompts[row["prompt_id"]] = row.get("text", "")
 
 
 
 
2166
 
2167
  images = defaultdict(dict)
 
2168
  with generations_path.open() as handle:
2169
  for line in handle:
2170
  if not line.strip():
@@ -2172,20 +2189,33 @@ def load_sample_comparison_data(folder):
2172
  row = json.loads(line)
2173
  model_id = row["model_id"]
2174
  prompt_id = row["prompt_id"]
2175
- image_url = row.get("image")
2176
- if model_id and prompt_id and image_url:
2177
- images[model_id][prompt_id] = image_url
 
 
 
 
 
 
 
 
 
2178
 
2179
  models = sorted(images)
2180
  if not models or not prompts:
2181
  return None
2182
 
2183
- return {
2184
  "prompts": prompts,
2185
  "images": {model: dict(prompt_map) for model, prompt_map in images.items()},
2186
  "models": models,
2187
  "prompt_ids": sorted(prompts),
 
2188
  }
 
 
 
2189
 
2190
 
2191
  def _as_numeric(df, columns):
@@ -2416,6 +2446,10 @@ qwen_combined_dir = _resolve_data_path(
2416
  data_dir / "qwen_image_bench_combined",
2417
  space_root.parent / "qwen_image_bench_combined",
2418
  )
 
 
 
 
2419
  qwen_path = _resolve_data_path(
2420
  data_dir / "qwen_image_bench_model_price_and_median_generation_time_10_august.csv",
2421
  space_root.parent / "qwen_image_bench_model_price_and_median_generation_time_10_august.csv",
@@ -2483,6 +2517,7 @@ video_display_columns = [
2483
 
2484
  oneig_samples = load_sample_comparison_data(oneig_combined_dir)
2485
  qwen_samples = load_sample_comparison_data(qwen_combined_dir)
 
2486
 
2487
  metrics = [
2488
  {"id": "datapoint_elo", "column": "Datapoint Elo"},
@@ -2556,7 +2591,7 @@ datasets = [
2556
  "per second of output video. Generation time per second of video "
2557
  "is end-to-end wall time to produce one second of output."
2558
  ),
2559
- "samples": None,
2560
  },
2561
  {
2562
  "id": "qwen",
 
1783
  max-width: 100% !important;
1784
  }
1785
  .compare-cell { min-width: 0; }
1786
+ .compare-cell.compare-source .compare-model-label {
1787
+ color: var(--pruna-text-muted);
1788
+ }
1789
  .compare-model-label {
1790
  margin-bottom: 6px;
1791
  color: var(--pruna-lavender);
 
1793
  font-weight: 700;
1794
  word-break: break-word;
1795
  }
1796
+ .compare-cell img,
1797
+ .compare-cell video {
1798
  display: block;
1799
  width: 100%;
 
 
1800
  border-radius: 12px;
1801
  border: 1px solid var(--pruna-border);
1802
  background: var(--pruna-bg-elevated);
1803
  }
1804
+ .compare-cell img {
1805
+ aspect-ratio: 1 / 1;
1806
+ object-fit: cover;
1807
+ }
1808
+ .compare-cell video {
1809
+ aspect-ratio: 16 / 9;
1810
+ max-height: 360px;
1811
+ object-fit: contain;
1812
+ }
1813
  .compare-empty,
1814
  .pareto-note-copy {
1815
  margin: 0;
 
2168
  return None
2169
 
2170
  prompts = {}
2171
+ source_videos = {}
2172
  with prompts_path.open() as handle:
2173
  for line in handle:
2174
  if not line.strip():
2175
  continue
2176
  row = json.loads(line)
2177
+ prompt_id = row["prompt_id"]
2178
+ prompts[prompt_id] = row.get("text", "")
2179
+ source_video = row.get("source_video")
2180
+ if source_video:
2181
+ source_videos[prompt_id] = source_video
2182
 
2183
  images = defaultdict(dict)
2184
+ kinds = set()
2185
  with generations_path.open() as handle:
2186
  for line in handle:
2187
  if not line.strip():
 
2189
  row = json.loads(line)
2190
  model_id = row["model_id"]
2191
  prompt_id = row["prompt_id"]
2192
+ media_url = row.get("image") or row.get("video")
2193
+ if row.get("video"):
2194
+ kinds.add("video")
2195
+ elif row.get("image"):
2196
+ kinds.add("image")
2197
+ if model_id and prompt_id and media_url:
2198
+ images[model_id][prompt_id] = media_url
2199
+ if prompt_id and prompt_id not in source_videos:
2200
+ params = row.get("params") or {}
2201
+ input_video = params.get("input_video") or row.get("input_video")
2202
+ if input_video:
2203
+ source_videos[prompt_id] = input_video
2204
 
2205
  models = sorted(images)
2206
  if not models or not prompts:
2207
  return None
2208
 
2209
+ loaded = {
2210
  "prompts": prompts,
2211
  "images": {model: dict(prompt_map) for model, prompt_map in images.items()},
2212
  "models": models,
2213
  "prompt_ids": sorted(prompts),
2214
+ "kind": "video" if "video" in kinds else "image",
2215
  }
2216
+ if source_videos:
2217
+ loaded["source_videos"] = source_videos
2218
+ return loaded
2219
 
2220
 
2221
  def _as_numeric(df, columns):
 
2446
  data_dir / "qwen_image_bench_combined",
2447
  space_root.parent / "qwen_image_bench_combined",
2448
  )
2449
+ video_combined_dir = _resolve_data_path(
2450
+ data_dir / "video_editing_combined",
2451
+ space_root.parent / "video_editing_combined",
2452
+ )
2453
  qwen_path = _resolve_data_path(
2454
  data_dir / "qwen_image_bench_model_price_and_median_generation_time_10_august.csv",
2455
  space_root.parent / "qwen_image_bench_model_price_and_median_generation_time_10_august.csv",
 
2517
 
2518
  oneig_samples = load_sample_comparison_data(oneig_combined_dir)
2519
  qwen_samples = load_sample_comparison_data(qwen_combined_dir)
2520
+ video_samples = load_sample_comparison_data(video_combined_dir)
2521
 
2522
  metrics = [
2523
  {"id": "datapoint_elo", "column": "Datapoint Elo"},
 
2591
  "per second of output video. Generation time per second of video "
2592
  "is end-to-end wall time to produce one second of output."
2593
  ),
2594
+ "samples": video_samples,
2595
  },
2596
  {
2597
  "id": "qwen",
data/video_editing_combined/generations.jsonl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3ec4ea0a431484e65f30990c8cc4292b00c665be96db587775426da1c84a4ab8
3
+ size 762227
data/video_editing_combined/prompts.jsonl ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {"prompt_id": "video_edit_internal__advertising__p0000", "text": "Replace the white bottle with an orange sunscreen bottle.", "dataset": "video_edit_internal", "category": "advertising", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/advertising/4620329ad65820ce.mp4"}
2
+ {"prompt_id": "video_edit_internal__advertising__p0001", "text": "Replace the woman with an asian woman riding on a donkey through a chinese small town.", "dataset": "video_edit_internal", "category": "advertising", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/advertising/44db5689846be901.mp4"}
3
+ {"prompt_id": "video_edit_internal__advertising__p0002", "text": "Place the couple on a snowy mountain next to a mountain hut.", "dataset": "video_edit_internal", "category": "advertising", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/advertising/481db4a047688bbe.mp4"}
4
+ {"prompt_id": "video_edit_internal__advertising__p0003", "text": "Turn this into a scene in the summer with birds flying in the sky and butterflies in the foreground.", "dataset": "video_edit_internal", "category": "advertising", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/advertising/32b9f56763c56482.mp4"}
5
+ {"prompt_id": "video_edit_internal__advertising__p0004", "text": "Replace the robot arm with a dancing hamster on a small table.", "dataset": "video_edit_internal", "category": "advertising", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/advertising/22d02ae2df7f9045.mp4"}
6
+ {"prompt_id": "video_edit_internal__anonymization__p0000", "text": "Anonymize the womans face", "dataset": "video_edit_internal", "category": "anonymization", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/anonymization/7c410085f2fd939d.mp4"}
7
+ {"prompt_id": "video_edit_internal__anonymization__p0001", "text": "Anonymize the mans face", "dataset": "video_edit_internal", "category": "anonymization", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/anonymization/7b495805c0c270ea.mp4"}
8
+ {"prompt_id": "video_edit_internal__anonymization__p0002", "text": "Anonymize the mans face", "dataset": "video_edit_internal", "category": "anonymization", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/anonymization/736b6fb504bd32be.mp4"}
9
+ {"prompt_id": "video_edit_internal__anonymization__p0003", "text": "Anonymize the girls face", "dataset": "video_edit_internal", "category": "anonymization", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/anonymization/2c82413d39579cd5.mp4"}
10
+ {"prompt_id": "video_edit_internal__artificial_analysis__p0000", "text": "Change the rainforest setting to a neon-lit urban alley at night with steam from vents and wet reflective asphalt, and move into an ariel shot of the character after the initial camera movement to focus on the character", "dataset": "video_edit_internal", "category": "artificial_analysis", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/artificial_analysis/e2f6121269a206d3.mp4"}
11
+ {"prompt_id": "video_edit_internal__artificial_analysis__p0001", "text": "Replace the magenta hover-car with a chrome-blue car, keeping the drift and neon light trails.", "dataset": "video_edit_internal", "category": "artificial_analysis", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/artificial_analysis/55d1baa7f3f71b26.mp4"}
12
+ {"prompt_id": "video_edit_internal__artificial_analysis__p0002", "text": "Make the footage look like it was shot on a 1970s film camera, with grainy film texture, faded warm colors, slight softness, and slightly darker corners around the edges.", "dataset": "video_edit_internal", "category": "artificial_analysis", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/artificial_analysis/fd1ab436de020152.mp4"}
13
+ {"prompt_id": "video_edit_internal__artificial_analysis__p0003", "text": "A person appears at the top of the waterfall, leaps into the lake below, and disappears into the misty water beneath the falls.", "dataset": "video_edit_internal", "category": "artificial_analysis", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/artificial_analysis/7ee1623303a8da68.mp4"}
14
+ {"prompt_id": "video_edit_internal__artificial_analysis__p0004", "text": "A fluffy orange cat leaps gracefully from the floor onto the couch, paws sinking into the soft cushions. It circles once in place, tail swaying gently, before curling up tightly on one of the cushions and settling in comfortably.", "dataset": "video_edit_internal", "category": "artificial_analysis", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/artificial_analysis/9a73c608b343bbbe.mp4"}
15
+ {"prompt_id": "video_edit_internal__camera_editing__p0000", "text": "Zoom in on the man's face to show his focused expression", "dataset": "video_edit_internal", "category": "camera_editing", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/camera_editing/0336e64b0594bd7a.mp4"}
16
+ {"prompt_id": "video_edit_internal__camera_editing__p0001", "text": "Perform an arc shot around the tram as it arrives at the station", "dataset": "video_edit_internal", "category": "camera_editing", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/camera_editing/204aa93703da117b.mp4"}
17
+ {"prompt_id": "video_edit_internal__camera_editing__p0002", "text": "Change the view to a high angle.", "dataset": "video_edit_internal", "category": "camera_editing", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/camera_editing/c2ccb5351be5c718.mp4"}
18
+ {"prompt_id": "video_edit_internal__camera_editing__p0003", "text": "Change the view to a high angle.", "dataset": "video_edit_internal", "category": "camera_editing", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/camera_editing/b725aaded02d65e9.mp4"}
19
+ {"prompt_id": "video_edit_internal__camera_editing__p0004", "text": "Gradually move the camera away from the doctor", "dataset": "video_edit_internal", "category": "camera_editing", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/camera_editing/33f24f4d083df743.mp4"}
20
+ {"prompt_id": "video_edit_internal__design_arena__p0000", "text": "Create a transition of the video of the product whihc is the jeans on the lady model with an atitiude that goes into a zoom out camera that she is in a party .Focus on the vibes", "dataset": "video_edit_internal", "category": "design_arena", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/design_arena/b0b4642272a481b1.mp4"}
21
+ {"prompt_id": "video_edit_internal__design_arena__p0001", "text": "add ethnic urban women dancing at the bottem and at the bar wearing DMI Tshirts", "dataset": "video_edit_internal", "category": "design_arena", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/design_arena/0f730f98f3c51356.mp4"}
22
+ {"prompt_id": "video_edit_internal__design_arena__p0002", "text": "Generate a commercial of this dog drinking beer at an electronic music party in a world where dogs and humans are mixed together.", "dataset": "video_edit_internal", "category": "design_arena", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/design_arena/575fc4b9b6d7b3ab.mp4"}
23
+ {"prompt_id": "video_edit_internal__design_arena__p0003", "text": "everything is the same excpet the winter season, snowing", "dataset": "video_edit_internal", "category": "design_arena", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/design_arena/8674fd022867a736.mp4"}
24
+ {"prompt_id": "video_edit_internal__design_arena__p0004", "text": "A cinematic character introduction of Jason, framed in a medium close-up with subtle camera movement, confident body language, and expressive facial detail. Moody, high-contrast lighting with a cool-toned color palette, shallow depth of field, and a slow dramatic reveal that builds intrigue over a few seconds. I want a video in a 9:16 aspect ratio for tiktok. remove all text and have him in a mid day campus setting", "dataset": "video_edit_internal", "category": "design_arena", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/design_arena/91873bbafe4173da.mp4"}
25
+ {"prompt_id": "video_edit_internal__e_commerce__p0000", "text": "Remove the black blazer.", "dataset": "video_edit_internal", "category": "e_commerce", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/e_commerce/b89faaa5080c31db.mp4"}
26
+ {"prompt_id": "video_edit_internal__e_commerce__p0001", "text": "Replace her skirt with a jeans skirt.", "dataset": "video_edit_internal", "category": "e_commerce", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/e_commerce/c34a33d07e843804.mp4"}
27
+ {"prompt_id": "video_edit_internal__e_commerce__p0002", "text": "Replace the black leggings and the black shirt with a white dress.", "dataset": "video_edit_internal", "category": "e_commerce", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/e_commerce/489d2439cbaeed79.mp4"}
28
+ {"prompt_id": "video_edit_internal__e_commerce__p0003", "text": "Replace the white woman with a lebanese-looking woman.", "dataset": "video_edit_internal", "category": "e_commerce", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/e_commerce/0ad8fb773f303a11.mp4"}
29
+ {"prompt_id": "video_edit_internal__e_commerce__p0004", "text": "Remove all items on the table and place an eyeshadow pallete on the table next to the woman.", "dataset": "video_edit_internal", "category": "e_commerce", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/e_commerce/f28f3aa12b1ec220.mp4"}
30
+ {"prompt_id": "video_edit_internal__lighting__p0000", "text": "After the sun sets behind the mountains, the scene transitions into nighttime.", "dataset": "video_edit_internal", "category": "lighting", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/lighting/229c165e0ac97daf.mp4"}
31
+ {"prompt_id": "video_edit_internal__lighting__p0001", "text": "Change the weather to a dazzling starry night.", "dataset": "video_edit_internal", "category": "lighting", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/lighting/f42c41ab2f3adc26.mp4"}
32
+ {"prompt_id": "video_edit_internal__lighting__p0002", "text": "Change the weather to a thunderstorm with heavy rain.", "dataset": "video_edit_internal", "category": "lighting", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/lighting/daa36567634ca6be.mp4"}
33
+ {"prompt_id": "video_edit_internal__lighting__p0003", "text": "Change the weather to a torrential downpour.", "dataset": "video_edit_internal", "category": "lighting", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/lighting/6817a4142b69d602.mp4"}
34
+ {"prompt_id": "video_edit_internal__lighting__p0004", "text": "Change the weather to a torrential downpour.", "dataset": "video_edit_internal", "category": "lighting", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/lighting/ac01488a685a1096.mp4"}
35
+ {"prompt_id": "video_edit_internal__long__p0000", "text": "Change the weather to a dazzling starry night.", "dataset": "video_edit_internal", "category": "long", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/long/e9af2a7039e43f16.mp4"}
36
+ {"prompt_id": "video_edit_internal__long__p0001", "text": "Adjust the color of book to blue", "dataset": "video_edit_internal", "category": "long", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/long/eab696d1555be316.mp4"}
37
+ {"prompt_id": "video_edit_internal__long__p0002", "text": "Make the young woman turn into sand and blow away.", "dataset": "video_edit_internal", "category": "long", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/long/d18378f1d7e4ca0e.mp4"}
38
+ {"prompt_id": "video_edit_internal__long__p0003", "text": "Make the bird flap its wings", "dataset": "video_edit_internal", "category": "long", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/long/3835b37b43f5e5bf.mp4"}
39
+ {"prompt_id": "video_edit_internal__long__p0004", "text": "Transform the video into a ukiyo-e style", "dataset": "video_edit_internal", "category": "long", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/long/09fe5bb4b5304b66.mp4"}
40
+ {"prompt_id": "video_edit_internal__movie_concept_art__p0000", "text": "Add more blood and wounds to the mans face.", "dataset": "video_edit_internal", "category": "movie_concept_art", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/movie_concept_art/1d1a99167475720b.mp4"}
41
+ {"prompt_id": "video_edit_internal__movie_concept_art__p0001", "text": "Make the scene less dark.", "dataset": "video_edit_internal", "category": "movie_concept_art", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/movie_concept_art/10cb44d8c0bf4116.mp4"}
42
+ {"prompt_id": "video_edit_internal__movie_concept_art__p0002", "text": "Replace the female warrior with a male warrior with ginger hair.", "dataset": "video_edit_internal", "category": "movie_concept_art", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/movie_concept_art/9e45454390c20b8a.mp4"}
43
+ {"prompt_id": "video_edit_internal__movie_concept_art__p0003", "text": "Turn the man's hand into a robotic hand.", "dataset": "video_edit_internal", "category": "movie_concept_art", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/movie_concept_art/99977e7a91a950b4.mp4"}
44
+ {"prompt_id": "video_edit_internal__real_estate__p0000", "text": "Replace the interior with a gold-black interior heavy luxury style.", "dataset": "video_edit_internal", "category": "real_estate", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/real_estate/869064ab06bb5daa.mp4"}
45
+ {"prompt_id": "video_edit_internal__real_estate__p0001", "text": "Replace the grey wallpaper with a beige painted wall and turn the grey curtains a dark brown.", "dataset": "video_edit_internal", "category": "real_estate", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/real_estate/1c2f358bfe9b8299.mp4"}
46
+ {"prompt_id": "video_edit_internal__real_estate__p0002", "text": "Remove all decoration from the walls and keep only the furniture.", "dataset": "video_edit_internal", "category": "real_estate", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/real_estate/2058bcf38389f8fe.mp4"}
47
+ {"prompt_id": "video_edit_internal__real_estate__p0003", "text": "Exchange the wooden floor for a marble floor.", "dataset": "video_edit_internal", "category": "real_estate", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/real_estate/6a4c09a23dda57d9.mp4"}
48
+ {"prompt_id": "video_edit_internal__real_estate__p0004", "text": "Replace the bedframe with a modern wooden bed.", "dataset": "video_edit_internal", "category": "real_estate", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/real_estate/3e0f6dc5df891001.mp4"}
49
+ {"prompt_id": "video_edit_internal__style_transfer__p0000", "text": "Transform the video into a cyberpunk style", "dataset": "video_edit_internal", "category": "style_transfer", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/style_transfer/2253f6ed3674f006.mp4"}
50
+ {"prompt_id": "video_edit_internal__style_transfer__p0001", "text": "Convert to different shades of orange", "dataset": "video_edit_internal", "category": "style_transfer", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/style_transfer/edb6a105be03bae0.mp4"}
51
+ {"prompt_id": "video_edit_internal__style_transfer__p0002", "text": "Convert to black and white", "dataset": "video_edit_internal", "category": "style_transfer", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/style_transfer/c3dc058b3be26cbd.mp4"}
52
+ {"prompt_id": "video_edit_internal__style_transfer__p0003", "text": "Apply Ghibli-style editing to the video", "dataset": "video_edit_internal", "category": "style_transfer", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/style_transfer/83a638223a20911c.mp4"}
53
+ {"prompt_id": "video_edit_internal__style_transfer__p0004", "text": "Relight the scene as if it were shot during golden hour, with warm low-angle sunlight, soft shadows, and natural highlights on faces and surfaces.", "dataset": "video_edit_internal", "category": "style_transfer", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/style_transfer/daa36567634ca6be.mp4"}
54
+ {"prompt_id": "video_edit_internal__subject_editing__p0000", "text": "Replace the rainbow colors of the logo with different shades of purple", "dataset": "video_edit_internal", "category": "subject_editing", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/subject_editing/6358f26b46baadf5.mp4"}
55
+ {"prompt_id": "video_edit_internal__subject_editing__p0001", "text": "Add a small dog running beside the scooter", "dataset": "video_edit_internal", "category": "subject_editing", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/subject_editing/052c0bfd7b68fea7.mp4"}
56
+ {"prompt_id": "video_edit_internal__subject_editing__p0002", "text": "Replace the splashing waves with a calm water surface", "dataset": "video_edit_internal", "category": "subject_editing", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/subject_editing/c3f79578a39f415d.mp4"}
57
+ {"prompt_id": "video_edit_internal__subject_editing__p0003", "text": "Add a violinist in the background", "dataset": "video_edit_internal", "category": "subject_editing", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/subject_editing/a0eebf32a076e2fc.mp4"}
58
+ {"prompt_id": "video_edit_internal__subject_editing__p0004", "text": "Add a group of people walking on the pathway", "dataset": "video_edit_internal", "category": "subject_editing", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/subject_editing/3c2b7e3a5b284e1d.mp4"}
59
+ {"prompt_id": "video_edit_internal__subject_motion_editing__p0000", "text": "Make the bird hop around instead of walking and foraging", "dataset": "video_edit_internal", "category": "subject_motion_editing", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/subject_motion_editing/ac38b2a97d1a5c3a.mp4"}
60
+ {"prompt_id": "video_edit_internal__subject_motion_editing__p0001", "text": "The male colleague is walking around to observe.", "dataset": "video_edit_internal", "category": "subject_motion_editing", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/subject_motion_editing/8aaab7d304c5ad99.mp4"}
61
+ {"prompt_id": "video_edit_internal__subject_motion_editing__p0002", "text": "Make the static spider-man in the mural dynamic and make him swing faster", "dataset": "video_edit_internal", "category": "subject_motion_editing", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/subject_motion_editing/3412b39686fd5879.mp4"}
62
+ {"prompt_id": "video_edit_internal__subject_motion_editing__p0003", "text": "Change the woman's jogging to taking off.", "dataset": "video_edit_internal", "category": "subject_motion_editing", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/subject_motion_editing/17c4dc0514772321.mp4"}
63
+ {"prompt_id": "video_edit_internal__subject_motion_editing__p0004", "text": "Make the knight lunging forward and the creature swiping at the knight", "dataset": "video_edit_internal", "category": "subject_motion_editing", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/subject_motion_editing/980354550011911b.mp4"}
64
+ {"prompt_id": "video_edit_internal__synthetic_data__p0000", "text": "Turn the scene into nighttime.", "dataset": "video_edit_internal", "category": "synthetic_data", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/synthetic_data/e3b1e603bfaa1aec.mp4"}
65
+ {"prompt_id": "video_edit_internal__synthetic_data__p0001", "text": "Remove the crosswalk.", "dataset": "video_edit_internal", "category": "synthetic_data", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/synthetic_data/30df5fd5fe28af65.mp4"}
66
+ {"prompt_id": "video_edit_internal__synthetic_data__p0002", "text": "Add a bicycle riding in front of the car.", "dataset": "video_edit_internal", "category": "synthetic_data", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/synthetic_data/d093491e25682b3a.mp4"}
67
+ {"prompt_id": "video_edit_internal__synthetic_data__p0003", "text": "Turn the scene into a snowstorm scene.", "dataset": "video_edit_internal", "category": "synthetic_data", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/synthetic_data/1da5913f13362f8d.mp4"}
68
+ {"prompt_id": "video_edit_internal__synthetic_data__p0004", "text": "Make it rain in the scene.", "dataset": "video_edit_internal", "category": "synthetic_data", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/synthetic_data/936bdb89558f5a7f.mp4"}
69
+ {"prompt_id": "video_edit_internal__text__p0000", "text": "Add the text \"True Love\" in the foreground in pink romantic font.", "dataset": "video_edit_internal", "category": "text", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/text/c763407793ca9b0e.mp4"}
70
+ {"prompt_id": "video_edit_internal__text__p0001", "text": "Replace any mention of \"Fanta\" with the branding \"Cola\".", "dataset": "video_edit_internal", "category": "text", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/text/7b878ea6d99834b2.mp4"}
71
+ {"prompt_id": "video_edit_internal__text__p0002", "text": "Remove all text from the video.", "dataset": "video_edit_internal", "category": "text", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/text/76763c31b2609109.mp4"}
72
+ {"prompt_id": "video_edit_internal__text__p0003", "text": "Replace the branding \"Royalty\" with the phrasing \"Princess\".", "dataset": "video_edit_internal", "category": "text", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/text/d221d299c9e49064.mp4"}
73
+ {"prompt_id": "video_edit_internal__text__p0004", "text": "Remove all text from the video.", "dataset": "video_edit_internal", "category": "text", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/text/5c169901af8e4ed6.mp4"}
74
+ {"prompt_id": "video_edit_internal__transitions__p0000", "text": "After a black screen transition, the road transforms into lush grass.", "dataset": "video_edit_internal", "category": "transitions", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/transitions/964c35b19ee1fc1f.mp4"}
75
+ {"prompt_id": "video_edit_internal__transitions__p0001", "text": "After a wave-foam transition, the small fishing boat is eaten by a giant whale.", "dataset": "video_edit_internal", "category": "transitions", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/transitions/b8b88f43316363f3.mp4"}
76
+ {"prompt_id": "video_edit_internal__transitions__p0002", "text": "Add a cut transition, then show a bowl of ramen topped with parsley.", "dataset": "video_edit_internal", "category": "transitions", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/transitions/c823d6c77bdc87f4.mp4"}
77
+ {"prompt_id": "video_edit_internal__transitions__p0003", "text": "Add a smoke transition, then show the circuit board burning.", "dataset": "video_edit_internal", "category": "transitions", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/transitions/edb9927ff06c1175.mp4"}
78
+ {"prompt_id": "video_edit_internal__transitions__p0004", "text": "After a smoke transition, the Basilica of the Sacred Heart of Paris catches fire.", "dataset": "video_edit_internal", "category": "transitions", "source_video": "https://d2j1a65dna040x.cloudfront.net/benchmark_inputs/video_edit_internal/transitions/77bb900383d4f370.mp4"}
model_display.py CHANGED
@@ -95,6 +95,15 @@ MODEL_DISPLAY_NAMES = {
95
  "P-Video Edit Final (draft)": "P-Video-Edit Draft",
96
  "p_video_edit_preview__replicate_final": "P-Video-Edit",
97
  "p_video_edit_preview__replicate_final__draft": "P-Video-Edit Draft",
 
 
 
 
 
 
 
 
 
98
  # Others overlapping P-Bench
99
  "z_image": "Z-Image",
100
  "glm_image": "GLM-Image",
 
95
  "P-Video Edit Final (draft)": "P-Video-Edit Draft",
96
  "p_video_edit_preview__replicate_final": "P-Video-Edit",
97
  "p_video_edit_preview__replicate_final__draft": "P-Video-Edit Draft",
98
+ # Video-to-video leaderboard
99
+ "gemini_omni_flash_edit__fal": "Gemini Omni Flash Edit",
100
+ "grok_imagine_video__replicate": "Grok Imagine Video",
101
+ "happyhorse_1_0__wavespeed": "HappyHorse 1.0",
102
+ "ltx_2_3_quality_reference_video_to_video__fal": "LTX 2.3 Video Edit",
103
+ "lucy_edit_pro__fal": "Lucy Edit Pro",
104
+ "minimax_h3_reference_to_video__fal": "MiniMax H3 Reference-to-Video",
105
+ "seedance_2_5_video_edit_turbo__wavespeed": "Seedance 2.5 Video Edit Turbo",
106
+ "wan_2_7_video_edit__wavespeed": "Wan 2.7 Video Edit",
107
  # Others overlapping P-Bench
108
  "z_image": "Z-Image",
109
  "glm_image": "GLM-Image",
ui.py CHANGED
@@ -86,7 +86,9 @@ There is no single score across P-Bench.
86
  and lower price (or time). Only datasets with price or generation time
87
  can open this tab (not Arena AI).
88
  4. **Samples**: the same prompts, side by side. Only for datasets we
89
- generated (Qwen Image Dataset and OneIG Alignment Dataset).
 
 
90
 
91
  ## How a score is made
92
 
@@ -113,8 +115,8 @@ e-commerce, real estate, concept art, and similar work. The suite also
113
  covers camera-angle and movement changes, lighting, and text in video
114
  (altering, adding, or removing it). Quality is Datapoint Elo from
115
  pairwise preference. Price is USD per second of output video;
116
- generation time is wall time per second of output video. Samples are
117
- not shown yet.
118
 
119
  ### Qwen Image Dataset
120
  100 prompts from the 1,000-prompt Qwen Image Bench set, sampled for coverage
@@ -179,14 +181,18 @@ models *within* a Dataset | Metric view.
179
  - **Prompt counts:** OneIG Alignment uses 100 anime, 100 human, and 99 object
180
  prompts (299 total). Qwen Image Dataset uses 100 prompts sampled from the
181
  1,000-prompt pool for roughly even coverage of its fine-grained (L3)
182
- categories. Artificial Analysis and Arena AI use their own private prompt
183
- sets.
 
 
184
  - **Generation (Qwen and OneIG):** one image per prompt per endpoint when
185
  the run exists. Default resolution is 1024×1024. Exceptions: FLUX 1.1 Pro
186
  Ultra at 2K, FLUX 2 Flex at 1008×1008, and any endpoint labeled 2K. The
187
  seed is derived from the prompt, so every model gets the same seed for the
188
  same prompt. Steps, CFG, prompt rewrite, and safety filters follow each
189
  endpoint's default. This does not describe Artificial Analysis or Arena AI.
 
 
190
  - **Datapoint (Qwen and OneIG):** every model pair is compared on every
191
  prompt, with 10 votes per battle.
192
  - **Rapidata (Qwen and OneIG):** prompts longer than 400 characters are
@@ -324,7 +330,37 @@ def _sample_model_ids(datasets, dataset_id):
324
  samples = dataset.get("samples") if dataset else None
325
  if not samples:
326
  return set()
327
- return set(samples.get("models") or [])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
328
 
329
 
330
  def _pareto_price_column(data):
@@ -1205,15 +1241,48 @@ def _samples_html(samples, selected_models, num_prompts, seed=0):
1205
  return _pareto_unavailable_html(
1206
  "Samples aren't available for this dataset."
1207
  )
1208
- images = samples.get("images", {})
1209
- models = [model for model in (selected_models or []) if model in images]
 
 
 
1210
  if not models:
1211
- models = (samples.get("models") or [])[:2]
1212
  return _build_compare_samples_html(samples, models, num_prompts, seed)
1213
 
1214
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1215
  def _build_compare_samples_html(samples, selected_models, num_prompts, seed=0):
1216
  selected_models = list(selected_models or [])[:MAX_COMPARE_MODELS]
 
 
 
1217
 
1218
  if not selected_models:
1219
  return (
@@ -1224,7 +1293,7 @@ def _build_compare_samples_html(samples, selected_models, num_prompts, seed=0):
1224
 
1225
  shared_prompt_ids = None
1226
  for model in selected_models:
1227
- model_prompt_ids = set(samples["images"][model])
1228
  shared_prompt_ids = (
1229
  model_prompt_ids
1230
  if shared_prompt_ids is None
@@ -1244,29 +1313,31 @@ def _build_compare_samples_html(samples, selected_models, num_prompts, seed=0):
1244
  rng.shuffle(prompt_pool)
1245
  chosen = prompt_pool[: max(1, min(int(num_prompts), len(prompt_pool)))]
1246
 
1247
- columns = len(selected_models)
1248
  blocks = []
1249
  for index, prompt_id in enumerate(chosen, start=1):
1250
  prompt_text = escape(samples["prompts"].get(prompt_id, ""))
1251
  cells = []
 
 
 
 
 
 
 
1252
  for model in selected_models:
1253
- image_url = escape(samples["images"][model][prompt_id], quote=True)
1254
  cells.append(
1255
- f"""
1256
- <div class="compare-cell">
1257
- <div class="compare-model-label">{escape(display_model_name(model))}</div>
1258
- <a href="{image_url}" target="_blank" rel="noopener noreferrer">
1259
- <img src="{image_url}" alt="{escape(display_model_name(model))} sample" loading="lazy" />
1260
- </a>
1261
- </div>
1262
- """
1263
  )
 
1264
  blocks.append(
1265
  f"""
1266
  <div class="compare-prompt-block">
1267
  <div class="compare-prompt-meta">
1268
  <span>Prompt {index}</span>
1269
- <span>{escape(prompt_id)}</span>
1270
  </div>
1271
  <p class="compare-prompt-text">{prompt_text}</p>
1272
  <div class="compare-row" style="grid-template-columns: repeat({columns}, minmax(0, 1fr));">
@@ -1524,7 +1595,8 @@ def render_image_workspace(datasets, metrics, default_dataset_id, default_metric
1524
  with gr.Column(visible=bool(initial_samples)) as samples_panel:
1525
  gr.Markdown(
1526
  f"<p class='view-help'>"
1527
- f"The same prompts, side by side. Select up to "
 
1528
  f"<strong>{MAX_COMPARE_MODELS}</strong> models above, or leave "
1529
  f"Models empty for two defaults."
1530
  f"</p>",
 
86
  and lower price (or time). Only datasets with price or generation time
87
  can open this tab (not Arena AI).
88
  4. **Samples**: the same prompts, side by side. Only for datasets we
89
+ generated (Qwen Image Dataset, OneIG Alignment Dataset, and the
90
+ Pruna Internal Video-Edit Benchmark). Video samples show the source
91
+ clip first, then each model's edit.
92
 
93
  ## How a score is made
94
 
 
115
  covers camera-angle and movement changes, lighting, and text in video
116
  (altering, adding, or removing it). Quality is Datapoint Elo from
117
  pairwise preference. Price is USD per second of output video;
118
+ generation time is wall time per second of output video. Samples show
119
+ the source clip beside each model's edit.
120
 
121
  ### Qwen Image Dataset
122
  100 prompts from the 1,000-prompt Qwen Image Bench set, sampled for coverage
 
181
  - **Prompt counts:** OneIG Alignment uses 100 anime, 100 human, and 99 object
182
  prompts (299 total). Qwen Image Dataset uses 100 prompts sampled from the
183
  1,000-prompt pool for roughly even coverage of its fine-grained (L3)
184
+ categories. The Pruna Internal Video-Edit Benchmark uses 78 prompts
185
+ across advertising, e-commerce, real estate, camera, lighting, text, and
186
+ related categories. Artificial Analysis and Arena AI use their own
187
+ private prompt sets.
188
  - **Generation (Qwen and OneIG):** one image per prompt per endpoint when
189
  the run exists. Default resolution is 1024×1024. Exceptions: FLUX 1.1 Pro
190
  Ultra at 2K, FLUX 2 Flex at 1008×1008, and any endpoint labeled 2K. The
191
  seed is derived from the prompt, so every model gets the same seed for the
192
  same prompt. Steps, CFG, prompt rewrite, and safety filters follow each
193
  endpoint's default. This does not describe Artificial Analysis or Arena AI.
194
+ - **Generation (Video-Edit):** one edited clip per prompt per endpoint when
195
+ the run exists. Every model sees the same source video for a prompt.
196
  - **Datapoint (Qwen and OneIG):** every model pair is compared on every
197
  prompt, with 10 votes per battle.
198
  - **Rapidata (Qwen and OneIG):** prompts longer than 400 characters are
 
330
  samples = dataset.get("samples") if dataset else None
331
  if not samples:
332
  return set()
333
+ models = set(samples.get("models") or [])
334
+ return models | {display_model_name(model) for model in models}
335
+
336
+
337
+ def _sample_media_map(samples):
338
+ return (samples or {}).get("images") or {}
339
+
340
+
341
+ def _resolve_sample_model(samples, model):
342
+ media = _sample_media_map(samples)
343
+ if model in media:
344
+ return model
345
+ wanted = {str(model or "").strip(), display_model_name(model)}
346
+ wanted.discard("")
347
+ for key in media:
348
+ if key in wanted or display_model_name(key) in wanted:
349
+ return key
350
+ return None
351
+
352
+
353
+ def _default_sample_models(samples):
354
+ models = list((samples or {}).get("models") or [])
355
+ preferred = [model for model in models if _is_pruna_model(model)]
356
+ preferred.sort(
357
+ key=lambda model: (
358
+ "draft" in str(model).casefold()
359
+ or "draft" in display_model_name(model).casefold(),
360
+ display_model_name(model).casefold(),
361
+ )
362
+ )
363
+ return (preferred or models)[:2]
364
 
365
 
366
  def _pareto_price_column(data):
 
1241
  return _pareto_unavailable_html(
1242
  "Samples aren't available for this dataset."
1243
  )
1244
+ models = [
1245
+ resolved
1246
+ for model in (selected_models or [])
1247
+ if (resolved := _resolve_sample_model(samples, model))
1248
+ ]
1249
  if not models:
1250
+ models = _default_sample_models(samples)
1251
  return _build_compare_samples_html(samples, models, num_prompts, seed)
1252
 
1253
 
1254
+ def _compare_media_html(url, label, *, kind):
1255
+ safe_url = escape(url, quote=True)
1256
+ safe_label = escape(label)
1257
+ if kind == "video":
1258
+ return (
1259
+ f'<video src="{safe_url}" controls preload="metadata" '
1260
+ f'playsinline></video>'
1261
+ )
1262
+ return (
1263
+ f'<a href="{safe_url}" target="_blank" rel="noopener noreferrer">'
1264
+ f'<img src="{safe_url}" alt="{safe_label} sample" loading="lazy" />'
1265
+ f"</a>"
1266
+ )
1267
+
1268
+
1269
+ def _compare_cell_html(label, url, *, kind, extra_class=""):
1270
+ classes = "compare-cell"
1271
+ if extra_class:
1272
+ classes = f"{classes} {extra_class}"
1273
+ return f"""
1274
+ <div class="{classes}">
1275
+ <div class="compare-model-label">{escape(label)}</div>
1276
+ {_compare_media_html(url, label, kind=kind)}
1277
+ </div>
1278
+ """
1279
+
1280
+
1281
  def _build_compare_samples_html(samples, selected_models, num_prompts, seed=0):
1282
  selected_models = list(selected_models or [])[:MAX_COMPARE_MODELS]
1283
+ media = _sample_media_map(samples)
1284
+ kind = (samples or {}).get("kind") or "image"
1285
+ source_videos = (samples or {}).get("source_videos") or {}
1286
 
1287
  if not selected_models:
1288
  return (
 
1293
 
1294
  shared_prompt_ids = None
1295
  for model in selected_models:
1296
+ model_prompt_ids = set(media.get(model) or [])
1297
  shared_prompt_ids = (
1298
  model_prompt_ids
1299
  if shared_prompt_ids is None
 
1313
  rng.shuffle(prompt_pool)
1314
  chosen = prompt_pool[: max(1, min(int(num_prompts), len(prompt_pool)))]
1315
 
 
1316
  blocks = []
1317
  for index, prompt_id in enumerate(chosen, start=1):
1318
  prompt_text = escape(samples["prompts"].get(prompt_id, ""))
1319
  cells = []
1320
+ source_url = source_videos.get(prompt_id)
1321
+ if source_url:
1322
+ cells.append(
1323
+ _compare_cell_html(
1324
+ "Source", source_url, kind="video", extra_class="compare-source"
1325
+ )
1326
+ )
1327
  for model in selected_models:
 
1328
  cells.append(
1329
+ _compare_cell_html(
1330
+ display_model_name(model),
1331
+ media[model][prompt_id],
1332
+ kind=kind,
1333
+ )
 
 
 
1334
  )
1335
+ columns = len(cells)
1336
  blocks.append(
1337
  f"""
1338
  <div class="compare-prompt-block">
1339
  <div class="compare-prompt-meta">
1340
  <span>Prompt {index}</span>
 
1341
  </div>
1342
  <p class="compare-prompt-text">{prompt_text}</p>
1343
  <div class="compare-row" style="grid-template-columns: repeat({columns}, minmax(0, 1fr));">
 
1595
  with gr.Column(visible=bool(initial_samples)) as samples_panel:
1596
  gr.Markdown(
1597
  f"<p class='view-help'>"
1598
+ f"The same prompts, side by side. Video edits show the "
1599
+ f"source clip first. Select up to "
1600
  f"<strong>{MAX_COMPARE_MODELS}</strong> models above, or leave "
1601
  f"Models empty for two defaults."
1602
  f"</p>",