using AIStudio.Chat; using RustService = AIStudio.Tools.RustService; namespace AIStudio.Provider; /// /// The base class for all providers. /// public abstract class BaseProvider : IProvider, ISecretId { /// /// The HTTP client to use it for all requests. /// protected readonly HttpClient httpClient = new(); /// /// The logger to use. /// protected readonly ILogger logger; static BaseProvider() { RUST_SERVICE = Program.RUST_SERVICE; ENCRYPTION = Program.ENCRYPTION; } protected static readonly RustService RUST_SERVICE; protected static readonly Encryption ENCRYPTION; /// /// Constructor for the base provider. /// /// The base URL for the provider. /// The logger service to use. protected BaseProvider(string url, ILogger loggerService) { this.logger = loggerService; // Set the base URL: this.httpClient.BaseAddress = new(url); } #region Handling of IProvider, which all providers must implement /// public abstract string Id { get; } /// public abstract string InstanceName { get; set; } /// public abstract IAsyncEnumerable StreamChatCompletion(Model chatModel, ChatThread chatThread, CancellationToken token = default); /// public abstract IAsyncEnumerable StreamImageCompletion(Model imageModel, string promptPositive, string promptNegative = FilterOperator.String.Empty, ImageURL referenceImageURL = default, CancellationToken token = default); /// public abstract Task> GetTextModels(string? apiKeyProvisional = null, CancellationToken token = default); /// public abstract Task> GetImageModels(string? apiKeyProvisional = null, CancellationToken token = default); /// public abstract Task> GetEmbeddingModels(string? apiKeyProvisional = null, CancellationToken token = default); #endregion #region Implementation of ISecretId public string SecretId => this.Id; public string SecretName => this.InstanceName; #endregion }