{"record":{"id":"67cb47cefd2358b5","repo":"oraios/serena","slug":"no-language-server-factory-available-to-create-lan","errorCode":null,"errorMessage":"No language server factory available to create language server for {ls_id}","messagePattern":"No language server factory available to create language server for (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"src/serena/ls_manager.py","lineNumber":185,"sourceCode":"        for candidate in self._language_servers.values():\n            if not candidate.is_ignored_path(relative_path, ignore_unsupported_files=True):\n                return candidate\n        return None\n\n    def get_language_server(self, relative_path: str) -> SolidLanguageServer:\n        \"\"\":param relative_path: relative path to a file\"\"\"\n        ls: SolidLanguageServer | None = None\n        if len(self._language_servers) > 1:\n            if os.path.isdir(relative_path):\n                raise ValueError(f\"Expected a file path, but got a directory: {relative_path}\")\n            ls = self._get_suitable_language_server(relative_path)\n        if ls is None:\n            ls = self._default_language_server\n        return self._ensure_functional_ls(ls)\n\n    def _create_and_start_language_server(self, ls_id: LanguageServerId) -> SolidLanguageServer:\n        if self._language_server_factory is None:\n            raise ValueError(f\"No language server factory available to create language server for {ls_id}\")\n        language_server = self._language_server_factory.create_language_server(ls_id)\n        language_server.start()\n        self._language_servers[ls_id] = language_server\n        return language_server\n\n    def restart_language_server(self, language: LanguageServerId) -> SolidLanguageServer:\n        \"\"\"\n        Forces recreation and restart of the language server for the given language.\n        It is assumed that the language server for the given language is no longer running.\n\n        :param language: the language\n        :return: the newly created language server\n        \"\"\"\n        if language not in self._language_servers:\n            raise ValueError(f\"No language server for language {language.value} present; cannot restart\")\n        return self._create_and_start_language_server(language)\n\n    def add_language_server(self, ls_id: LanguageServerId) -> SolidLanguageServer:","sourceCodeStart":167,"sourceCodeEnd":203,"githubUrl":"https://github.com/oraios/serena/blob/7fcbca7e62555ec2287ddb2f083caee805848ea6/src/serena/ls_manager.py#L167-L203","documentation":"_create_and_start_language_server requires the optional _language_server_factory to create servers on demand. A manager built without a factory (e.g. the default constructor path where factory is None) cannot create new servers, so it raises ValueError naming the requested language.","triggerScenarios":"Calling restart_language_server or add_language_server on a manager whose _language_server_factory is None — typically a manager constructed directly rather than via from_languages, or deserialized/pickled where the factory was dropped.","commonSituations":"Manually constructed LanguageServerManager with factory=None; manager obtained through a path that doesn't wire the factory; dynamic language addition attempted on a read-only/prebuilt manager.","solutions":["Construct the manager via from_languages so a factory is always present","Pass the LanguageServerFactory explicitly when constructing LanguageServerManager","Recreate the manager with a factory instead of calling add/restart on a factory-less instance"],"exampleFix":"// before\nmanager = LanguageServerManager({}, None, project)\nmanager.add_language_server(LanguageServerId.PYTHON)  # ValueError\n// after\nmanager = LanguageServerManager({}, my_factory, project)\nmanager.add_language_server(LanguageServerId.PYTHON)","handlingStrategy":"validation","validationCode":"if not manager.get_active_language_server_ids() and manager_is_factoryless:\n    raise RuntimeError(\"manager has no factory; recreate via from_languages\")","typeGuard":null,"tryCatchPattern":"try:\n    ls = manager.add_language_server(ls_id)\nexcept ValueError as e:\n    if \"No language server factory available\" in str(e):\n        manager = LanguageServerManager.from_languages([ls_id], factory, project)\n        ls = manager.get_language_server(representative_file)\n    else:\n        raise","preventionTips":["Create managers via from_languages so the factory is always wired","Never construct LanguageServerManager manually with factory=None","Avoid pickling/reconstructing managers without re-injecting the factory","Expose a helper that recreates the manager for dynamic language changes"],"tags":["language-server","factory","configuration"],"backgroundTag":"missing-dependency-injection","analyzedSha":"7fcbca7e62555ec2287ddb2f083caee805848ea6","analyzedAt":"2026-08-29T00:04:09.619Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}