oraios/serena · critical · LanguageServerManagerInitialisationError

Failed to start {len(exceptions)} language server(s): {failu

Error message

Failed to start {len(exceptions)} language server(s):
{failure_messages}

What it means

LanguageServerManager.from_languages aggregates per-language startup exceptions and, if any occurred, stops all successfully started servers and raises LanguageServerManagerInitialisationError listing each failing language and its error. The manager refuses to operate with a partial set of language servers, since silently missing languages would degrade agent behavior.

Source

Thrown at src/serena/ls_manager.py:155

        language_servers: dict[LanguageServerId, SolidLanguageServer] = {}
        exceptions: dict[LanguageServerId, Exception] = {}
        for thread in threads:
            thread.join()
            if thread.exception is not None:
                exceptions[thread.ls_id] = thread.exception
            elif thread.language_server is not None:
                language_servers[thread.ls_id] = thread.language_server

        # If any server failed to start up, raise an exception and stop all started language servers.
        # We intentionally fail fast here. The user's intention is to work with all the specified languages,
        # so if any of them is not available, it is better to make symbolic tool calls fail, bringing the issue to the
        # user's attention instead of silently continuing with a subset of the language servers and potentially
        # causing suboptimal agent behaviour.
        if exceptions:
            for ls in language_servers.values():
                ls.stop()
            failure_messages = "\n".join([f"{lang.value}: {e}" for lang, e in exceptions.items()])
            raise LanguageServerManagerInitialisationError(f"Failed to start {len(exceptions)} language server(s):\n{failure_messages}")

        return LanguageServerManager(language_servers, factory, project)

    def _ensure_functional_ls(self, ls: SolidLanguageServer) -> SolidLanguageServer:
        if not ls.is_running():
            log.warning(f"Language server for language {ls.ls_id} is not running; restarting ...")
            ls = self.restart_language_server(ls.ls_id)
        return ls

    def _get_suitable_language_server(self, relative_path: str) -> SolidLanguageServer | None:
        """:param relative_path: relative path to a file"""
        for candidate in self._language_servers.values():
            if not candidate.is_ignored_path(relative_path, ignore_unsupported_files=True):
                return candidate
        return None

    def get_language_server(self, relative_path: str) -> SolidLanguageServer:
        """:param relative_path: relative path to a file"""

View on GitHub (pinned to 7fcbca7e62)

Solutions

  1. Read the failure_messages in the exception to identify which language(s) failed and why
  2. Install or fix the failing language server's binary/config
  3. Remove the failing language from the requested languages list if it isn't needed
  4. Retry from_languages after remediation — a failed manager cannot be reused

Example fix

// before
manager = LanguageServerManager.from_languages(
    [LanguageServerId.PYTHON, LanguageServerId.TYPESCRIPT], factory, project)
# LanguageServerManagerInitialisationError: typescript missing
// after
# $ npm install -g typescript typescript-language-server
manager = LanguageServerManager.from_languages(
    [LanguageServerId.PYTHON, LanguageServerId.TYPESCRIPT], factory, project)
Defensive patterns

Strategy: try-catch

Validate before calling

import shutil
missing = [l for l in languages if not shutil.which(expected_binary[l])]
if missing:
    raise EnvironmentError(f"Missing language servers: {missing}")

Try / catch

try:
    manager = LanguageServerManager.from_languages(langs, factory, project)
except LanguageServerManagerInitialisationError as e:
    print(e)  # lists each failing language: error
    langs = [l for l in langs if f"{l.value}:" not in str(e)]
    manager = LanguageServerManager.from_languages(langs, factory, project)

Prevention

When it happens

Trigger: Calling create_language_server_manager / from_languages with several languages where at least one language server fails to start (e.g. one LSP binary missing) — the whole initialization aborts.

Common situations: Multi-language project where one toolchain isn't installed (e.g. gopls missing while pyright works); wrong command path for one server in config; one server crashing on startup due to version incompatibility.

Related errors


AI-assisted analysis of oraios/serena@7fcbca7e62 (2026-08-29). Data as JSON: /api/errors/261ca0fb270d9301. Report an issue: GitHub.