Skip to content

Commit 498d2b5

Browse files
committed
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 <[email protected]>
1 parent 48725a7 commit 498d2b5

File tree

7 files changed

+90
-4
lines changed

7 files changed

+90
-4
lines changed

src/Models/RepositorySettings.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,12 @@ public bool KeepIndexWhenStash
130130
set;
131131
} = false;
132132

133+
public string PreferedOpenAIService
134+
{
135+
get;
136+
set;
137+
} = "---";
138+
133139
public void PushCommitMessage(string message)
134140
{
135141
var existIdx = CommitMessages.IndexOf(message);

src/Resources/Locales/en_US.axaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,9 @@
155155
<x:String x:Key="Text.Configure.IssueTracker.RuleName" xml:space="preserve">Rule Name:</x:String>
156156
<x:String x:Key="Text.Configure.IssueTracker.URLTemplate" xml:space="preserve">Result URL:</x:String>
157157
<x:String x:Key="Text.Configure.IssueTracker.URLTemplate.Tip" xml:space="preserve">Please use $1, $2 to access regex groups values.</x:String>
158+
<x:String x:Key="Text.Configure.OpenAI" xml:space="preserve">OPEN AI</x:String>
159+
<x:String x:Key="Text.Configure.OpenAI.Prefered" xml:space="preserve">Prefered Service:</x:String>
160+
<x:String x:Key="Text.Configure.OpenAI.Prefered.Tip" xml:space="preserve">If the 'Prefered Service' is set, SourceGit will only use it in this repository. Otherwise, if there is more than one service available, a context menu to choose one of them will be shown.</x:String>
158161
<x:String x:Key="Text.Configure.Proxy" xml:space="preserve">HTTP Proxy</x:String>
159162
<x:String x:Key="Text.Configure.Proxy.Placeholder" xml:space="preserve">HTTP proxy used by this repository</x:String>
160163
<x:String x:Key="Text.Configure.User" xml:space="preserve">User Name</x:String>

src/Resources/Locales/zh_CN.axaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,9 @@
158158
<x:String x:Key="Text.Configure.IssueTracker.RuleName" xml:space="preserve">规则名 :</x:String>
159159
<x:String x:Key="Text.Configure.IssueTracker.URLTemplate" xml:space="preserve">为ISSUE生成的URL链接 :</x:String>
160160
<x:String x:Key="Text.Configure.IssueTracker.URLTemplate.Tip" xml:space="preserve">可在URL中使用$1,$2等变量填入正则表达式匹配的内容</x:String>
161+
<x:String x:Key="Text.Configure.OpenAI" xml:space="preserve">OPEN AI</x:String>
162+
<x:String x:Key="Text.Configure.OpenAI.Prefered" xml:space="preserve">启用特定服务 :</x:String>
163+
<x:String x:Key="Text.Configure.OpenAI.Prefered.Tip" xml:space="preserve">当【启用特定服务】被设置时,SourceGit将在本仓库中仅使用该服务。否则将弹出可用的OpenAI服务列表供用户选择。</x:String>
161164
<x:String x:Key="Text.Configure.Proxy" xml:space="preserve">HTTP代理</x:String>
162165
<x:String x:Key="Text.Configure.Proxy.Placeholder" xml:space="preserve">HTTP网络代理</x:String>
163166
<x:String x:Key="Text.Configure.User" xml:space="preserve">用户名</x:String>

src/Resources/Locales/zh_TW.axaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,9 @@
158158
<x:String x:Key="Text.Configure.IssueTracker.RuleName" xml:space="preserve">規則名稱:</x:String>
159159
<x:String x:Key="Text.Configure.IssueTracker.URLTemplate" xml:space="preserve">為 Issue 產生的網址連結:</x:String>
160160
<x:String x:Key="Text.Configure.IssueTracker.URLTemplate.Tip" xml:space="preserve">可在網址中使用 $1、$2 等變數填入正則表示式相符的內容</x:String>
161+
<x:String x:Key="Text.Configure.OpenAI" xml:space="preserve">OPEN AI</x:String>
162+
<x:String x:Key="Text.Configure.OpenAI.Prefered" xml:space="preserve">启用特定服务 :</x:String>
163+
<x:String x:Key="Text.Configure.OpenAI.Prefered.Tip" xml:space="preserve">当【启用特定服务】被设置时,SourceGit将在本仓库中仅使用该服务。否则将弹出可用的OpenAI服务列表供用户选择。</x:String>
161164
<x:String x:Key="Text.Configure.Proxy" xml:space="preserve">HTTP 代理</x:String>
162165
<x:String x:Key="Text.Configure.Proxy.Placeholder" xml:space="preserve">HTTP 網路代理</x:String>
163166
<x:String x:Key="Text.Configure.User" xml:space="preserve">使用者名稱</x:String>

src/ViewModels/RepositoryConfigure.cs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Collections.Generic;
1+
using System;
2+
using System.Collections.Generic;
23
using Avalonia.Collections;
34
using CommunityToolkit.Mvvm.ComponentModel;
45

@@ -108,6 +109,18 @@ public Models.IssueTrackerRule SelectedIssueTrackerRule
108109
set => SetProperty(ref _selectedIssueTrackerRule, value);
109110
}
110111

