diff --git a/llama_stack/providers/remote/files/s3/files.py b/llama_stack/providers/remote/files/s3/files.py index 82ee1da83..5f436fe04 100644 --- a/llama_stack/providers/remote/files/s3/files.py +++ b/llama_stack/providers/remote/files/s3/files.py @@ -256,7 +256,8 @@ class S3FilesImpl(Files): content = response["Body"].read() except ClientError as e: if e.response["Error"]["Code"] == "NoSuchKey": - raise ResourceNotFoundError(row["id"], "File content", "files.list()") from e + await self.sql_store.delete("openai_files", where={"id": file_id}) + raise ResourceNotFoundError(file_id, "File", "files.list()") from e raise RuntimeError(f"Failed to download file from S3: {e}") from e return Response( diff --git a/tests/unit/providers/files/test_s3_files.py b/tests/unit/providers/files/test_s3_files.py index 20eab1f51..640411b53 100644 --- a/tests/unit/providers/files/test_s3_files.py +++ b/tests/unit/providers/files/test_s3_files.py @@ -223,18 +223,13 @@ class TestS3FilesImpl: # Directly delete the S3 object from the backend s3_client.delete_object(Bucket=s3_config.bucket_name, Key=uploaded.id) - retrieved_metadata_after = await s3_provider.openai_retrieve_file(uploaded.id) # TODO: this should fail - assert retrieved_metadata_after.id == uploaded.id - - listed_files = await s3_provider.openai_list_files() - assert uploaded.id in [file.id for file in listed_files.data] - with pytest.raises(ResourceNotFoundError, match="not found") as exc_info: await s3_provider.openai_retrieve_file_content(uploaded.id) - - assert "content" in str(exc_info).lower() assert uploaded.id in str(exc_info).lower() + listed_files = await s3_provider.openai_list_files() + assert uploaded.id not in [file.id for file in listed_files.data] + async def test_upload_file_s3_put_object_failure(self, s3_provider, sample_text_file, s3_config, s3_client): """Test that put_object failure results in exception and no orphaned metadata.""" sample_text_file.filename = "test_s3_put_object_failure"