< Summary

Information
Class: Elsa.AI.Host.Endpoints.AI.Capabilities.Endpoint
Assembly: Elsa.AI.Host
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.AI.Host/Endpoints/AI/Capabilities/Endpoint.cs
Line coverage
81%
Covered lines: 22
Uncovered lines: 5
Coverable lines: 27
Total lines: 62
Line coverage: 81.4%
Branch coverage
50%
Covered branches: 4
Total branches: 8
Branch coverage: 50%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
Configure()100%210%
ExecuteAsync(...)50%22100%
HasSelectableProvider(...)50%7675%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.AI.Host/Endpoints/AI/Capabilities/Endpoint.cs

#LineLine coverage
 1using Elsa.Abstractions;
 2using Elsa.AI.Abstractions.Contracts;
 3using Elsa.AI.Host.Options;
 4using Elsa.AI.Host.Permissions;
 5using JetBrains.Annotations;
 6using Microsoft.Extensions.Options;
 7
 8namespace Elsa.AI.Host.Endpoints.AI.Capabilities;
 9
 10[PublicAPI]
 711public class Endpoint(
 712    IOptions<AIHostOptions> options,
 713    IEnumerable<IAIProvider> providers,
 714    IEnumerable<IAIConversationStore> conversationStores,
 715    IEnumerable<IAIProposalStore> proposalStores) : ElsaEndpointWithoutRequest<Response>
 16{
 17    public override void Configure()
 18    {
 019        Get("/ai/capabilities");
 020        ConfigurePermissions(AIPermissions.ViewCapabilities);
 021    }
 22
 23    public override Task<Response> ExecuteAsync(CancellationToken cancellationToken)
 24    {
 725        var optionsValue = options.Value;
 726        var providerOptions = optionsValue.Providers.ToList();
 1627        var availableProviders = providers.Where(x => providerOptions.IsProviderEnabled(x.Name)).ToList();
 728        var hasSelectableProvider = HasSelectableProvider(optionsValue.DefaultProviderName, providerOptions, availablePr
 1429        var hasDurableConversationStore = conversationStores.Any(x => x is not IAITransientConversationStore);
 30
 731        return Task.FromResult(new Response(
 732            optionsValue.StreamingEnabled && hasSelectableProvider,
 733            optionsValue.ConversationPersistenceEnabled && hasDurableConversationStore,
 734            optionsValue.ProposalReviewEnabled && proposalStores.Any(),
 735            optionsValue.SupportedAttachmentKinds.ToList(),
 1436            optionsValue.Agents.Select(x => new AIAgentCapability(x.Name, x.DisplayName, x.Description)).ToList()));
 37    }
 38
 39    private static bool HasSelectableProvider(string? providerName, IReadOnlyCollection<AIProviderOptions> providerOptio
 40    {
 741        if (!string.IsNullOrWhiteSpace(providerName))
 42        {
 143            var configuredProviders = providerOptions.Where(x => x.Enabled).ToList();
 144            var configuredProvider = configuredProviders.FirstOrDefault(x => string.Equals(x.Name, providerName, StringC
 145            return configuredProvider != null
 046                ? availableProviders.Any(x => string.Equals(x.Name, configuredProvider.Name, StringComparison.OrdinalIgn
 047                                              string.Equals(x.Name, configuredProvider.Provider, StringComparison.Ordina
 348                : availableProviders.Any(x => string.Equals(x.Name, providerName, StringComparison.OrdinalIgnoreCase));
 49        }
 50
 651        return availableProviders.Count == 1;
 52    }
 53}
 54
 55public record Response(
 56    bool Streaming,
 57    bool ConversationPersistence,
 58    bool ProposalReview,
 59    IReadOnlyCollection<string> SupportedAttachmentKinds,
 60    IReadOnlyCollection<AIAgentCapability> Agents);
 61
 62public record AIAgentCapability(string Name, string DisplayName, string Description);