-
Notifications
You must be signed in to change notification settings - Fork 26
Expand file tree
/
Copy pathFoundryLocalConnector.cs
More file actions
87 lines (68 loc) · 3.15 KB
/
FoundryLocalConnector.cs
File metadata and controls
87 lines (68 loc) · 3.15 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
77
78
79
80
81
82
83
84
85
86
87
using System.ClientModel;
using Microsoft.AI.Foundry.Local;
using Microsoft.Extensions.AI;
using OpenAI;
using OpenChat.PlaygroundApp.Abstractions;
using OpenChat.PlaygroundApp.Configurations;
namespace OpenChat.PlaygroundApp.Connectors;
/// <summary>
/// This represents the connector entity for Foundry Local.
/// </summary>
/// <param name="settings"><see cref="AppSettings"/> instance.</param>
public class FoundryLocalConnector(AppSettings settings) : LanguageModelConnector(settings.FoundryLocal)
{
private readonly AppSettings _appSettings = settings ?? throw new ArgumentNullException(nameof(settings));
private const string ApiKey = "OPENAI_API_KEY";
/// <inheritdoc/>
public override bool EnsureLanguageModelSettingsValid()
{
if (this.Settings is not FoundryLocalSettings settings)
{
throw new InvalidOperationException("Missing configuration: FoundryLocal.");
}
if (string.IsNullOrWhiteSpace(settings.Alias!.Trim()))
{
throw new InvalidOperationException("Missing configuration: FoundryLocal:Alias.");
}
if (settings.DisableFoundryLocalManager == true && string.IsNullOrWhiteSpace(settings.Endpoint!.Trim()) == true)
{
throw new InvalidOperationException("Missing configuration: FoundryLocal:Endpoint is required when DisableFoundryLocalManager is enabled.");
}
return true;
}
/// <inheritdoc/>
public override async Task<IChatClient> GetChatClientAsync()
{
var settings = this.Settings as FoundryLocalSettings;
Uri endpoint;
string modelId;
if (settings!.DisableFoundryLocalManager == true)
{
var settingsEndpoint = settings.Endpoint!.Trim() ?? throw new InvalidOperationException("Missing configuration: FoundryLocal:Endpoint.");
if (Uri.IsWellFormedUriString(settingsEndpoint, UriKind.Absolute) == false)
{
throw new UriFormatException($"Invalid URI: The Foundry Local endpoint '{settingsEndpoint}' is not a valid URI.");
}
endpoint = new Uri(settingsEndpoint);
modelId = settings.Alias!.Trim() ?? throw new InvalidOperationException("Missing configuration: FoundryLocal:Alias.");
}
else
{
var alias = settings!.Alias!.Trim() ?? throw new InvalidOperationException("Missing configuration: FoundryLocal:Alias.");
var manager = await FoundryLocalManager.StartModelAsync(aliasOrModelId: alias).ConfigureAwait(false);
var model = await manager.GetModelInfoAsync(aliasOrModelId: alias).ConfigureAwait(false);
endpoint = manager.Endpoint;
modelId = model!.ModelId;
}
var credential = new ApiKeyCredential(ApiKey);
var options = new OpenAIClientOptions()
{
Endpoint = endpoint,
};
var client = new OpenAIClient(credential, options);
var chatClient = client.GetChatClient(modelId)
.AsIChatClient();
Console.WriteLine($"The {this._appSettings.ConnectorType} connector created with model: {modelId}");
return chatClient;
}
}