mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-04 18:26:39 +02:00
Advanced Paste: AI pasting enhancement (#42374)
<!-- Enter a brief description/summary of your PR here. What does it fix/what does it change/how was it tested (even manually, if necessary)? --> ## Summary of the Pull Request * Add multiple endpoint support for paste with AI * Add Local AI support for paste AI * Advanced AI implementation <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #32960 - [x] **Communication:** I've discussed this with core contributors already. If the work hasn't been agreed, this work might be rejected - [x] **Tests:** Added/updated and all pass - [x] **Localization:** All end-user-facing strings can be localized - [x] **Dev docs:** Added/updated - [x] **New binaries:** Added on the required places - [x] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries - [x] [WXS for installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs) for new binaries and localization folder - [x] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml) for new test projects - [x] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml) - [ ] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: #xxx <!-- Provide a more detailed description of the PR, other things fixed, or any additional comments/features here --> ## Detailed Description of the Pull Request / Additional comments <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed ### GPO - [x] Paste with AI should not be available if the original GPO for paste AI is set to false - [x] Paste with AI should be controlled within endpoint granularity - [x] Advanced Paste UI should disable AI ability if GPO is set to disable for any llm ### Paste AI - [x] Every AI endpoint should work as expected - [x] Default prompt should be able to give a reasonable result - [x] Local AI should work as expected ### Advanced AI - [x] Open AI and Azure OPENAI should be able to configure as advanced AI endpoint - [x] Advanced AI should be able to pick up functions correctly to do the transformation and give reasonable result --------- Signed-off-by: Shawn Yuan <shuaiyuan@microsoft.com> Signed-off-by: Shuai Yuan <shuai.yuan.zju@gmail.com> Signed-off-by: Shawn Yuan (from Dev Box) <shuaiyuan@microsoft.com> Co-authored-by: Leilei Zhang <leilzh@microsoft.com> Co-authored-by: Niels Laute <niels.laute@live.nl> Co-authored-by: Kai Tao <kaitao@microsoft.com> Co-authored-by: Kai Tao <69313318+vanzue@users.noreply.github.com> Co-authored-by: vanzue <vanzue@outlook.com> Co-authored-by: Gordon Lam (SH) <yeelam@microsoft.com>
This commit is contained in:
175
src/settings-ui/Settings.UI.Library/PasteAIProviderDefinition.cs
Normal file
175
src/settings-ui/Settings.UI.Library/PasteAIProviderDefinition.cs
Normal file
@@ -0,0 +1,175 @@
|
||||
// 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
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents a single Paste AI provider configuration entry.
|
||||
/// </summary>
|
||||
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<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
|
||||
{
|
||||
if (EqualityComparer<T>.Default.Equals(field, value))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
field = value;
|
||||
OnPropertyChanged(propertyName);
|
||||
return true;
|
||||
}
|
||||
|
||||
protected void OnPropertyChanged(string propertyName)
|
||||
{
|
||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user