Views
No views yet
ACTION, SHOT, STORYBOARD_PROMPT, H3_MODE: FL2VA, H3_VIDEO_PROMPT, overall_soundscape, non_diegetic_music, DURATION). Each beat maps 1:1 to a storyboard still + one ~5 s H3 FL2V clip.final/ adapter (story craft + TVTropes) on 836 H3-format SFT rows, so it keeps the old screenplay/trope knowledge and adds the MiniMax-H3 prompt format on top. Per the project's own guidance, that continue-train is the "practical merge of skills" (see docs/H3_FORMAT_README.md) — it is not a weighted merge of two separately-trained LoRAs.| Artifact | Description |
|---|---|
adapter_model.safetensors + adapter_config.json | The merged adapter (final, epoch 2) — load with PEFT |
tokenizer_config.json, tokenizer.json, chat_template.jinja | Qwen3.5 tokenizer + chat template (from base) |
training_config.json | Training metadata (init_from: …/final, base, hyperparams) |
checkpoint-105/ | Epoch-1 checkpoint (full trainer state, resumable) |
checkpoint-210/ | Epoch-2 checkpoint (== root adapter; full trainer state) |
scripts/ | train_script_lora_h3.py, build_sft_from_scriptlib.py, SFT dataset (train_dataset.full.jsonl, 836 rows) + seed examples |
docs/ | MiniMax H3 prompt guides (VIDEO_PROMPT_base-en.txt, VIDEO_PROMPT_ref-en.txt), h3_prompt_format.py (runtime field builders), H3_FORMAT_README.md |
Qwen/Qwen3.5-0.8B (Apache-2.0), 0.8B params, causal LM.r=16, alpha=32, dropout=0.1, target modules q/k/v/o_proj + gate/up/down_proj (193 tensors, 193 = standard PEFT layout).| Setting | Value |
|---|---|
| Format | minimax-h3-fl2va-v1 (SFT, chat template) |
| Init | Continue-train from models/script-lora/final adapter |
| Data | train_dataset.full.jsonl — 836 rows from 102 screenplays (scriptlib) + TVTropes seeds + hand-written H3 examples |
| Epochs / steps | 2 / 210 |
| Learning rate | 1e-4 (cosine decay) |
| Max seq len | 1536 |
| Optimizer | AdamW (non-fused, XPU) |
| Device | Intel Arc A770 (XPU) |
train_loss 0.7535, final-step mean_token_accuracy 0.8932; token accuracy ranged ~0.86–0.91 over the run. checkpoint-105 (epoch 1) and checkpoint-210 (epoch 2) are both included; the root adapter_model.safetensors is identical to checkpoint-210.1## SCENE {N} — {SLUGLINE}
2ACTION: <1–2 sentences of visual action for ~5 s>
3DIALOGUE — {NAME}: <line> (at most 1 line, or omit if silent)
4SHOT: <camera type + optional amplitude + speed, natural English>
5STORYBOARD_PROMPT: <self-contained still-image prompt; no camera timeline>
6H3_MODE: FL2VA
7H3_VIDEO_PROMPT:
8How the reference pictures align with the target video — Picture 1 (from Shot 1) aligns with the 0.00-second mark of the target video; Picture 2 (from Shot 1) aligns with the 5.00-second mark of the target video.
9
10integrated_multimodal_description: [Shot 1] Live-action, cinematic, <opening composition matching the storyboard>. <continuous motion path Picture 1 → Picture 2; camera motion as natural English>. <dialogue as: the {name} (S1) says: <d>[English] line here</d>>
11
12overall_soundscape: <ambience / physical sounds, or N/A>
13
14non_diegetic_music: <audience-only score, or N/A>
15LORA: <image-lora:strength, or "none">
16AUDIO: <post-process sfx/music note, or "none">
17DURATION: 5h3_video_prompt and storyboard_prompt fields feed directly into the MiniMax H3 FL2V pipeline (storyboard panel N → panel N+1, zvideo_h3_storyboard_fl2v).1from peft import PeftModel
2from transformers import AutoModelForCausalLM, AutoTokenizer
3
4base = "Qwen/Qwen3.5-0.8B"
5tok = AutoTokenizer.from_pretrained(base)
6model = AutoModelForCausalLM.from_pretrained(base, torch_dtype="bfloat16")
7model = PeftModel.from_pretrained(model, "woodfireind/H3-ScriptGen")
8
9messages = [
10 {"role": "system", "content": "You write ONE MiniMax-H3 FL2VA scene beat for Backlot."},
11 {"role": "user", "content": "Premise: A courier delivers a package through a neon alley in the rain.\nWrite SCENE 1 now."},
12]
13text = tok.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
14out = tok.generate(tok(text, return_tensors="pt").input_ids, max_new_tokens=512)
15print(tok.decode(out[0]))docs/h3_prompt_format.py (parse_scene_h3_fields).H3_VIDEO_PROMPT must keep the FL2VA alignment line, <d>[Language] …</d> dialogue tags, and speaker (S1) IDs. See docs/VIDEO_PROMPT_base-en.txt.