focus on intervals, and fix provider

This commit is contained in:
2026-09-08 14:44:34 +02:00
parent 579cd8e4b3
commit acad70aaac
11 changed files with 1163 additions and 286 deletions
+101 -3
View File
@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
@@ -33,7 +33,19 @@ namespace AnotherReplayReader
RefreshProviderList();
if (_settings.Providers.Count > 0)
{
_providerListBox.SelectedIndex = 0;
var lastSelection = _settings.ResolveLastSelection();
if (lastSelection is { } last)
{
// 恢复上次选中的 Provider 与模型。
// OnProviderSelectionChanged 会从持久化的 CurrentModelId 恢复模型;
// 显式调用 SelectModel 作为双保险(模型仍存在则精确恢复)。
_providerListBox.SelectedItem = last.Provider;
SelectModel(last.Model);
}
else
{
_providerListBox.SelectedIndex = 0;
}
}
}
@@ -52,6 +64,19 @@ namespace AnotherReplayReader
return _settings.Prompt;
}
/// <summary>
/// 把当前选中的 Provider/模型保存到设置文件(供窗口关闭时调用,
/// 下次打开 AI 设置页时恢复上次选择)。
/// </summary>
public void SaveCurrentSelection()
{
if (_currentProvider is not null && _currentModel is not null)
{
_settings.SetCurrentSelection(_currentProvider, _currentModel);
_settings.Save();
}
}
private void RefreshPromptFields()
{
_useCustomPromptCheck.IsChecked = _settings.Prompt.UseCustomSystemPrompt;
@@ -102,6 +127,9 @@ namespace AnotherReplayReader
private void OnProviderSelectionChanged(object sender, SelectionChangedEventArgs e)
{
// 记住当前模型选择,切换 Provider 后若新 Provider 存在同名模型则保持选择
var previousModelId = _settings.CurrentModelId;
_currentProvider = _providerListBox.SelectedItem as AiProvider;
if (_currentProvider is null)
{
@@ -115,7 +143,26 @@ namespace AnotherReplayReader
_topPBox.Text = _currentProvider.DefaultTopP.ToString();
_maxTokensBox.Text = _currentProvider.DefaultMaxTokens.ToString();
// 记录上次选中的 Provider(模型在 OnModelSelectionChanged 中记录)
_settings.CurrentProviderName = _currentProvider.Name;
RefreshModelList();
// 尝试恢复上一个选中的模型(启动恢复与 Provider 切换共用同一路径)
if (!string.IsNullOrWhiteSpace(previousModelId))
{
var previousItem = _modelComboBox.Items
.OfType<ModelDisplayItem>()
.FirstOrDefault(m => string.Equals(
m.Model.ModelId, previousModelId, StringComparison.OrdinalIgnoreCase));
if (previousItem is not null)
{
_modelComboBox.SelectedItem = previousItem;
}
}
// 无任何模型/无可恢复目标时回退到第一个模型
if (_currentModel is null && _modelComboBox.Items.Count > 0)
{
_modelComboBox.SelectedIndex = 0;
}
}
private void OnAddProviderClick(object sender, RoutedEventArgs e)
@@ -147,6 +194,8 @@ namespace AnotherReplayReader
}
_settings.Providers.Remove(_currentProvider);
_settings.CurrentProviderName = null;
_settings.CurrentModelId = null;
_settings.Save();
RefreshProviderList();
if (_settings.Providers.Count > 0)
@@ -156,6 +205,7 @@ namespace AnotherReplayReader
else
{
_currentProvider = null;
_currentModel = null;
ClearProviderFields();
}
}
@@ -177,6 +227,7 @@ namespace AnotherReplayReader
int.TryParse(_maxTokensBox.Text, out int maxTokens);
_currentProvider.DefaultMaxTokens = maxTokens;
_settings.CurrentProviderName = _currentProvider.Name;
_settings.Save();
RefreshProviderList();
_providerListBox.SelectedItem = _currentProvider;
@@ -215,10 +266,33 @@ namespace AnotherReplayReader
}
else
{
// 当前 Provider 没有任何模型:清空当前模型,避免残留上一个 Provider 的模型
_currentModel = null;
_settings.CurrentModelId = null;
ClearModelFields();
}
}
/// <summary>
/// 在模型下拉框中选中指定模型;找不到时回退到第一个模型。
/// 仅供启动恢复使用(避免刷新列表后触发首次默认选中)。
/// </summary>
private void SelectModel(AiModel model)
{
var item = _modelComboBox.Items
.OfType<ModelDisplayItem>()
.FirstOrDefault(m => string.Equals(
m.Model.ModelId, model.ModelId, StringComparison.OrdinalIgnoreCase));
if (item is not null)
{
_modelComboBox.SelectedItem = item;
}
else if (_modelComboBox.Items.Count > 0)
{
_modelComboBox.SelectedIndex = 0;
}
}
private void OnModelSelectionChanged(object sender, SelectionChangedEventArgs e)
{
var selected = _modelComboBox.SelectedItem as ModelDisplayItem;
@@ -226,10 +300,13 @@ namespace AnotherReplayReader
if (_currentModel is null)
{
_settings.CurrentModelId = null;
ClearModelFields();
return;
}
_settings.CurrentModelId = _currentModel.ModelId;
_modelIdBox.Text = _currentModel.ModelId;
_contextLengthBox.Text = _currentModel.ContextLength.ToString();
_contextBudgetBox.Text = _currentModel.ContextBudget is { } budget ? budget.ToString() : "0";
@@ -312,6 +389,18 @@ namespace AnotherReplayReader
_settings.Save();
RefreshModelList();
// 保持上次选中的模型(若仍存在),否则回退到第一个
if (_settings.CurrentModelId is { } lastModelId)
{
var lastItem = _modelComboBox.Items
.OfType<ModelDisplayItem>()
.FirstOrDefault(m => string.Equals(
m.Model.ModelId, lastModelId, StringComparison.OrdinalIgnoreCase));
if (lastItem is not null)
{
_modelComboBox.SelectedItem = lastItem;
}
}
_modelStatusText.Text = $"获取成功,共 {ids.Count} 个模型";
}
catch (Exception ex)
@@ -359,6 +448,8 @@ namespace AnotherReplayReader
_currentProvider.Models.Remove(_currentModel);
_settings.Save();
// 被删除模型不再是上次选择;RefreshModelList 会回退到第一个模型
_settings.CurrentModelId = null;
RefreshModelList();
}
@@ -411,7 +502,13 @@ namespace AnotherReplayReader
}
_settings.Save();
// 模型 ID 已修改:更新持久化选择,避免下一次启动仍按旧 ID 解析
_settings.CurrentModelId = _currentModel.ModelId;
RefreshModelList();
_modelComboBox.SelectedItem = _modelComboBox.Items
.OfType<ModelDisplayItem>()
.FirstOrDefault(m => string.Equals(
m.Model.ModelId, _currentModel.ModelId, StringComparison.OrdinalIgnoreCase));
MessageBox.Show("模型修改已保存", "信息", MessageBoxButton.OK);
}
@@ -437,7 +534,8 @@ namespace AnotherReplayReader
RefreshModelList();
_modelComboBox.SelectedItem = _modelComboBox.Items
.OfType<ModelDisplayItem>()
.FirstOrDefault(m => m.Model.ModelId == _currentModel.ModelId);
.FirstOrDefault(m => string.Equals(
m.Model.ModelId, _currentModel.ModelId, StringComparison.OrdinalIgnoreCase));
MessageBox.Show("已从已知模板填充", "信息", MessageBoxButton.OK);
}
else