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.exceptionView on GitHub (pinned to 7fcbca7e62)
Solutions
- Check the server log output (log.error includes exc_info) for the underlying cause
- Install/verify the language server binary, e.g. run 'pyright --version' or 'typescript-language-server --version'
- Fix the language server command/options in the serena language config
- 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
- Pre-install all language server binaries and verify with --version
- Pin compatible server versions in your environment
- Inspect serena logs (exc_info included) for the root cause
- Health-check the manager right after creation
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
- No symbols found in target file {target_file}
- FindSymbolTool returned no results
- Unhandled document change kind: {change}; Please report to S
- Invalid language server: '{orig_language_str}'.\nValid value
- Invalid language server identifier: {request_add_language.la
AI-assisted analysis of oraios/serena@7fcbca7e62 (2026-08-29).
Data as JSON: /api/errors/df6360f636ab9ce8.
Report an issue: GitHub.