What Each Model Actually Contributes (And Why You Can't Swap Them)
The first thing to internalize about this stack is that it is not a pipeline you can assemble from four interchangeable parts. Each model is solving a fundamentally different problem, and the reason this composition works at all is that the problems are separable—but only barely. Let me walk through what each component actually does, mechanically, because the failure modes all live in the seams.
GPT-5.6 is not generating images. It is generating structured scene manifests: camera angles, lighting directions, character descriptions, per-shot prompt conditioning. The critical limitation is that it has no visual feedback loop unless you build one. It cannot see the keyframe it just described. This means spatial hallucinations—"character on the left" when the composition actually puts them on the right—are a structural risk, not an edge case. I've found that treating GPT-5.6 purely as a text-to-JSON compiler, rather than a creative director with vision, is the only way to make it reliable.
Nano Banana 2 renders the anchor keyframes: the start frame and end frame that bracket every shot. Its strength is prompt adherence and high-fidelity rendering for scene establishment. It does not do motion. It does not do temporal coherence. It produces a single beautiful raster, and that's the extent of its contract.
SAM 3 is where people get confused. It does segmentation, not matting. It outputs soft or binary masks—blob-like object boundaries—not sub-pixel alpha channel decomposition. For character isolation and regional re-rendering, that's fine. For hair, smoke, glass, or any semi-transparent element, it will produce edge artifacts you'll be fighting downstream.
H3 Max is the interpolation engine. It takes your start/end keyframes and generates the transition frames between them using latent diffusion, conditioned on the segmentation masks from SAM 3. It is not a video model in the Runway Gen-3 sense—it's a frame-to-frame bridging tool with temporal attention. The masks tell it where the foreground subject is so it doesn't hallucinate a new environment mid-transition.
Here's the pipeline as it actually flows, and where the QA gate catches failures:
flowchart LR
A[GPT-5.6 Scene Manifest] --> B[Structured JSON Payload]
B --> C[Nano Banana 2 Keyframe A]
B --> D[Nano Banana 2 Keyframe B]
C --> E[SAM 3 Foreground Mask]
D --> F[SAM 3 Background Mask]
E --> G[H3 Max Interpolation]
F --> G
G --> H{QA Gate<br>Identity Check<br>Optical Flow}
H -- "Fail" --> C
H -- "Pass" --> I[Final Composite]
The QA gate is non-negotiable. It runs CLIP or DINOv2 similarity between frames to detect identity drift, optical flow acceleration spikes to catch warping, and edge variance checks for matte tearing. If any of those fail, you re-render the keyframes, not the interpolation—because the problem is almost always in the anchor image, not the bridging.
The gluing is the real work. Getting these four models to agree on a shared visual language—same color palette, same lighting direction, same subject continuity—requires an intermediate representation that survives the transit between them. That's the topic of the next section.
The Orchestration Problem: Why Free-Form Text From GPT-5.6 Breaks Downstream Models
The moment you pass free-form natural language from GPT-5.6 directly to Nano Banana 2, you've introduced a semantic mismatch that will propagate through the entire pipeline. LLMs describe scenes with linguistic density—dense, compressed, ambiguous in ways that diffusion cross-attention layers cannot deterministically resolve. This is not a prompt-engineering problem you can tune away; it's a structural mismatch between two radically different representational systems.
Let me give you a concrete failure mode I've seen repeatedly. GPT-5.6 generates a 400-word shot description: "Character on the left wearing a blue coat holding a lantern, character on the right looking away, lantern light casting warm glow on the left face, rain falling on the street." When that text hits Nano Banana 2's cross-attention layers, every noun and adjective competes for attention weight. The result: the lantern ends up held by the right character, the blue coat appears on the wrong person, and the warm glow illuminates the wrong face. This is token dilution and attention competition in action.
The fix is to stop expecting LLMs to speak "diffusion" and force them to speak a structured intermediate representation instead. I parse GPT-5.6's output into a strictly validated JSON schema—a scene manifest that the visual models can consume without ambiguity. The fields are exact: camera angle (elevation, azimuth, focal length), lighting direction (as vector coordinates, not "warm glow"), hex color palette (not "moody blue"), subject bounding boxes (as normalized coordinates), LoRA trigger tokens (for style conditioning), and negative constraints (what to explicitly exclude).
This JSON schema is the shield. It prevents the linguistic density from leaking through. When Nano Banana 2 receives "subject_left": {"coat_color": "#1E3A8A", "holds": "lantern"}, it has no room to reinterpret. The attention competition is eliminated because there's nothing for the tokens to compete over—each visual attribute is bound to a specific spatial location.
I've found that the schema needs to be aggressively nested and typed. Not just "lighting": "warm" but "lighting": {"direction": [0.7, -0.3, 0.5], "temperature": 3200, "intensity": 0.8}. The more precise you get at the manifest stage, the fewer downstream artifacts you'll fight. GPT-5.6 is actually excellent at this—it's a structured output machine when you force it to be. The problem was never its reasoning capability; it was that free-form text is an invitation for the generative model to inject ambiguity.
The cost is that you lose some creative serendipity. But that's a trade I'll take every time, because a transition between two keyframes where the character's coat swapped colors is not fixable by any amount of video interpolation tuning.
Segmentation Is Not Matting: SAM 3's Silent Frailty
Here's the misconception that ruins more pipelines than anything else: people hear "segmentation" and assume they're getting clean alpha channels. They're not. SAM 3 produces blob masks—soft or binary object boundaries—not sub-pixel alpha mattes. The distinction matters enormously when you're feeding those masks into H3 Max as conditioning.
Where does SAM 3 actually break? Hair is the classic case. Fine wisps at the boundary of a character's head are not a clean binary; they're semi-transparent, multi-layered, and full of background bleed. SAM 3 will either classify those wisps as background (leaving a hard, unnatural hairline) or as foreground (dragging background pixels along with it). Smoke and glass have the same problem—they're inherently non-binary, and a segmentation model has no mechanism to represent partial opacity. Motion blur and depth-of-field defocus are equally brutal: a blurred foreground element crossing a sharp background renders as a jagged edge, not a gradual transition.
The worst part is temporal flicker. If you apply SAM 3 frame-by-frame without any temporal coherence constraints, the mask boundary will jitter between frames—one frame the hairline sits at pixel 812, the next frame at 817, then back to 812. That flicker becomes visible jitter in the interpolated video even when H3 Max does its job perfectly. The mask itself is the artifact source.
And then there's edge halo fringing. Raw SAM masks retain a thin band of background color from the original keyframe—the bleed from the source image's anti-aliased edges. When you feed those masks into H3 Max as inpainting conditions, the interpolation engine sees that fringe as part of the foreground and propagates it forward. The result is a dark rim artifact around the character in the final transition, a subtle but visible contamination that reads as "this shot was composited."
The fix requires two steps before the masks ever touch H3 Max. First, defringe the masks: strip the background bleed from the boundary region by re-sampling the mask edge against the original keyframe's background, not the combined foreground-background composite. Second, smooth the masks temporally using optical flow—RAFT-style flow estimation tracks the mask boundary across frames and averages out the flicker. You get a mask that moves coherently because the flow vectors enforce temporal consistency.
I've found this step is where the pipeline either succeeds or quietly degrades. Skip it and you'll spend hours debugging "H3 Max is drifting" when the actual culprit is a flickering SAM mask. Do the defringe and smoothing pass and the interpolation quality jumps dramatically—not because H3 Max got better, but because you stopped feeding it garbage conditioning.
The deeper lesson: SAM 3 is a segmentation tool, not a matting tool. Treat it as such. If you need true alpha mattes for hair or semi-transparent elements, you need a dedicated matting model in front of it. Otherwise, accept that you're doing compositing with hard boundaries, and adjust your art direction accordingly—close-ups of characters with intricate hair are where this stack quietly falls apart.
H3 Max's Interpolation: What It Can and Cannot Do With Your Keyframes
H3 Max is not a video model in the way most people think about video models. It does not generate a full shot from a prompt or a text description. It is a frame-to-frame interpolator: it takes your start frame and end frame, and it synthesizes the temporal transition between them. That's the entire contract. Understanding this distinction is the single most important thing about working with it, because it reframes every expectation about what the output can be.
The critical constraint is keyframe compatibility. H3 Max works best when Keyframe A and Keyframe B are already visually compatible—same color palette, same lighting direction, same character proportions, similar camera framing. When they differ too much, it doesn't bridge the gap so much as it gives up and takes a shortcut: it morphs instead of moves. Morphing is what happens when the model recognizes it can't plausibly transition between two wildly different compositions, so it just warps one into the other. You get a visually smooth but physically impossible shot where the character's face deforms into the new pose rather than moving into it. The fix is always upstream—the keyframes need to be close enough that interpolation feels like motion, not shape-shifting.
Temporal coherence comes at a direct compute cost. Longer transitions require more generated frames, and each frame requires more attention computation to maintain temporal consistency. I've found that pushing a transition beyond roughly 2-3 seconds of video is where the quality starts to degrade noticeably, regardless of the compute budget you throw at it. The model compensates by reducing coherence for the sake of smoothness, and the result is a shot that looks fluid but has lost the specific character details you wanted preserved.
Complex camera paths are where H3 Max genuinely breaks. The model approximates 3D motion using 2D temporal self-attention. It has no explicit 3D representation—no Gaussian splatting, no mesh priors, no depth-aware rendering. So a 180° orbital shot where the camera moves around a character requires the model to hallucinate the occluded geometry on the far side of the subject. It doesn't know what's behind the character, so it invents something. That invented geometry is often wrong, and it often looks wrong in motion. Simple camera moves—pans, slow push-ins, lateral tracks—work well because the visible geometry stays consistent. The moment the camera path requires the model to fill in occluded space, you're rolling dice.
sequenceDiagram
participant GPT as GPT-5.6
participant NB as Nano Banana 2
participant SAM as SAM 3
participant H3 as H3 Max
participant QA as QA Gate
GPT->>NB: Scene manifest (structured JSON)
NB->>NB: Generate Keyframe A (start frame)
NB->>NB: Generate Keyframe B (end frame)
NB->>SAM: Keyframe A + Keyframe B
SAM->>SAM: Generate Foreground Mask A
SAM->>SAM: Generate Foreground Mask B
SAM->>H3: Masks A + B (defringed, flow-smoothed)
NB->>H3: Keyframe A + Keyframe B
H3->>QA: Interpolated transition frames
QA->>QA: CLIP identity check (frame 0, mid, end)
QA->>QA: Optical flow acceleration spike detection
alt Pass
QA->>QA: Render final composite
else Fail (identity drift / warping / fringe)
QA->>NB: Re-render keyframes (not interpolation)
NB->>SAM: Regenerate masks
SAM->>H3: New conditioning masks
H3->>QA: Re-interpolate transition
end
The essential posture: treat H3 Max as a slot-filler, not a creative engine. It will do exactly what you condition it to do, no more. When you feed it compatible keyframes and coherent masks, it produces beautiful interpolation. When you feed it an ambitious camera path or visually mismatched anchors, it produces a visually smooth but semantically broken shot. The problem is never the model; it's the upstream decisions about what you asked it to bridge.
Failure Modes That Will Haunt You: Identity Drift, Fringing, and the 60% Discard Rate
There are three failure modes I've seen repeatedly across generative video pipelines, and each one traces back to a specific mechanism rather than a vague quality issue. Understanding the mechanism is what lets you build automated guards against it.
Temporal identity drift is the most insidious. When H3 Max interpolates between Keyframe A and Keyframe B, it's treating the transition as latent interpolation in a compressed space. Complex textures—facial structure, costume patterns, fine jewelry—get lossy-compressed during interpolation, and the model can't perfectly reconstruct them across frames. The result is subtle "melting": eyes shift color midway through a camera pan, clothing details transform into new patterns, background geometry warps. It's rarely a dramatic glitch. It's a slow, gradual degradation that you only notice when you play the shot back at full speed. The mechanism is fundamentally about how the latent space handles fine detail under temporal compression.
Mask degradation is the fringing problem from the previous section, but it deserves its own elaboration because it has a distinct failure signature. Edge halos in SAM 3's masks bleed background color from the original keyframe into the interpolated frames. The mask isn't wrong in a gross sense; it's wrong at the sub-pixel boundary, and that boundary error propagates through H3 Max's conditioning as a thin dark rim around the character. It reads as "this shot was composited" even when the shot is entirely generated. The fix is defringing before interpolation, not after—once the fringe is baked into the generated frames, you can't cleanly remove it.
Non-Euclidean camera moves are the third major failure mode. Transition models approximate 3D motion using 2D temporal attention. When you ask for a 180° orbital shot, the model has no way to represent the occluded geometry behind the character. It hallucinates plausible-looking but physically incorrect geometry, and that geometry often doesn't match the environment. The result is a camera path that feels "wrong" in motion—not visually jarring, but subtly off, as if the world bends slightly around the camera's pivot point.
The yield penalty is the harsh reality that ties all three together. Generative video pipelines almost never produce production-ready output on seed 0. In practice, successful transitions have a 30%–60% discard rate due to jitter, limb hallucination, or matte tearing. This isn't a failure of any single model—it's a structural consequence of chaining heterogeneous models, where each model's minor imperfections compound the next model's conditioning errors.
This discard rate has profound implications for automation. You cannot run this pipeline sequentially and expect one pass to succeed. You must run multi-candidate generation in parallel—generate 3-5 interpolation variants per shot, run them all through the QA gate, and pick the best performer. The QA gate's automated checks—CLIP identity similarity between frames, optical flow acceleration spikes, edge variance for matte tearing—are not optional quality luxuries. They're the mechanism that makes the discard rate tractable. Without them, you're manually reviewing 60% of your shots at human speed, and that's how a 180-second clip turns into an afternoon.
There is no single fix for any of these failure modes. They're structural. The only thing you can do is build the detection infrastructure that catches them early, and design your upstream stages (keyframe compatibility, mask quality) to minimize how often they trigger.
Operational Latency and Cost: The Real Price of Modularity
The modular stack's biggest practical problem isn't quality—it's the sequential latency chain. Every single shot requires at minimum four API calls: GPT-5.6 for the scene manifest, Nano Banana 2 for Keyframe A, Nano Banana 2 for Keyframe B (two separate calls), SAM 3 for the masks, and H3 Max for the interpolation. If each call takes 15–30 seconds—which is typical for image generation and video interpolation—the end-to-end turnaround per clip easily hits 60–180+ seconds. And that's assuming everything succeeds on seed 0, which we know it doesn't.
The contrast with monolithic platforms like Runway or Luma is stark. They have an integrated UI, a single billing tier, and the entire pipeline—prompt, keyframe, motion brush, final render—happens inside one interface. You don't orchestrate API calls; you don't manage cross-vendor artifact transfer; you don't debug why a mask stepped on a transition. The cost is loss of control: you can't swap in a better keyframe model when one arrives, you can't inject SAM masks as custom conditioning, and you're locked into their pricing model.
The other hidden cost is data ingress/egress. Moving uncompressed 4K keyframe tensors, multi-channel segmentation masks, and high-bitrate video clips between different vendor APIs—OpenAI to Google to Meta endpoints to fal—introduces substantial network latency and serialization overhead. Every hop adds seconds to the pipeline, and those seconds compound. The solution I've landed on is co-locating intermediary assets in an edge S3 or R2 bucket with pre-signed direct URLs. This means keyframes, masks, and depth maps transfer directly from the generation vendor to the storage bucket, and then from the bucket into the next vendor's API, rather than bouncing through your orchestration server. It cuts round-trip time meaningfully and avoids storing large artifacts in transient memory.
| Dimension | Modular Stack | Monolithic (Runway, Luma) | Local ComfyUI |
|---|---|---|---|
| Latency per clip | 60–180+ seconds (4+ sequential API calls) | 20–60 seconds (integrated, single pass) | Highly variable; often 2–10 minutes depending on GPU |
| Cost model | Multiple subscriptions/credits across OpenAI, Google, Meta, fal | Single predictable tier, but higher per-second pricing | Zero API fees; pay only for compute (RunPod/Vast.ai) |
| Control | Full granularity—swap any component, inject custom masks, adjust quality gates | Black-box—hard-coded pipeline, limited sub-model control | Maximum—every node, every weight, every LoRA |
| Consistency | Requires orchestrated QA gates to catch inter-model drift | Built-in consistency tools (camera controls, motion brushes) | Deterministic if you fix seeds and caches manually |
| Maintenance | API key management, version tracking, artifact routing | None—vendor handles everything | Infrastructure setup, VRAM limits, model updates |
Cost multiplexing is the reality of modularity. You're paying OpenAI for GPT-5.6, Google for Nano Banana 2, Meta for SAM 3, and fal for H3 Max. That's four vendors, four billing models, four rate limits, and four potential points of silent upstream model changes. The cost is not just dollar-denominated—it's the operational overhead of managing four separate accounts, monitoring four different rate-limit headers, and tracking four independent release schedules. Multi-week productions break silently when one vendor updates its model and changes the latent space, and your prompts stop reproducing the same visual style. Monolithic platforms trade finite control for zero operational surprise. I've found the modular stack is worth it when you need precision and control, but only if you're willing to build the infrastructure—caching, QA gates, asset storage—that makes its complexity manageable.
The Mitigation Playbook: QA Gates, Optical Flow, and Caching
Everything I've described so far—the seams between models, the mask degradation, the discard rate—is manageable, but only if you build the infrastructure that manages it. This is the difference between a demo and a production pipeline. The demo works when you hand-tune each transition and manually inspect every frame. The production pipeline works because you've automated the inspection and built safeguards into the artifact flow.
The first safeguard is the JSON schema validation layer. I touched on this earlier, but it deserves emphasis as a distinct architectural component rather than a prompt-engineering trick. You parse GPT-5.6's output into a strictly validated schema—camera angle, lighting direction as vector coordinates, hex color palettes, subject bounding boxes, LoRA trigger tokens, negative constraints. The validator rejects malformed manifests before they ever reach Nano Banana 2. This isn't just about catching syntax errors; it's about catching semantic errors that would propagate as visual noise downstream. A manifest missing a bounding box for a character produces a keyframe with no clear subject, which produces a SAM mask that can't find the foreground, which produces an H3 Max interpolation that hallucinates an entirely new environment. The validation layer is the first line of defense against cascading failure.
The second safeguard is the temporal mask treatment. I've said it before and I'll say it again: never feed raw SAM 3 masks into H3 Max. The pipeline step that makes this work is the defringe pass—re-sampling the mask edge against the original keyframe's background to strip the anti-aliased bleed—followed by optical flow smoothing. The flow vectors (RAFT-style estimation works well) track the mask boundary across frames and average out the frame-to-frame flicker. The result is a matte that moves coherently because the flow vectors enforce temporal consistency. This is a mandatory step, not an optimization.
The third safeguard is the automated QA gate. This runs after H3 Max produces its candidate frames and before they reach the composite. Three automated checks: CLIP or DINOv2 identity cosine similarity between frame 0, mid-frame, and end frame to detect identity drift; optical flow acceleration spike detection to catch warping and limb artifacts; edge variance checks to flag mask tearing or alpha halo leakage. The gate rejects failing candidates and triggers a re-render loop. Crucially, re-render the keyframes, not the interpolation—the problem is almost always in the anchor image.
The fourth safeguard is unified asset storage and latent caching. Co-locate keyframes, masks, and depth maps in an edge S3 or R2 bucket with pre-signed direct URLs. This means artifacts transfer directly from vendor to bucket to vendor, rather than bouncing through your orchestration server. Every hop through your server adds latency; every direct URL cuts it. The storage layer is not an afterthought—it's the infrastructure that makes the latency chain survivable.
Project Applications: Where You'd Actually Wire This Together
Let me give you three concrete ways to put this stack to work, in ascending order of complexity. If you're just getting started with this architecture, the first one is where I'd begin.
The interactive storyboard generator is the simplest entry point. Build a web app that takes a prompt, uses GPT-5.6 to generate a structured JSON manifest, then calls Nano Banana 2 to render two keyframes from that manifest. Display them side-by-side with the manifest for human review. The critical connection is the JSON schema validator (zod works well)—it catches malformed output before it reaches the image model. The failure mode to watch for is attribute swapping: the validator will catch structural errors but not visual misalignment, so you need a human-in-the-loop check before rendering. And you should draw a hard budget line on candidate generation—if you're generating four keyframe pairs per shot, the cost compounds fast. Start with one pair, validate visually, then expand.
The character matte extraction tool is where things get interesting. Build a tool that takes a video clip or keyframes, runs SAM 3 to segment a character, then smooths the masks with RAFT optical flow and outputs clean alpha mattes for compositing. The connections are SAM 3 for initial masks, optical flow for temporal smoothing, defringe post-processing, and H3 Max for testing interpolation with the finished mattes. Watch for hair and semi-transparent edges—they will fringe even after defringing, and you may need dedicated alpha matting refinement. And test it with motion blur. That's where it will break.
The multi-vendor pipeline orchestrator is the full production system. Create a Python or Node service that chains all four API calls with retries, caching, and a QA gate—CLIP-based similarity scoring to automatically reject bad interpolations and re-render keyframes. The connections are all four models, plus a queue (Celery works), storage (S3/R2 with presigned URLs), and the similarity checker. Two constraints to plan for up front: cascading latency requires parallelizing candidate generation and possibly pre-generating keyframes before the interpolation stage; and API version drift means your prompts may break silently when vendors update their models, so version your prompts and monitor output consistency across releases.
Resources
Updated 2026-09-02 by Mehran Mozaffari.
Related posts
9 September 2026
What I Learned Stitching Together Homography, Tracking, and Temporal Detection in a Custom Vision Pipeline
8 September 2026
Basketball ReID Done Right: The Case for a Three-Tier Tracking Stack
8 September 2026
The $720-Per-Hour Trap: How to Actually Build a Basketball AI Pipeline on RF-DETR, BoT-SORT, and a VLM
6 September 2026
Native VLM Segmentation: The Mechanics of Generating Masks from Pure Tokens
15 September 2026
From Static Mesh to Walking Character: A Technical Operator's Manual for the 3D Vibe Coding Pipeline
15 September 2026
Designing Physical Objects with Gemini Canvas: From Prompt to Printable STL
