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

  1. Use one of: 'python', 'javascript', or 'nodejs' (case-insensitive)
  2. Check provider.get_supported_languages() before dispatching, or pick a different sandbox provider for the language
  3. 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

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


AI-assisted analysis of infiniflow/ragflow@554fb1133a (2026-08-15). Data as JSON: /api/errors/b66082105c169da3. Report an issue: GitHub.