feature: supports to read OpenAI API key from env (#1748)

Signed-off-by: leo <longshuang@msn.cn>
This commit is contained in:
leo
2025-08-25 17:18:21 +08:00
parent 2f61f06ca2
commit b00bf2a0ec
5 changed files with 16 additions and 2 deletions

View File

@@ -117,6 +117,12 @@ namespace SourceGit.Models
set => SetProperty(ref _apiKey, value);
}
public bool ReadApiKeyFromEnv
{
get => _readApiKeyFromEnv;
set => SetProperty(ref _readApiKeyFromEnv, value);
}
public string Model
{
get => _model;
@@ -176,8 +182,9 @@ namespace SourceGit.Models
public async Task ChatAsync(string prompt, string question, CancellationToken cancellation, Action<string> onUpdate)
{
var finalKey = _readApiKeyFromEnv ? Environment.GetEnvironmentVariable(_apiKey) : _apiKey;
var server = new Uri(_server);
var key = new ApiKeyCredential(_apiKey);
var key = new ApiKeyCredential(finalKey);
var oaiClient = _server.Contains("openai.azure.com/", StringComparison.Ordinal)
? new AzureOpenAIClient(server, key)
: new OpenAIClient(key, new() { Endpoint = server });
@@ -220,6 +227,7 @@ namespace SourceGit.Models
private string _name;
private string _server;
private string _apiKey;
private bool _readApiKeyFromEnv = false;
private string _model;
private bool _streaming = true;
private string _analyzeDiffPrompt;

View File

@@ -530,6 +530,7 @@
<x:String x:Key="Text.Preferences.AI.GenerateSubjectPrompt" xml:space="preserve">Generate Subject Prompt</x:String>
<x:String x:Key="Text.Preferences.AI.Model" xml:space="preserve">Model</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.Streaming" xml:space="preserve">Enable Streaming</x:String>
<x:String x:Key="Text.Preferences.Appearance" xml:space="preserve">APPEARANCE</x:String>

View File

@@ -534,6 +534,7 @@
<x:String x:Key="Text.Preferences.AI.GenerateSubjectPrompt" xml:space="preserve">Generate Subject Prompt</x:String>
<x:String x:Key="Text.Preferences.AI.Model" xml:space="preserve">模型</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密钥</x:String>
<x:String x:Key="Text.Preferences.AI.Server" xml:space="preserve">服务地址</x:String>
<x:String x:Key="Text.Preferences.AI.Streaming" xml:space="preserve">启用流式输出</x:String>
<x:String x:Key="Text.Preferences.Appearance" xml:space="preserve">外观配置</x:String>

View File

@@ -534,6 +534,7 @@
<x:String x:Key="Text.Preferences.AI.GenerateSubjectPrompt" xml:space="preserve">產生提交訊息提示詞</x:String>
<x:String x:Key="Text.Preferences.AI.Model" xml:space="preserve">模型</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">從環境變數中(輸入為環境變數名稱)載入金鑰</x:String>
<x:String x:Key="Text.Preferences.AI.Server" xml:space="preserve">伺服器</x:String>
<x:String x:Key="Text.Preferences.AI.Streaming" xml:space="preserve">啟用串流輸出</x:String>
<x:String x:Key="Text.Preferences.Appearance" xml:space="preserve">外觀設定</x:String>

View File

@@ -788,7 +788,10 @@
<TextBox Margin="0,4,0,0" CornerRadius="3" Height="28" Text="{Binding Model, Mode=TwoWay}"/>
<TextBlock Margin="0,12,0,0" Text="{DynamicResource Text.Preferences.AI.ApiKey}"/>
<TextBox Margin="0,4,0,0" CornerRadius="3" Height="28" Text="{Binding ApiKey, Mode=TwoWay}" PasswordChar="*"/>
<TextBox Margin="0,4,0,0" CornerRadius="3" Height="28" Text="{Binding ApiKey, Mode=TwoWay}" PasswordChar="*" RevealPassword="{Binding ReadApiKeyFromEnv, Mode=OneWay}"/>
<CheckBox Margin="0,4,0,0"
Content="{DynamicResource Text.Preferences.AI.ReadApiKeyFromEnv}"
IsChecked="{Binding ReadApiKeyFromEnv, Mode=TwoWay}"/>
<TextBlock Margin="0,12,0,0" Text="{DynamicResource Text.Preferences.AI.AnalyzeDiffPrompt}"/>
<TextBox Height="120"