A FLUX 3 Action video model fine-tuned on AgiBot World Beta head-camera clips (k past frames + task caption → 33 future frames, 15 fps, 384×512), then retrofitted as a Looped-DiT whose 9 core blocks run N times per denoising step. Two evaluations, each a page with videos, cover every looped checkpoint we trained; a third page sweeps noise seeds over the random-depth long run. Code and notes: naomili0924/looped-dit-video, folder agibot-flux3/.
Test split, 100 windows, k = 1 and 9, the model sampled at loop depth N = 1, 2, 4, 8: PSNR / SSIM / LPIPS, FVD (300 windows), a VLM judge, validation curves, the training recipe, and 8 fixed test windows as strips GT | base | fine-tuned | N = 1 | 2 | 4 | 8.
Zero-shot: one real frame and one prompt, four 33-frame windows chained autoregressively to 8.8 s. 8 test cases × 3 prompts (the real caption and two alternatives) × loop depths 1, 2, 4, 8, 16 next to the ground truth, the base model and the Phase-3 fine-tune.
The long rollout of the random-depth (N 1–8) long run, repeated over 5 noise seeds at every checkpoint (steps 3000–9500): 5 × 5 seed-by-depth grid videos per case and prompt, and per depth the distance to the ground truth, its spread over seeds, motion and the LPIPS diversity between seeds. What it learns and fails to learn: findings.
Capability eval of the random-depth long run (step 9500) on never-trained episodes: asked for a different action in the same scene, the rollout mostly does the episode's own action, at every loop depth N = 1–8. Prompt understanding, dynamics (smoothness, window seams, object motion) and video quality per depth: no dimension improves meaningfully, and N = 8 hurts unseen tasks. Video examples and the numbers over 25 cases: findings.
| model | tag | step | trained N | weights (Hugging Face) · inference config | evaluations |
|---|---|---|---|---|---|
| looped, 2500 steps r1: trained at N = 4 with deep supervision, 500-step cooldown over steps 2000-2500 (0.5 epoch); 2 x A100. | loop2500 | 2500 | 4 | Jinyan0924/flux3-agibot-looped/ema_loop2500_step-2500.safetensorsconfigs/looped_ft_384_r1.json | normal eval · long rollout: not run |
| looped, 4500 steps r2: resumed from r1's step 2000, constant learning rate, stopped at step 4500 without cooldown (0.9 epoch); 2 x H100. | loop4500 | 4500 | 4 | Jinyan0924/flux3-agibot-looped/ema_loop4500_step-4500.safetensorsconfigs/looped_ft_384_r2.json | normal eval · long rollout |
| random depth N 1–8, step 2500 trained on another box with the loop depth sampled in 1-8 per step and a new loss; its training code is not in this repo, the config here is inference-only. | rand2500 | 2500 | 1, 2, 3, 4, 5, 6, 7, 8 | Jinyan0924/flux3-agibot-looped/random_depth_n1-8/ema_step-2500.safetensorsconfigs/looped_ft_384_random_n1-8.json | normal eval: not run · long rollout |
All looped models start from the Phase-3 fine-tune (Jinyan0924/flux3-agibot-videoft, ema_step-6000.safetensors), blocks split 12 / 9 / 12 with head-wise attention gates in the 9 core blocks. The EMA weights are what is evaluated; the loop depth is a sampling-time argument.
| model | k1 PSNR ↑ | SSIM ↑ | LPIPS ↓ | FVD ↓ | judge ↑ | k9 PSNR ↑ | k9 LPIPS ↓ |
|---|---|---|---|---|---|---|---|
| base FLUX 3 Action, zero-shot (N = 1) | 17.03 | 0.664 | 0.288 | 407.6 | 0.38 | 20.16 | 0.168 |
| fine-tuned 6000 steps, Phase 3 (N = 1) | 19.83 | 0.805 | 0.166 | 166.9 | 0.46 | 21.77 | 0.123 |
| looped, 2500 steps, N = 1 | 19.97 | 0.805 | 0.166 | 164.2 | 0.43 | 21.82 | 0.121 |
| looped, 2500 steps, N = 2 | 20.02 | 0.808 | 0.161 | 162.0 | 0.43 | 21.75 | 0.121 |
| looped, 2500 steps, N = 4 | 20.00 | 0.807 | 0.162 | 157.1 | 0.39 | 21.78 | 0.120 |
| looped, 2500 steps, N = 8 | 20.03 | 0.803 | 0.164 | 159.2 | 0.42 | 21.73 | 0.122 |
| looped, 4500 steps, N = 1 | 19.74 | 0.804 | 0.168 | 166.3 | 0.39 | 21.91 | 0.120 |
| looped, 4500 steps, N = 2 | 19.94 | 0.808 | 0.162 | 154.4 | 0.46 | 21.85 | 0.120 |
| looped, 4500 steps, N = 4 | 19.93 | 0.807 | 0.163 | 150.5 | 0.40 | 21.78 | 0.121 |
| looped, 4500 steps, N = 8 | 20.05 | 0.807 | 0.161 | 151.5 | 0.40 | 21.79 | 0.122 |
k = 1: PSNR / SSIM / LPIPS on 100 windows, FVD on 300, judge adherence on 100 (yes-rate with the true caption minus yes-rate with a swapped caption). Shaded rows: the depth the model was trained at. Full tables per split in results/RESULTS.md; the Trained Loop Depth page has the per-depth and validation tables.
Both run on the box that holds the repo (two GPUs, the Phase-3 EMA and the Qwen3-VL text encoder under flux-action/outputs/weights); the full guide with prerequisites is EVAL.md. A checkpoint is named by a tag, its training step, its inference config and its EMA file (local or hf://user/repo/path).
# normal eval (≈ 2.5 h on 2 H100s) → docs/loop-depth HF_TOKEN=... scripts/normal_eval.sh <tag> <step> <config> <ema> ["label"] ["trained depths, e.g. 4"] # long-rollout eval (≈ 35 min on 2 H100s) → docs/long-rollout HF_TOKEN=... scripts/run_long_rollout.sh <tag> <config> <ema> # env: STEP, LABEL, TRAINED # both end by rebuilding this site (scripts/build_pages.sh); publish it: GH_TOKEN=... scripts/push_all.sh "agibot-flux3: eval of <tag>"
Models are registered in configs/models.json (tag, step, label, trained depths, config, weights); the wrappers add new tags automatically. Example for the random-depth model: scripts/normal_eval.sh rand2500 2500 configs/looped_ft_384_random_n1-8.json hf://Jinyan0924/flux3-agibot-looped/random_depth_n1-8/ema_step-2500.safetensors "random depth N 1–8, step 2500" 1,2,3,4,5,6,7,8.
Jinyan0924/flux3-agibot-looped, Jinyan0924/flux3-agibot-videoft (Hugging Face). Sampling: Euler 30 steps, CFG 4, shift 5, seed 0.