{"record":{"id":"c9e20f4cb3f700f6","repo":"zylon-ai/private-gpt","slug":"no-default-model-configured-to-set-llm","errorCode":null,"errorMessage":"No default model configured to set LLM","messagePattern":"No default model configured to set LLM","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"warning","filePath":"private_gpt/components/llm/llm_component.py","lineNumber":218,"sourceCode":"            ):\n                seen.add(id(model_id))\n\n                tokenizer_fn: TokenizerFn | AsyncTokenizerFn | None = None\n                if component.tokenizer:\n                    if isinstance(component.tokenizer, AsyncTokenizerBase):\n                        tokenizer_fn = get_async_tokenizer_fn(component.tokenizer)\n                    else:\n                        tokenizer_fn = get_tokenizer_fn(component.tokenizer)\n                yield component.llm, model_config, tokenizer_fn\n\n    @property\n    def llm(self) -> LLM:\n        return self.get_llm()\n\n    @llm.setter\n    def llm(self, value: LLM) -> None:\n        if not self._default_model_id:\n            raise ValueError(\"No default model configured to set LLM\")\n\n        before_tokenizer: TokenizerBase | None = None\n        llm_instance = self.registry.get(self._default_model_id)\n        if llm_instance:\n            before_tokenizer = llm_instance.tokenizer\n            self.registry.unregister(self._default_model_id)\n\n        instance = LLMInstance(llm=value, tokenizer=before_tokenizer)\n        logger.warning(\n            \"Directly setting the LLM instance is deprecated. \"\n            \"Use ONLY for testing purposes.\"\n        )\n        self.registry.register(self._default_model_id, instance)\n\n    @property\n    def alias(self) -> str | None:\n        return self.get_alias()\n","sourceCodeStart":200,"sourceCodeEnd":236,"githubUrl":"https://github.com/zylon-ai/private-gpt/blob/4a030776a31a901ad80b1bf4d7faa2c1a367efbb/private_gpt/components/llm/llm_component.py#L200-L236","documentation":"ValueError from the deprecated llm setter on LLMComponent: assigning component.llm requires a default model id to exist, because the setter replaces the registry entry for the default model (preserving its tokenizer). With no default configured there is no entry to replace, so the assignment is rejected. The setter also logs a deprecation warning — it is intended for tests only.","triggerScenarios":"Doing `component.llm = my_llm` on a component where no default model was configured (empty config or nothing registered).","commonSituations":"Test fixtures wiring a mock LLM into a component built without model settings; production code using the deprecated direct-assignment API instead of configuration.","solutions":["In tests, configure a minimal model entry (or mock _default_model_id) before assigning so a default exists.","Prefer configuring llm.models/default_model in settings over the setter; the setter is deprecated and test-only.","If you must use the setter, ensure the component booted with at least one registered default model."],"exampleFix":"# before\ncomponent = LLMComponent()\ncomponent.llm = mock_llm  # raises: no default\n\n# after (give the component a default first, e.g. in settings/test fixture)\ncomponent = build_component_with_default_model()\ncomponent.llm = mock_llm","handlingStrategy":"validation","validationCode":"def can_set_llm(component) -> bool:\n    return bool(component._default_model_id)","typeGuard":null,"tryCatchPattern":"try:\n    component.llm = mock_llm\nexcept ValueError as e:\n    if 'No default model configured' in str(e):\n        # configure a default first, or register a model, then retry\n        raise RuntimeError('Configure a default model before assigning llm') from e\n    raise","preventionTips":["Treat the llm setter as test-only; production code should go through settings/registry.","In test fixtures, always build the component with one minimal model entry.","Assert _default_model_id is set in fixture setup so failures point at configuration, not the setter."],"tags":["deprecated","testing","llm","configuration"],"backgroundTag":null,"analyzedSha":"4a030776a31a901ad80b1bf4d7faa2c1a367efbb","analyzedAt":"2026-08-15T03:51:26.951Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}