langchain-ai/langgraph · error · ValueError

Invalid keep_pkg_tools

Error message

Invalid keep_pkg_tools: '{tool}'. Must be one of 'pip', 'setuptools', 'wheel'.

What it means

Item-level validation of the keep_pkg_tools array in the CLI config validator: keep_pkg_tools was given as a list, but one of its elements is not in _BUILD_TOOLS ('pip', 'setuptools', 'wheel'). Allowing arbitrary names would inject untrusted strings into RUN pip ... cleanup lines of the generated Dockerfile, so each entry is checked against the fixed set.

Solutions

  1. Keep only 'pip', 'setuptools', and/or 'wheel' in the keep_pkg_tools list
  2. Replace the list with `true` to keep all supported packaging tools
  3. Drop the keep_pkg_tools key to use the default (tools removed)
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at libs/cli/langgraph_cli/config.py:548 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/47f34590c9509b68. Report an issue: GitHub.

Appendix: source

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

    if encryption_conf := config.get("encryption"):
        if "path" in encryption_conf:
            if ":" not in encryption_conf["path"]:
                raise ValueError(
                    f"Invalid encryption.path format: '{encryption_conf['path']}'. "
                    "Must be in format './path/to/file.py:attribute_name'"
                )
    if http_conf := config.get("http"):
        if "app" in http_conf:
            if ":" not in http_conf["app"]:
                raise ValueError(
                    f"Invalid http.app format: '{http_conf['app']}'. "
                    "Must be in format './path/to/file.py:attribute_name'"
                )
    if keep_pkg_tools := config.get("keep_pkg_tools"):
        if isinstance(keep_pkg_tools, list):
            for tool in keep_pkg_tools:
                if tool not in _BUILD_TOOLS:
                    raise ValueError(
                        f"Invalid keep_pkg_tools: '{tool}'. "
                        "Must be one of 'pip', 'setuptools', 'wheel'."
                    )
        elif keep_pkg_tools is True:
            pass
        else:
            raise ValueError(
                f"Invalid keep_pkg_tools: '{keep_pkg_tools}'. "
                "Must be bool or list[str] (with values"
                " 'pip', 'setuptools', and/or 'wheel')."
            )
    return config


# Keys recognized by validate_config (used to detect unknown fields).
_KNOWN_CONFIG_KEYS = {
    "python_version",
    "node_version",

View on GitHub (pinned to 38031739e5)