Files
PowerToys/src/settings-ui/Settings.UI.Library/PasteAIProviderDefinition.cs
Shawn Yuan a3b8dc6cb8 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>
2025-11-05 16:13:55 +08:00

176 lines
5.3 KiB
C#

// 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));
}
}
}