-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathProgram.cs
More file actions
76 lines (74 loc) · 3.8 KB
/
Program.cs
File metadata and controls
76 lines (74 loc) · 3.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
using System;
using System.ClientModel.Primitives;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Windows.Forms;
using Azure.AI.OpenAI;
using DevExpress.AIIntegration;
using DevExpress.Data.Utils;
using DevExpress.LookAndFeel;
using DevExpress.Skins;
using DevExpress.UserSkins;
using DevExpress.XtraEditors;
using Microsoft.Extensions.AI;
namespace DevExpress.AI.WinForms.HtmlChat.Demo {
internal static class Program {
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main() {
AzureOpenAIClient azureOpenAIClient = new AzureOpenAIClient(AzureOpenAIEndpoint, AzureOpenAIKey, new AzureOpenAIClientOptions() {
Transport = new PromoteHttpStatusErrorsPipelineTransport()
});
IChatClient chatClient = azureOpenAIClient.GetChatClient("gpt-4o-mini").AsIChatClient();
var container = AIExtensionsContainerDesktop.Default;
container.RegisterChatClient(chatClient);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
class PromoteHttpStatusErrorsPipelineTransport : HttpClientPipelineTransport {
protected override void OnReceivedResponse(PipelineMessage message, HttpResponseMessage httpResponse) {
if(!httpResponse.IsSuccessStatusCode) {
if((int)httpResponse.StatusCode == 429)
throw new Exception("You have reached demo request limit. Further requests are temporarily suspended. Please try again in a few minutes. Thank you for your patience and understanding.");
throw new HttpRequestException("HTTP request failed with status code: " + httpResponse.StatusCode);
}
base.OnReceivedResponse(message, httpResponse);
}
}
static Uri AzureOpenAIEndpoint {
get {
string azureOpenAIEndpoint = GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT", IsDeveloperMode);
if(string.IsNullOrEmpty(azureOpenAIEndpoint))
azureOpenAIEndpoint = "https://public-api.devexpress.com/demo-openai";//DevExpress proxy-server
return new Uri(azureOpenAIEndpoint);
}
}
static System.ClientModel.ApiKeyCredential AzureOpenAIKey {
get {
string azureOpenAIKey = GetEnvironmentVariable("AZURE_OPENAI_API_KEY", IsDeveloperMode);
if(string.IsNullOrEmpty(azureOpenAIKey))
azureOpenAIKey = "DEMO";//Demo key
return new System.ClientModel.ApiKeyCredential(azureOpenAIKey);
}
}
static bool IsDeveloperMode {
get {
return string.Equals(AssemblyInfo.Version, $"{AssemblyInfo.VersionShort}.0.0", StringComparison.InvariantCultureIgnoreCase);
}
}
static string GetEnvironmentVariable(string variableName, bool allowSetNewEnvironmentVariable = false) {
string environmentVariable = SafeEnvironment.GetEnvironmentVariable(variableName, EnvironmentVariableTarget.User);
if(string.IsNullOrEmpty(environmentVariable) && allowSetNewEnvironmentVariable) {
environmentVariable = XtraInputBox.Show($"Please enter {variableName} variable.", variableName, string.Empty);
if(string.IsNullOrEmpty(environmentVariable))
Application.Exit();
SafeEnvironment.SetEnvironmentVariable(variableName, environmentVariable, EnvironmentVariableTarget.User);
}
return environmentVariable;
}
}
}