{"record":{"id":"d691456e4ef8a1a4","repo":"crewAIInc/crewAI","slug":"no-loader-defined-for-self","errorCode":null,"errorMessage":"No loader defined for {self}","messagePattern":"No loader defined for (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"lib/crewai-tools/src/crewai_tools/rag/data_types.py","lineNumber":88,"sourceCode":"            DataType.WEBSITE: (\"webpage_loader\", \"WebPageLoader\"),\n            DataType.MDX: (\"mdx_loader\", \"MDXLoader\"),\n            DataType.JSON: (\"json_loader\", \"JSONLoader\"),\n            DataType.DOCX: (\"docx_loader\", \"DOCXLoader\"),\n            DataType.CSV: (\"csv_loader\", \"CSVLoader\"),\n            DataType.DIRECTORY: (\"directory_loader\", \"DirectoryLoader\"),\n            DataType.YOUTUBE_VIDEO: (\"youtube_video_loader\", \"YoutubeVideoLoader\"),\n            DataType.YOUTUBE_CHANNEL: (\n                \"youtube_channel_loader\",\n                \"YoutubeChannelLoader\",\n            ),\n            DataType.GITHUB: (\"github_loader\", \"GithubLoader\"),\n            DataType.DOCS_SITE: (\"docs_site_loader\", \"DocsSiteLoader\"),\n            DataType.MYSQL: (\"mysql_loader\", \"MySQLLoader\"),\n            DataType.POSTGRES: (\"postgres_loader\", \"PostgresLoader\"),\n        }\n\n        if self not in loaders:\n            raise ValueError(f\"No loader defined for {self}\")\n        module_name, class_name = loaders[self]\n        module_path = f\"crewai_tools.rag.loaders.{module_name}\"\n        try:\n            module = import_module(module_path)\n            return cast(BaseLoader, getattr(module, class_name)())\n        except Exception as e:\n            raise ValueError(f\"Error loading loader for {self}: {e}\") from e\n\n\nclass DataTypes:\n    @staticmethod\n    def from_content(content: str | Path | None = None) -> DataType:\n        if content is None:\n            return DataType.TEXT\n\n        if isinstance(content, Path):\n            content = str(content)\n","sourceCodeStart":70,"sourceCodeEnd":106,"githubUrl":"https://github.com/crewAIInc/crewAI/blob/754d7323beb2fd042e33444a115ea2d5a47193f0/lib/crewai-tools/src/crewai_tools/rag/data_types.py#L70-L106","documentation":"DataType.get_loader() mirrors get_chunker(): it maps DataType members to loader (module, class) pairs and raises ValueError('No loader defined for ...') when the member has no loaders[] entry. The shown mapping covers PDF/TEXT/XML/WEBSITE/MDX/JSON/DOCX/CSV/YOUTUBE/GITHUB/DOCS_SITE/MYSQL/POSTGRES; any other enum member fails here.","triggerScenarios":"Calling get_loader() on a DataType without a registered loader — typically a newly added or custom enum member, or a member supported for chunking but not loading (asymmetry between the two registries).","commonSituations":"Fork/extension adding enum members; version skew where a DataType was introduced for one code path only; misrouted DataTypes.from_content classification returning an unexpected member.","solutions":["Use one of the documented DataTypes that has a loader","If extending the enum, register both a loader and a chunker","Upgrade crewai-tools — a newer version may have added the loader","Check what DataTypes.from_content() actually returned before calling get_loader()"],"exampleFix":"# before\nloader = dtype.get_loader()  # raises for unregistered dtype\n# after\nif dtype in (DataType.PDF_FILE, DataType.TEXT_FILE, DataType.TEXT, DataType.XML, DataType.WEBSITE, DataType.MDX, DataType.JSON, DataType.DOCX, DataType.CSV, DataType.YOUTUBE_VIDEO, DataType.YOUTUBE_CHANNEL, DataType.GITHUB, DataType.DOCS_SITE, DataType.MYSQL, DataType.POSTGRES, DataType.DIRECTORY):\n    loader = dtype.get_loader()\nelse:\n    raise ValueError(f'unsupported data type: {dtype}')","handlingStrategy":"validation","validationCode":"SUPPORTED_LOADERS = {DataType.PDF_FILE, DataType.TEXT_FILE, DataType.TEXT, DataType.XML, DataType.WEBSITE, DataType.MDX, DataType.JSON, DataType.DOCX, DataType.CSV, DataType.DIRECTORY, DataType.YOUTUBE_VIDEO, DataType.YOUTUBE_CHANNEL, DataType.GITHUB, DataType.DOCS_SITE, DataType.MYSQL, DataType.POSTGRES}\nif dtype not in SUPPORTED_LOADERS:\n    raise ValueError(f'no loader for {dtype}; pick a supported type')","typeGuard":"def has_loader(dt: DataType) -> bool:\n    try:\n        dt.get_loader(); return True\n    except ValueError:\n        return False","tryCatchPattern":"try:\n    loader = dtype.get_loader()\nexcept ValueError as e:\n    if 'No loader defined' in str(e):\n        loader = DataType.TEXT.get_loader()\n    else:\n        raise","preventionTips":["Check the registry-supported DataTypes before dispatching ingestion","Log the classified DataType early to catch misrouting","Upgrade crewai-tools when adopting newer DataTypes so registries are complete"],"tags":["rag","loader","enum","registry"],"backgroundTag":null,"analyzedSha":"754d7323beb2fd042e33444a115ea2d5a47193f0","analyzedAt":"2026-08-15T04:06:56.746Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}