{"record":{"id":"80b11b805ae88759","repo":"xai-org/x-algorithm","slug":"no-generators-provided","errorCode":null,"errorMessage":"No generators provided","messagePattern":"No generators provided","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"grox/core/generators/task_generator.py","lineNumber":73,"sourceCode":"\n    @abstractmethod\n    def _poll(self) -> AsyncGenerator[TaskPayload | None, None]:\n        pass\n\n    async def ack(self, result: TaskResult):\n        pass\n\n    def identify_task_origin(self, result: TaskResult) -> str | None:\n        return self.TASK_GENERATOR_TYPE\n\n    def on_terminal_failure(self, result: TaskResult) -> None:\n        pass\n\n\nclass PriorityTaskGenerator(TaskGenerator):\n    def __init__(self, generators: list[tuple[TaskGenerator, int]]):\n        if not generators:\n            raise ValueError(\"No generators provided\")\n        if any(weight <= 0 for _, weight in generators):\n            raise ValueError(\"All weights must be positive\")\n        super().__init__(None)\n        self._generators: dict[str, TaskGenerator] = {}\n        self._weights: dict[str, int] = {}\n        for i, (gen, weight) in enumerate(generators):\n            label = f\"GEN_{i}\"\n            self._generators[label] = gen\n            self._weights[label] = weight\n        self._result_cache: dict[str, str] = {}\n        logger.info(\n            f\"Initialized priority task generator with {list(zip(self._generators.keys(), [gen.__class__.__name__ for gen in self._generators.values()], self._weights.values(), strict=True))}\"\n        )\n\n    async def start(self) -> None:\n        logger.info(\"Starting priority task generators\")\n        await asyncio.gather(*[gen.start() for gen in self._generators.values()])\n        self._streams = {label: gen.poll() for label, gen in self._generators.items()}","sourceCodeStart":55,"sourceCodeEnd":91,"githubUrl":"https://github.com/xai-org/x-algorithm/blob/24c60942c5c5fdad3a6addffb4c6e6d2f228f04f/grox/core/generators/task_generator.py#L55-L91","documentation":"PriorityTaskGenerator multiplexes several weighted child generators; with zero children there is nothing to poll, so its constructor refuses an empty list immediately with ValueError.","triggerScenarios":"Constructing PriorityTaskGenerator(generators=[]) or with a list comprehension that filtered everything out; passing a programmatically-built list that happens to be empty.","commonSituations":"Dynamically assembling generators from config where all entries were disabled/filtered; empty config arrays; tests constructing the class without children.","solutions":["Guard before construction: if the candidate list is empty, skip creating the PriorityTaskGenerator or supply a default generator.","Fix the filtering/config logic that produced an empty list.","Ensure config arrays contain at least one enabled generator entry."],"exampleFix":"# before\npg = PriorityTaskGenerator([])\n\n# after\ngens = [(g, w) for g, w in configured if g.enabled]\nif not gens:\n    raise ValueError(\"config must enable at least one generator\")\npg = PriorityTaskGenerator(gens)","handlingStrategy":"validation","validationCode":"if not generators:\n    raise ValueError(\"need at least one (generator, weight) pair\")\npg = PriorityTaskGenerator(generators)","typeGuard":"def is_nonempty_pairs(generators: list) -> bool:\n    return isinstance(generators, list) and len(generators) > 0","tryCatchPattern":"try:\n    pg = PriorityTaskGenerator(gens)\nexcept ValueError as e:\n    if \"No generators provided\" in str(e):\n        pg = PriorityTaskGenerator([(default_gen(), 1)])\n    else:\n        raise","preventionTips":["Check filtered generator lists for emptiness before constructing.","Require at least one enabled generator in config validation.","Default to a fallback generator when the list would be empty."],"tags":["python","validation","constructor","configuration"],"backgroundTag":"empty-collection-argument","analyzedSha":"24c60942c5c5fdad3a6addffb4c6e6d2f228f04f","analyzedAt":"2026-08-28T11:40:14.686Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}