diff --git a/src/Aspire.Hosting.GitHub.Models/GitHubModelResource.cs b/src/Aspire.Hosting.GitHub.Models/GitHubModelResource.cs index a6c441e38ac..054e8f8ce0c 100644 --- a/src/Aspire.Hosting.GitHub.Models/GitHubModelResource.cs +++ b/src/Aspire.Hosting.GitHub.Models/GitHubModelResource.cs @@ -10,6 +10,8 @@ namespace Aspire.Hosting.GitHub.Models; /// public class GitHubModelResource : Resource, IResourceWithConnectionString, IResourceWithoutLifetime { + internal ParameterResource DefaultKeyParameter { get; set; } + /// /// Initializes a new instance of the class. /// @@ -21,7 +23,7 @@ public GitHubModelResource(string name, string model, ParameterResource? organiz { Model = model; Organization = organization; - Key = key; + Key = DefaultKeyParameter = key; } /// diff --git a/src/Aspire.Hosting.GitHub.Models/GitHubModelsExtensions.cs b/src/Aspire.Hosting.GitHub.Models/GitHubModelsExtensions.cs index 7b68c6ac2d2..34ca285214d 100644 --- a/src/Aspire.Hosting.GitHub.Models/GitHubModelsExtensions.cs +++ b/src/Aspire.Hosting.GitHub.Models/GitHubModelsExtensions.cs @@ -85,8 +85,11 @@ public static IResourceBuilder WithApiKey(this IResourceBui throw new ArgumentException("The API key parameter must be marked as secret. Use AddParameter with secret: true when creating the parameter.", nameof(apiKey)); } - // Remove the existing API key parameter - builder.ApplicationBuilder.Resources.Remove(builder.Resource.Key); + // Remove the existing parameter if it's the default one + if (builder.Resource.DefaultKeyParameter == builder.Resource.Key) + { + builder.ApplicationBuilder.Resources.Remove(builder.Resource.Key); + } builder.Resource.Key = apiKey.Resource; diff --git a/tests/Aspire.Hosting.GitHub.Models.Tests/GitHubModelsExtensionTests.cs b/tests/Aspire.Hosting.GitHub.Models.Tests/GitHubModelsExtensionTests.cs index 0ea7e0e2951..89dd0499ba3 100644 --- a/tests/Aspire.Hosting.GitHub.Models.Tests/GitHubModelsExtensionTests.cs +++ b/tests/Aspire.Hosting.GitHub.Models.Tests/GitHubModelsExtensionTests.cs @@ -254,6 +254,26 @@ public void WithApiKeySucceedsIfParameterIsSecret() Assert.Equal(apiKey.Resource, github.Resource.Key); } + [Fact] + public void WithApiKeyCalledTwiceOnlyRemovesDefaultParameter() + { + using var builder = TestDistributedApplicationBuilder.Create(); + + var github = builder.AddGitHubModel("github", "openai/gpt-4o-mini"); + + Assert.NotNull(builder.Resources.FirstOrDefault(r => r.Name == "github-gh-apikey")); + + github.WithApiKey(builder.AddParameter("secret-key1", secret: true)); + + Assert.Null(builder.Resources.FirstOrDefault(r => r.Name == "github-gh-apikey")); + Assert.NotNull(builder.Resources.FirstOrDefault(r => r.Name == "secret-key1")); + + github.WithApiKey(builder.AddParameter("secret-key2", secret: true)); + + Assert.NotNull(builder.Resources.FirstOrDefault(r => r.Name == "secret-key1")); + Assert.NotNull(builder.Resources.FirstOrDefault(r => r.Name == "secret-key2")); + } + [Fact] public void WithHealthCheckAddsHealthCheckAnnotation() {