A framework to score reasoning capabilities in video generation models at scale, through cognitive tasks. We make it very convenient to add models, add tasks, run inferences, run scoring, manage datasets and display results. It's permissively open-source, and we welcome everyone to join us and build in public together! π
π Leaderboard (Under Construction) β’ π Preliminary results
VMEvalKit provides unified access to 40 video generation models across 11 provider families:
| Provider | Models | Key Features |
|---|---|---|
| Luma Dream Machine | 2 | luma-ray-2, luma-ray-flash-2 |
| Google Veo | 3 | veo-2.0-generate, veo-3.0-generate, veo-3.0-fast-generate |
| Google Veo 3.1 | 4 | Native 1080p, audio generation (via WaveSpeed) |
| WaveSpeed WAN 2.1 | 8 | 480p/720p variants with LoRA and ultra-fast options |
| WaveSpeed WAN 2.2 | 10 | Enhanced 5B models, improved quality |
| Runway ML | 3 | Gen-3A Turbo, Gen-4 Turbo, Gen-4 Aleph |
| OpenAI Sora | 2 | Sora-2, Sora-2-Pro (4s/8s/12s durations) |
| Provider | Models | Key Features | Hardware Requirements |
|---|---|---|---|
| HunyuanVideo | 1 | High-quality 720p I2V | GPU with 24GB+ VRAM |
| VideoCrafter | 1 | Text-guided video synthesis | GPU with 16GB+ VRAM |
| DynamiCrafter | 3 | 256p/512p/1024p, image animation | GPU with 12-24GB VRAM |
| Stable Video Diffusion | 1 | Video generation | GPU with 16GB+ VRAM |
| Morphic | 1 | Video generation | GPU with 16GB+ VRAM |
| LTX-Video | 1 | Video generation | GPU with 16GB+ VRAM |
VMEvalKit provides access to 3 external benchmark datasets and 6 local task generation engines:
| Dataset | Tasks | Domains | Key Features |
|---|---|---|---|
| VideoThinkBench | ~4,000 | 4 subsets | Vision-centric (ARC-AGI, Eyeballing, Visual Puzzles) + Text-centric reasoning |
| MME-CoF | 59 | 16 domains | Video Chain-of-Frame reasoning across cognitive domains |
VideoThinkBench Subsets:
arc_agi_2- Abstract reasoning (1,000 tasks)eyeballing_puzzles- Visual estimation (1,050 tasks)visual_puzzles- Pattern recognition (496 tasks)text_centric_tasks- Math & multimodal reasoning (1,453 tasks)
| Task | Description | Generation Method |
|---|---|---|
| Chess | Strategic thinking & tactical patterns | Chess engine with mate-in-1 puzzles |
| Maze | Path-finding & navigation | Procedural maze generation (Kruskal's algorithm) |
| Raven | Abstract reasoning matrices | RAVEN dataset patterns |
| Rotation | 3D mental rotation | Procedural 3D object generation |
| Sudoku | Logical constraint satisfaction | Sudoku puzzle generator |
| Object Subtraction | Selective object removal | Multi-level cognitive reasoning |
All tasks follow the unified First Frame β Final Frame format with text prompts, enabling consistent evaluation across diverse reasoning domains.
VMEvalKit aims to provide an infrastructure for reasoning research in video models at scale:
- π― Task Creation at Scale: Create question dataset of many different cognitive tasks programmatically at scale and our framework makes sure the dataset to be well-organized.
- π Model Inference at Scale: Easy one-click inference of the entire question dataset across many video models (commercial APIs + open-source) with automatic resume, error handling, and structured output management, and automatically sync the inference results into the dataset.
- βοΈ Scoring Pipeline: Human scoring via web interface and AI scoring via automated MLLM scoring, also automatically sync the scoring results into the dataset.
- βοΈ Dataset Management: Manage question datasets from task creation, inference results from video models, and scoring results from humans or MLLM pipelines. Provides AWS S3 integration with version tracking and built-in logging for reproducibility.
We have completed running a question dataset of chess, maze, Sudoku, mental rotation, and Raven's Matrices on latest video models. Checkout our raw results videos on this website. Here are a few examples.
- Clone the repository
git clone https://github.com/hokindeng/VMEvalKit.git
cd VMEvalKit- Initialize submodules - good for optional open-source models and datasets
git submodule update --init --recursive- Configure environment - Copy the example environment file and add your API keys
cp env.template .env- Set up Python environment β Recommended: use a fresh virtual environment
python -m venv venv
source venv/bin/activateAlternatively, you can use other tools like uv for faster install (uv venv), or conda if your usecase has cross-language dependencies.
- Install dependencies:
pip install -r requirements.txt
pip install -e .For open-source video generation and evaluator models, please refer to Open Source Models for detailed installation instructions.
Here's a complete workflow from creating questions to scoring results:
# Generate 5 chess and maze questions each
python examples/create_questions.py --task chess maze --pairs-per-domain 5
# Output: Creates data/questions/ with chess_task/ and maze_task/ folders# List available models
python examples/generate_videos.py --list-models
# set Luma key in .env file
# Run on specific model (e.g., Luma Ray 2)
python examples/generate_videos.py --model luma-ray-2 --task chess maze
# Output: Creates data/outputs/pilot_experiment/ with generated videos# Option A: Human scoring via web interface
python examples/score_videos.py human
# Option B: Automated GPT-4O scoring
python examples/score_videos.py gpt4o# Launch web dashboard to explore results
cd web && ./start.sh
# Open http://localhost:5000 in your browser# AWS S3 (enterprise backup)
python data/s3_sync.py --logThat's it! You now have:
- β
Custom reasoning questions in
data/questions/ - β
Generated videos in
data/outputs/ - β
Scoring results in
data/scorings/ - β Interactive dashboard to explore everything
Tips:
- Start small:
--pairs-per-domain 2for quick testing - Use
--task-id chess_0001to run specific questions - Try different models:
--model openai-sora-2 veo-3.0-generate
Solving Chess
Solving Maze
Mental Rotation
Raven's Matrices
Sudoku Solving
Every VMEvalKit dataset consists of Task Pairs - the basic unit for video reasoning scoring:
Each Task Pair consists of three core components:
- πΈ Initial state image (
first_frame.png): shows the starting point or problem to be solved - π― Final state image (
final_frame.png): illustrates the goal state or solution - π Text prompt (
prompt.txt): provides natural language instructions for the video model
There is also an accompanying question_metadata.json file with rich metadata. Each task pair is organized in its own folder (data/questions/{domain}_task/{question_id}/) containing all four files.
from vmevalkit.runner.inference import InferenceRunner
# Initialize runner - creates structured output directories
runner = InferenceRunner(output_dir="data/outputs")
# Generate video showing reasoning process
result = runner.run(
model_name="luma-ray-2",
image_path="data/questions/maze_task/maze_0000/first_frame.png",
text_prompt="Navigate the green dot through the maze corridors to reach the red flag",
question_data={"id": "maze_0000", "domain": "maze"} # Optional metadata
)
# Each inference creates a self-contained output folder:
print(f"π Output folder: {result['inference_dir']}")
# Contains:
# βββ video/generated_video.mp4 # The generated video
# βββ question/ # Input data archive
# β βββ first_frame.png # Input image
# β βββ prompt.txt # Text prompt
# β βββ question_metadata.json # Task metadata
# βββ metadata.json # Complete inference recordβββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β InferenceRunner β
β Top-level orchestrator: manages workflow, batching, and output β
βββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Dynamic Model Loading (importlib)
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β MODEL_CATALOG β
β Unified model registry: β
β - Lists all available models (both API and open-source) β
β - Records provider family, wrapper paths, model meta-info β
β - No imports of implementations (pure config) β
βββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β importlib.import_module() dynamically loads
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Model Implementations (Two Flavors) β
β ββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββ β
β β Commercial Models β Open-Source Models β β
β β (Closed Source Services) β (Local Implementations) β β
β ββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββ€ β
β β LumaWrapper + LumaService β LTXVideoWrapper + LTXService β β
β β VeoWrapper + VeoService β HunyuanWrapper + HunyuanSvc β β
β β RunwayWrapper+ RunwayService β VideoCrafterWrapper+VCService β β
β β ... β DynamiCrafterWrapper+DynService β β
β ββββββββββββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββ β
β - Each Wrapper implements unified VMEvalKit interface β
β - API Services handle endpoints, retries, S3-upload (when needed) β
β - Open-source backends directly invoke local model code β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
See Inference Guide for details.
# Create questions for specific domains
python examples/create_questions.py --task chess maze --pairs-per-domain 10
# Generate videos with selected models
python examples/generate_videos.py --model luma-ray-2 veo-3.0-generate --task chess maze
# Score results
python examples/score_videos.py human
python examples/score_videos.py gpt4o
# Using runner modules directly
python -m vmevalkit.runner.score human \
--experiment pilot_experiment \
--annotator "John Doe" \
--port 7860 --share
python -m vmevalkit.runner.score gpt4o \
--experiment pilot_experiment \
--output-dir data/scorings \
--temperature 0.1 Use as Python Modules
from vmevalkit.eval import HumanScorer
scorer = HumanScorer(experiment_name="pilot_experiment")
scorer.launch_interface(share=True, port=7860)See Scoring Guide for details.
VMEvalKit uses a hierarchical structure for organizing all data:
data/
βββ questions/ # Task datasets
β βββ vmeval_dataset.json # Master dataset manifest
β βββ chess_task/ # Chess puzzles (mate-in-1 scenarios)
β β βββ chess_0000/
β β βββ first_frame.png # Initial chess position
β β βββ final_frame.png # Solution position
β β βββ prompt.txt # Move instructions
β β βββ question_metadata.json # Task metadata
β βββ maze_task/ # Maze solving challenges
β βββ raven_task/ # Raven's progressive matrices
β βββ rotation_task/ # 3D mental rotation
β βββ sudoku_task/ # Sudoku puzzles
β
βββ outputs/ # Model inference results
β βββ pilot_experiment/ # Experiment name
β βββ <model_name>/ # e.g., openai-sora-2, luma-ray-2
β βββ <domain>_task/ # e.g., chess_task
β βββ <task_id>/ # e.g., chess_0000
β βββ <run_id>/ # Timestamped run folder
β βββ video/
β β βββ model_output.mp4
β βββ question/
β β βββ prompt.txt
β β βββ first_frame.png
β βββ metadata.json
β
βββ scorings/ # Scoring results
β βββ pilot_experiment/
β βββ <model_name>/
β βββ <domain>_task/
β βββ <task_id>/
β βββ human-score.json # Human scoring scores
β βββ GPT4OScorer.json # GPT-4O scoring scores
β
βββ data_logging/ # Version tracking
βββ version_log.json # Version history
βββ versions/ # Version snapshots
Upload your dataset to S3:
# AWS S3
python data/s3_sync.py --log # Upload with version logging
python data/s3_sync.py --date 20250115 # Upload with specific timestampSee Data Management for details.
You could quickly host your results on an interactive dashboard at: http://localhost:5000
# Navigate to web directory
cd web
# Option 1: Use startup script (recommended)
./start.sh
# Option 2: Manual startup
source ../venv/bin/activate
python app.pySee Web Dashboard for details.
You can add new video generation models and reasoning tasks with minimal effort:
Adding New Models
Add any video generation model (API-based or open-source) with just a few steps:
# Example: Adding a new model wrapper
from vmevalkit.models.base import BaseVideoModel
class MyModelWrapper(BaseVideoModel):
def generate_video(self, image_path, text_prompt, **kwargs):
# Your model's video generation logic
return video_pathThen register it in MODEL_CATALOG.py:
"my-model": {
"provider": "mycompany",
"wrapper_path": "vmevalkit.models.my_model.MyModelWrapper",
...
}See Adding Models Guide for details.
Adding New Tasks
Create new reasoning tasks programmatically at scale:
from vmevalkit.tasks.base_task import BaseTask
class MyTask(BaseTask):
def generate_task_pair(self, ...):
# Generate initial and final states
initial_state = self.create_initial_state()
final_state = self.create_final_state()
prompt = self.create_prompt()
return {
"first_frame": initial_state,
"final_frame": final_state,
"prompt": prompt,
"metadata": {...}
}VMEvalKit handles all the dataset organization, inference pipelines, and evaluation infrastructure automatically.
See Adding Tasks Guide for details.
VMEvalKit is meant to be a permissively open-source shared playground for everyone. If youβre interested in machine cognition, video models, evaluation, or anything anything π¦β¨, weβd love to build with you:
- π§ͺ Add new reasoning tasks (planning, causality, social, physical, etc.)
- π₯ Plug in new video models (APIs or open-source)
- π Experiment with better evaluation metrics and protocols
- π§± Improve infrastructure, logging, and the web dashboard
- π Use VMEvalKit in your own research and share back configs/scripts
- ππ Or Anything anything π¦β¨
π¬ Join us on Slack to ask questions, propose ideas, or start a collab: Slack Invite π
π Core Documentation:
- Inference Guide - Complete guide to running inference, supported models, and architecture
- Scoring Guide - Human and automated scoring methods
- Data Management - Dataset organization, S3 sync, and version tracking
- Adding Models - How to add new video generation models
- Adding Tasks - How to create new reasoning tasks
- Web Dashboard - Interactive results visualization
Here we keep track of papers spinned off from this code infrastructure and some works in progress.
This paper implements our experimental framework and demonstrates that leading video generation models (Sora-2 etc) can perform visual reasoning tasks with >60% success rates. See results.
Apache 2.0






