diff --git a/src/modules/AdvancedPaste/AdvancedPaste/AdvancedPasteXAML/Controls/PromptBox.xaml b/src/modules/AdvancedPaste/AdvancedPaste/AdvancedPasteXAML/Controls/PromptBox.xaml index 9a6b8d04c9..8b7e3e5c6a 100644 --- a/src/modules/AdvancedPaste/AdvancedPaste/AdvancedPasteXAML/Controls/PromptBox.xaml +++ b/src/modules/AdvancedPaste/AdvancedPaste/AdvancedPasteXAML/Controls/PromptBox.xaml @@ -542,7 +542,10 @@ Source="{x:Bind ViewModel.ActiveAIProvider?.ServiceType, Mode=OneWay, Converter={StaticResource ServiceTypeToIconConverter}}" /> - + + NavigateUri="{x:Bind ViewModel.TermsLinkUri, Mode=OneWay}" + Visibility="{x:Bind ViewModel.HasTermsLink, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" /> + NavigateUri="{x:Bind ViewModel.PrivacyLinkUri, Mode=OneWay}" + Visibility="{x:Bind ViewModel.HasPrivacyLink, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" /> diff --git a/src/modules/AdvancedPaste/AdvancedPaste/ViewModels/OptionsViewModel.cs b/src/modules/AdvancedPaste/AdvancedPaste/ViewModels/OptionsViewModel.cs index ede006e960..0cda4fc6e5 100644 --- a/src/modules/AdvancedPaste/AdvancedPaste/ViewModels/OptionsViewModel.cs +++ b/src/modules/AdvancedPaste/AdvancedPaste/ViewModels/OptionsViewModel.cs @@ -71,6 +71,11 @@ namespace AdvancedPaste.ViewModels [NotifyPropertyChangedFor(nameof(IsCustomAIAvailable))] [NotifyPropertyChangedFor(nameof(AllowedAIProviders))] [NotifyPropertyChangedFor(nameof(ActiveAIProvider))] + [NotifyPropertyChangedFor(nameof(ActiveAIProviderTooltip))] + [NotifyPropertyChangedFor(nameof(TermsLinkUri))] + [NotifyPropertyChangedFor(nameof(PrivacyLinkUri))] + [NotifyPropertyChangedFor(nameof(HasTermsLink))] + [NotifyPropertyChangedFor(nameof(HasPrivacyLink))] private bool _isAllowedByGPO; [ObservableProperty] @@ -187,6 +192,35 @@ namespace AdvancedPaste.ViewModels } } + private AIServiceTypeMetadata GetActiveProviderMetadata() + { + var provider = ActiveAIProvider ?? AllowedAIProviders.FirstOrDefault(); + var serviceType = provider?.ServiceTypeKind ?? AIServiceType.OpenAI; + return AIServiceTypeRegistry.GetMetadata(serviceType); + } + + public Uri TermsLinkUri + { + get + { + var metadata = GetActiveProviderMetadata(); + return metadata.HasTermsLink ? metadata.TermsUri : null; + } + } + + public Uri PrivacyLinkUri + { + get + { + var metadata = GetActiveProviderMetadata(); + return metadata.HasPrivacyLink ? metadata.PrivacyUri : null; + } + } + + public bool HasTermsLink => GetActiveProviderMetadata().HasTermsLink; + + public bool HasPrivacyLink => GetActiveProviderMetadata().HasPrivacyLink; + public bool ClipboardHasData => AvailableClipboardFormats != ClipboardFormat.None; public bool ClipboardHasDataForCustomAI => PasteFormat.SupportsClipboardFormats(CustomAIFormat, AvailableClipboardFormats); @@ -276,8 +310,8 @@ namespace AdvancedPaste.ViewModels OnPropertyChanged(nameof(IsAdvancedAIEnabled)); OnPropertyChanged(nameof(AIProviders)); OnPropertyChanged(nameof(AllowedAIProviders)); - OnPropertyChanged(nameof(ActiveAIProvider)); - OnPropertyChanged(nameof(ActiveAIProviderTooltip)); + + NotifyActiveProviderChanged(); EnqueueRefreshPasteFormats(); } @@ -316,8 +350,17 @@ namespace AdvancedPaste.ViewModels } } + NotifyActiveProviderChanged(); + } + + private void NotifyActiveProviderChanged() + { OnPropertyChanged(nameof(ActiveAIProvider)); OnPropertyChanged(nameof(ActiveAIProviderTooltip)); + OnPropertyChanged(nameof(TermsLinkUri)); + OnPropertyChanged(nameof(PrivacyLinkUri)); + OnPropertyChanged(nameof(HasTermsLink)); + OnPropertyChanged(nameof(HasPrivacyLink)); } private void RefreshPasteFormats() @@ -837,6 +880,7 @@ namespace AdvancedPaste.ViewModels UpdateAIProviderActiveFlags(); OnPropertyChanged(nameof(AIProviders)); + NotifyActiveProviderChanged(); EnqueueRefreshPasteFormats(); } diff --git a/src/settings-ui/Settings.UI.Library/AIServiceTypeRegistry.cs b/src/settings-ui/Settings.UI.Library/AIServiceTypeRegistry.cs index ca0bd9e011..fc9e484808 100644 --- a/src/settings-ui/Settings.UI.Library/AIServiceTypeRegistry.cs +++ b/src/settings-ui/Settings.UI.Library/AIServiceTypeRegistry.cs @@ -36,9 +36,9 @@ public static class AIServiceTypeRegistry IsOnlineService = true, LegalDescription = "AdvancedPaste_Anthropic_LegalDescription", TermsLabel = "AdvancedPaste_Anthropic_TermsLabel", - TermsUri = new Uri("https://www.anthropic.com/legal/terms-of-service"), + TermsUri = new Uri("https://privacy.claude.com/en/collections/10672567-policies-terms-of-service"), PrivacyLabel = "AdvancedPaste_Anthropic_PrivacyLabel", - PrivacyUri = new Uri("https://www.anthropic.com/legal/privacy"), + PrivacyUri = new Uri("https://privacy.claude.com/en/"), }, [AIServiceType.AzureAIInference] = new AIServiceTypeMetadata { @@ -81,9 +81,9 @@ public static class AIServiceTypeRegistry IsOnlineService = true, LegalDescription = "AdvancedPaste_Google_LegalDescription", TermsLabel = "AdvancedPaste_Google_TermsLabel", - TermsUri = new Uri("https://policies.google.com/terms"), + TermsUri = new Uri("https://ai.google.dev/gemini-api/terms"), PrivacyLabel = "AdvancedPaste_Google_PrivacyLabel", - PrivacyUri = new Uri("https://policies.google.com/privacy"), + PrivacyUri = new Uri("https://support.google.com/gemini/answer/13594961"), }, [AIServiceType.HuggingFace] = new AIServiceTypeMetadata { @@ -126,9 +126,9 @@ public static class AIServiceTypeRegistry IsLocalModel = true, LegalDescription = "AdvancedPaste_LocalModel_LegalDescription", TermsLabel = "AdvancedPaste_Ollama_TermsLabel", - TermsUri = new Uri("https://ollama.com/terms"), + TermsUri = new Uri("https://ollama.org/terms"), PrivacyLabel = "AdvancedPaste_Ollama_PrivacyLabel", - PrivacyUri = new Uri("https://ollama.com/privacy"), + PrivacyUri = new Uri("https://ollama.org/privacy"), }, [AIServiceType.Onnx] = new AIServiceTypeMetadata {