diff --git a/src/Aspire.Dashboard/Model/GenAI/GenAIVisualizerDialogViewModel.cs b/src/Aspire.Dashboard/Model/GenAI/GenAIVisualizerDialogViewModel.cs index 4747ddc1b10..e31f0418717 100644 --- a/src/Aspire.Dashboard/Model/GenAI/GenAIVisualizerDialogViewModel.cs +++ b/src/Aspire.Dashboard/Model/GenAI/GenAIVisualizerDialogViewModel.cs @@ -208,8 +208,8 @@ private static void CreateMessages(GenAIVisualizerDialogViewModel viewModel, Tel // Attempt get get messages from span events. foreach (var item in viewModel.Span.Events.OrderBy(i => i.Time)) { - if (GenAIHelpers.IsGenAISpan(item.Attributes) && - TryMapEventName(item.Name, out var type)) + // Detect GenAI messages by event name. Don't check for the gen_ai.system attribute because it's optional on events. + if (TryMapEventName(item.Name, out var type)) { var content = item.Attributes.GetValue(GenAIHelpers.GenAIEventContent); var parts = content != null ? DeserializeBody(type.Value, content) : []; diff --git a/tests/Aspire.Dashboard.Tests/Model/GenAIVisualizerDialogViewModelTests.cs b/tests/Aspire.Dashboard.Tests/Model/GenAIVisualizerDialogViewModelTests.cs index 9569e2ee16e..edced980c74 100644 --- a/tests/Aspire.Dashboard.Tests/Model/GenAIVisualizerDialogViewModelTests.cs +++ b/tests/Aspire.Dashboard.Tests/Model/GenAIVisualizerDialogViewModelTests.cs @@ -240,6 +240,12 @@ public void Create_GenAISpanEvents_HasMessages() CreateSpanEvent( name: "gen_ai.assistant.message", startTime: 2, + attributes: [ + KeyValuePair.Create(GenAIHelpers.GenAIEventContent, JsonSerializer.Serialize(new AssistantEvent { Content = "Assistant!" }, GenAIEventsContext.Default.AssistantEvent)), + ]), + CreateSpanEvent( + name: "other_name_that_is_ignored", + startTime: 3, attributes: [ KeyValuePair.Create(GenAIHelpers.GenAIEventContent, JsonSerializer.Serialize(new AssistantEvent { Content = "Assistant!" }, GenAIEventsContext.Default.AssistantEvent)), KeyValuePair.Create(GenAIHelpers.GenAISystem, "System!"),