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()