{"record":{"id":"f70b191cb04d537f","repo":"sgl-project/sglang","slug":"encoder-hidden-states-must-be-provided","errorCode":null,"errorMessage":"encoder_hidden_states must be provided.","messagePattern":"encoder_hidden_states must be provided\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/multimodal_gen/runtime/models/dits/stablediffusion3.py","lineNumber":110,"sourceCode":"        self.proj_out = nn.Linear(\n            self.inner_dim, patch_size * patch_size * self.out_channels, bias=True\n        )\n\n        self.gradient_checkpointing = False\n\n    def forward(\n        self,\n        hidden_states: torch.Tensor,\n        encoder_hidden_states: torch.Tensor | None = None,\n        pooled_projections: torch.Tensor | None = None,\n        timestep: torch.LongTensor | None = None,\n        block_controlnet_hidden_states: list | None = None,\n        guidance: torch.Tensor | None = None,\n        joint_attention_kwargs: dict[str, Any] | None = None,\n        skip_layers: list[int] | None = None,\n    ) -> torch.Tensor:\n        if encoder_hidden_states is None:\n            raise ValueError(\"encoder_hidden_states must be provided.\")\n        if pooled_projections is None:\n            raise ValueError(\"pooled_projections must be provided.\")\n\n        encoder_embeddings = encoder_hidden_states\n\n        height, width = hidden_states.shape[-2:]\n\n        hidden_states = self.pos_embed(hidden_states)\n        temb = self.time_text_embed(timestep, pooled_projections)\n        encoder_embeddings = self.context_embedder(encoder_embeddings)\n\n        skip_layer_set = set(skip_layers) if skip_layers else set()\n\n        if block_controlnet_hidden_states is not None:\n            interval_control = len(self.transformer_blocks) / len(\n                block_controlnet_hidden_states\n            )\n        else:","sourceCodeStart":92,"sourceCodeEnd":128,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/multimodal_gen/runtime/models/dits/stablediffusion3.py#L92-L128","documentation":"Raised by the StableDiffusion3 transformer forward when encoder_hidden_states is None. SD3 is text-conditioned; the prompt embeddings are mandatory input, unlike optional masks or guidance.","triggerScenarios":"Calling the SD3 transformer forward with encoder_hidden_states omitted or explicitly None.","commonSituations":"Adapting an unconditional generation path from a class-free model; a pipeline bug dropping the text encoder output before the DiT call.","solutions":["Run the prompt through the text encoders and pass the pooled/sequence embeddings as encoder_hidden_states","Verify the pipeline passes text_encoder_output into the transformer call"],"exampleFix":"# before\nnoise_pred = transformer(hidden_states=latents, timestep=t)\n# after\nnoise_pred = transformer(hidden_states=latents, timestep=t, encoder_hidden_states=prompt_embeds)","handlingStrategy":"validation","validationCode":"assert encoder_hidden_states is not None, \"run text encoders before DiT forward\"","typeGuard":"def has_text_conditioning(x) -> bool:\n    return x is not None and getattr(x, \"numel\", lambda: 0)() > 0","tryCatchPattern":null,"preventionTips":["Assert text encoder outputs are non-None in the pipeline before the transformer call"],"tags":["stable-diffusion-3","missing-argument","text-embedding"],"backgroundTag":"missing-required-argument","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}