{"record":{"id":"5f8673fbd580bb10","repo":"deepset-ai/haystack","slug":"n-expansions-must-be-positive","errorCode":null,"errorMessage":"n_expansions must be positive","messagePattern":"n_expansions must be positive","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"haystack/components/query/query_expander.py","lineNumber":110,"sourceCode":"        chat_generator: ChatGenerator | None = None,\n        prompt_template: str | None = None,\n        n_expansions: int = 4,\n        include_original_query: bool = True,\n    ) -> None:\n        \"\"\"\n        Initialize the QueryExpander component.\n\n        :param chat_generator: The chat generator component to use for query expansion.\n            If None, a default OpenAIChatGenerator with gpt-4.1-mini model is used.\n        :param prompt_template: Custom [PromptBuilder](https://docs.haystack.deepset.ai/docs/promptbuilder)\n            template for query expansion. The template should instruct the LLM to return a JSON response with the\n            structure: `{\"queries\": [\"query1\", \"query2\", \"query3\"]}`. The template should include 'query' and\n            'n_expansions' variables.\n        :param n_expansions: Number of alternative queries to generate (default: 4).\n        :param include_original_query: Whether to include the original query in the output.\n        \"\"\"\n        if n_expansions <= 0:\n            raise ValueError(\"n_expansions must be positive\")\n\n        self.n_expansions = n_expansions\n        self.include_original_query = include_original_query\n\n        if chat_generator is None:\n            self.chat_generator: ChatGenerator = OpenAIChatGenerator(\n                model=\"gpt-4.1-mini\",\n                generation_kwargs={\n                    \"temperature\": 0.7,\n                    \"response_format\": {\n                        \"type\": \"json_schema\",\n                        \"json_schema\": {\n                            \"name\": \"query_expansion\",\n                            \"schema\": {\n                                \"type\": \"object\",\n                                \"properties\": {\"queries\": {\"type\": \"array\", \"items\": {\"type\": \"string\"}}},\n                                \"required\": [\"queries\"],\n                                \"additionalProperties\": False,","sourceCodeStart":92,"sourceCodeEnd":128,"githubUrl":"https://github.com/deepset-ai/haystack/blob/e318778c9bf60a1963e3b5f451359655dd696c30/haystack/components/query/query_expander.py#L92-L128","documentation":"QueryExpander.__init__ requires n_expansions (number of alternative queries the LLM should generate) to be a positive integer. Zero or negative values would ask the model to produce no/non-sensical expansions, so construction fails fast.","triggerScenarios":"QueryExpander(n_expansions=0), negative values, or a variable computed from user/config input that resolved to <= 0.","commonSituations":"App settings exposing 'number of query variations' to end users who enter 0; config defaults of 0 meaning 'unset' elsewhere but invalid here.","solutions":["Pass a positive integer, e.g. QueryExpander(n_expansions=4) (default).","Validate/clamp user input: max(1, requested).","Omit the parameter to keep the default of 4."],"exampleFix":"// before\nexpander = QueryExpander(n_expansions=0)\n// after\nexpander = QueryExpander(n_expansions=4)","handlingStrategy":"validation","validationCode":"if n_expansions <= 0:\n    raise ValueError(f'n_expansions must be positive, got {n_expansions}')","typeGuard":"def is_positive_int(v) -> bool:\n    return isinstance(v, int) and v > 0","tryCatchPattern":"try:\n    expander = QueryExpander(n_expansions=n)\nexcept ValueError as e:\n    logger.error('Invalid n_expansions: %s', e)\n    expander = QueryExpander()  # default 4","preventionTips":["Clamp user-facing inputs: max(1, requested).","Don't use 0 as 'unset'; use None/omit the parameter.","Validate app settings at startup, not at first query."],"tags":["python","validation","constructor-argument","haystack","query"],"backgroundTag":"invalid-parameter-value","analyzedSha":"e318778c9bf60a1963e3b5f451359655dd696c30","analyzedAt":"2026-08-30T11:45:20.711Z","schemaVersion":2},"datasetVersion":"2026-08-30T13:17:10.514Z"}