{"record":{"id":"bdbe27ffebe1a7d1","repo":"invoke-ai/InvokeAI","slug":"gemini-api-key-is-not-configured","errorCode":null,"errorMessage":"Gemini API key is not configured","messagePattern":"Gemini API key is not configured","errorType":"exception","errorClass":"ExternalProviderRequestError","httpStatus":null,"severity":"error","filePath":"invokeai/app/services/external_generation/providers/gemini.py","lineNumber":32,"sourceCode":")\nfrom invokeai.app.services.external_generation.image_utils import decode_image_base64, encode_image_base64\n\n\nclass GeminiProvider(ExternalProvider):\n    provider_id = \"gemini\"\n    _SYSTEM_INSTRUCTION = (\n        \"You are an image generation model. Always respond with an image based on the user's prompt. \"\n        \"Do not return text-only responses. If the user input is not an edit instruction, \"\n        \"interpret it as a request to create a new image.\"\n    )\n\n    def is_configured(self) -> bool:\n        return bool(self._app_config.external_gemini_api_key)\n\n    def generate(self, request: ExternalGenerationRequest) -> ExternalGenerationResult:\n        api_key = self._app_config.external_gemini_api_key\n        if not api_key:\n            raise ExternalProviderRequestError(\"Gemini API key is not configured\")\n\n        base_url = (self._app_config.external_gemini_base_url or \"https://generativelanguage.googleapis.com\").rstrip(\n            \"/\"\n        )\n        if not base_url.endswith(\"/v1\") and not base_url.endswith(\"/v1beta\"):\n            base_url = f\"{base_url}/v1beta\"\n        model_id = request.model.provider_model_id.removeprefix(\"models/\")\n        endpoint = f\"{base_url}/models/{model_id}:generateContent\"\n\n        request_parts: list[dict[str, object]] = []\n\n        if request.init_image is not None:\n            request_parts.append(\n                {\n                    \"inlineData\": {\n                        \"mimeType\": \"image/png\",\n                        \"data\": encode_image_base64(request.init_image),\n                    }","sourceCodeStart":14,"sourceCodeEnd":50,"githubUrl":"https://github.com/invoke-ai/InvokeAI/blob/0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06/invokeai/app/services/external_generation/providers/gemini.py#L14-L50","documentation":"ExternalProviderRequestError raised by GeminiProvider.generate when the app config has no external_gemini_api_key set. The provider requires an API key to authenticate requests to the Gemini generateContent endpoint (sent as the ?key= query parameter), and refuses to make a doomed request when it is absent. This is a configuration error, not a network or API failure.","triggerScenarios":"A generation request is routed to provider_id 'gemini' while self._app_config.external_gemini_api_key is empty/None — i.e., generate() is called without the key ever having been configured (is_configured() would also return False).","commonSituations":"Missing environment variable / config entry for the Gemini API key; key set under the wrong config name (e.g. only OPENAI key configured); key removed after a config migration; user selects a Gemini model without ever enrolling an API key.","solutions":["Set the external_gemini_api_key config value (or its corresponding environment variable) to a valid Google AI Studio API key and restart InvokeAI.","Before selecting a Gemini model, call provider.is_configured() and surface a setup prompt to the user if it returns False.","Double-check the key is placed in the active config file/profile actually loaded by the app, not a stale one.","Verify the key works with a direct curl to https://generativelanguage.googleapis.com/v1beta/models?key=... ."],"exampleFix":"// before: key missing, generate() raises at runtime\nresult = gemini_provider.generate(request)\n// after: check configuration first and give an actionable message\nif not gemini_provider.is_configured():\n    raise RuntimeError(\n        \"Gemini is not configured: set external_gemini_api_key in InvokeAI config\"\n    )\nresult = gemini_provider.generate(request)","handlingStrategy":"validation","validationCode":"if not app_config.external_gemini_api_key:\n    raise RuntimeError(\"Gemini is not configured: set external_gemini_api_key before using Gemini models\")\n# or, non-raising:\nif not gemini_provider.is_configured():\n    disable_gemini_models_in_ui()","typeGuard":null,"tryCatchPattern":"try:\n    result = provider.generate(request)\nexcept ExternalProviderRequestError as e:\n    if \"not configured\" in str(e):\n        show_setup_instructions(\"gemini\")\n    else:\n        raise","preventionTips":["Check provider.is_configured() at startup and expose the result in the UI/model list.","Keep API keys in environment variables loaded by the actual service process.","Add a config smoke test that asserts required keys exist when a provider is enabled.","Document which env vars each provider needs."],"tags":["configuration","missing-credentials","api-key","gemini"],"backgroundTag":"missing-env-var","analyzedSha":"0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06","analyzedAt":"2026-08-29T04:46:49.967Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}