Skip to content
 
 

Repository files navigation

VMEvalKit πŸŽ₯🧠

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 Framework

🎬 Supported Models

VMEvalKit provides unified access to 40 video generation models across 11 provider families:

Commercial APIs (32 models)

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)

Open-Source Models

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

πŸ“Š Supported Datasets

VMEvalKit provides access to 3 external benchmark datasets and 6 local task generation engines:

External Benchmarks (HuggingFace)

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)

Local Task Generation Engines

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.

Basic Idea

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.

Installation & Setup

  1. Clone the repository
git clone https://github.com/hokindeng/VMEvalKit.git
cd VMEvalKit
  1. Initialize submodules - good for optional open-source models and datasets
git submodule update --init --recursive
  1. Configure environment - Copy the example environment file and add your API keys
cp env.template .env
  1. Set up Python environment – Recommended: use a fresh virtual environment
python -m venv venv
source venv/bin/activate

Alternatively, you can use other tools like uv for faster install (uv venv), or conda if your usecase has cross-language dependencies.

  1. 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.

πŸš€ Quick Start - End-to-End Example

Here's a complete workflow from creating questions to scoring results:

1️⃣ Create Questions

# 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

2️⃣ Generate Videos

# 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

3️⃣ Score Results

# 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

4️⃣ View Results

# Launch web dashboard to explore results
cd web && ./start.sh
# Open http://localhost:5000 in your browser

5️⃣ (Optional) Sync with Cloud

# AWS S3 (enterprise backup)
python data/s3_sync.py --log

That'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 2 for quick testing
  • Use --task-id chess_0001 to run specific questions
  • Try different models: --model openai-sora-2 veo-3.0-generate

Examples

Solving Chess

Chess Example

Solving Maze

Maze Example

Mental Rotation

Rotation Example

Raven's Matrices

Raven Example

Sudoku Solving

Sudoku Example

Tasks

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.

Task Pair Structure

Inference Architecture

πŸš€ Quick Start

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

πŸ—οΈ System Design

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                               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.

Scoring Pipeline

Example Usage

# 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.

Dataset Management

Dataset Structure

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

Synchronization

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 timestamp

See Data Management for details.

Display Results

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.py

See Web Dashboard for details.

Add Models or Tasks

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_path

Then 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.

Invitation to Collaborate 🀝

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 πŸš€

Documentation

πŸ“š Core Documentation:

Research

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.

License

Apache 2.0

About

This is a framework for evaluating reasoning in foundational Video Models.

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages