{"record":{"id":"ca4a869e1dcd9ce6","repo":"sgl-project/sglang","slug":"sana-wm-forward-requires-encoder-hidden-states","errorCode":null,"errorMessage":"SANA-WM forward requires encoder_hidden_states.","messagePattern":"SANA-WM forward requires encoder_hidden_states\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/multimodal_gen/runtime/models/dits/sana_wm.py","lineNumber":620,"sourceCode":"            )\n\n        if not torch.is_grad_enabled():\n            self._plucker_emb_cache = (key, chunk_plucker, plucker_emb)\n        return plucker_emb\n\n    def forward(\n        self,\n        hidden_states: torch.Tensor,\n        encoder_hidden_states: Optional[torch.Tensor] = None,\n        timestep: Optional[torch.Tensor] = None,\n        encoder_attention_mask: Optional[torch.Tensor] = None,\n        camera_conditions: Optional[torch.Tensor] = None,\n        chunk_plucker: Optional[torch.Tensor] = None,\n        guidance: Optional[torch.Tensor] = None,  # kept for compat\n        **kwargs,\n    ) -> torch.Tensor:\n        if encoder_hidden_states is None:\n            raise ValueError(\"SANA-WM forward requires encoder_hidden_states.\")\n        if timestep is None:\n            raise ValueError(\"SANA-WM forward requires timestep.\")\n\n        B, C, T_raw, H_raw, W_raw = hidden_states.shape\n        p_t, p_h, p_w = self.patch_size\n        T = T_raw // p_t\n        H = H_raw // p_h\n        W = W_raw // p_w\n        chunk_size = kwargs.get(\"chunk_size\", self.chunk_size)\n        chunk_split_strategy = kwargs.get(\n            \"chunk_split_strategy\", self.chunk_split_strategy\n        )\n        chunk_index = kwargs.get(\"chunk_index\", None)\n\n        # Patch embed: (B, C, T, H, W) -> (B, T*H*W, D)\n        x = self.x_embedder(hidden_states.to(dtype=self.x_embedder.proj.weight.dtype))\n\n        # Timestep AdaLN-single. SANA-WM's LTX sampler passes per-frame","sourceCodeStart":602,"sourceCodeEnd":638,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/multimodal_gen/runtime/models/dits/sana_wm.py#L602-L638","documentation":"SANA-WM's forward requires text conditioning; encoder_hidden_states is a mandatory argument and passing None raises immediately. The model has no unconditional path, unlike diffusers models that default to dropout/CFG-free branches.","triggerScenarios":"Calling forward(hidden_states, timestep) without encoder_hidden_states, or passing it as None explicitly / under a wrong kwarg name (e.g. 'context' or 'encoder_hidden_state').","commonSituations":"Porting code from diffusers SanaPipeline where encoder_hidden_states defaulted; calling with **kwargs dict that lacks the key; wrapper code that drops None fields.","solutions":["Pass encoder_hidden_states (text embeddings, shape (B, N, D)) to forward","If you truly want unconditional, pass zero/empty embeddings matching the text encoder's output shape","Check the exact kwarg name in the signature before calling"],"exampleFix":"# before\nout = model(h, timestep=t)\n# after\nout = model(h, timestep=t, encoder_hidden_states=ehs)","handlingStrategy":"validation","validationCode":"if encoder_hidden_states is None:\n    raise TypeError('encoder_hidden_states required') from None","typeGuard":"def has_ehs(ehs: torch.Tensor | None) -> bool: return isinstance(ehs, torch.Tensor) and ehs.ndim == 3","tryCatchPattern":null,"preventionTips":["Make encoder_hidden_states positional in your wrapper so omission is a TypeError, not a deep ValueError"],"tags":["sana-wm","missing-argument","required-parameter"],"backgroundTag":"missing-required-argument","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}