From 611b9ecb091e8ad0f3ff9c2ed11b52db4c607932 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Thu, 25 Sep 2025 15:53:19 +0800 Subject: [PATCH 1/3] Display help text for enabling GenAI sensitive data when there are no messages --- .../Model/GenAI/GenAIVisualizerDialogViewModel.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Aspire.Dashboard/Model/GenAI/GenAIVisualizerDialogViewModel.cs b/src/Aspire.Dashboard/Model/GenAI/GenAIVisualizerDialogViewModel.cs index f2c81686c48..36ddefa3e66 100644 --- a/src/Aspire.Dashboard/Model/GenAI/GenAIVisualizerDialogViewModel.cs +++ b/src/Aspire.Dashboard/Model/GenAI/GenAIVisualizerDialogViewModel.cs @@ -100,7 +100,8 @@ private static bool AllMessagesHaveNoContent(List messageVie { if (messageViewModels.Count == 0) { - return false; + // Microsoft.Extensions.AI doesn't output any message telemetry when sensitive data isn't enabled. + return true; } foreach (var messageViewModel in messageViewModels) From 433c61e79a14c6af9098fbd2043816b725b75c8d Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Thu, 25 Sep 2025 16:05:12 +0800 Subject: [PATCH 2/3] Update --- .../GenAIVisualizerDialogViewModelTests.cs | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/tests/Aspire.Dashboard.Tests/Model/GenAIVisualizerDialogViewModelTests.cs b/tests/Aspire.Dashboard.Tests/Model/GenAIVisualizerDialogViewModelTests.cs index 0f125d2fd56..a8d4255c106 100644 --- a/tests/Aspire.Dashboard.Tests/Model/GenAIVisualizerDialogViewModelTests.cs +++ b/tests/Aspire.Dashboard.Tests/Model/GenAIVisualizerDialogViewModelTests.cs @@ -542,6 +542,50 @@ public void Create_GenAISpanAttributesWithoutContent_HasNoMessageContent() Assert.True(vm.NoMessageContent); } + [Fact] + public void Create_NoMessages_HasNoMessageContent() + { + // Arrange + var repository = CreateRepository(); + + var attributes = new KeyValuePair[] + { + KeyValuePair.Create(GenAIHelpers.GenAISystem, "System!"), + KeyValuePair.Create("server.address", "ai-server.address"), + }; + + var addContext = new AddContext(); + repository.AddTraces(addContext, new RepeatedField() + { + new ResourceSpans + { + Resource = CreateResource(), + ScopeSpans = + { + new ScopeSpans + { + Scope = CreateScope(), + Spans = + { + CreateSpan(traceId: "1", spanId: "1-1", startTime: s_testTime.AddMinutes(1), endTime: s_testTime.AddMinutes(10), attributes: attributes) + } + } + } + } + }); + Assert.Equal(0, addContext.FailureCount); + + var span = repository.GetSpan(GetHexId("1"), GetHexId("1-1"))!; + var spanDetailsViewModel = SpanDetailsViewModel.Create(span, repository, repository.GetResources()); + + // Act + var vm = Create(repository, spanDetailsViewModel); + + // Assert + Assert.Empty(vm.Items); + Assert.True(vm.NoMessageContent); + } + private static GenAIVisualizerDialogViewModel Create( TelemetryRepository repository, SpanDetailsViewModel spanDetailsViewModel) From 5f6b95fb8ca99811cafabfef91819aac3d105951 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Thu, 25 Sep 2025 16:22:45 +0800 Subject: [PATCH 3/3] Handle error spans --- .../Model/GenAI/GenAIVisualizerDialogViewModel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Aspire.Dashboard/Model/GenAI/GenAIVisualizerDialogViewModel.cs b/src/Aspire.Dashboard/Model/GenAI/GenAIVisualizerDialogViewModel.cs index 36ddefa3e66..b1a8c5dc4ac 100644 --- a/src/Aspire.Dashboard/Model/GenAI/GenAIVisualizerDialogViewModel.cs +++ b/src/Aspire.Dashboard/Model/GenAI/GenAIVisualizerDialogViewModel.cs @@ -91,7 +91,7 @@ public static GenAIVisualizerDialogViewModel Create( viewModel.InputMessages = viewModel.Items.Where(e => e.Type is GenAIItemType.SystemMessage or GenAIItemType.UserMessage or GenAIItemType.AssistantMessage or GenAIItemType.ToolMessage).ToList(); viewModel.OutputMessages = viewModel.Items.Where(e => e.Type == GenAIItemType.OutputMessage).ToList(); - viewModel.NoMessageContent = AllMessagesHaveNoContent(viewModel.InputMessages) && AllMessagesHaveNoContent(viewModel.OutputMessages); + viewModel.NoMessageContent = AllMessagesHaveNoContent(viewModel.InputMessages) && AllMessagesHaveNoContent(viewModel.OutputMessages) && viewModel.ErrorItem == null; return viewModel; }