langchain-ai/langchain · error · ValueError

Could not resolve content_key {full_path!r}: missing key {ke

Error message

Could not resolve content_key {full_path!r}: missing key {key!r} under {current_path!r}.

What it means

While resolving `content_key` on a LangSmith dataset example, a path segment does not exist in the mapping at that level: `ValueError` names the full key, the missing segment, and the path traversed so far. The loader refuses to guess when a required key is absent from the example inputs.

Source

Thrown at libs/core/langchain_core/document_loaders/langsmith.py:171

    content = inputs
    full_path = ".".join(content_key)

    for i, key in enumerate(content_key):
        current_path = ".".join(content_key[:i]) or "<root>"
        if not isinstance(content, Mapping):
            msg = (
                f"Could not resolve content_key {full_path!r}: expected a mapping at "
                f"{current_path!r}, but found {type(content).__name__}."
            )
            # A too-deep `content_key` is an invalid-argument error, not a runtime
            # type bug, so it is unified with the missing-key case as `ValueError`.
            raise ValueError(msg)  # noqa: TRY004
        if key not in content:
            msg = (
                f"Could not resolve content_key {full_path!r}: missing key {key!r} "
                f"under {current_path!r}."
            )
            raise ValueError(msg)
        content = content[key]

    return content


def _stringify(x: str | dict[str, Any]) -> str:
    if isinstance(x, str):
        return x
    try:
        return json.dumps(x, indent=2)
    except Exception:
        return str(x)

View on GitHub (pinned to e32fa9a52e)

Solutions

  1. Print an example's structure (`example.inputs.keys()` / pprint) and correct the content_key spelling/path
  2. If the key is optional on some examples, switch to `format_content` — supply a callable that tolerates absence — or pre-normalize the dataset
  3. Re-upload/fix the dataset so every example contains the required key
  4. Guard the whole load with try/except ValueError to surface dataset-name + key together for debugging

Example fix

# before
loader = LangSmithLoader(dataset_name="ds", content_key="output_text")

# after
loader = LangSmithLoader(
    dataset_name="ds",
    content_key="answer",
    format_content=lambda x: x.get("output_text", "") if isinstance(x, dict) else str(x),
)
Defensive patterns

Strategy: validation

Validate before calling

def key_exists(inputs: dict, content_key: str) -> bool:
    node = inputs
    for seg in content_key.split('.'):
        if not isinstance(node, dict) or seg not in node:
            return False
        node = node[seg]
    return True

assert key_exists(example.inputs, content_key), f'missing {content_key}'

Try / catch

try:
    docs = list(loader.lazy_load())
except ValueError as e:
    if 'missing key' in str(e):
        logger.error('dataset %s lacks key %s on some examples; normalize or use format_content', dataset, content_key)
    raise

Prevention

When it happens

Trigger: `content_key='answer.text'` where examples have inputs `{'answer': {...no 'text'...}}`; key typo or casing mismatch ('Text' vs 'text'); heterogeneous datasets where only some examples carry the key; schema drift after dataset version updates.

Common situations: Renamed fields in a re-uploaded dataset; guessing key names from memory; mixed-format datasets where optional fields are omitted on some examples.

Related errors


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