{"record":{"id":"f3cb5756200906c4","repo":"sgl-project/sglang","slug":"sana-video-requires-encoder-hidden-states","errorCode":null,"errorMessage":"SANA-Video requires encoder_hidden_states","messagePattern":"SANA-Video requires encoder_hidden_states","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/multimodal_gen/runtime/models/dits/sana_video.py","lineNumber":520,"sourceCode":"        )\n        self.layer_names = [\"transformer_blocks\"]\n\n    def post_load_weights(self) -> None:\n        if self.rope.freqs_cos.is_meta or self.rope.freqs_sin.is_meta:\n            self.rope._init_freqs_buffers()\n\n    def forward(\n        self,\n        hidden_states: torch.Tensor,\n        encoder_hidden_states: torch.Tensor,\n        timestep: torch.Tensor,\n        guidance: torch.Tensor | None = None,\n        encoder_attention_mask: torch.Tensor | None = None,\n        **kwargs,\n    ) -> torch.Tensor:\n        del guidance, kwargs\n        if encoder_hidden_states is None:\n            raise ValueError(\"SANA-Video requires encoder_hidden_states\")\n        if isinstance(encoder_attention_mask, (list, tuple)):\n            encoder_attention_mask = (\n                encoder_attention_mask[0] if encoder_attention_mask else None\n            )\n\n        batch_size, _, num_frames, height, width = hidden_states.shape\n        patch_t, patch_h, patch_w = self.patch_size\n        post_patch_frames = num_frames // patch_t\n        post_patch_height = height // patch_h\n        post_patch_width = width // patch_w\n        rotary_emb = self.rope(hidden_states)\n\n        hidden_states = self.patch_embedding(hidden_states)\n        hidden_states = hidden_states.flatten(2).transpose(1, 2)\n        timestep, embedded_timestep = self.time_embed(\n            timestep.flatten(), hidden_dtype=hidden_states.dtype\n        )\n        timestep = timestep.view(batch_size, -1, timestep.shape[-1])","sourceCodeStart":502,"sourceCodeEnd":538,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/multimodal_gen/runtime/models/dits/sana_video.py#L502-L538","documentation":"SANA-Video's forward deletes guidance and kwargs and requires encoder_hidden_states; None raises ValueError. Captions embeddings are always required, and encoder_attention_mask may be a list/tuple (first element is taken).","triggerScenarios":"Calling forward without caption embeddings — unconditional or mis-wired pipeline paths.","commonSituations":"CFG negative-prompt leg skipping the text encoder; refactors dropping caption tensors; confusion because guidance is accepted-but-ignored (del guidance) making callers assume other optional args are too.","solutions":["Always encode prompts (including null prompts) and pass encoder_hidden_states","Pass encoder_attention_mask from the tokenizer if captions are padded","Audit the uncond branch of your CFG pipeline"],"exampleFix":"# before\nnoise_pred = dit(latents, t, encoder_hidden_states=None)\n# after\nnoise_pred = dit(latents, t, encoder_hidden_states=null_prompt_emb, encoder_attention_mask=null_mask)","handlingStrategy":"validation","validationCode":"assert encoder_hidden_states is not None, \"SANA-Video requires caption embeddings\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Encode null prompts for the CFG uncond leg","Remember guidance is silently ignored — validate required args yourself"],"tags":["sana-video","encoder-hidden-states","missing-argument"],"backgroundTag":"missing-required-argument","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}