diff --git a/src/Aspire.Dashboard/Model/GenAI/GenAIVisualizerDialogViewModel.cs b/src/Aspire.Dashboard/Model/GenAI/GenAIVisualizerDialogViewModel.cs index b1a8c5dc4ac..3f3e23eae57 100644 --- a/src/Aspire.Dashboard/Model/GenAI/GenAIVisualizerDialogViewModel.cs +++ b/src/Aspire.Dashboard/Model/GenAI/GenAIVisualizerDialogViewModel.cs @@ -191,8 +191,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 a8d4255c106..f38a4fe888b 100644 --- a/tests/Aspire.Dashboard.Tests/Model/GenAIVisualizerDialogViewModelTests.cs +++ b/tests/Aspire.Dashboard.Tests/Model/GenAIVisualizerDialogViewModelTests.cs @@ -239,6 +239,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!"),