{"record":{"id":"d952a3eeba1f6274","repo":"sgl-project/sglang","slug":"pooled-projections-must-be-provided","errorCode":null,"errorMessage":"pooled_projections must be provided.","messagePattern":"pooled_projections must be provided\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/multimodal_gen/runtime/models/dits/stablediffusion3.py","lineNumber":112,"sourceCode":"        )\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:\n            interval_control = 0\n","sourceCodeStart":94,"sourceCodeEnd":130,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/multimodal_gen/runtime/models/dits/stablediffusion3.py#L94-L130","documentation":"Raised by the StableDiffusion3 transformer forward when pooled_projections is None. SD3 conditioning concatenates a pooled text projection with the timestep embedding, so pooled prompt embeddings are mandatory alongside encoder_hidden_states.","triggerScenarios":"Calling SD3 forward with pooled_projections omitted while passing only encoder_hidden_states.","commonSituations":"Pipeline code that computes prompt embeds but forgets to forward the pooled output of encode_prompt; partial port from diffusers where the arg was bundled differently.","solutions":["Pass the pooled prompt embeddings returned by the text encoder stack as pooled_projections","Check that your encode_prompt step returns (prompt_embeds, pooled_prompt_embeds) and both are forwarded"],"exampleFix":"# before\nnoise_pred = transformer(latents, t, encoder_hidden_states=prompt_embeds)\n# after\nnoise_pred = transformer(latents, t, encoder_hidden_states=prompt_embeds, pooled_projections=pooled_embeds)","handlingStrategy":"validation","validationCode":"assert pooled_projections is not None and encoder_hidden_states is not None","typeGuard":"def sd3_inputs_complete(enc_hs, pooled) -> bool:\n    return enc_hs is not None and pooled is not None","tryCatchPattern":null,"preventionTips":["Unpack encode_prompt results once and thread both through the denoise loop"],"tags":["stable-diffusion-3","missing-argument","pooled-embedding"],"backgroundTag":"missing-required-argument","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}