File: Components\Dialogs\AIAgentsDialog.razor.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 System.Globalization;
using Aspire.Dashboard.Configuration;
using Aspire.Dashboard.Model.Markdown;
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Options;
using Microsoft.FluentUI.AspNetCore.Components;
 
using DialogsLoc = Aspire.Dashboard.Resources.Dialogs;
 
namespace Aspire.Dashboard.Components.Dialogs;
 
public partial class AIAgentsDialog : IDialogContentComponent
{
    private MarkdownProcessor? _markdownProcessor;
 
    [Inject]
    public required IStringLocalizer<DialogsLoc> Loc { get; init; }
 
    [Inject]
    public required IStringLocalizer<Resources.ControlsStrings> ControlsStringsLoc { get; init; }
 
    [Inject]
    public required IDashboardClient DashboardClient { get; init; }
 
    [Inject]
    public required IOptionsMonitor<DashboardOptions> Options { get; init; }
 
    private const string AppHostLearnMoreUrl = "https://aka.ms/aspire/ai-agents-apphost";
    private const string StandaloneLearnMoreUrl = "https://aka.ms/aspire/dashboard-ai-standalone";
    private const string InstallCliUrl = "https://aka.ms/aspire/install-cli";
 
    private string Description => DashboardClient.IsEnabled
        ? string.Format(CultureInfo.CurrentCulture, Loc[nameof(DialogsLoc.AIAgentsDialogAppHostDescription)], AppHostLearnMoreUrl, InstallCliUrl)
        : string.Format(CultureInfo.CurrentCulture, Loc[nameof(DialogsLoc.AIAgentsDialogStandaloneDescription)], GetDashboardUrl(), StandaloneLearnMoreUrl, InstallCliUrl);
 
    private string GetDashboardUrl()
    {
        var options = Options.CurrentValue;
        var frontendEndpoints = options.Frontend.GetEndpointAddresses();
        var baseUrl = options.Frontend.PublicUrl
            ?? frontendEndpoints.FirstOrDefault(e => string.Equals(e.Scheme, "https", StringComparison.Ordinal))?.ToString()
            ?? frontendEndpoints.FirstOrDefault(e => string.Equals(e.Scheme, "http", StringComparison.Ordinal))?.ToString();
 
        if (baseUrl is null)
        {
            return "http://localhost:18888";
        }
 
        // Trim trailing slash for consistent URL building.
        baseUrl = baseUrl.TrimEnd('/');
 
        if (options.Api.AuthMode is ApiAuthMode.ApiKey &&
            options.Frontend.AuthMode is FrontendAuthMode.BrowserToken &&
            options.Frontend.BrowserToken is { } token)
        {
            return $"{baseUrl}/login?t={token}";
        }
 
        return baseUrl;
    }
 
    private MarkdownProcessor GetMarkdownProcessor()
    {
        return _markdownProcessor ??= new MarkdownProcessor(ControlsStringsLoc, safeUrlSchemes: MarkdownHelpers.SafeUrlSchemes, extensions: []);
    }
}