{"record":{"id":"73a2e0890230e750","repo":"microsoft/semantic-kernel","slug":"the-openai-api-key-is-required-73a2e0","errorCode":null,"errorMessage":"The OpenAI API key is required.","messagePattern":"The OpenAI API key is required\\.","errorType":"exception","errorClass":"ServiceInitializationError","httpStatus":null,"severity":"error","filePath":"python/semantic_kernel/connectors/ai/open_ai/services/open_ai_chat_completion.py","lineNumber":65,"sourceCode":"            async_client (Optional[AsyncOpenAI]): An existing client to use. (Optional)\n            env_file_path (str | None): Use the environment settings file as a fallback\n                to environment variables. (Optional)\n            env_file_encoding (str | None): The encoding of the environment settings file. (Optional)\n            instruction_role (str | None): The role to use for 'instruction' messages, for example,\n        \"\"\"\n        try:\n            openai_settings = OpenAISettings(\n                api_key=api_key,\n                org_id=org_id,\n                chat_model_id=ai_model_id,\n                env_file_path=env_file_path,\n                env_file_encoding=env_file_encoding,\n            )\n        except ValidationError as ex:\n            raise ServiceInitializationError(\"Failed to create OpenAI settings.\", ex) from ex\n\n        if not async_client and not openai_settings.api_key:\n            raise ServiceInitializationError(\"The OpenAI API key is required.\")\n        if not openai_settings.chat_model_id:\n            raise ServiceInitializationError(\"The OpenAI model ID is required.\")\n\n        super().__init__(\n            ai_model_id=openai_settings.chat_model_id,\n            api_key=openai_settings.api_key.get_secret_value() if openai_settings.api_key else None,\n            org_id=openai_settings.org_id,\n            service_id=service_id,\n            ai_model_type=OpenAIModelTypes.CHAT,\n            default_headers=default_headers,\n            client=async_client,\n            instruction_role=instruction_role,\n        )\n\n    @classmethod\n    def from_dict(cls, settings: dict[str, Any]) -> \"OpenAIChatCompletion\":\n        \"\"\"Initialize an Open AI service from a dictionary of settings.\n","sourceCodeStart":47,"sourceCodeEnd":83,"githubUrl":"https://github.com/microsoft/semantic-kernel/blob/c028a0c7dc4f0814cdcbaba9d998f187a41197bf/python/semantic_kernel/connectors/ai/open_ai/services/open_ai_chat_completion.py#L47-L83","documentation":"Raised by OpenAIChatCompletion.__init__ after settings creation succeeds. The check is 'if not async_client and not openai_settings.api_key' — meaning an API key is only required when no pre-built AsyncOpenAI client was supplied. The api_key is sourced from the constructor argument or the OPENAI_API_KEY environment variable. Without either a client or a key, the service cannot authenticate to the OpenAI API.","triggerScenarios":"Constructing OpenAIChatCompletion without async_client= AND without api_key= (constructor argument) AND without OPENAI_API_KEY in the environment or .env file. This check runs after settings validation passed, so the settings object exists but its api_key field is None.","commonSituations":"Missing OPENAI_API_KEY env var; .env file not loaded or path incorrect; OPENAI_API_KEY set but empty string; copy-pasting sample code without configuring secrets; running in CI/Docker without injecting the key; assuming the key is optional (it is only optional if a client is provided).","solutions":["Set OPENAI_API_KEY in your environment or .env file to your API key from https://platform.openai.com/api-keys.","Pass api_key= explicitly in the constructor: OpenAIChatCompletion(ai_model_id='gpt-4o', api_key='sk-...').","Pass a pre-built AsyncOpenAI client via async_client= to bypass key resolution entirely.","Verify your .env file is discoverable by passing env_file_path='.env'."],"exampleFix":"# before\nservice = OpenAIChatCompletion(\n    ai_model_id='gpt-4o',\n)\n# after\nservice = OpenAIChatCompletion(\n    ai_model_id='gpt-4o',\n    api_key='sk-...',\n)\n# or via env var: export OPENAI_API_KEY=sk-...","handlingStrategy":"validation","validationCode":"import os\nfrom openai import AsyncOpenAI\n\napi_key = os.environ.get('OPENAI_API_KEY')\nif not api_key:\n    raise ValueError(\n        'OPENAI_API_KEY is not set. Provide it via environment variable, .env file, '\n        'the api_key= constructor argument, or an async_client= parameter.'\n    )","typeGuard":null,"tryCatchPattern":"from semantic_kernel.exceptions.service_exceptions import ServiceInitializationError\n\ntry:\n    service = OpenAIChatCompletion(\n        ai_model_id='gpt-4o',\n        api_key=os.environ.get('OPENAI_API_KEY'),\n    )\nexcept ServiceInitializationError as e:\n    if 'API key is required' in str(e):\n        print('Set OPENAI_API_KEY, pass api_key=, or provide an async_client=')\n    raise","preventionTips":["Set OPENAI_API_KEY in your .env file during development.","In production, inject the key via environment variable or a secrets manager.","Pass a pre-built AsyncOpenAI client via async_client= to decouple key management from service construction.","Validate that OPENAI_API_KEY is set at application startup before constructing any OpenAI service."],"tags":["openai","chat-completion","api-key","authentication","env-vars"],"backgroundTag":null,"analyzedSha":"c028a0c7dc4f0814cdcbaba9d998f187a41197bf","analyzedAt":"2026-08-13T13:48:05.040Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}