{"record":{"id":"8e1bf15a56e7bf16","repo":"invoke-ai/InvokeAI","slug":"gemini-returned-fileuri-instead-of-inline-image-da","errorCode":null,"errorMessage":"Gemini returned fileUri instead of inline image data: {file_uri}","messagePattern":"Gemini returned fileUri instead of inline image data: (.+?)","errorType":"exception","errorClass":"ExternalProviderRequestError","httpStatus":null,"severity":"error","filePath":"invokeai/app/services/external_generation/providers/gemini.py","lineNumber":154,"sourceCode":"            finish_message = candidate.get(\"finishMessage\")\n            finish_reason = candidate.get(\"finishReason\")\n            if isinstance(finish_message, str):\n                finish_messages.append(finish_message)\n            elif isinstance(finish_reason, str):\n                finish_messages.append(f\"Finish reason: {finish_reason}\")\n            for part in _iter_response_parts(candidate):\n                inline_data = part.get(\"inline_data\") or part.get(\"inlineData\")\n                if isinstance(inline_data, dict):\n                    encoded = inline_data.get(\"data\")\n                    if encoded:\n                        image = decode_image_base64(encoded)\n                        images.append(ExternalGeneratedImage(image=image, seed=request.seed))\n                        continue\n                file_data = part.get(\"fileData\") or part.get(\"file_data\")\n                if isinstance(file_data, dict):\n                    file_uri = file_data.get(\"fileUri\") or file_data.get(\"file_uri\")\n                    if isinstance(file_uri, str) and file_uri:\n                        raise ExternalProviderRequestError(\n                            f\"Gemini returned fileUri instead of inline image data: {file_uri}\"\n                        )\n                text = part.get(\"text\")\n                if isinstance(text, str):\n                    text_parts.append(text)\n\n        if not images:\n            self._logger.error(\"Gemini response contained no images: %s\", data)\n            detail = \"\"\n            if finish_messages:\n                combined = \" \".join(message.strip() for message in finish_messages if message.strip())\n                if combined:\n                    detail = f\" Response status: {combined[:500]}\"\n            elif text_parts:\n                combined = \" \".join(text_parts).strip()\n                if combined:\n                    detail = f\" Response text: {combined[:500]}\"\n            raise ExternalProviderRequestError(f\"Gemini response contained no images.{detail}\")","sourceCodeStart":136,"sourceCodeEnd":172,"githubUrl":"https://github.com/invoke-ai/InvokeAI/blob/0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06/invokeai/app/services/external_generation/providers/gemini.py#L136-L172","documentation":"ExternalProviderRequestError raised when a Gemini response part contains fileData/file_uri (a Files API URI) instead of inline_data with base64 bytes. The provider only supports inline image payloads; it deliberately fails fast rather than silently dropping the image, because fetching the fileUri would require additional Files API calls and credentials. This indicates the model (or a proxy) returned the generated image as a file reference.","triggerScenarios":"A candidate part has fileData.fileUri (or file_data.file_uri) set — seen when using Gemini image models configured to return Files-API output, or an upstream/proxy converting inline data to file references (e.g. long-running batch responses or certain API versions returning media as fileUri).","commonSituations":"Using a newer Gemini image model or API surface whose default response mode stores output in the Files API; running behind a proxy that rewrites inlineData to fileData; model route (v1 vs v1beta) differences in output encoding.","solutions":["Pin/request the Gemini model version that returns inlineData (and keep using responseModalities: [\"IMAGE\"] with the documented v1beta endpoint the provider targets).","Bypass any proxy/gateway that rewrites the Gemini response to file references.","As a provider-side fix, add code to download fileUri via the Files API (with the same API key) and inline it before decoding.","Check the model id in provider_model_id matches an image model that supports inline responses."],"exampleFix":"// before: provider-side hard failure on fileData\nraise ExternalProviderRequestError(f\"Gemini returned fileUri instead of inline image data: {file_uri}\")\n// after: fetch the file and inline it\nif isinstance(file_uri, str) and file_uri:\n    file_resp = requests.get(file_uri, params={\"key\": api_key}, timeout=60)\n    file_resp.raise_for_status()\n    image = decode_image_bytes(file_resp.content)\n    images.append(ExternalGeneratedImage(image=image, seed=request.seed))\n    continue","handlingStrategy":"fallback","validationCode":null,"typeGuard":"def part_is_inline_image(part: dict) -> bool:\n    inline = part.get(\"inline_data\") or part.get(\"inlineData\")\n    return isinstance(inline, dict) and bool(inline.get(\"data\"))\n\ndef part_is_file_ref(part: dict) -> bool:\n    fd = part.get(\"fileData\") or part.get(\"file_data\")\n    return isinstance(fd, dict) and bool(fd.get(\"fileUri\") or fd.get(\"file_uri\"))","tryCatchPattern":"try:\n    result = provider.generate(request)\nexcept ExternalProviderRequestError as e:\n    if \"fileUri instead of inline\" in str(e):\n        file_uri = extract_uri(str(e))\n        image = download_files_api_image(file_uri, api_key)  # manual fetch fallback\n        result = build_result_from(image)\n    else:\n        raise","preventionTips":["Use the documented v1beta endpoint and image model versions known to return inlineData.","Avoid proxies that transform Gemini responses between client and provider.","Keep responseModalities: [\"IMAGE\"] in generationConfig as the provider does.","If fileUri output is expected in your setup, extend the provider to fetch via the Files API instead of failing."],"tags":["gemini","files-api","response-shape","image-data","unsupported-feature"],"backgroundTag":"unsupported-response-format","analyzedSha":"0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06","analyzedAt":"2026-08-29T04:46:49.967Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}