{"record":{"id":"de6a814c2bbbd14b","repo":"BerriAI/litellm","slug":"googleaistudiofileshandler-does-not-support-file-l","errorCode":null,"errorMessage":"GoogleAIStudioFilesHandler does not support file listing","messagePattern":"GoogleAIStudioFilesHandler does not support file listing","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"litellm/llms/gemini/files/transformation.py","lineNumber":372,"sourceCode":"                        file_id = url.split(\"/files/\")[-1].split(\"?\")[0]\n                        # Add the files/ prefix if not present\n                        if not file_id.startswith(\"files/\"):\n                            file_id = f\"files/{file_id}\"\n\n                return FileDeleted(id=file_id, deleted=True, object=\"file\")\n            else:\n                raise ValueError(f\"Failed to delete file: {raw_response.text}\")\n        except Exception as e:\n            verbose_logger.exception(\"Error parsing file delete response: %s\", e)\n            raise ValueError(f\"Error parsing file delete response: {e}\")\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(\"GoogleAIStudioFilesHandler does not support file listing\")\n\n    def transform_list_files_response(\n        self,\n        raw_response: httpx.Response,\n        logging_obj: LiteLLMLoggingObj,\n        litellm_params: dict,\n    ) -> list[OpenAIFileObject]:\n        raise NotImplementedError(\"GoogleAIStudioFilesHandler does not support file listing\")\n\n    def transform_file_content_request(\n        self,\n        file_content_request,\n        optional_params: dict,\n        litellm_params: dict,\n    ) -> tuple[str, dict]:\n        raise NotImplementedError(\"GoogleAIStudioFilesHandler does not support file content retrieval\")\n\n    def transform_file_content_response(","sourceCodeStart":354,"sourceCodeEnd":390,"githubUrl":"https://github.com/BerriAI/litellm/blob/77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8/litellm/llms/gemini/files/transformation.py#L354-L390","documentation":"GoogleAIStudioFilesHandler.transform_list_files_request deliberately raises NotImplementedError: the Gemini files handler implements upload/retrieve/delete but not listing, even though Google's Files API exposes GET /v1beta/files. Any list-files call routed to the gemini provider (e.g. litellm.files_list / litellm.list_files with custom_llm_provider='gemini') fails here before any HTTP request is made.","triggerScenarios":"litellm.files_list(custom_llm_provider='gemini', api_key=KEY); any code that iterates uploaded files through LiteLLM's OpenAI-style files interface against the Gemini provider.","commonSituations":"Porting OpenAI file-management code (client.files.list()) to Gemini through LiteLLM; housekeeping scripts that list files before deleting; assuming provider parity because upload/get/delete work.","solutions":["Call the Gemini Files API directly for listing: httpx.get(f'{base}/v1beta/files', headers={'x-goog-api-key': KEY}) and page through nextPageToken","Or use the google-genai SDK: client.files.list()","Track file ids in your own database at create time instead of relying on server-side listing","Upstream: open a GitHub issue/PR on BerriAI/litellm to implement transform_list_files_request for the Gemini handler"],"exampleFix":"# before\nfiles = litellm.files_list(custom_llm_provider='gemini', api_key=KEY)\n# NotImplementedError: GoogleAIStudioFilesHandler does not support file listing\n\n# after - list directly against the Gemini Files API\nimport httpx\nresp = httpx.get(\n    'https://generativelanguage.googleapis.com/v1beta/files',\n    headers={'x-goog-api-key': KEY},\n)\nresp.raise_for_status()\nfiles = resp.json().get('files', [])","handlingStrategy":"validation","validationCode":"GEMINI_FILES_UNSUPPORTED = {'list', 'content'}\n\ndef files_op_allowed(op: str, provider: str) -> bool:\n    return not (provider == 'gemini' and op in GEMINI_FILES_UNSUPPORTED)\n\nassert files_op_allowed('list', 'gemini') is False","typeGuard":null,"tryCatchPattern":"try:\n    files = litellm.files_list(custom_llm_provider='gemini', api_key=KEY)\nexcept NotImplementedError:\n    files = httpx.get(\n        'https://generativelanguage.googleapis.com/v1beta/files',\n        headers={'x-goog-api-key': KEY},\n    ).json().get('files', [])","preventionTips":["Maintain a per-provider capability map for file operations and branch before calling litellm","Persist file ids at upload time so listing is never required","Know the gemini handler's supported set: create, retrieve, delete only"],"tags":["gemini","files-api","not-implemented","list-files"],"backgroundTag":"unsupported-operation","analyzedSha":"77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8","analyzedAt":"2026-08-18T11:44:31.656Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}