{"record":{"id":"ed466b287df96828","repo":"invoke-ai/InvokeAI","slug":"expected-torch-tensor-for-input-ids-got-type-tex","errorCode":null,"errorMessage":"Expected torch.Tensor for input_ids, got {type(text_input_ids).__name__}. Tokenizer returned unexpected type.","messagePattern":"Expected torch\\.Tensor for input_ids, got (.+?)\\. Tokenizer returned unexpected type\\.","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"invokeai/app/invocations/z_image_text_encoder.py","lineNumber":144,"sourceCode":"            except (AttributeError, TypeError) as e:\n                # Fallback if tokenizer doesn't support apply_chat_template or enable_thinking\n                context.logger.warning(f\"Chat template failed ({e}), using raw prompt.\")\n                prompt_formatted = prompt\n\n            # Tokenize the formatted prompt\n            text_inputs = tokenizer(\n                prompt_formatted,\n                padding=\"max_length\",\n                max_length=max_seq_len,\n                truncation=True,\n                return_attention_mask=True,\n                return_tensors=\"pt\",\n            )\n\n            text_input_ids = text_inputs.input_ids\n            attention_mask = text_inputs.attention_mask\n            if not isinstance(text_input_ids, torch.Tensor):\n                raise TypeError(\n                    f\"Expected torch.Tensor for input_ids, got {type(text_input_ids).__name__}. \"\n                    \"Tokenizer returned unexpected type.\"\n                )\n            if not isinstance(attention_mask, torch.Tensor):\n                raise TypeError(\n                    f\"Expected torch.Tensor for attention_mask, got {type(attention_mask).__name__}. \"\n                    \"Tokenizer returned unexpected type.\"\n                )\n\n            # Check for truncation\n            untruncated_ids = tokenizer(prompt_formatted, padding=\"longest\", return_tensors=\"pt\").input_ids\n            if untruncated_ids.shape[-1] >= text_input_ids.shape[-1] and not torch.equal(\n                text_input_ids, untruncated_ids\n            ):\n                removed_text = tokenizer.batch_decode(untruncated_ids[:, max_seq_len - 1 : -1])\n                context.logger.warning(\n                    f\"The following part of your input was truncated because `max_sequence_length` is set to \"\n                    f\"{max_seq_len} tokens: {removed_text}\"","sourceCodeStart":126,"sourceCodeEnd":162,"githubUrl":"https://github.com/invoke-ai/InvokeAI/blob/0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06/invokeai/app/invocations/z_image_text_encoder.py#L126-L162","documentation":"After tokenizer(prompt_formatted, padding=..., return_tensors=\"pt\"), _encode_prompt asserts text_inputs.input_ids is a torch.Tensor before using it. If the tokenizer returns an unexpected type (e.g. list instead of tensor), a TypeError naming the actual type is raised. This guards against non-standard tokenizer outputs breaking the encoder forward call.","triggerScenarios":"Calling the Qwen3 tokenizer with return_tensors=\"pt\" and receiving input_ids that is not a torch.Tensor — typically from a custom/incompatible tokenizer implementation or mocked tokenizer.","commonSituations":"A tokenizer subclass overriding __call__ and returning Python lists; a transformers version where tensor conversion failed; passing a raw tokenizer config object instead of the loaded tokenizer.","solutions":["Use the standard transformers tokenizer for Qwen3 (AutoTokenizer / PreTrainedTokenizerFast) instead of a custom subclass.","Ensure return_tensors=\"pt\" is honoured by your tokenizer version; upgrade transformers if needed.","Confirm the loaded tokenizer is a PreTrainedTokenizerBase instance before calling it.","Convert manually if needed: torch.tensor(tokenizer_output.input_ids)."],"exampleFix":"// before\ninputs = custom_tokenizer(prompt, return_tensors=\"pt\")\n// after\nfrom transformers import AutoTokenizer\ntok = AutoTokenizer.from_pretrained(model_path)\ninputs = tok(prompt, padding=\"longest\", return_tensors=\"pt\")","handlingStrategy":"type-guard","validationCode":"inputs = tok(prompt, padding=\"longest\", return_tensors=\"pt\")\nif not isinstance(inputs.input_ids, torch.Tensor):\n    fail_fast(inputs.input_ids)","typeGuard":"def is_tensor(x) -> bool:\n    import torch\n    return isinstance(x, torch.Tensor)","tryCatchPattern":"try:\n    encode(context)\nexcept TypeError as e:\n    if \"Expected torch.Tensor for input_ids\" in str(e):\n        swap_to_stock_tokenizer()\n    else:\n        raise","preventionTips":["Always call tokenizers with return_tensors=\"pt\" in torch pipelines.","Avoid custom tokenizer subclasses that return raw lists.","Test tokenizer output types in CI when changing transformers versions."],"tags":["type-check","tokenizer","torch","z-image"],"backgroundTag":"unexpected-model-type","analyzedSha":"0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06","analyzedAt":"2026-08-29T04:46:49.967Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}