infiniflow/ragflow · warning · RuntimeError
Unsupported language for SSH provider: {language}
Error message
Unsupported language for SSH provider: {language} What it means
Raised as RuntimeError by _upload_script when the language (already passed through _normalize_language) is not 'python' and not in {'javascript','nodejs'}. It selects the wrapper (build_python_wrapper vs build_javascript_wrapper) and script filename; anything else has no wrapper, so upload is rejected before any file is written. Supported set matches get_supported_languages(): python, javascript, nodejs.
Source
Thrown at agent/sandbox/providers/ssh.py:547
raise RuntimeError("Remote workspace creation did not return a path.")
return remote_work_dir
def _upload_script(
self,
sftp: paramiko.SFTPClient,
remote_work_dir: str,
language: str,
code: str,
args_json: str,
) -> tuple[str, str]:
if language == "python":
script_name = "main.py"
script_content = build_python_wrapper(code, args_json)
elif language in {"javascript", "nodejs"}:
script_name = "main.js"
script_content = build_javascript_wrapper(code, args_json)
else:
raise RuntimeError(f"Unsupported language for SSH provider: {language}")
remote_script_path = posixpath.join(remote_work_dir, script_name)
with sftp.file(remote_script_path, "w") as remote_file:
remote_file.write(script_content)
command = self._build_execution_command(remote_work_dir, remote_script_path, language)
return remote_script_path, command
def _build_execution_command(self, remote_work_dir: str, remote_script_path: str, language: str) -> str:
normalized_lang = self._normalize_language(language)
if normalized_lang == "python":
executable = self.python_bin
elif normalized_lang == "nodejs":
executable = self.node_bin
else:
raise RuntimeError(f"Unsupported language for SSH provider: {language}")
return f"cd {shlex.quote(remote_work_dir)} && {shlex.quote(executable)} {shlex.quote(remote_script_path)}"View on GitHub (pinned to 554fb1133a)
Solutions
- Use one of: 'python', 'javascript', or 'nodejs' (case-insensitive)
- Check provider.get_supported_languages() before dispatching, or pick a different sandbox provider for the language
- Normalize your own language strings to these tokens before calling execute_code
Example fix
// before provider.execute_code(instance_id, code, "js") // after provider.execute_code(instance_id, code, "javascript")
Defensive patterns
Strategy: validation
Validate before calling
language = provider._normalize_language(language or "python")
if language not in {"python", "javascript", "nodejs"}:
raise ValueError(f"unsupported language {language!r}; use python/javascript/nodejs")
result = provider.execute_code(instance_id, code, language) Type guard
SUPPORTED = {"python", "javascript", "nodejs"}
def is_supported_language(provider, language: str) -> bool:
return provider._normalize_language((language or "").lower()) in SUPPORTED Prevention
- Gate language values against get_supported_languages() before dispatch
- Use 'javascript' or 'nodejs', not 'js'/'node'
- Select interpreter versions via python_bin/node_bin config, not the language string
When it happens
Trigger: Calling execute_code with language='java', 'bash', 'go', etc.; passing an empty or None-ish language value that normalizes to something unexpected; language spelling like 'JavaScript' actually works (lowercased), but 'js' does not — it falls through and raises.
Common situations: Agent templates configured for languages this provider does not support; assuming 'js'/'node' aliases exist (only 'javascript' and 'nodejs' are accepted); language values coming from user input in a multi-language code node.
Related errors
- Invalid SSH provider configuration.
- Execution timeout must be greater than 0 seconds, got {reque
- SSH execution output exceeded {self.max_output_bytes} bytes.
- SANDBOX_LOCAL_TIMEOUT must be greater than 0.
- SANDBOX_LOCAL_MAX_MEMORY_MB must be greater than 0.
AI-assisted analysis of infiniflow/ragflow@554fb1133a (2026-08-15).
Data as JSON: /api/errors/b66082105c169da3.
Report an issue: GitHub.