File: Model\Assistant\Prompts\PromptContextsBuilder.cs
Web Access
Project: src\src\Aspire.Dashboard\Aspire.Dashboard.csproj (Aspire.Dashboard)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Aspire.Dashboard.Model.Otlp;
using Aspire.Dashboard.Otlp.Model;
using Aspire.Dashboard.Otlp.Storage;
 
namespace Aspire.Dashboard.Model.Assistant.Prompts;
 
internal static class PromptContextsBuilder
{
    public static Task ErrorTraces(InitializePromptContext promptContext, string displayText, Func<PagedResult<OtlpTrace>> getErrorTraces)
    {
        var outgoingPeerResolvers = promptContext.ServiceProvider.GetRequiredService<IEnumerable<IOutgoingPeerResolver>>();
        var errorTraces = getErrorTraces();
        foreach (var trace in errorTraces.Items)
        {
            promptContext.DataContext.AddReferencedTrace(trace);
        }
 
        promptContext.ChatBuilder.AddUserMessage(
            displayText,
            KnownChatMessages.Traces.CreateErrorTracesMessage(errorTraces.Items, outgoingPeerResolvers).Text);
 
        return Task.CompletedTask;
    }
 
    public static Task ErrorStructuredLogs(InitializePromptContext promptContext, string displayText, Func<PagedResult<OtlpLogEntry>> getErrorLogs)
    {
        var errorLogs = getErrorLogs();
        foreach (var log in errorLogs.Items)
        {
            promptContext.DataContext.AddReferencedLogEntry(log);
        }
 
        promptContext.ChatBuilder.AddUserMessage(
            displayText,
            KnownChatMessages.StructuredLogs.CreateErrorStructuredLogsMessage(errorLogs.Items).Text);
 
        return Task.CompletedTask;
    }
 
    public static Task AnalyzeResource(InitializePromptContext promptContext, string displayText, ResourceViewModel resource)
    {
        promptContext.ChatBuilder.AddUserMessage(
            displayText,
            KnownChatMessages.Resources.CreateAnalyzeResourceMessage(resource).Text);
 
        return Task.CompletedTask;
    }
 
    public static Task AnalyzeLogEntry(InitializePromptContext promptContext, string displayText, OtlpLogEntry logEntry)
    {
        promptContext.DataContext.AddReferencedLogEntry(logEntry);
        promptContext.ChatBuilder.AddUserMessage(
            displayText,
            KnownChatMessages.StructuredLogs.CreateAnalyzeLogEntryMessage(logEntry).Text);
 
        return Task.CompletedTask;
    }
 
    public static Task AnalyzeTrace(InitializePromptContext context, string displayText, OtlpTrace trace)
    {
        context.DataContext.AddReferencedTrace(trace);
 
        var outgoingPeerResolvers = context.ServiceProvider.GetRequiredService<IEnumerable<IOutgoingPeerResolver>>();
        var repository = context.ServiceProvider.GetRequiredService<TelemetryRepository>();
        var traceLogs = repository.GetLogs(new GetLogsContext
        {
            ResourceKey = null,
            Count = int.MaxValue,
            StartIndex = 0,
            Filters = [new FieldTelemetryFilter { Field = KnownStructuredLogFields.TraceIdField, Condition = FilterCondition.Equals, Value = trace.TraceId }]
        });
        foreach (var log in traceLogs.Items)
        {
            context.DataContext.AddReferencedLogEntry(log);
        }
 
        context.ChatBuilder.AddUserMessage(
            displayText,
            KnownChatMessages.Traces.CreateAnalyzeTraceMessage(trace, traceLogs.Items, outgoingPeerResolvers).Text);
 
        return Task.CompletedTask;
    }
 
    public static Task AnalyzeSpan(InitializePromptContext context, string displayText, OtlpSpan span)
    {
        context.DataContext.AddReferencedTrace(span.Trace);
 
        var outgoingPeerResolvers = context.ServiceProvider.GetRequiredService<IEnumerable<IOutgoingPeerResolver>>();
        var repository = context.ServiceProvider.GetRequiredService<TelemetryRepository>();
        var traceLogs = repository.GetLogs(new GetLogsContext
        {
            ResourceKey = null,
            Count = int.MaxValue,
            StartIndex = 0,
            Filters = [new FieldTelemetryFilter { Field = KnownStructuredLogFields.TraceIdField, Condition = FilterCondition.Equals, Value = span.Trace.TraceId }]
        });
        foreach (var log in traceLogs.Items)
        {
            context.DataContext.AddReferencedLogEntry(log);
        }
 
        context.ChatBuilder.AddUserMessage(
            displayText,
            KnownChatMessages.Traces.CreateAnalyzeSpanMessage(span, traceLogs.Items, outgoingPeerResolvers).Text);
 
        return Task.CompletedTask;
    }
}