langchain-ai/langgraph · error · IsADirectoryError

Encryption path must be a file

Error message

Encryption path must be a file: {resolved}

What it means

Raised during langgraph.json config preparation when encryption.path uses the relative 'module:attribute' form but the resolved file (config directory joined with the module path) does not exist. The encryption provider module could not be located, so the config is invalid. Correct the path or place the file where the config expects it.

Solutions

  1. Point encryption.path at the specific .py file, e.g. './encryption.py:key'.
  2. Add the ':<attribute>' suffix.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at libs/cli/langgraph_cli/config.py:986 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of langchain-ai/langgraph@38031739e5 (2026-08-26). Data as JSON: /api/errors/aa6ae3fc345b792f. Report an issue: GitHub.

Appendix: source

Thrown at libs/cli/langgraph_cli/config.py:986

def _update_encryption_path(
    config_path: pathlib.Path, config: Config, local_deps: LocalDeps
) -> None:
    """Update encryption.path to use Docker container paths."""
    encryption_conf = config.get("encryption")
    if not encryption_conf or not (path_str := encryption_conf.get("path")):
        return

    module_str, sep, attr_str = path_str.partition(":")
    if not sep or not module_str.startswith("."):
        return  # Already validated or absolute path

    resolved = config_path.parent / module_str
    if not resolved.exists():
        raise FileNotFoundError(
            f"Encryption file not found: {resolved} (from {path_str})"
        )
    if not resolved.is_file():
        raise IsADirectoryError(f"Encryption path must be a file: {resolved}")

    # Check faux packages first (higher priority)
    for faux_path, (_, destpath) in local_deps.faux_pkgs.items():
        if resolved.is_relative_to(faux_path):
            new_path = f"{destpath}/{resolved.relative_to(faux_path)}:{attr_str}"
            encryption_conf["path"] = new_path
            return

    # Check real packages
    for real_path in local_deps.real_pkgs:
        if resolved.is_relative_to(real_path):
            new_path = (
                f"/deps/{real_path.name}/{resolved.relative_to(real_path)}:{attr_str}"
            )
            encryption_conf["path"] = new_path
            return

    raise ValueError(

View on GitHub (pinned to 38031739e5)