{"record":{"id":"674bf97644e95551","repo":"vllm-project/vllm","slug":"the-model-is-not-multimodal","errorCode":null,"errorMessage":"The model is not multimodal.","messagePattern":"The model is not multimodal\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"vllm/config/model.py","lineNumber":1630,"sourceCode":"            # used by e.g. Mamba2, NemotronH, Zamba\n            chunk_size = getattr(self.hf_text_config, \"chunk_size\", None)\n\n        # Since Mamba1 does not have a chunk notion\n        # we use a default chunk size of 2048.\n        if chunk_size is None:\n            chunk_size = 2048\n\n        return chunk_size\n\n    def get_multimodal_config(self) -> MultiModalConfig:\n        \"\"\"\n        Get the multimodal configuration of the model.\n\n        Raises:\n            ValueError: If the model is not multimodal.\n        \"\"\"\n        if self.multimodal_config is None:\n            raise ValueError(\"The model is not multimodal.\")\n\n        return self.multimodal_config\n\n    def try_get_generation_config(self) -> dict[str, Any]:\n        \"\"\"\n        This method attempts to retrieve the non-default values of the\n        generation config for this model.\n\n        The generation config can contain information about special tokens, as\n        well as sampling parameters. Which is why this method exists separately\n        to `get_diff_sampling_param`.\n\n        Returns:\n            A dictionary containing the non-default generation config.\n        \"\"\"\n        if self.generation_config in {\"auto\", \"vllm\"}:\n            config = try_get_generation_config(\n                self.hf_config_path or self.model,","sourceCodeStart":1612,"sourceCodeEnd":1648,"githubUrl":"https://github.com/vllm-project/vllm/blob/c794754062d49a8fdb63ab3c5215b488b865030c/vllm/config/model.py#L1612-L1648","documentation":"get_multimodal_config() returns the MultiModalConfig only for multimodal models; it raises ValueError('The model is not multimodal.') when the config's multimodal_config is None. The docstring marks this as the expected failure mode for text-only models.","triggerScenarios":"Calling ModelConfig.get_multimodal_config() on a text-only LLM (e.g. Llama) — any component assuming multimodality (processor registration, MM profiling) hits this.","commonSituations":"Writing generic code that unconditionally fetches the MM config for every model; passing a text-only model to a multimodal serving pipeline; forgetting that multimodal_config is Optional on ModelConfig.","solutions":["Guard the call: check config.multimodal_config is not None (or use is_multimodal_model / the model type) before calling get_multimodal_config().","Use the correct multimodal checkpoint (e.g. a -VL / -Vision variant) if MM processing was intended."],"exampleFix":"# before\nmm_cfg = model_config.get_multimodal_config()\n# after\nif model_config.multimodal_config is not None:\n    mm_cfg = model_config.get_multimodal_config()\nelse:\n    mm_cfg = None","handlingStrategy":"type-guard","validationCode":"mm_cfg = (model_config.get_multimodal_config()\n          if model_config.multimodal_config is not None else None)","typeGuard":"def is_multimodal(model_config) -> bool:\n    return model_config.multimodal_config is not None","tryCatchPattern":null,"preventionTips":["Never call get_multimodal_config() unconditionally in generic code paths.","Branch on multimodal_config presence (or is_multimodal_model) before touching MM subsystems.","Type model_config-carrying code against Optional[MultiModalConfig] so None is handled explicitly."],"tags":["multimodal","api-misuse","config"],"backgroundTag":null,"analyzedSha":"c794754062d49a8fdb63ab3c5215b488b865030c","analyzedAt":"2026-08-14T21:17:39.825Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}