{"record":{"id":"307ed186db6c88f9","repo":"sgl-project/sglang","slug":"sana-wm-refiner-requires-a-string-prompt-or-one-pr","errorCode":null,"errorMessage":"SANA-WM refiner requires a string prompt or one prompt per batch item.","messagePattern":"SANA-WM refiner requires a string prompt or one prompt per batch item\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/multimodal_gen/runtime/pipelines_core/stages/model_specific_stages/sana_wm/refiner.py","lineNumber":479,"sourceCode":"                component_name=\"transformer_2\",\n                target_dtype=self.dtype,\n                memory_intensive=True,\n            ),\n        ]\n\n    @staticmethod\n    def _prompts_for_batch(batch: Req, batch_size: int) -> list[str]:\n        prompt = batch.extra.get(\"refiner_prompt\") if batch.extra else None\n        if prompt is None:\n            prompt = batch.prompt\n        if isinstance(prompt, str):\n            return [prompt] * batch_size\n        if isinstance(prompt, list) and all(isinstance(p, str) for p in prompt):\n            if len(prompt) == batch_size:\n                return prompt\n            if len(prompt) == 1:\n                return prompt * batch_size\n        raise ValueError(\n            \"SANA-WM refiner requires a string prompt or one prompt per batch item.\"\n        )\n\n    @torch.inference_mode()\n    def _encode_prompt(\n        self,\n        prompt: str,\n        device: torch.device,\n    ) -> tuple[torch.Tensor, torch.Tensor]:\n        tokenizer = self.tokenizer\n        if getattr(tokenizer, \"padding_side\", \"right\") != \"left\":\n            tokenizer.padding_side = \"left\"\n        if tokenizer.pad_token is None and tokenizer.eos_token is not None:\n            tokenizer.pad_token = tokenizer.eos_token\n\n        text_inputs = tokenizer(\n            [prompt.strip()],\n            padding=\"max_length\",","sourceCodeStart":461,"sourceCodeEnd":497,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/multimodal_gen/runtime/pipelines_core/stages/model_specific_stages/sana_wm/refiner.py#L461-L497","documentation":"The SANA-WM refiner stage resolves prompts per batch item via _prompts_for_batch. It accepts exactly three shapes: a single string (broadcast to the batch), a list of strings whose length equals batch_size, or a one-element list of strings (broadcast). Anything else — an int, None, a list of non-strings, or a list whose length is neither 1 nor batch_size — raises this ValueError.","triggerScenarios":"Calling forward() on the refiner stage with batch prompt metadata that is not a str, or a list of str with len != batch_size and len != 1 (e.g. a 3-prompt list for a 2-item batch, or a list containing None/tensors).","commonSituations":"Upstream stage produces one prompt-embedding per item but the refiner is fed a mismatched prompt list; batch size changes (chunking/merging of Reqs) after prompts were materialized; prompt defaults to None when not supplied in the request.","solutions":["Pass a single string prompt and let it broadcast to the whole batch","Ensure the prompt list length matches batch_size exactly (or use a 1-element list)","Sanitize upstream: coerce non-string entries to str and re-derive the list after any batch resize"],"exampleFix":"// before\nrefiner.forward(batch, server_args)  # batch prompt list len 3, batch_size 2\n// after\nprompts = prompts if len(prompts) == batch_size else [prompts[0]] * batch_size\nbatch.prompt = prompts\nrefiner.forward(batch, server_args)","handlingStrategy":"validation","validationCode":"def valid_prompts(prompt, batch_size):\n    if isinstance(prompt, str):\n        return [prompt] * batch_size\n    if isinstance(prompt, list) and all(isinstance(p, str) for p in prompt) and len(prompt) in (1, batch_size):\n        return prompt * batch_size if len(prompt) == 1 else prompt\n    return None\n\nprompts = valid_prompts(batch.prompt, batch_size)\nassert prompts is not None, 'invalid prompt spec for refiner'","typeGuard":"def is_valid_refiner_prompt(p: object, batch_size: int) -> bool:\n    if isinstance(p, str):\n        return True\n    return isinstance(p, list) and all(isinstance(x, str) for x in p) and len(p) in (1, batch_size)","tryCatchPattern":"try:\n    out = refiner.forward(batch, server_args)\nexcept ValueError as e:\n    if \"one prompt per batch item\" in str(e):\n        batch.prompt = str(batch.prompt)\n        out = refiner.forward(batch, server_args)\n    else:\n        raise","preventionTips":["Derive prompt lists from the same batch construction that sets batch_size","Coerce prompt fields to str at the request boundary","Add a unit test mirroring test_prompt_resolution_accepts_batch_prompt_list for your custom paths"],"tags":["sana-wm","refiner","prompt-validation","batch-mismatch","valueerror"],"backgroundTag":"input-validation-failed","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}