From c49db4e2b33c0a68d54359ddba21740c886d72e4 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Tue, 12 Aug 2025 11:19:38 -0700 Subject: [PATCH 1/5] Fix Azure AI Foundry resource name --- .../AzureAIFoundryDeploymentResource.cs | 4 +-- .../AzureAIFoundryResource.cs | 3 --- .../AzureAIFoundryExtensionsTests.cs | 4 ++- ...ndry_GeneratesValidBicep#00.verified.bicep | 25 ++++++++++++++++--- 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/Aspire.Hosting.Azure.AIFoundry/AzureAIFoundryDeploymentResource.cs b/src/Aspire.Hosting.Azure.AIFoundry/AzureAIFoundryDeploymentResource.cs index db468ec3a79..fd8963dd364 100644 --- a/src/Aspire.Hosting.Azure.AIFoundry/AzureAIFoundryDeploymentResource.cs +++ b/src/Aspire.Hosting.Azure.AIFoundry/AzureAIFoundryDeploymentResource.cs @@ -27,7 +27,7 @@ public class AzureAIFoundryDeploymentResource : Resource, IResourceWithParent /// Gets the connection string expression for the Azure AI Foundry resource with model/deployment information. /// - public ReferenceExpression ConnectionStringExpression => Parent.GetConnectionString(DeploymentName); + public ReferenceExpression ConnectionStringExpression => ReferenceExpression.Create($"{Parent};DeploymentId={DeploymentName};Model={ModelName}"); } diff --git a/src/Aspire.Hosting.Azure.AIFoundry/AzureAIFoundryResource.cs b/src/Aspire.Hosting.Azure.AIFoundry/AzureAIFoundryResource.cs index 36c7cc9cdd6..dd19a2fb31e 100644 --- a/src/Aspire.Hosting.Azure.AIFoundry/AzureAIFoundryResource.cs +++ b/src/Aspire.Hosting.Azure.AIFoundry/AzureAIFoundryResource.cs @@ -73,7 +73,4 @@ internal void AddDeployment(AzureAIFoundryDeploymentResource deployment) _deployments.Add(deployment); } - - internal ReferenceExpression GetConnectionString(string deploymentName) => - ReferenceExpression.Create($"{ConnectionStringExpression};DeploymentId={deploymentName};Model={deploymentName}"); } diff --git a/tests/Aspire.Hosting.Azure.Tests/AzureAIFoundryExtensionsTests.cs b/tests/Aspire.Hosting.Azure.Tests/AzureAIFoundryExtensionsTests.cs index 0cd7e994f87..e17fc165b96 100644 --- a/tests/Aspire.Hosting.Azure.Tests/AzureAIFoundryExtensionsTests.cs +++ b/tests/Aspire.Hosting.Azure.Tests/AzureAIFoundryExtensionsTests.cs @@ -30,6 +30,7 @@ public void AddDeployment_ShouldAddDeploymentToResource() var resource = Assert.Single(builder.Resources.OfType()); var deployment = Assert.Single(resource.Deployments); Assert.Equal("deployment1", deployment.Name); + Assert.Equal("deployment1", deployment.DeploymentName); Assert.Equal("gpt-4", deployment.ModelName); Assert.Equal("1.0", deployment.ModelVersion); Assert.Equal("OpenAI", deployment.Format); @@ -122,7 +123,7 @@ public void RunAsFoundryLocal_DeploymentConnectionString_HasModelProperty() Assert.Single(resource.Deployments); var connectionString = deployment.Resource.ConnectionStringExpression.ValueExpression; Assert.Contains("Model=gpt-4", connectionString); - Assert.Contains("DeploymentId=gpt-4", connectionString); + Assert.Contains("DeploymentId=deployment1", connectionString); Assert.Contains("Endpoint=", connectionString); Assert.Contains("Key=", connectionString); } @@ -135,6 +136,7 @@ public async Task AddAzureAIFoundry_GeneratesValidBicep() var foundry = builder.AddAzureAIFoundry("foundry"); var deployment1 = foundry.AddDeployment("deployment1", "gpt-4", "1.0", "OpenAI"); var deployment2 = foundry.AddDeployment("deployment2", "Phi-4", "1.0", "Microsoft"); + var deployment3 = foundry.AddDeployment("my-model", "Phi-4", "1.0", "Microsoft"); using var app = builder.Build(); var model = app.Services.GetRequiredService(); diff --git a/tests/Aspire.Hosting.Azure.Tests/Snapshots/AzureAIFoundryExtensionsTests.AddAzureAIFoundry_GeneratesValidBicep#00.verified.bicep b/tests/Aspire.Hosting.Azure.Tests/Snapshots/AzureAIFoundryExtensionsTests.AddAzureAIFoundry_GeneratesValidBicep#00.verified.bicep index 88d1692c48d..a00bd7f9165 100644 --- a/tests/Aspire.Hosting.Azure.Tests/Snapshots/AzureAIFoundryExtensionsTests.AddAzureAIFoundry_GeneratesValidBicep#00.verified.bicep +++ b/tests/Aspire.Hosting.Azure.Tests/Snapshots/AzureAIFoundryExtensionsTests.AddAzureAIFoundry_GeneratesValidBicep#00.verified.bicep @@ -22,7 +22,7 @@ resource foundry 'Microsoft.CognitiveServices/accounts@2024-10-01' = { } resource deployment1 'Microsoft.CognitiveServices/accounts/deployments@2024-10-01' = { - name: 'gpt-4' + name: 'deployment1' properties: { model: { format: 'OpenAI' @@ -38,7 +38,7 @@ resource deployment1 'Microsoft.CognitiveServices/accounts/deployments@2024-10-0 } resource deployment2 'Microsoft.CognitiveServices/accounts/deployments@2024-10-01' = { - name: 'Phi-4' + name: 'deployment2' properties: { model: { format: 'Microsoft' @@ -56,8 +56,27 @@ resource deployment2 'Microsoft.CognitiveServices/accounts/deployments@2024-10-0 ] } +resource my_model 'Microsoft.CognitiveServices/accounts/deployments@2024-10-01' = { + name: 'my-model' + properties: { + model: { + format: 'Microsoft' + name: 'Phi-4' + version: '1.0' + } + } + sku: { + name: 'GlobalStandard' + capacity: 1 + } + parent: foundry + dependsOn: [ + deployment2 + ] +} + output aiFoundryApiEndpoint string = foundry.properties.endpoints['AI Foundry API'] output endpoint string = foundry.properties.endpoint -output name string = foundry.name \ No newline at end of file +output name string = foundry.name From acfa56d13a921436978e93b850fd93a6612b682c Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Tue, 12 Aug 2025 13:19:28 -0700 Subject: [PATCH 2/5] Fix test --- .../AzureAIFoundryExtensionsTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Aspire.Hosting.Azure.Tests/AzureAIFoundryExtensionsTests.cs b/tests/Aspire.Hosting.Azure.Tests/AzureAIFoundryExtensionsTests.cs index e17fc165b96..96bd85fcb24 100644 --- a/tests/Aspire.Hosting.Azure.Tests/AzureAIFoundryExtensionsTests.cs +++ b/tests/Aspire.Hosting.Azure.Tests/AzureAIFoundryExtensionsTests.cs @@ -113,7 +113,7 @@ public void RunAsFoundryLocal_DeploymentIsMarkedLocal() } [Fact] - public void RunAsFoundryLocal_DeploymentConnectionString_HasModelProperty() + public async Task RunAsFoundryLocal_DeploymentConnectionString_HasModelProperty() { using var builder = TestDistributedApplicationBuilder.Create(); var foundry = builder.AddAzureAIFoundry("myAIFoundry"); @@ -121,7 +121,7 @@ public void RunAsFoundryLocal_DeploymentConnectionString_HasModelProperty() foundry.RunAsFoundryLocal(); var resource = Assert.Single(builder.Resources.OfType()); Assert.Single(resource.Deployments); - var connectionString = deployment.Resource.ConnectionStringExpression.ValueExpression; + var connectionString = await deployment.Resource.ConnectionStringExpression.GetValueAsync(default); Assert.Contains("Model=gpt-4", connectionString); Assert.Contains("DeploymentId=deployment1", connectionString); Assert.Contains("Endpoint=", connectionString); From 35b6eed43fcfe00992735c602865f4d911cd5b4e Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Tue, 12 Aug 2025 13:34:27 -0700 Subject: [PATCH 3/5] Update manifest --- .../AzureAIFoundryEndToEnd.AppHost/aspire-manifest.json | 2 +- .../AzureAIFoundryEndToEnd.AppHost/foundry.module.bicep | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/playground/AzureAIFoundryEndToEnd/AzureAIFoundryEndToEnd.AppHost/aspire-manifest.json b/playground/AzureAIFoundryEndToEnd/AzureAIFoundryEndToEnd.AppHost/aspire-manifest.json index dac3209cb58..7b82de04876 100644 --- a/playground/AzureAIFoundryEndToEnd/AzureAIFoundryEndToEnd.AppHost/aspire-manifest.json +++ b/playground/AzureAIFoundryEndToEnd/AzureAIFoundryEndToEnd.AppHost/aspire-manifest.json @@ -8,7 +8,7 @@ }, "chat": { "type": "value.v0", - "connectionString": "Endpoint={foundry.outputs.endpoint};EndpointAIInference={foundry.outputs.aiFoundryApiEndpoint}models;DeploymentId=qwen2.5-0.5b;Model=qwen2.5-0.5b" + "connectionString": "{foundry.connectionString};DeploymentId=chat;Model=qwen2.5-0.5b" }, "webstory": { "type": "project.v0", diff --git a/playground/AzureAIFoundryEndToEnd/AzureAIFoundryEndToEnd.AppHost/foundry.module.bicep b/playground/AzureAIFoundryEndToEnd/AzureAIFoundryEndToEnd.AppHost/foundry.module.bicep index 92590ac8adc..9bd27c1f183 100644 --- a/playground/AzureAIFoundryEndToEnd/AzureAIFoundryEndToEnd.AppHost/foundry.module.bicep +++ b/playground/AzureAIFoundryEndToEnd/AzureAIFoundryEndToEnd.AppHost/foundry.module.bicep @@ -22,7 +22,7 @@ resource foundry 'Microsoft.CognitiveServices/accounts@2024-10-01' = { } resource chat 'Microsoft.CognitiveServices/accounts/deployments@2024-10-01' = { - name: 'qwen2.5-0.5b' + name: 'chat' properties: { model: { format: 'Microsoft' From 6469f9cd76f32435bf54e7173432cddb6807f3cd Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Thu, 21 Aug 2025 09:58:09 -0700 Subject: [PATCH 4/5] Revert deployment connection string changes --- .../AzureAIFoundryEndToEnd.AppHost/aspire-manifest.json | 2 +- .../AzureAIFoundryDeploymentResource.cs | 2 +- src/Aspire.Hosting.Azure.AIFoundry/AzureAIFoundryResource.cs | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/playground/AzureAIFoundryEndToEnd/AzureAIFoundryEndToEnd.AppHost/aspire-manifest.json b/playground/AzureAIFoundryEndToEnd/AzureAIFoundryEndToEnd.AppHost/aspire-manifest.json index 7b82de04876..dac3209cb58 100644 --- a/playground/AzureAIFoundryEndToEnd/AzureAIFoundryEndToEnd.AppHost/aspire-manifest.json +++ b/playground/AzureAIFoundryEndToEnd/AzureAIFoundryEndToEnd.AppHost/aspire-manifest.json @@ -8,7 +8,7 @@ }, "chat": { "type": "value.v0", - "connectionString": "{foundry.connectionString};DeploymentId=chat;Model=qwen2.5-0.5b" + "connectionString": "Endpoint={foundry.outputs.endpoint};EndpointAIInference={foundry.outputs.aiFoundryApiEndpoint}models;DeploymentId=qwen2.5-0.5b;Model=qwen2.5-0.5b" }, "webstory": { "type": "project.v0", diff --git a/src/Aspire.Hosting.Azure.AIFoundry/AzureAIFoundryDeploymentResource.cs b/src/Aspire.Hosting.Azure.AIFoundry/AzureAIFoundryDeploymentResource.cs index fd8963dd364..011ac10ecee 100644 --- a/src/Aspire.Hosting.Azure.AIFoundry/AzureAIFoundryDeploymentResource.cs +++ b/src/Aspire.Hosting.Azure.AIFoundry/AzureAIFoundryDeploymentResource.cs @@ -85,5 +85,5 @@ public AzureAIFoundryDeploymentResource(string name, string modelName, string mo /// /// Gets the connection string expression for the Azure AI Foundry resource with model/deployment information. /// - public ReferenceExpression ConnectionStringExpression => ReferenceExpression.Create($"{Parent};DeploymentId={DeploymentName};Model={ModelName}"); + public ReferenceExpression ConnectionStringExpression => Parent.GetConnectionString(DeploymentName); } diff --git a/src/Aspire.Hosting.Azure.AIFoundry/AzureAIFoundryResource.cs b/src/Aspire.Hosting.Azure.AIFoundry/AzureAIFoundryResource.cs index dd19a2fb31e..36c7cc9cdd6 100644 --- a/src/Aspire.Hosting.Azure.AIFoundry/AzureAIFoundryResource.cs +++ b/src/Aspire.Hosting.Azure.AIFoundry/AzureAIFoundryResource.cs @@ -73,4 +73,7 @@ internal void AddDeployment(AzureAIFoundryDeploymentResource deployment) _deployments.Add(deployment); } + + internal ReferenceExpression GetConnectionString(string deploymentName) => + ReferenceExpression.Create($"{ConnectionStringExpression};DeploymentId={deploymentName};Model={deploymentName}"); } From 3beb4e264c4dd0094b5848e5ce647fb240de3a22 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Thu, 21 Aug 2025 11:26:34 -0700 Subject: [PATCH 5/5] Fix test --- .../Aspire.Hosting.Azure.Tests/AzureAIFoundryExtensionsTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Aspire.Hosting.Azure.Tests/AzureAIFoundryExtensionsTests.cs b/tests/Aspire.Hosting.Azure.Tests/AzureAIFoundryExtensionsTests.cs index 96bd85fcb24..5442a789cbc 100644 --- a/tests/Aspire.Hosting.Azure.Tests/AzureAIFoundryExtensionsTests.cs +++ b/tests/Aspire.Hosting.Azure.Tests/AzureAIFoundryExtensionsTests.cs @@ -122,7 +122,7 @@ public async Task RunAsFoundryLocal_DeploymentConnectionString_HasModelProperty( var resource = Assert.Single(builder.Resources.OfType()); Assert.Single(resource.Deployments); var connectionString = await deployment.Resource.ConnectionStringExpression.GetValueAsync(default); - Assert.Contains("Model=gpt-4", connectionString); + Assert.Contains("Model=deployment1", connectionString); Assert.Contains("DeploymentId=deployment1", connectionString); Assert.Contains("Endpoint=", connectionString); Assert.Contains("Key=", connectionString);