112+
public List<string> AvailableOpenAIServices
113+
{
114+
get;
115+
private set;
116+
}
117+
118+
public string PreferedOpenAIService
119+
{
120+
get => _repo.Settings.PreferedOpenAIService;
121+
set => _repo.Settings.PreferedOpenAIService = value;
122+
}
123+
111124
public RepositoryConfigure(Repository repo)
112125
{
113126
_repo = repo;
@@ -116,6 +129,13 @@ public RepositoryConfigure(Repository repo)
116129
foreach (var remote in _repo.Remotes)
117130
Remotes.Add(remote.Name);
118131

132+
AvailableOpenAIServices = new List<string>() { "---" };
133+
foreach (var service in Preference.Instance.OpenAIServices)
134+
AvailableOpenAIServices.Add(service.Name);
135+
136+
if (AvailableOpenAIServices.IndexOf(PreferedOpenAIService) == -1)
137+
PreferedOpenAIService = "---";
138+
119139
_cached = new Commands.Config(repo.FullPath).ListAll();
120140
if (_cached.TryGetValue("user.name", out var name))
121141
UserName = name;

src/ViewModels/WorkingCopy.cs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
using Avalonia.Threading;
99

1010
using CommunityToolkit.Mvvm.ComponentModel;
11-
using SourceGit.Models;
1211

1312
namespace SourceGit.ViewModels
1413
{
@@ -884,7 +883,7 @@ public ContextMenu CreateContextMenuForStagedChanges()
884883
var menu = new ContextMenu();
885884

886885
var ai = null as MenuItem;
887-
var services = Preference.Instance.OpenAIServices;
886+
var services = GetPreferedOpenAIServices();
888887
if (services.Count > 0)
889888
{
890889
ai = new MenuItem();
@@ -1251,7 +1250,7 @@ public ContextMenu CreateContextForOpenAI()
12511250
return null;
12521251
}
12531252

1254-
var services = Preference.Instance.OpenAIServices;
1253+
var services = GetPreferedOpenAIServices();
12551254
if (services.Count == 0)
12561255
{
12571256
App.RaiseException(_repo.FullPath, "Bad configuration for OpenAI");
@@ -1440,6 +1439,25 @@ private bool IsChanged(List<Models.Change> old, List<Models.Change> cur)
14401439
return false;
14411440
}
14421441

1442+
private IList<Models.OpenAIService> GetPreferedOpenAIServices()
1443+
{
1444+
var services = Preference.Instance.OpenAIServices;
1445+
if (services == null || services.Count == 0)
1446+
return [];
1447+
1448+
if (services.Count == 1)
1449+
return services;
1450+
1451+
var prefered = _repo.Settings.PreferedOpenAIService;
1452+
foreach (var service in services)
1453+
{
1454+
if (service.Name.Equals(prefered, StringComparison.Ordinal))
1455+
return [service];
1456+
}
1457+
1458+
return services;
1459+
}
1460+
14431461
private Repository _repo = null;
14441462
private bool _isLoadingData = false;
14451463
private bool _isStaging = false;

src/Views/RepositoryConfigure.axaml

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,39 @@
340340
</ContentControl>
341341
</Grid>
342342
</TabItem>
343+
344+
<TabItem>
345+
<TabItem.Header>
346+
<TextBlock Classes="tab_header" Text="{DynamicResource Text.Configure.OpenAI}"/>
347+
</TabItem.Header>
348+
349+
<Grid Margin="16,4,16,8" RowDefinitions="32,Auto" ColumnDefinitions="Auto,*">
350+
<TextBlock Grid.Row="0" Grid.Column="0"
351+
HorizontalAlignment="Right" VerticalAlignment="Center"
352+
Margin="0,0,8,0"
353+
Text="{DynamicResource Text.Configure.OpenAI.Prefered}"/>
354+
<ComboBox Grid.Row="0" Grid.Column="1"
355+
Height="28" Padding="8,0"
356+
VerticalAlignment="Center" HorizontalAlignment="Stretch"
357+
ItemsSource="{Binding AvailableOpenAIServices}"
358+
SelectedItem="{Binding PreferedOpenAIService, Mode=TwoWay}">
359+
<ComboBox.ItemTemplate>
360+
<DataTemplate>
361+
<StackPanel Orientation="Horizontal" Height="20" VerticalAlignment="Center">
362+
<Path Width="12" Height="12" Data="{StaticResource Icons.AIAssist}" Fill="{DynamicResource Brush.FG1}"/>
363+
<TextBlock Margin="6,0,0,0" Text="{Binding}"/>
364+
</StackPanel>
365+
</DataTemplate>
366+
</ComboBox.ItemTemplate>
367+
</ComboBox>
368+
369+
<TextBlock Grid.Row="1" Grid.Column="1"
370+
Margin="0,6,0,0"
371+
Text="{DynamicResource Text.Configure.OpenAI.Prefered.Tip}"
372+
TextWrapping="Wrap"
373+
Foreground="{DynamicResource Brush.FG2}"/>
374+
</Grid>
375+
</TabItem>
343376
</TabControl>
344377
</Grid>
345378
</v:ChromelessWindow>

0 commit comments

Comments
 (0)