AgiBot World Beta · FLUX 3 Action 7B · Looped-DiT retrofit · evaluation pages

Looped FLUX 3 Action on AgiBot

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

say “normal eval”

Trained Loop Depth

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.

say “long-rollout eval”

Long Rollout

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.

say “seed sweep”

Random-Depth Seed Sweep

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.

say “changed prompts”

Changed Prompts and Loop Depth

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.

Models

modeltagsteptrained Nweights (Hugging Face) · inference configevaluations
looped, 2500 steps
r1: trained at N = 4 with deep supervision, 500-step cooldown over steps 2000-2500 (0.5 epoch); 2 x A100.
loop250025004Jinyan0924/flux3-agibot-looped/ema_loop2500_step-2500.safetensors
configs/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.
loop450045004Jinyan0924/flux3-agibot-looped/ema_loop4500_step-4500.safetensors
configs/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.
rand250025001, 2, 3, 4, 5, 6, 7, 8Jinyan0924/flux3-agibot-looped/random_depth_n1-8/ema_step-2500.safetensors
configs/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.

Headline numbers, test split

modelk1 PSNR ↑SSIM ↑LPIPS ↓FVD ↓judge ↑k9 PSNR ↑k9 LPIPS ↓
base FLUX 3 Action, zero-shot (N = 1)17.030.6640.288407.60.3820.160.168
fine-tuned 6000 steps, Phase 3 (N = 1)19.830.8050.166166.90.4621.770.123
looped, 2500 steps, N = 119.970.8050.166164.20.4321.820.121
looped, 2500 steps, N = 220.020.8080.161162.00.4321.750.121
looped, 2500 steps, N = 420.000.8070.162157.10.3921.780.120
looped, 2500 steps, N = 820.030.8030.164159.20.4221.730.122
looped, 4500 steps, N = 119.740.8040.168166.30.3921.910.120
looped, 4500 steps, N = 219.940.8080.162154.40.4621.850.120
looped, 4500 steps, N = 419.930.8070.163150.50.4021.780.121
looped, 4500 steps, N = 820.050.8070.161151.50.4021.790.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.

How to run the evaluations

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.

Frames are from AgiBot World Beta (CC BY-NC-SA 4.0: attribution, non-commercial, share-alike). Weights: Jinyan0924/flux3-agibot-looped, Jinyan0924/flux3-agibot-videoft (Hugging Face). Sampling: Euler 30 steps, CFG 4, shift 5, seed 0.