oraios/serena · error · RuntimeError

Failed to start the language server for language {self.ls_id

Error message

Failed to start the language server for language {self.ls_id.value}

What it means

During parallel startup, a thread creates and starts the language server, then raises RuntimeError if language_server.is_running() is still false. The exception is captured in self.exception and logged; it surfaces aggregated via from_languages as LanguageServerManagerInitialisationError.

Source

Thrown at src/serena/ls_manager.py:124

        :param factory: the factory for language server creation
        :param project: the project for which the language servers are created
        :return: the instance
        """

        class StartLSThread(threading.Thread):
            def __init__(self, ls_id: LanguageServerId):
                super().__init__(target=self._start_language_server, name="StartLS:" + ls_id.value)
                self.ls_id = ls_id
                self.language_server: SolidLanguageServer | None = None
                self.exception: Exception | None = None

            def _start_language_server(self) -> None:
                try:
                    with LogTime(f"Language server startup (language={self.ls_id.value})"):
                        self.language_server = factory.create_language_server(self.ls_id)
                        self.language_server.start()
                        if not self.language_server.is_running():
                            raise RuntimeError(f"Failed to start the language server for language {self.ls_id.value}")
                except Exception as e:
                    log.error(f"Error starting language server for language {self.ls_id.value}: {e}", exc_info=e)
                    self.exception = e

        # start language servers in parallel threads
        threads = []
        for language in languages:
            thread = StartLSThread(language)
            thread.start()
            threads.append(thread)

        # collect language servers and exceptions
        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

View on GitHub (pinned to 7fcbca7e62)

Solutions

  1. Check the server log output (log.error includes exc_info) for the underlying cause
  2. Install/verify the language server binary, e.g. run 'pyright --version' or 'typescript-language-server --version'
  3. Fix the language server command/options in the serena language config
  4. Retry after fixing; the manager stops all servers and raises LanguageServerManagerInitialisationError, so the whole manager must be recreated

Example fix

// before
# pyright not installed
manager = LanguageServerManager.from_languages([LanguageServerId.PYTHON], factory, project)
// after
# $ npm install -g pyright
manager = LanguageServerManager.from_languages([LanguageServerId.PYTHON], factory, project)
Defensive patterns

Strategy: try-catch

Validate before calling

import shutil
assert shutil.which("pyright"), "pyright binary not on PATH"

Try / catch

try:
    manager = LanguageServerManager.from_languages(langs, factory, project)
except LanguageServerManagerInitialisationError as e:
    logger.error("LS startup failed: %s", e)
    # fix binary/config, then retry
    manager = LanguageServerManager.from_languages(langs, factory, project)

Prevention

When it happens

Trigger: factory.create_language_server(ls_id) succeeds and start() returns but the server process exits immediately — e.g. missing LSP binary on PATH, bad command-line configuration, port/pipe failure, or the server crashing on startup.

Common situations: language server executable not installed (e.g. pyright/typescript-language-server absent); wrong version pinned in config; insufficient permissions or broken node installation; server killed by resource limits.

Related errors


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