{"record":{"id":"6ca2313ec8523b8f","repo":"vllm-project/vllm","slug":"seq-pooling-type-is-not-set-it-should-be-resolved","errorCode":null,"errorMessage":"seq_pooling_type is not set; it should be resolved by ModelConfig before calling get_seq_pooling_type()","messagePattern":"seq_pooling_type is not set; it should be resolved by ModelConfig before calling get_seq_pooling_type\\(\\)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"vllm/config/pooler.py","lineNumber":164,"sourceCode":"                logger.debug(\n                    \"Resolved `pooling_type=%r` to `seq_pooling_type=%r`.\",\n                    pooling_type,\n                    pooling_type,\n                )\n                self.seq_pooling_type = pooling_type  # type: ignore[assignment]\n            elif pooling_type in TOK_POOLING_TYPES:\n                logger.debug(\n                    \"Resolved `pooling_type=%r` to `tok_pooling_type=%r`.\",\n                    pooling_type,\n                    pooling_type,\n                )\n                self.tok_pooling_type = pooling_type  # type: ignore[assignment]\n            else:\n                raise NotImplementedError(pooling_type)\n\n    def get_seq_pooling_type(self) -> SequencePoolingType:\n        if self.seq_pooling_type is None:\n            raise ValueError(\n                \"seq_pooling_type is not set; it should be resolved by\"\n                \" ModelConfig before calling get_seq_pooling_type()\"\n            )\n        return self.seq_pooling_type\n\n    def get_tok_pooling_type(self) -> TokenPoolingType:\n        if self.tok_pooling_type is None:\n            raise ValueError(\n                \"tok_pooling_type is not set; it should be resolved by\"\n                \" ModelConfig before calling get_tok_pooling_type()\"\n            )\n        return self.tok_pooling_type\n\n    def compute_hash(self) -> str:\n        \"\"\"\n        WARNING: Whenever a new field is added to this config,\n        ensure that it is included in the factors list if\n        it affects the computation graph.","sourceCodeStart":146,"sourceCodeEnd":182,"githubUrl":"https://github.com/vllm-project/vllm/blob/c794754062d49a8fdb63ab3c5215b488b865030c/vllm/config/pooler.py#L146-L182","documentation":"PoolerConfig.get_seq_pooling_type() raises when seq_pooling_type is still None at call time. The field is meant to be populated either explicitly by the user or by ModelConfig's resolution step (which maps pooling_type and task defaults into seq/tok fields). Seeing None means resolution never ran — an internal contract violation, not a user config error in most cases.","triggerScenarios":"Calling pooler_config.get_seq_pooling_type() on a hand-constructed PoolerConfig that was never processed by ModelConfig/_resolve_pooling; or model-loading code paths that skip the ModelConfig resolution step.","commonSituations":"Custom model implementations or tests instantiating PoolerConfig directly and calling getters; internal refactors that call the getter before ModelConfig.__post_init__ resolution.","solutions":["Set seq_pooling_type explicitly when constructing the config for direct use.","In model code, obtain PoolerConfig via ModelConfig (model_config.pooler_config) so resolution has run.","For vLLM contributors: call the resolution path (ModelConfig initialization) before get_seq_pooling_type()."],"exampleFix":"# before\ncfg = PoolerConfig()\ntype_ = cfg.get_seq_pooling_type()  # raises\n\n# after\ncfg = PoolerConfig(seq_pooling_type='MEAN')\ntype_ = cfg.get_seq_pooling_type()","handlingStrategy":"validation","validationCode":"def get_seq_type_or_default(cfg, default: str = \"MEAN\") -> str:\n    return cfg.seq_pooling_type if cfg.seq_pooling_type is not None else default","typeGuard":"def has_seq_pooling(cfg) -> bool:\n    return cfg.seq_pooling_type is not None","tryCatchPattern":"try:\n    ptype = cfg.get_seq_pooling_type()\nexcept ValueError:\n    ptype = \"MEAN\"  # or run ModelConfig resolution first","preventionTips":["Always obtain PoolerConfig from ModelConfig, never construct it standalone in model code.","Check .seq_pooling_type is not None before calling the getter in tests."],"tags":["pooling","internal-contract","api-misuse"],"backgroundTag":null,"analyzedSha":"c794754062d49a8fdb63ab3c5215b488b865030c","analyzedAt":"2026-08-14T21:17:39.825Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}