Advanced Paste: No cache for foundry local model list (#43716)

<!-- 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
Cache of the downloaded model will make the newly added model only work
after running of powertoys, this disable the cache, so just downloaded
model will take effect immediately

<!-- Please review the items on the PR checklist before submitting-->
## PR Checklist

- [ ] Closes: #xxx
<!-- - [ ] Closes: #yyy (add separate lines for additional resolved
issues) -->
- [ ] **Communication:** I've discussed this with core contributors
already. If the work hasn't been agreed, this work might be rejected
- [ ] **Tests:** Added/updated and all pass
- [ ] **Localization:** All end-user-facing strings can be localized
- [ ] **Dev docs:** Added/updated
- [ ] **New binaries:** Added on the required places
- [ ] [JSON for
signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json)
for new binaries
- [ ] [WXS for
installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs)
for new binaries and localization folder
- [ ] [YML for CI
pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml)
for new test projects
- [ ] [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
Validated locally
This commit is contained in:
Kai Tao
2025-11-20 09:57:29 +08:00
committed by GitHub
parent 15c79a0176
commit 4a0d9912ae
5 changed files with 53 additions and 83 deletions

View File

@@ -82,7 +82,7 @@ namespace Microsoft.PowerToys.Settings.UI.Views
{
ViewModel.RefreshEnabledState();
UpdatePasteAIUIVisibility();
_ = UpdateFoundryLocalUIAsync(refreshFoundry: true);
_ = UpdateFoundryLocalUIAsync();
}
private void EnableAdvancedPasteAI() => ViewModel.EnableAI();
@@ -384,7 +384,7 @@ namespace Microsoft.PowerToys.Settings.UI.Views
}
}
private Task UpdateFoundryLocalUIAsync(bool refreshFoundry = false)
private Task UpdateFoundryLocalUIAsync()
{
string selectedType = ViewModel?.PasteAIProviderDraft?.ServiceType ?? string.Empty;
bool isFoundryLocal = string.Equals(selectedType, "FoundryLocal", StringComparison.OrdinalIgnoreCase);
@@ -419,12 +419,12 @@ namespace Microsoft.PowerToys.Settings.UI.Views
PasteAIProviderConfigurationDialog.IsPrimaryButtonEnabled = false;
}
FoundryLocalPicker?.RequestLoad(refreshFoundry);
FoundryLocalPicker?.RequestLoad();
return Task.CompletedTask;
}
private async Task LoadFoundryLocalModelsAsync(bool refresh = false)
private async Task LoadFoundryLocalModelsAsync()
{
if (FoundryLocalPanel is null)
{
@@ -456,9 +456,7 @@ namespace Microsoft.PowerToys.Settings.UI.Views
return;
}
IEnumerable<ModelDetails> cachedModelsEnumerable = refresh
? await provider.GetModelsAsync(ignoreCached: true, cancelationToken: cancellationToken)
: await provider.GetModelsAsync(cancelationToken: cancellationToken);
IEnumerable<ModelDetails> cachedModelsEnumerable = await provider.GetModelsAsync(cancelationToken: cancellationToken).ConfigureAwait(false);
if (cancellationToken.IsCancellationRequested)
{
@@ -467,9 +465,12 @@ namespace Microsoft.PowerToys.Settings.UI.Views
var cachedModels = cachedModelsEnumerable?.ToList() ?? new List<ModelDetails>();
UpdateFoundryCollections(cachedModels);
ShowFoundryAvailableState();
RestoreFoundrySelection(cachedModels);
DispatcherQueue.TryEnqueue(() =>
{
UpdateFoundryCollections(cachedModels);
ShowFoundryAvailableState();
RestoreFoundrySelection(cachedModels);
});
}
catch (OperationCanceledException)
{
@@ -478,12 +479,18 @@ namespace Microsoft.PowerToys.Settings.UI.Views
catch (Exception ex)
{
var errorMessage = $"Unable to load Foundry Local models. {ex.Message}";
ShowFoundryUnavailableState(errorMessage);
System.Diagnostics.Debug.WriteLine($"[AdvancedPastePage] Failed to load Foundry Local models: {ex}");
DispatcherQueue.TryEnqueue(() =>
{
ShowFoundryUnavailableState(errorMessage);
});
}
finally
{
UpdateFoundrySaveButtonState();
DispatcherQueue.TryEnqueue(() =>
{
UpdateFoundrySaveButtonState();
});
}
}
@@ -672,9 +679,9 @@ namespace Microsoft.PowerToys.Settings.UI.Views
UpdateFoundrySaveButtonState();
}
private async void FoundryLocalPicker_LoadRequested(object sender, FoundryLocalModelPicker.FoundryLoadRequestedEventArgs args)
private async void FoundryLocalPicker_LoadRequested(object sender)
{
await LoadFoundryLocalModelsAsync(args?.Refresh ?? false);
await LoadFoundryLocalModelsAsync();
}
private sealed class FoundryDownloadableModel : INotifyPropertyChanged
@@ -1089,7 +1096,7 @@ namespace Microsoft.PowerToys.Settings.UI.Views
PasteAIProviderConfigurationDialog.Title = $"{displayName} provider configuration";
}
await UpdateFoundryLocalUIAsync(refreshFoundry: true);
await UpdateFoundryLocalUIAsync();
UpdatePasteAIUIVisibility();
RefreshDialogBindings();
@@ -1118,7 +1125,7 @@ namespace Microsoft.PowerToys.Settings.UI.Views
: $"{titlePrefix} provider configuration";
UpdatePasteAIUIVisibility();
await UpdateFoundryLocalUIAsync(refreshFoundry: false);
await UpdateFoundryLocalUIAsync();
RefreshDialogBindings();
PasteAIApiKeyPasswordBox.Password = ViewModel.GetPasteAIApiKey(provider.Id, provider.ServiceType);
await PasteAIProviderConfigurationDialog.ShowAsync();