{"record":{"id":"8355400b4a16d773","repo":"BerriAI/litellm","slug":"bedrockfilesconfig-does-not-support-file-deletion","errorCode":null,"errorMessage":"BedrockFilesConfig does not support file deletion","messagePattern":"BedrockFilesConfig does not support file deletion","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"litellm/llms/bedrock/files/transformation.py","lineNumber":1189,"sourceCode":"        litellm_params: dict,\n    ) -> tuple[str, dict]:\n        raise NotImplementedError(\"BedrockFilesConfig does not support file retrieval\")\n\n    def transform_retrieve_file_response(\n        self,\n        raw_response: httpx.Response,\n        logging_obj: LiteLLMLoggingObj,\n        litellm_params: dict,\n    ) -> OpenAIFileObject:\n        raise NotImplementedError(\"BedrockFilesConfig does not support file retrieval\")\n\n    def transform_delete_file_request(\n        self,\n        file_id: str,\n        optional_params: dict,\n        litellm_params: dict,\n    ) -> tuple[str, dict]:\n        raise NotImplementedError(\"BedrockFilesConfig does not support file deletion\")\n\n    def transform_delete_file_response(\n        self,\n        raw_response: httpx.Response,\n        logging_obj: LiteLLMLoggingObj,\n        litellm_params: dict,\n    ) -> FileDeleted:\n        raise NotImplementedError(\"BedrockFilesConfig does not support file deletion\")\n\n    def transform_list_files_request(\n        self,\n        purpose: str | None,\n        optional_params: dict,\n        litellm_params: dict,\n    ) -> tuple[str, dict]:\n        raise NotImplementedError(\"BedrockFilesConfig does not support file listing\")\n\n    def transform_list_files_response(","sourceCodeStart":1171,"sourceCodeEnd":1207,"githubUrl":"https://github.com/BerriAI/litellm/blob/77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8/litellm/llms/bedrock/files/transformation.py#L1171-L1207","documentation":"Deleting a Bedrock-backed file would mean deleting the underlying S3 object, which LiteLLM deliberately does not automate, so the request-side delete transform raises NotImplementedError. Bedrock batch files live in your own bucket; lifecycle/cleanup is expected to happen in S3.","triggerScenarios":"client.files.delete(file_id) / DELETE /v1/files/{id} routed to a bedrock/* model; cleanup jobs written against OpenAI-compatible file deletion.","commonSituations":"Porting OpenAI batch workflows that delete intermediate files after processing; automated retention scripts hitting the proxy files route.","solutions":["Delete the object yourself: boto3 delete_object on the bucket/key encoded in the s3:// file id","Use S3 lifecycle rules to expire batch objects instead of per-file deletes","Catch NotImplementedError in shared cleanup code and branch to the S3 path (see pattern)"],"exampleFix":"# before\nawait client.files.delete(file_id)\n\n# after (Bedrock)\nbucket, key = file_id[len(\"s://\"):].split(\"/\", 1)  # parse s3://bucket/key\ns3.delete_object(Bucket=bucket, Key=key)","handlingStrategy":"fallback","validationCode":"def delete_file_for_provider(client, s3, file_id: str, provider: str):\n    if provider.startswith(\"bedrock\"):\n        bucket, key = file_id[len(\"s3://\"):].split(\"/\", 1)\n        s3.delete_object(Bucket=bucket, Key=key)\n    else:\n        client.files.delete(file_id)","typeGuard":null,"tryCatchPattern":"try:\n    await client.files.delete(file_id)\nexcept NotImplementedError:\n    bucket, key = file_id[len(\"s3://\"):].split(\"/\", 1)\n    s3.delete_object(Bucket=bucket, Key=key)","preventionTips":["Branch deletion on provider: S3 delete_object for Bedrock, files.delete elsewhere","Prefer S3 lifecycle rules over per-file deletes for batch artifacts"],"tags":["bedrock","files-api","unsupported-operation","s3","litellm"],"backgroundTag":"unsupported-operation","analyzedSha":"77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8","analyzedAt":"2026-08-18T11:44:31.656Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}