Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 39 additions & 23 deletions src/AI/Service.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
using System;
using System;
using System.ClientModel;
using System.Collections.Generic;
using System.Text.Json.Serialization;
using Azure.AI.OpenAI;
using CommunityToolkit.Mvvm.ComponentModel;
using OpenAI;
Expand Down Expand Up @@ -35,54 +34,71 @@ public bool ReadApiKeyFromEnv
set;
} = false;

[JsonIgnore]
public List<string> AvailableModels
{
get;
private set;
} = [];
get => _availableModels;
set => SetProperty(ref _availableModels, value);
}

public string Model
{
get => _model;
set => SetProperty(ref _model, value);
}

public bool AutoFetchAvailableModels
{
get => _autoFetchAvailableModels;
set => SetProperty(ref _autoFetchAvailableModels, value);
}

public string AdditionalPrompt
{
get;
set;
} = string.Empty;

public void FetchAvailableModels()
public void AddModel(string model)
{
if (!_autoFetchAvailableModels)
if (!_availableModels.Contains(model))
{
if (!string.IsNullOrEmpty(Model))
AvailableModels = [Model];
return;
var newList = new List<string>(_availableModels) { model };
AvailableModels = newList;
}
}

public void RemoveModel(string model)
{
if (_availableModels.Contains(model))
{
var newList = new List<string>(_availableModels);
newList.Remove(model);
AvailableModels = newList;
}
}

public List<string> FetchModelsFromServer()
{
var allModels = GetOpenAIClient().GetOpenAIModelClient().GetModels();
AvailableModels = new List<string>();
var result = new List<string>();
foreach (var model in allModels.Value)
AvailableModels.Add(model.Id);

if (AvailableModels.Count > 0 && (string.IsNullOrEmpty(Model) || !AvailableModels.Contains(Model)))
Model = AvailableModels[0];
result.Add(model.Id);
return result;
}

public ChatClient GetChatClient()
{
return !string.IsNullOrEmpty(Model) ? GetOpenAIClient().GetChatClient(Model) : null;
}

public Service Clone()
{
return new Service
{
Name = Name,
Server = Server,
ApiKey = ApiKey,
ReadApiKeyFromEnv = ReadApiKeyFromEnv,
Model = Model,
AdditionalPrompt = AdditionalPrompt,
AvailableModels = new List<string>(AvailableModels),
};
}

private OpenAIClient GetOpenAIClient()
{
var credential = new ApiKeyCredential(ReadApiKeyFromEnv ? Environment.GetEnvironmentVariable(ApiKey) : ApiKey);
Expand All @@ -93,6 +109,6 @@ private OpenAIClient GetOpenAIClient()

private string _name = string.Empty;
private string _model = string.Empty;
private bool _autoFetchAvailableModels = true;
private List<string> _availableModels = [];
}
}
1 change: 0 additions & 1 deletion src/App.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -482,7 +482,6 @@ private void TryLaunchAsNormal(IClassicDesktopStyleApplicationLifetime desktop)

var pref = ViewModels.Preferences.Instance;
pref.SetCanModify();
pref.UpdateAvailableAIModels();

_launcher = new ViewModels.Launcher(startupRepo);
desktop.MainWindow = new Views.Launcher() { DataContext = _launcher };
Expand Down
8 changes: 7 additions & 1 deletion src/Models/RepositorySettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,13 @@ public string PreferredOpenAIService
{
get;
set;
} = "---";
} = "";

public string PreferredAIModel
{
get;
set;
} = string.Empty;

