mirror of
https://github.com/MindWorkAI/AI-Studio.git
synced 2025-02-11 21:29:06 +00:00
178 lines
5.3 KiB
C#
178 lines
5.3 KiB
C#
// ReSharper disable InconsistentNaming
|
|
|
|
using System.Text;
|
|
|
|
using AIStudio.Assistants.ERI;
|
|
using AIStudio.Settings.DataModel;
|
|
using AIStudio.Tools.ERIClient;
|
|
using AIStudio.Tools.ERIClient.DataModel;
|
|
|
|
using Microsoft.AspNetCore.Components;
|
|
|
|
using RetrievalInfo = AIStudio.Tools.ERIClient.DataModel.RetrievalInfo;
|
|
|
|
namespace AIStudio.Dialogs;
|
|
|
|
public partial class DataSourceERI_V1InfoDialog : ComponentBase, IAsyncDisposable, ISecretId
|
|
{
|
|
[CascadingParameter]
|
|
private MudDialogInstance MudDialog { get; set; } = null!;
|
|
|
|
[Parameter]
|
|
public DataSourceERI_V1 DataSource { get; set; }
|
|
|
|
[Inject]
|
|
private RustService RustService { get; init; } = null!;
|
|
|
|
#region Overrides of ComponentBase
|
|
|
|
protected override async Task OnInitializedAsync()
|
|
{
|
|
this.eriServerTasks.Add(this.GetERIMetadata());
|
|
await base.OnInitializedAsync();
|
|
}
|
|
|
|
#endregion
|
|
|
|
private readonly CancellationTokenSource cts = new();
|
|
private readonly List<Task> eriServerTasks = new();
|
|
private readonly List<string> dataIssues = [];
|
|
|
|
private string serverDescription = string.Empty;
|
|
private ProviderType securityRequirements = ProviderType.NONE;
|
|
private IReadOnlyList<RetrievalInfo> retrievalInfoformation = [];
|
|
|
|
private bool IsOperationInProgress { get; set; } = true;
|
|
|
|
private bool IsConnectionEncrypted() => this.DataSource.Hostname.StartsWith("https://", StringComparison.InvariantCultureIgnoreCase);
|
|
|
|
private string Port => this.DataSource.Port == 0 ? string.Empty : $"{this.DataSource.Port}";
|
|
|
|
private string RetrievalName(RetrievalInfo retrievalInfo)
|
|
{
|
|
var hasId = !string.IsNullOrWhiteSpace(retrievalInfo.Id);
|
|
var hasName = !string.IsNullOrWhiteSpace(retrievalInfo.Name);
|
|
|
|
if (hasId && hasName)
|
|
return $"[{retrievalInfo.Id}] {retrievalInfo.Name}";
|
|
|
|
if (hasId)
|
|
return $"[{retrievalInfo.Id}] Unnamed retrieval process";
|
|
|
|
return hasName ? retrievalInfo.Name : "Unnamed retrieval process";
|
|
}
|
|
|
|
private string RetrievalParameters(RetrievalInfo retrievalInfo)
|
|
{
|
|
var parameters = retrievalInfo.ParametersDescription;
|
|
if (parameters is null || parameters.Count == 0)
|
|
return "This retrieval process has no parameters.";
|
|
|
|
var sb = new StringBuilder();
|
|
foreach (var (paramName, description) in parameters)
|
|
{
|
|
sb.Append("Parameter: ");
|
|
sb.AppendLine(paramName);
|
|
sb.AppendLine(description);
|
|
sb.AppendLine();
|
|
}
|
|
|
|
return sb.ToString();
|
|
}
|
|
|
|
private async Task GetERIMetadata()
|
|
{
|
|
this.dataIssues.Clear();
|
|
|
|
try
|
|
{
|
|
this.IsOperationInProgress = true;
|
|
this.StateHasChanged();
|
|
|
|
using var client = ERIClientFactory.Get(ERIVersion.V1, this.DataSource);
|
|
if(client is null)
|
|
{
|
|
this.dataIssues.Add("Failed to connect to the ERI v1 server. The server is not supported.");
|
|
return;
|
|
}
|
|
|
|
var loginResult = await client.AuthenticateAsync(this.DataSource, this.RustService);
|
|
if (!loginResult.Successful)
|
|
{
|
|
this.dataIssues.Add(loginResult.Message);
|
|
return;
|
|
}
|
|
|
|
var dataSourceInfo = await client.GetDataSourceInfoAsync(this.cts.Token);
|
|
if (!dataSourceInfo.Successful)
|
|
{
|
|
this.dataIssues.Add(dataSourceInfo.Message);
|
|
return;
|
|
}
|
|
|
|
this.serverDescription = dataSourceInfo.Data.Description;
|
|
|
|
var securityRequirementsResult = await client.GetSecurityRequirementsAsync(this.cts.Token);
|
|
if (!securityRequirementsResult.Successful)
|
|
{
|
|
this.dataIssues.Add(securityRequirementsResult.Message);
|
|
return;
|
|
}
|
|
|
|
this.securityRequirements = securityRequirementsResult.Data.AllowedProviderType;
|
|
|
|
var retrievalInfoResult = await client.GetRetrievalInfoAsync(this.cts.Token);
|
|
if (!retrievalInfoResult.Successful)
|
|
{
|
|
this.dataIssues.Add(retrievalInfoResult.Message);
|
|
return;
|
|
}
|
|
|
|
this.retrievalInfoformation = retrievalInfoResult.Data ?? [];
|
|
|
|
this.StateHasChanged();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
this.dataIssues.Add($"Failed to connect to the ERI v1 server. The message was: {e.Message}");
|
|
}
|
|
finally
|
|
{
|
|
this.IsOperationInProgress = false;
|
|
this.StateHasChanged();
|
|
}
|
|
}
|
|
|
|
private void Close()
|
|
{
|
|
this.cts.Cancel();
|
|
this.MudDialog.Close();
|
|
}
|
|
|
|
#region Implementation of ISecretId
|
|
|
|
public string SecretId => this.DataSource.Id;
|
|
|
|
public string SecretName => this.DataSource.Name;
|
|
|
|
#endregion
|
|
|
|
#region Implementation of IDisposable
|
|
|
|
public async ValueTask DisposeAsync()
|
|
{
|
|
try
|
|
{
|
|
await this.cts.CancelAsync();
|
|
await Task.WhenAll(this.eriServerTasks);
|
|
|
|
this.cts.Dispose();
|
|
}
|
|
catch
|
|
{
|
|
// ignored
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
} |