langchain-ai/langchain · error · ValueError

`default` should not be passed to dumps

Error message

`default` should not be passed to dumps

What it means

Raised by langchain_core.load.dumps when the caller passes json.dumps' `default` kwarg. LangChain installs its own serializer (_serialize_value) as the default handler, and a user-supplied `default` would silently bypass LangChain's escaping of user data (including 'lc'-keyed dicts and secret handling), so it is explicitly rejected.

Source

Thrown at libs/core/langchain_core/load/dump.py:94

        deserialization.

    Args:
        obj: The object to dump.
        pretty: Whether to pretty print the json.

            If `True`, the json will be indented by either 2 spaces or the amount
            provided in the `indent` kwarg.
        **kwargs: Additional arguments to pass to `json.dumps`

    Returns:
        A JSON string representation of the object.

    Raises:
        ValueError: If `default` is passed as a kwarg.
    """
    if "default" in kwargs:
        msg = "`default` should not be passed to dumps"
        raise ValueError(msg)

    obj = _dump_pydantic_models(obj)
    serialized = _serialize_value(obj)

    if pretty:
        indent = kwargs.pop("indent", 2)
        return json.dumps(serialized, indent=indent, **kwargs)
    return json.dumps(serialized, **kwargs)


def dumpd(obj: Any) -> Any:
    """Return a dict representation of an object.

    Note:
        Plain dicts containing an `'lc'` key are automatically escaped to prevent
        confusion with LC serialization format. The escape marker is removed during
        deserialization.

View on GitHub (pinned to e32fa9a52e)

Solutions

  1. Remove the default kwarg and rely on LangChain's built-in serialization
  2. Pre-convert custom types to dicts/primitives before calling dumps
  3. Wrap custom classes as Serializable subclasses so dumps handles them natively

Example fix

# before
dumps(obj, default=lambda o: o.__dict__)
# after
dumps(obj)  # pre-convert custom types to plain dicts yourself
Defensive patterns

Strategy: validation

Validate before calling

kwargs.pop('default', None)  # never forward `default` to langchain's dumps
from langchain_core.load import dumps
dumps(obj, **kwargs)

Try / catch

try:
    dumps(obj, **json_kwargs)
except ValueError as e:
    if 'default' in str(e):
        json_kwargs.pop('default', None)
        dumps(obj, **json_kwargs)
    else:
        raise

Prevention

When it happens

Trigger: dumps(obj, default=my_encoder); forwarding **json_kwargs collected from elsewhere that happen to include 'default'. Any kwargs are otherwise passed through to json.dumps, but 'default' is reserved.

Common situations: Reusing a json.dumps(...) call's kwargs verbatim when switching to langchain dumps; attempting to support custom types via a default hook instead of Serializable.

Related errors


AI-assisted analysis of langchain-ai/langchain@e32fa9a52e (2026-08-14). Data as JSON: /api/errors/f5e81a1256b42fb9. Report an issue: GitHub.