{"record":{"id":"a010dd163047ac0b","repo":"FoundationAgents/MetaGPT","slug":"must-provide-either-input-dir-or-input-files","errorCode":null,"errorMessage":"Must provide either `input_dir` or `input_files`.","messagePattern":"Must provide either `input_dir` or `input_files`\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"metagpt/rag/engines/simple.py","lineNumber":117,"sourceCode":"        ranker_configs: list[BaseRankerConfig] = None,\n        fs: Optional[fsspec.AbstractFileSystem] = None,\n    ) -> \"SimpleEngine\":\n        \"\"\"From docs.\n\n        Must provide either `input_dir` or `input_files`.\n\n        Args:\n            input_dir: Path to the directory.\n            input_files: List of file paths to read (Optional; overrides input_dir, exclude).\n            transformations: Parse documents to nodes. Default [SentenceSplitter].\n            embed_model: Parse nodes to embedding. Must supported by llama index. Default OpenAIEmbedding.\n            llm: Must supported by llama index. Default OpenAI.\n            retriever_configs: Configuration for retrievers. If more than one config, will use SimpleHybridRetriever.\n            ranker_configs: Configuration for rankers.\n            fs: File system to use.\n        \"\"\"\n        if not input_dir and not input_files:\n            raise ValueError(\"Must provide either `input_dir` or `input_files`.\")\n\n        file_extractor = cls._get_file_extractor()\n        documents = SimpleDirectoryReader(\n            input_dir=input_dir, input_files=input_files, file_extractor=file_extractor, fs=fs\n        ).load_data()\n        cls._fix_document_metadata(documents)\n\n        transformations = transformations or cls._default_transformations()\n        nodes = run_transformations(documents, transformations=transformations)\n\n        return cls._from_nodes(\n            nodes=nodes,\n            transformations=transformations,\n            embed_model=embed_model,\n            llm=llm,\n            retriever_configs=retriever_configs,\n            ranker_configs=ranker_configs,\n        )","sourceCodeStart":99,"sourceCodeEnd":135,"githubUrl":"https://github.com/FoundationAgents/MetaGPT/blob/11cdf466d042aece04fc6cfd13b28e1a70341b1f/metagpt/rag/engines/simple.py#L99-L135","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Pass a directory: SimpleEngine.from_input(input_dir='./data').","Or pass files: SimpleEngine.from_input(input_files=['a.pdf', 'b.md']).","If inputs are dynamic, check them before calling: if not input_dir and not input_files: raise/exit with a clear message.","Verify glob results are non-empty when building input_files programmatically."],"exampleFix":"# before\nengine = SimpleEngine.from_input(input_files=glob.glob('*.pdf'))  # empty list -> ValueError\n\n# after\nfiles = glob.glob('*.pdf') or None\nengine = SimpleEngine.from_input(input_files=files) if files else SimpleEngine.from_input(input_dir='./docs')","handlingStrategy":"validation","validationCode":"def validate_rag_inputs(input_dir=None, input_files=None):\n    if not input_dir and not input_files:\n        raise ValueError(\"Nothing to ingest: pass input_dir or input_files\")\n    if input_files:\n        missing = [f for f in input_files if not Path(f).exists()]\n        assert not missing, f\"missing files: {missing}\"\n\nvalidate_rag_inputs(input_dir, input_files)","typeGuard":null,"tryCatchPattern":"try:\n    engine = SimpleEngine.from_input(input_dir=input_dir, input_files=input_files)\nexcept ValueError as e:\n    if \"input_dir\" in str(e):\n        raise SystemExit(\"Usage: script --data-dir DIR | --files F1 F2\") from e\n    raise","preventionTips":["Check path args at CLI parse time with argparse required groups","Verify globs return non-empty before passing to input_files","Default input_dir to a known docs folder in examples"],"tags":["rag","validation","llama-index","ingestion"],"backgroundTag":null,"analyzedSha":"11cdf466d042aece04fc6cfd13b28e1a70341b1f","analyzedAt":"2026-08-14T23:20:02.994Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}