using AIStudio.Chat; using RustService = AIStudio.Tools.RustService; namespace AIStudio.Provider; /// <summary> /// The base class for all providers. /// </summary> public abstract class BaseProvider : IProvider, ISecretId { /// <summary> /// The HTTP client to use it for all requests. /// </summary> protected readonly HttpClient httpClient = new(); /// <summary> /// The logger to use. /// </summary> 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; /// <summary> /// Constructor for the base provider. /// </summary> /// <param name="url">The base URL for the provider.</param> /// <param name="loggerService">The logger service to use.</param> 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 /// <inheritdoc /> public abstract string Id { get; } /// <inheritdoc /> public abstract string InstanceName { get; set; } /// <inheritdoc /> public abstract IAsyncEnumerable<string> StreamChatCompletion(Model chatModel, ChatThread chatThread, CancellationToken token = default); /// <inheritdoc /> public abstract IAsyncEnumerable<ImageURL> StreamImageCompletion(Model imageModel, string promptPositive, string promptNegative = FilterOperator.String.Empty, ImageURL referenceImageURL = default, CancellationToken token = default); /// <inheritdoc /> public abstract Task<IEnumerable<Model>> GetTextModels(string? apiKeyProvisional = null, CancellationToken token = default); /// <inheritdoc /> public abstract Task<IEnumerable<Model>> GetImageModels(string? apiKeyProvisional = null, CancellationToken token = default); /// <inheritdoc /> public abstract Task<IEnumerable<Model>> GetEmbeddingModels(string? apiKeyProvisional = null, CancellationToken token = default); #endregion #region Implementation of ISecretId public string SecretId => this.Id; public string SecretName => this.InstanceName; #endregion }