run-llama/llama_index · error · ValueError

Unknown extractor name: {extractor_name}

Error message

Unknown extractor name: {extractor_name}

What it means

Raised by load_extractor() when the dict's class_name does not match any of the four supported extractors: SummaryExtractor, QuestionsAnsweredExtractor, TitleExtractor, KeywordExtractor. The loader is a hardcoded if/elif chain over those class_name() strings, so any other extractor (built-in or custom) cannot be deserialized through it.

Source

Thrown at llama-index-core/llama_index/core/extractors/loading.py:29

    data: dict,
) -> BaseExtractor:
    if isinstance(data, BaseExtractor):
        return data

    extractor_name = data.get("class_name")
    if extractor_name is None:
        raise ValueError("Extractor loading requires a class_name")

    if extractor_name == SummaryExtractor.class_name():
        return SummaryExtractor.from_dict(data)
    elif extractor_name == QuestionsAnsweredExtractor.class_name():
        return QuestionsAnsweredExtractor.from_dict(data)
    elif extractor_name == TitleExtractor.class_name():
        return TitleExtractor.from_dict(data)
    elif extractor_name == KeywordExtractor.class_name():
        return KeywordExtractor.from_dict(data)
    else:
        raise ValueError(f"Unknown extractor name: {extractor_name}")

View on GitHub (pinned to afd0fef371)

Solutions

  1. For the four supported extractors, ensure class_name matches exactly: 'SummaryExtractor', 'QuestionsAnsweredExtractor', 'TitleExtractor', 'KeywordExtractor'.
  2. For unsupported/custom extractors, deserialize directly with YourExtractor.from_dict(data) instead of load_extractor.
  3. Extend your own loader (mapping name -> class) rather than relying on the hardcoded chain.

Example fix

# before
extractor = load_extractor({"class_name": "DocumentContextExtractor", ...})

# after
from llama_index.core.extractors import DocumentContextExtractor
extractor = DocumentContextExtractor.from_dict(data)
Defensive patterns

Strategy: type-guard

Validate before calling

SUPPORTED = {"SummaryExtractor", "QuestionsAnsweredExtractor", "TitleExtractor", "KeywordExtractor"}
name = data.get("class_name")
if name not in SUPPORTED:
    extractor = EXTRACTOR_CLASSES[name].from_dict(data)  # your own registry
else:
    extractor = load_extractor(data)

Type guard

def is_loadable_extractor_name(name: str) -> bool:
    return name in {"SummaryExtractor", "QuestionsAnsweredExtractor", "TitleExtractor", "KeywordExtractor"}

Try / catch

try:
    extractor = load_extractor(data)
except ValueError as e:
    if "Unknown extractor name" in str(e):
        extractor = CUSTOM_EXTRACTORS[data["class_name"]].from_dict(data)
    else:
        raise

Prevention

When it happens

Trigger: Calling load_extractor({'class_name': 'DocumentContextExtractor', ...}) or with a custom extractor's name; also triggered by exact-string mismatches such as 'TitleExtractor ' (trailing space) or wrong casing.

Common situations: Serializing newer extractors (DocumentContextExtractor lives in the same package but is not in the chain) and assuming the loader handles everything; custom BaseExtractor subclasses that need round-tripping; version drift where class_name strings changed.

Related errors


AI-assisted analysis of run-llama/llama_index@afd0fef371 (2026-08-15). Data as JSON: /api/errors/52ee009ab63c6a7f. Report an issue: GitHub.