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
- Read the failure_messages in the exception to identify which language(s) failed and why
- Install or fix the failing language server's binary/config
- Remove the failing language from the requested languages list if it isn't needed
- 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
- Verify every requested language's server binary is installed before init
- Parse failure_messages to identify exactly which languages failed
- Only request languages the project actually uses
- Keep server commands/paths correct in language config
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
- The language server manager is not initialized, indicating a
- Language server is missing required capabilities: {', '.join
- Failed to initialize F# language server for {self.repository
- No symbols found in target file {target_file}
- FindSymbolTool returned no results
AI-assisted analysis of oraios/serena@7fcbca7e62 (2026-08-29).
Data as JSON: /api/errors/261ca0fb270d9301.
Report an issue: GitHub.