From d6ab773c3fdc9cb7703ca50546e3ad19c94aebdf Mon Sep 17 00:00:00 2001 From: Hugo-DDT <141296842+Hugo-DDT@users.noreply.github.com> Date: Sun, 11 Oct 2026 14:09:41 +0800 Subject: [PATCH] fix(tools): return ErrorArtifact for unsupported file types in FileManagerTool load_files_from_disk raised an uncaught StopIteration when a file's MIME type matched no loader key (e.g. application/json). Use a None default and return a descriptive ErrorArtifact instead. --- griptape/tools/file_manager/tool.py | 5 ++++- tests/unit/tools/test_file_manager.py | 12 +++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/griptape/tools/file_manager/tool.py b/griptape/tools/file_manager/tool.py index b187eca454..6c7358f569 100644 --- a/griptape/tools/file_manager/tool.py +++ b/griptape/tools/file_manager/tool.py @@ -75,7 +75,10 @@ def load_files_from_disk(self, params: dict) -> ListArtifact | ErrorArtifact: # Fetch the file to try and determine the appropriate loader abs_path = os.path.join(self.file_manager_driver.workdir, path) mime_type = get_mime_type(abs_path) - loader = next((loader for key, loader in self.loaders.items() if mime_type.startswith(key))) + loader = next((loader for key, loader in self.loaders.items() if mime_type.startswith(key)), None) + + if loader is None: + return ErrorArtifact(f"Failed to load file '{path}': no loader available for MIME type '{mime_type}'") artifact = loader.load(path) if isinstance(artifact, ListArtifact): diff --git a/tests/unit/tools/test_file_manager.py b/tests/unit/tools/test_file_manager.py index a0e42bbe70..927c0cb52d 100644 --- a/tests/unit/tools/test_file_manager.py +++ b/tests/unit/tools/test_file_manager.py @@ -5,7 +5,7 @@ import pytest -from griptape.artifacts import ListArtifact, TextArtifact +from griptape.artifacts import ErrorArtifact, ListArtifact, TextArtifact from griptape.drivers.file_manager.local_file_manager_driver import LocalFileManagerDriver from griptape.tools import FileManagerTool from tests.utils import defaults @@ -44,6 +44,16 @@ def test_load_files_from_disk_with_encoding(self, file_manager): assert len(result.value) == 1 assert isinstance(result.value[0], TextArtifact) + def test_load_files_from_disk_with_unsupported_file_type(self, temp_dir): + with open(os.path.join(temp_dir, "config.json"), "w") as f: + f.write('{"a": 1}') + + file_manager = FileManagerTool(file_manager_driver=LocalFileManagerDriver(workdir=temp_dir)) + result = file_manager.load_files_from_disk({"values": {"paths": ["config.json"]}}) + + assert isinstance(result, ErrorArtifact) + assert "no loader available" in result.value + def test_save_memory_artifacts_to_disk_for_one_artifact(self, temp_dir): memory = defaults.text_task_memory("Memory1") artifact = TextArtifact("foobar")