// Copyright (c) Microsoft Corporation // The Microsoft Corporation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. using System; using System.Collections.Generic; using System.ComponentModel; using System.Runtime.CompilerServices; using System.Text.Json.Serialization; namespace Microsoft.PowerToys.Settings.UI.Library { /// /// Represents a single Paste AI provider configuration entry. /// public class PasteAIProviderDefinition : INotifyPropertyChanged { private string _id = Guid.NewGuid().ToString("N"); private string _serviceType = "OpenAI"; private string _modelName = string.Empty; private string _endpointUrl = string.Empty; private string _apiVersion = string.Empty; private string _deploymentName = string.Empty; private string _modelPath = string.Empty; private string _systemPrompt = string.Empty; private bool _moderationEnabled = true; private bool _isActive; private bool _enableAdvancedAI; private bool _isLocalModel; public event PropertyChangedEventHandler PropertyChanged; [JsonPropertyName("id")] public string Id { get => _id; set => SetProperty(ref _id, value); } [JsonPropertyName("service-type")] public string ServiceType { get => _serviceType; set { if (SetProperty(ref _serviceType, string.IsNullOrWhiteSpace(value) ? "OpenAI" : value)) { OnPropertyChanged(nameof(DisplayName)); } } } [JsonIgnore] public AIServiceType ServiceTypeKind { get => ServiceType.ToAIServiceType(); set => ServiceType = value.ToConfigurationString(); } [JsonPropertyName("model-name")] public string ModelName { get => _modelName; set { if (SetProperty(ref _modelName, value ?? string.Empty)) { OnPropertyChanged(nameof(DisplayName)); } } } [JsonPropertyName("endpoint-url")] public string EndpointUrl { get => _endpointUrl; set => SetProperty(ref _endpointUrl, value ?? string.Empty); } [JsonPropertyName("api-version")] public string ApiVersion { get => _apiVersion; set => SetProperty(ref _apiVersion, value ?? string.Empty); } [JsonPropertyName("deployment-name")] public string DeploymentName { get => _deploymentName; set => SetProperty(ref _deploymentName, value ?? string.Empty); } [JsonPropertyName("model-path")] public string ModelPath { get => _modelPath; set => SetProperty(ref _modelPath, value ?? string.Empty); } [JsonPropertyName("system-prompt")] public string SystemPrompt { get => _systemPrompt; set => SetProperty(ref _systemPrompt, value?.Trim() ?? string.Empty); } [JsonPropertyName("moderation-enabled")] public bool ModerationEnabled { get => _moderationEnabled; set => SetProperty(ref _moderationEnabled, value); } [JsonPropertyName("enable-advanced-ai")] public bool EnableAdvancedAI { get => _enableAdvancedAI; set => SetProperty(ref _enableAdvancedAI, value); } [JsonPropertyName("is-local-model")] public bool IsLocalModel { get => _isLocalModel; set => SetProperty(ref _isLocalModel, value); } [JsonIgnore] public bool IsActive { get => _isActive; set => SetProperty(ref _isActive, value); } [JsonIgnore] public string DisplayName => string.IsNullOrWhiteSpace(ModelName) ? ServiceType : ModelName; public PasteAIProviderDefinition Clone() { return new PasteAIProviderDefinition { Id = Id, ServiceType = ServiceType, ModelName = ModelName, EndpointUrl = EndpointUrl, ApiVersion = ApiVersion, DeploymentName = DeploymentName, ModelPath = ModelPath, SystemPrompt = SystemPrompt, ModerationEnabled = ModerationEnabled, EnableAdvancedAI = EnableAdvancedAI, IsLocalModel = IsLocalModel, IsActive = IsActive, }; } protected bool SetProperty(ref T field, T value, [CallerMemberName] string propertyName = null) { if (EqualityComparer.Default.Equals(field, value)) { return false; } field = value; OnPropertyChanged(propertyName); return true; } protected void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } }