{"record":{"id":"6eb9233983d0e12f","repo":"microsoft/aspire","slug":"openai-api-key-parameter-name-openai-apikey-is-missing-and","errorCode":null,"errorMessage":"OpenAI API key parameter '{name}-openai-apikey' is missing and OPENAI_API_KEY environment variable is not set.","messagePattern":"OpenAI API key parameter '(.+?)-openai-apikey' is missing and OPENAI_API_KEY environment variable is not set\\.","errorType":"exception","errorClass":"MissingParameterValueException","httpStatus":null,"severity":"error","filePath":"src/Aspire.Hosting.OpenAI/OpenAIExtensions.cs","lineNumber":35,"sourceCode":"    /// Adds an OpenAI parent resource that can host multiple models.\n    /// </summary>\n    /// <param name=\"builder\">The <see cref=\"IDistributedApplicationBuilder\"/>.</param>\n    /// <param name=\"name\">The name of the OpenAI resource.</param>\n    /// <returns>The OpenAI resource builder.</returns>\n    [AspireExport]\n    public static IResourceBuilder<OpenAIResource> AddOpenAI(this IDistributedApplicationBuilder builder, [ResourceName] string name)\n    {\n        ArgumentNullException.ThrowIfNull(builder);\n        ArgumentException.ThrowIfNullOrEmpty(name);\n\n        var defaultApiKeyParameter = builder.AddParameter($\"{name}-openai-apikey\", () =>\n        {\n            var configKey = $\"Parameters:{name}-openai-apikey\";\n            var value = builder.Configuration.GetValueWithNormalizedKey(configKey);\n            \n            return value ??\n                Environment.GetEnvironmentVariable(\"OPENAI_API_KEY\") ??\n                throw new MissingParameterValueException($\"OpenAI API key parameter '{name}-openai-apikey' is missing and OPENAI_API_KEY environment variable is not set.\");\n        },\n            secret: true);\n        defaultApiKeyParameter.Resource.Description = \"\"\"\n            The API key used to authenticate requests to the OpenAI API.\n            You can obtain an API key from the [OpenAI API Keys page](https://platform.openai.com/api-keys).\n            \"\"\";\n        defaultApiKeyParameter.Resource.EnableDescriptionMarkdown = true;\n\n        var resource = new OpenAIResource(name, defaultApiKeyParameter.Resource);\n\n        defaultApiKeyParameter.WithParentRelationship(resource);\n\n        // Register the health check\n        var healthCheckKey = $\"{name}_check\";\n\n        // Ensure IHttpClientFactory is available by registering HTTP client services\n        builder.Services.AddHttpClient();\n","sourceCodeStart":17,"sourceCodeEnd":53,"githubUrl":"https://github.com/microsoft/aspire/blob/25830f84bd145686607ad00c057b3f84e2e51d43/src/Aspire.Hosting.OpenAI/OpenAIExtensions.cs#L17-L53","documentation":"AddOpenAI creates a default secret API key parameter by reading configuration key 'Parameters:{name}-openai-apikey' and then the OPENAI_API_KEY environment variable. If both are absent it throws MissingParameterValueException, because the OpenAI client resource requires an API key to inject into dependent projects. This fail-fast ensures the model resource is never created without usable credentials.","triggerScenarios":"Calling builder.AddOpenAI(\"openai\") when neither the config key 'Parameters:openai-openai-apikey' (e.g. via appsettings.json or a parameter entry) nor the OPENAI_API_KEY environment variable is set in the AppHost process.","commonSituations":"Running the AppHost on a new machine or CI where OPENAI_API_KEY is not exported; forgetting a user-secrets entry; key typo in parameter name; deploying without the secrets provisioned.","solutions":["Export the OPENAI_API_KEY environment variable in the shell or launchSettings.json before running the AppHost.","Add the value to AppHost configuration under Parameters:{name}-openai-apikey (e.g. in user secrets or appsettings.Development.json).","Supply an explicit pre-created secret parameter via WithApiKey instead of relying on the default parameter."],"exampleFix":"// before (fails if key missing)\nvar openai = builder.AddOpenAI(\"openai\");\n// after\ndotnet user-secrets set \"Parameters:openai-openai-apikey\" \"sk-...\" # or\nexport OPENAI_API_KEY=sk-...\nvar openai = builder.AddOpenAI(\"openai\");","handlingStrategy":"validation","validationCode":"if (builder.Configuration[\"Parameters:openai-openai-apikey\"] is null &&\n    Environment.GetEnvironmentVariable(\"OPENAI_API_KEY\") is null)\n{\n    throw new InvalidOperationException(\"Provide an OpenAI API key via user secrets or OPENAI_API_KEY before AddOpenAI.\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Set OPENAI_API_KEY in launchSettings.json or your shell profile","Store the key under Parameters:{name}-openai-apikey in user secrets for local dev","Provision secrets in CI/CD before running the AppHost"],"tags":["aspire","openai","api-key","configuration"],"backgroundTag":"missing-api-key","analyzedSha":"25830f84bd145686607ad00c057b3f84e2e51d43","analyzedAt":"2026-09-16T11:10:06.193Z","contentChangedAt":"2026-09-16T11:10:06.193Z","schemaVersion":2},"datasetVersion":"2026-09-21T04:17:39.646Z"}