FoundationAgents/MetaGPT · error · ValueError

Must provide either `input_dir` or `input_files`.

Error message

Must provide either `input_dir` or `input_files`.

What it means

SimpleEngine.from_input is the factory that ingests documents, and it requires exactly one input source: a directory (input_dir) or an explicit file list (input_files). If both are falsy it raises ValueError immediately, before any document reading, since SimpleDirectoryReader would have nothing to load.

Source

Thrown at metagpt/rag/engines/simple.py:117

        ranker_configs: list[BaseRankerConfig] = None,
        fs: Optional[fsspec.AbstractFileSystem] = None,
    ) -> "SimpleEngine":
        """From docs.

        Must provide either `input_dir` or `input_files`.

        Args:
            input_dir: Path to the directory.
            input_files: List of file paths to read (Optional; overrides input_dir, exclude).
            transformations: Parse documents to nodes. Default [SentenceSplitter].
            embed_model: Parse nodes to embedding. Must supported by llama index. Default OpenAIEmbedding.
            llm: Must supported by llama index. Default OpenAI.
            retriever_configs: Configuration for retrievers. If more than one config, will use SimpleHybridRetriever.
            ranker_configs: Configuration for rankers.
            fs: File system to use.
        """
        if not input_dir and not input_files:
            raise ValueError("Must provide either `input_dir` or `input_files`.")

        file_extractor = cls._get_file_extractor()
        documents = SimpleDirectoryReader(
            input_dir=input_dir, input_files=input_files, file_extractor=file_extractor, fs=fs
        ).load_data()
        cls._fix_document_metadata(documents)

        transformations = transformations or cls._default_transformations()
        nodes = run_transformations(documents, transformations=transformations)

        return cls._from_nodes(
            nodes=nodes,
            transformations=transformations,
            embed_model=embed_model,
            llm=llm,
            retriever_configs=retriever_configs,
            ranker_configs=ranker_configs,
        )

View on GitHub (pinned to 11cdf466d0)

Solutions

  1. Pass a directory: SimpleEngine.from_input(input_dir='./data').
  2. Or pass files: SimpleEngine.from_input(input_files=['a.pdf', 'b.md']).
  3. If inputs are dynamic, check them before calling: if not input_dir and not input_files: raise/exit with a clear message.
  4. Verify glob results are non-empty when building input_files programmatically.

Example fix

# before
engine = SimpleEngine.from_input(input_files=glob.glob('*.pdf'))  # empty list -> ValueError

# after
files = glob.glob('*.pdf') or None
engine = SimpleEngine.from_input(input_files=files) if files else SimpleEngine.from_input(input_dir='./docs')
Defensive patterns

Strategy: validation

Validate before calling

def validate_rag_inputs(input_dir=None, input_files=None):
    if not input_dir and not input_files:
        raise ValueError("Nothing to ingest: pass input_dir or input_files")
    if input_files:
        missing = [f for f in input_files if not Path(f).exists()]
        assert not missing, f"missing files: {missing}"

validate_rag_inputs(input_dir, input_files)

Try / catch

try:
    engine = SimpleEngine.from_input(input_dir=input_dir, input_files=input_files)
except ValueError as e:
    if "input_dir" in str(e):
        raise SystemExit("Usage: script --data-dir DIR | --files F1 F2") from e
    raise

Prevention

When it happens

Trigger: Calling SimpleEngine.from_input() with no arguments, from_input(input_dir=None, input_files=[]), or passing paths that resolve to empty strings/None from a variable that was supposed to be populated.

Common situations: CLI scripts where the path argument was not provided, glob expressions that returned an empty list assigned to input_files, or dynamic pipelines where the input stage silently produced nothing.

Related errors


AI-assisted analysis of FoundationAgents/MetaGPT@11cdf466d0 (2026-08-14). Data as JSON: /api/errors/a010dd163047ac0b. Report an issue: GitHub.