public AvaloniaList<CommitTemplate> CommitTemplates
{
Expand Down
6 changes: 3 additions & 3 deletions src/Resources/Locales/de_DE.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -242,9 +242,9 @@ $1, $2, … Werte der Eingabe-Steuerelemente</x:String>
<x:String x:Key="Text.Configure.IssueTracker.Share" xml:space="preserve">Diese Regel per .issuetracker-Datei teilen</x:String>
<x:String x:Key="Text.Configure.IssueTracker.URLTemplate" xml:space="preserve">Ergebnis-URL:</x:String>
<x:String x:Key="Text.Configure.IssueTracker.URLTemplate.Tip" xml:space="preserve">Verwende bitte $1, $2, um auf Regex-Gruppenwerte zuzugreifen.</x:String>
<x:String x:Key="Text.Configure.OpenAI" xml:space="preserve">OPEN AI</x:String>
<x:String x:Key="Text.Configure.OpenAI.Preferred" xml:space="preserve">Bevorzugter Dienst:</x:String>
<x:String x:Key="Text.Configure.OpenAI.Preferred.Tip" xml:space="preserve">Der ausgewählte ‚Bevorzugte Dienst‘ wird nur in diesem Repository gesetzt und verwendet. Wenn keiner gesetzt ist und mehrere Dienste verfügbar sind, wird ein Kontextmenü zur Auswahl angezeigt.</x:String>
<x:String x:Key="Text.Configure.AI" xml:space="preserve">OPEN AI</x:String>
<x:String x:Key="Text.Configure.AI.DefaultService" xml:space="preserve">Bevorzugter Dienst:</x:String>
<x:String x:Key="Text.Configure.AI.DefaultService.Tip" xml:space="preserve">Der ausgewählte ‚Bevorzugte Dienst‘ wird nur in diesem Repository gesetzt und verwendet. Wenn keiner gesetzt ist und mehrere Dienste verfügbar sind, wird ein Kontextmenü zur Auswahl angezeigt.</x:String>
<x:String x:Key="Text.Configure.Proxy" xml:space="preserve">HTTP-Proxy</x:String>
<x:String x:Key="Text.Configure.Proxy.Placeholder" xml:space="preserve">HTTP-Proxy für dieses Repository</x:String>
<x:String x:Key="Text.Configure.User" xml:space="preserve">Benutzername</x:String>
Expand Down
7 changes: 3 additions & 4 deletions src/Resources/Locales/el_GR.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -264,9 +264,9 @@
<x:String x:Key="Text.Configure.IssueTracker.Share" xml:space="preserve">Κοινή χρήση αυτού του κανόνα στο αρχείο .issuetracker</x:String>
<x:String x:Key="Text.Configure.IssueTracker.URLTemplate" xml:space="preserve">URL αποτελέσματος:</x:String>
<x:String x:Key="Text.Configure.IssueTracker.URLTemplate.Tip" xml:space="preserve">Χρησιμοποιήστε $1, $2 για πρόσβαση στις τιμές των ομάδων της κανονικής έκφρασης.</x:String>
<x:String x:Key="Text.Configure.OpenAI" xml:space="preserve">AI</x:String>
<x:String x:Key="Text.Configure.OpenAI.Preferred" xml:space="preserve">Προτιμώμενη υπηρεσία:</x:String>
<x:String x:Key="Text.Configure.OpenAI.Preferred.Tip" xml:space="preserve">Αν οριστεί η «Προτιμώμενη υπηρεσία», το SourceGit θα τη χρησιμοποιεί μόνο σε αυτό το αποθετήριο. Διαφορετικά, αν υπάρχουν περισσότερες από μία διαθέσιμες υπηρεσίες, θα εμφανίζεται μενού για να επιλέξετε μία.</x:String>
<x:String x:Key="Text.Configure.AI" xml:space="preserve">AI</x:String>
<x:String x:Key="Text.Configure.AI.DefaultService" xml:space="preserve">Προτιμώμενη υπηρεσία:</x:String>
<x:String x:Key="Text.Configure.AI.DefaultService.Tip" xml:space="preserve">Αν οριστεί η «Προτιμώμενη υπηρεσία», το SourceGit θα τη χρησιμοποιεί μόνο σε αυτό το αποθετήριο. Διαφορετικά, αν υπάρχουν περισσότερες από μία διαθέσιμες υπηρεσίες, θα εμφανίζεται μενού για να επιλέξετε μία.</x:String>
<x:String x:Key="Text.Configure.Proxy" xml:space="preserve">HTTP Proxy</x:String>
<x:String x:Key="Text.Configure.Proxy.Placeholder" xml:space="preserve">HTTP proxy που χρησιμοποιεί αυτό το αποθετήριο</x:String>
<x:String x:Key="Text.Configure.User" xml:space="preserve">Όνομα χρήστη</x:String>
Expand Down Expand Up @@ -633,7 +633,6 @@
<x:String x:Key="Text.Preferences.AI.AdditionalPrompt" xml:space="preserve">Επιπλέον prompt (χρησιμοποιήστε `-` για να απαριθμήσετε τις απαιτήσεις σας)</x:String>
<x:String x:Key="Text.Preferences.AI.ApiKey" xml:space="preserve">Κλειδί API</x:String>
<x:String x:Key="Text.Preferences.AI.Model" xml:space="preserve">Μοντέλο</x:String>
<x:String x:Key="Text.Preferences.AI.Model.AutoFetchAvailableModels" xml:space="preserve">Αυτόματη ανάκτηση διαθέσιμων model-ids</x:String>
<x:String x:Key="Text.Preferences.AI.Name" xml:space="preserve">Όνομα</x:String>
<x:String x:Key="Text.Preferences.AI.ReadApiKeyFromEnv" xml:space="preserve">Η τιμή που εισήχθη είναι το όνομα για φόρτωση του κλειδιού API από το ENV</x:String>
<x:String x:Key="Text.Preferences.AI.Server" xml:space="preserve">Διακομιστής</x:String>
Expand Down
17 changes: 13 additions & 4 deletions src/Resources/Locales/en_US.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
<x:String x:Key="Text.About.Menu" xml:space="preserve">About SourceGit</x:String>
<x:String x:Key="Text.About.ReleaseDate" xml:space="preserve">Release Date: {0}</x:String>
<x:String x:Key="Text.About.ReleaseNotes" xml:space="preserve">Release Notes</x:String>
<x:String x:Key="Text.Add" xml:space="preserve">Add</x:String>
<x:String x:Key="Text.About.SubTitle" xml:space="preserve">Opensource &amp; Free Git GUI Client</x:String>
<x:String x:Key="Text.AddToIgnore" xml:space="preserve">Add File(s) To Ignore</x:String>
<x:String x:Key="Text.AddToIgnore.Pattern" xml:space="preserve">Pattern:</x:String>
Expand Down Expand Up @@ -269,9 +270,12 @@
<x:String x:Key="Text.Configure.IssueTracker.Share" xml:space="preserve">Share this rule in .issuetracker file</x:String>
<x:String x:Key="Text.Configure.IssueTracker.URLTemplate" xml:space="preserve">Result URL:</x:String>
<x:String x:Key="Text.Configure.IssueTracker.URLTemplate.Tip" xml:space="preserve">Please use $1, $2 to access regex groups values.</x:String>
<x:String x:Key="Text.Configure.OpenAI" xml:space="preserve">AI</x:String>
<x:String x:Key="Text.Configure.OpenAI.Preferred" xml:space="preserve">Preferred Service:</x:String>
<x:String x:Key="Text.Configure.OpenAI.Preferred.Tip" xml:space="preserve">If the 'Preferred 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>
<x:String x:Key="Text.Configure.AI" xml:space="preserve">AI</x:String>
<x:String x:Key="Text.Configure.AI.DefaultService" xml:space="preserve">Default Service:</x:String>
<x:String x:Key="Text.Configure.AI.PreferredModel" xml:space="preserve">Default Model:</x:String>
<x:String x:Key="Text.Configure.AI.DefaultService.Tip" xml:space="preserve">If set, SourceGit will use this service and model directly for AI commit message generation in this repository. Otherwise, a selection menu will be shown.</x:String>
<x:String x:Key="Text.Configure.AI.DefaultService.None" xml:space="preserve">(None)</x:String>
<x:String x:Key="Text.Configure.AI.PreferredModel.None" xml:space="preserve">(None)</x:String>
<x:String x:Key="Text.Configure.Proxy" xml:space="preserve">HTTP Proxy</x:String>
<x:String x:Key="Text.Configure.Proxy.Placeholder" xml:space="preserve">HTTP proxy used by this repository</x:String>
<x:String x:Key="Text.Configure.User" xml:space="preserve">User Name</x:String>
Expand Down Expand Up @@ -655,10 +659,15 @@
<x:String x:Key="Text.Preferences.AI.AdditionalPrompt" xml:space="preserve">Additional Prompt (Use `-` to list your requirements)</x:String>
<x:String x:Key="Text.Preferences.AI.ApiKey" xml:space="preserve">API Key</x:String>
<x:String x:Key="Text.Preferences.AI.Model" xml:space="preserve">Model</x:String>
<x:String x:Key="Text.Preferences.AI.Model.AutoFetchAvailableModels" xml:space="preserve">Fetch available model-ids automatically</x:String>
<x:String x:Key="Text.Preferences.AI.Model.AddModel" xml:space="preserve">Add Model</x:String>
<x:String x:Key="Text.Preferences.AI.Model.FetchModels" xml:space="preserve">Fetch Models</x:String>
<x:String x:Key="Text.Preferences.AI.Model.Fetching" xml:space="preserve">Fetching models...</x:String>
<x:String x:Key="Text.Preferences.AI.Model.RemoveModel" xml:space="preserve">Remove Model</x:String>
<x:String x:Key="Text.Preferences.AI.Model.SelectModels" xml:space="preserve">Select Models</x:String>
<x:String x:Key="Text.Preferences.AI.Name" xml:space="preserve">Name</x:String>
<x:String x:Key="Text.Preferences.AI.ReadApiKeyFromEnv" xml:space="preserve">Entered value is the name to load API key from ENV</x:String>
<x:String x:Key="Text.Preferences.AI.Server" xml:space="preserve">Server</x:String>
<x:String x:Key="Text.Preferences.AI.Services" xml:space="preserve">AI Services</x:String>
<x:String x:Key="Text.Preferences.Appearance" xml:space="preserve">APPEARANCE</x:String>
<x:String x:Key="Text.Preferences.Appearance.DefaultFont" xml:space="preserve">Default Font</x:String>
<x:String x:Key="Text.Preferences.Appearance.EditorTabWidth" xml:space="preserve">Editor Tab Width</x:String>
Expand Down
11 changes: 5 additions & 6 deletions src/Resources/Locales/es_ES.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@
<x:String x:Key="Text.AddWorktree.WhatToCheckout" xml:space="preserve">Qué Checkout:</x:String>
<x:String x:Key="Text.AddWorktree.WhatToCheckout.CreateNew" xml:space="preserve">Crear Nueva Rama</x:String>
<x:String x:Key="Text.AddWorktree.WhatToCheckout.Existing" xml:space="preserve">Rama Existente</x:String>
<x:String x:Key="Text.AIAssistant" xml:space="preserve">Asistente OpenAI</x:String>
<x:String x:Key="Text.AIAssistant" xml:space="preserve">Asistente AI</x:String>
<x:String x:Key="Text.AIAssistant.Model" xml:space="preserve">Modelo</x:String>
<x:String x:Key="Text.AIAssistant.Regen" xml:space="preserve">RE-GENERAR</x:String>
<x:String x:Key="Text.AIAssistant.Tip" xml:space="preserve">Usar OpenAI para generar mensaje de commit</x:String>
<x:String x:Key="Text.AIAssistant.Tip" xml:space="preserve">Usar AI para generar mensaje de commit</x:String>
<x:String x:Key="Text.AIAssistant.Use" xml:space="preserve">Usar</x:String>
<x:String x:Key="Text.App.Hide" xml:space="preserve">Ocultar SourceGit</x:String>
<x:String x:Key="Text.App.HideOthers" xml:space="preserve">Ocultar Otros</x:String>
Expand Down Expand Up @@ -273,9 +273,9 @@
<x:String x:Key="Text.Configure.IssueTracker.Share" xml:space="preserve">Compartir esta regla en el archivo .issuetracker</x:String>
<x:String x:Key="Text.Configure.IssueTracker.URLTemplate" xml:space="preserve">URL Resultante:</x:String>
<x:String x:Key="Text.Configure.IssueTracker.URLTemplate.Tip" xml:space="preserve">Por favor, use $1, $2 para acceder a los valores de los grupos regex.</x:String>
<x:String x:Key="Text.Configure.OpenAI" xml:space="preserve">OPEN AI</x:String>
<x:String x:Key="Text.Configure.OpenAI.Preferred" xml:space="preserve">Servicio Preferido:</x:String>
<x:String x:Key="Text.Configure.OpenAI.Preferred.Tip" xml:space="preserve">Si el 'Servicio Preferido' está establecido, SourceGit sólo lo usará en este repositorio. De lo contrario, si hay más de un servicio disponible, se mostrará un menú de contexto para elegir uno.</x:String>
<x:String x:Key="Text.Configure.AI" xml:space="preserve">OPEN AI</x:String>
<x:String x:Key="Text.Configure.AI.DefaultService" xml:space="preserve">Servicio Preferido:</x:String>
<x:String x:Key="Text.Configure.AI.DefaultService.Tip" xml:space="preserve">Si el 'Servicio Preferido' está establecido, SourceGit sólo lo usará en este repositorio. De lo contrario, si hay más de un servicio disponible, se mostrará un menú de contexto para elegir uno.</x:String>
<x:String x:Key="Text.Configure.Proxy" xml:space="preserve">Proxy HTTP</x:String>
<x:String x:Key="Text.Configure.Proxy.Placeholder" xml:space="preserve">Proxy HTTP utilizado por este repositorio</x:String>
<x:String x:Key="Text.Configure.User" xml:space="preserve">Nombre del Usuario</x:String>
Expand Down Expand Up @@ -648,7 +648,6 @@
<x:String x:Key="Text.Preferences.AI.AdditionalPrompt" xml:space="preserve">Prompt adicional (Usa `-` para listar tus requerimientos)</x:String>
<x:String x:Key="Text.Preferences.AI.ApiKey" xml:space="preserve">Clave API</x:String>
<x:String x:Key="Text.Preferences.AI.Model" xml:space="preserve">Modelo</x:String>
<x:String x:Key="Text.Preferences.AI.Model.AutoFetchAvailableModels" xml:space="preserve">Traer automáticamente los model-ids disponibles</x:String>
<x:String x:Key="Text.Preferences.AI.Name" xml:space="preserve">Nombre</x:String>
<x:String x:Key="Text.Preferences.AI.ReadApiKeyFromEnv" xml:space="preserve">El valor ingresado es el nombre de la clave API a cargar desde ENV</x:String>
<x:String x:Key="Text.Preferences.AI.Server" xml:space="preserve">Servidor</x:String>
Expand Down
7 changes: 3 additions & 4 deletions src/Resources/Locales/fr_FR.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -262,9 +262,9 @@
<x:String x:Key="Text.Configure.IssueTracker.Share" xml:space="preserve">Partager cette règle dans le fichier .issuetracker</x:String>
<x:String x:Key="Text.Configure.IssueTracker.URLTemplate" xml:space="preserve">URL résultant:</x:String>
<x:String x:Key="Text.Configure.IssueTracker.URLTemplate.Tip" xml:space="preserve">Veuillez utiliser $1, $2 pour accéder aux valeurs des groupes regex.</x:String>
<x:String x:Key="Text.Configure.OpenAI" xml:space="preserve">IA</x:String>
<x:String x:Key="Text.Configure.OpenAI.Preferred" xml:space="preserve">Service préféré:</x:String>
<x:String x:Key="Text.Configure.OpenAI.Preferred.Tip" xml:space="preserve">Si le 'Service préféré' est défini, SourceGit l'utilisera seulement dans ce repository. Sinon, si plus d'un service est disponible, un menu contextuel permettant de choisir l'un d'eux sera affiché.</x:String>
<x:String x:Key="Text.Configure.AI" xml:space="preserve">IA</x:String>
<x:String x:Key="Text.Configure.AI.DefaultService" xml:space="preserve">Service préféré:</x:String>
<x:String x:Key="Text.Configure.AI.DefaultService.Tip" xml:space="preserve">Si le 'Service préféré' est défini, SourceGit l'utilisera seulement dans ce repository. Sinon, si plus d'un service est disponible, un menu contextuel permettant de choisir l'un d'eux sera affiché.</x:String>
<x:String x:Key="Text.Configure.Proxy" xml:space="preserve">Proxy HTTP</x:String>
<x:String x:Key="Text.Configure.Proxy.Placeholder" xml:space="preserve">Proxy HTTP utilisé par ce dépôt</x:String>
<x:String x:Key="Text.Configure.User" xml:space="preserve">Nom d'utilisateur</x:String>
Expand Down Expand Up @@ -627,7 +627,6 @@
<x:String x:Key="Text.Preferences.AI.AdditionalPrompt" xml:space="preserve">Prompt supplémentaire (utilisez `-` pour lister vos exigences)</x:String>
<x:String x:Key="Text.Preferences.AI.ApiKey" xml:space="preserve">Clé d'API</x:String>
<x:String x:Key="Text.Preferences.AI.Model" xml:space="preserve">Modèle</x:String>
<x:String x:Key="Text.Preferences.AI.Model.AutoFetchAvailableModels" xml:space="preserve">Récupérer automatiquement les modèles disponibles</x:String>
<x:String x:Key="Text.Preferences.AI.Name" xml:space="preserve">Nom</x:String>
<x:String x:Key="Text.Preferences.AI.ReadApiKeyFromEnv" xml:space="preserve">La valeur saisie est le nom pour charger la clé API depuis l'ENV</x:String>
<x:String x:Key="Text.Preferences.AI.Server" xml:space="preserve">Serveur</x:String>
Expand Down
Loading