diff --git a/src/modules/agents/Elsa.Agents.Api/Endpoints/ServiceProviders/List/Endpoint.cs b/src/modules/agents/Elsa.Agents.Api/Endpoints/ServiceProviders/List/Endpoint.cs new file mode 100644 index 00000000..e81f4424 --- /dev/null +++ b/src/modules/agents/Elsa.Agents.Api/Endpoints/ServiceProviders/List/Endpoint.cs @@ -0,0 +1,27 @@ +using Elsa.Abstractions; +using Elsa.Agents; +using Elsa.Models; +using JetBrains.Annotations; + +namespace Elsa.Agents.Api.Endpoints.ServiceProviders.List; + +/// +/// Lists all registered service providers. +/// +[UsedImplicitly] +public class Endpoint(IServiceDiscoverer serviceDiscoverer) : ElsaEndpointWithoutRequest> +{ + /// + public override void Configure() + { + Get("/ai/service-providers"); + ConfigurePermissions("ai/services:read"); + } + + /// + public override Task> ExecuteAsync(CancellationToken ct) + { + var providers = serviceDiscoverer.Discover().Select(x => x.Name).ToList(); + return Task.FromResult(new ListResponse(providers)); + } +} diff --git a/src/modules/agents/Elsa.Studio.Agents/Client/IServiceProvidersApi.cs b/src/modules/agents/Elsa.Studio.Agents/Client/IServiceProvidersApi.cs new file mode 100644 index 00000000..c39dc0fe --- /dev/null +++ b/src/modules/agents/Elsa.Studio.Agents/Client/IServiceProvidersApi.cs @@ -0,0 +1,12 @@ +using Elsa.Api.Client.Shared.Models; +using Refit; + +namespace Elsa.Studio.Agents.Client; + +/// Represents a client API for retrieving available service providers. +public interface IServiceProvidersApi +{ + /// Lists all service providers. + [Get("/ai/service-providers")] + Task> ListAsync(CancellationToken cancellationToken = default); +} diff --git a/src/modules/agents/Elsa.Studio.Agents/UI/Pages/Service.razor b/src/modules/agents/Elsa.Studio.Agents/UI/Pages/Service.razor index 3a469b26..d8462c19 100644 --- a/src/modules/agents/Elsa.Studio.Agents/UI/Pages/Service.razor +++ b/src/modules/agents/Elsa.Studio.Agents/UI/Pages/Service.razor @@ -31,9 +31,10 @@ Label="@Localizer["Type"]" Variant="Variant.Outlined" HelperText="@Localizer["The type of the service."]"> - @Localizer["OpenAIChatCompletion"] - @Localizer["OpenAIEmbeddingGenerator"] - @Localizer["OpenAITextToImage"] + @foreach (var provider in _serviceProviders) + { + @Localizer[provider] + } _serviceProviders = []; + + /// + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + var providersApi = await ApiClientProvider.GetApiAsync(); + var response = await providersApi.ListAsync(); + _serviceProviders = response.Items; + } /// protected override async Task OnParametersSetAsync()