feature: add per-repository setting for prefered OpenAI service

* If there is only one OpenAI service available, discard the setting of prefered OpenAI service. Instead, use it directly
* If there are multiple OpenAI service available, try to find the prefered one or show a context menu for users to choose the one they want to use

Signed-off-by: leo <longshuang@msn.cn>
This commit is contained in:
leo 2024-10-28 21:31:40 +08:00
parent 48725a7937
commit 498d2b54ae
No known key found for this signature in database
7 changed files with 90 additions and 4 deletions

View file

@ -1,4 +1,5 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using Avalonia.Collections;
using CommunityToolkit.Mvvm.ComponentModel;
@ -108,6 +109,18 @@ namespace SourceGit.ViewModels
set => SetProperty(ref _selectedIssueTrackerRule, value);
}
public List<string> AvailableOpenAIServices
{
get;
private set;
}
public string PreferedOpenAIService
{
get => _repo.Settings.PreferedOpenAIService;
set => _repo.Settings.PreferedOpenAIService = value;
}
public RepositoryConfigure(Repository repo)
{
_repo = repo;
@ -116,6 +129,13 @@ namespace SourceGit.ViewModels
foreach (var remote in _repo.Remotes)
Remotes.Add(remote.Name);
AvailableOpenAIServices = new List<string>() { "---" };
foreach (var service in Preference.Instance.OpenAIServices)
AvailableOpenAIServices.Add(service.Name);
if (AvailableOpenAIServices.IndexOf(PreferedOpenAIService) == -1)
PreferedOpenAIService = "---";
_cached = new Commands.Config(repo.FullPath).ListAll();
if (_cached.TryGetValue("user.name", out var name))
UserName = name;

View file

@ -8,7 +8,6 @@ using Avalonia.Platform.Storage;
using Avalonia.Threading;
using CommunityToolkit.Mvvm.ComponentModel;
using SourceGit.Models;
namespace SourceGit.ViewModels
{
@ -884,7 +883,7 @@ namespace SourceGit.ViewModels
var menu = new ContextMenu();
var ai = null as MenuItem;
var services = Preference.Instance.OpenAIServices;
var services = GetPreferedOpenAIServices();
if (services.Count > 0)
{
ai = new MenuItem();
@ -1251,7 +1250,7 @@ namespace SourceGit.ViewModels
return null;
}
var services = Preference.Instance.OpenAIServices;
var services = GetPreferedOpenAIServices();
if (services.Count == 0)
{
App.RaiseException(_repo.FullPath, "Bad configuration for OpenAI");
@ -1440,6 +1439,25 @@ namespace SourceGit.ViewModels
return false;
}
private IList<Models.OpenAIService> GetPreferedOpenAIServices()
{
var services = Preference.Instance.OpenAIServices;
if (services == null || services.Count == 0)
return [];
if (services.Count == 1)
return services;
var prefered = _repo.Settings.PreferedOpenAIService;
foreach (var service in services)
{
if (service.Name.Equals(prefered, StringComparison.Ordinal))
return [service];
}
return services;
}
private Repository _repo = null;
private bool _isLoadingData = false;
private bool _isStaging = false;