Skip to content

Commit 001f573

Browse files
Merge pull request #264 from Avanade/feat/newcartridges
feat: upgrade Azure.Ai.OpenAi package version
2 parents ec097fa + 2320c36 commit 001f573

File tree

4 files changed

+63
-65
lines changed

4 files changed

+63
-65
lines changed
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
using Azure.AI.OpenAI;
2+
using OpenAI.Chat;
23

34
namespace Liquid.ChatCompletions.OpenAi
45
{
56
/// <summary>
6-
/// Provide <see cref="OpenAIClient"/> generator methods.
7+
/// Provide <see cref="ChatClient"/> generator methods.
78
/// </summary>
89
public interface IOpenAiClientFactory
910
{
1011
/// <summary>
11-
/// Provide a instance of <see cref="OpenAIClient"/> with conection started.
12+
/// Provide a instance of <see cref="ChatClient"/> with conection started.
1213
/// </summary>
1314
/// <param name="clientId">OpenAI connections alias.</param>
14-
OpenAIClient GetOpenAIClient(string clientId);
15+
ChatClient GetOpenAIClient(string clientId);
1516
}
1617
}

src/Liquid.ChatCompletions.OpenAi/Liquid.ChatCompletions.OpenAi.csproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<Copyright>Avanade 2019</Copyright>
1414
<PackageProjectUrl>https://github.com/Avanade/Liquid-Application-Framework</PackageProjectUrl>
1515
<PackageIcon>logo.png</PackageIcon>
16-
<Version>8.0.0-beta-03</Version>
16+
<Version>8.0.0-beta-04</Version>
1717
<GenerateDocumentationFile>true</GenerateDocumentationFile>
1818
<IsPackable>true</IsPackable>
1919
<DebugType>Full</DebugType>
@@ -31,9 +31,9 @@
3131
</ItemGroup>
3232

3333
<ItemGroup>
34-
<PackageReference Include="Azure.AI.OpenAI" Version="1.0.0-beta.17" />
35-
<PackageReference Include="Liquid.Core" Version="8.0.0-beta-06" />
36-
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="8.0.1" />
34+
<PackageReference Include="Azure.AI.OpenAI" Version="2.1.0" />
35+
<PackageReference Include="Liquid.Core" Version="8.0.0-beta-09" />
36+
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="8.0.2" />
3737
</ItemGroup>
3838

3939
</Project>

src/Liquid.ChatCompletions.OpenAi/OpenAiChatCompletions.cs

Lines changed: 37 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
using Liquid.Core.Entities;
22
using Liquid.Core.Interfaces;
33
using Liquid.Core.Settings;
4-
using Azure.AI.OpenAI;
4+
using OpenAI.Chat;
55
using System.Diagnostics.CodeAnalysis;
66

77
namespace Liquid.ChatCompletions.OpenAi
@@ -27,26 +27,24 @@ public async Task<ChatCompletionResult> FunctionCalling(ChatMessages messages, L
2727
{
2828
var client = _factory.GetOpenAIClient(settings.ClientId);
2929

30-
var requestMessages = new List<ChatRequestMessage>();
30+
var requestMessages = new List<OpenAI.Chat.ChatMessage>();
3131

3232
messages.Messages.ForEach(m => requestMessages.Add(MapChatRequestMessage(m)));
3333

3434
var option = MapChatCompletionOptions(requestMessages, settings);
3535

36-
functions.ForEach(f => option.Functions.Add(GetDefinition(f)));
36+
functions.ForEach(f => option.Tools.Add(ChatTool.CreateFunctionTool(f.Name, f.Description, f.Parameters)));
3737

38-
var responseWithoutStream = await client.GetChatCompletionsAsync(option, new CancellationToken());
39-
40-
var response = responseWithoutStream.Value.Choices[0].Message.FunctionCall == null ?
41-
null : responseWithoutStream.Value.Choices[0].Message.FunctionCall.Arguments;
38+
var responseWithoutStream = await client.CompleteChatAsync(requestMessages, option);
39+
var response = responseWithoutStream.Value.Content[0].Text;
4240

4341
var result = new ChatCompletionResult()
4442
{
45-
FinishReason = responseWithoutStream.Value.Choices[0]?.FinishReason?.ToString(),
43+
FinishReason = responseWithoutStream.Value.FinishReason.ToString(),
4644
Content = response,
47-
Usage = responseWithoutStream.Value.Usage.TotalTokens,
48-
PromptUsage = responseWithoutStream.Value.Usage.PromptTokens,
49-
CompletionUsage = responseWithoutStream.Value.Usage.CompletionTokens,
45+
Usage = responseWithoutStream.Value.Usage.TotalTokenCount,
46+
PromptUsage = responseWithoutStream.Value.Usage.InputTokenCount,
47+
CompletionUsage = responseWithoutStream.Value.Usage.OutputTokenCount,
5048
};
5149

5250
return result;
@@ -61,15 +59,16 @@ public async Task<ChatCompletionResult> ChatCompletions(string content, string p
6159

6260
var option = MapChatCompletionOptions(messages, settings);
6361

64-
var responseWithoutStream = await client.GetChatCompletionsAsync(option, new CancellationToken());
62+
var responseWithoutStream = await client.CompleteChatAsync(messages, option);
63+
var response = responseWithoutStream.Value.Content[0].Text;
6564

6665
var result = new ChatCompletionResult()
6766
{
68-
FinishReason = responseWithoutStream.Value.Choices[0]?.FinishReason?.ToString(),
69-
Content = responseWithoutStream.Value.Choices[0]?.Message?.Content,
70-
Usage = responseWithoutStream.Value.Usage.TotalTokens,
71-
PromptUsage = responseWithoutStream.Value.Usage.PromptTokens,
72-
CompletionUsage = responseWithoutStream.Value.Usage.CompletionTokens,
67+
FinishReason = responseWithoutStream.Value.FinishReason.ToString(),
68+
Content = response,
69+
Usage = responseWithoutStream.Value.Usage.TotalTokenCount,
70+
PromptUsage = responseWithoutStream.Value.Usage.InputTokenCount,
71+
CompletionUsage = responseWithoutStream.Value.Usage.OutputTokenCount,
7372
};
7473

7574
return result;
@@ -78,36 +77,29 @@ public async Task<ChatCompletionResult> ChatCompletions(string content, string p
7877
///<inheritdoc/>
7978
public async Task<ReadOnlyMemory<float>> GetEmbeddings(string description, string modelName, string clientId)
8079
{
81-
var client = _factory.GetOpenAIClient(clientId);
80+
//var client = _factory.GetOpenAIClient(clientId);
8281

83-
EmbeddingsOptions embeddingsOptions = new(modelName, new string[] { description });
82+
//EmbeddingGenerationOptions embeddingsOptions = new(modelName, new string[] { description });
8483

85-
var embeddings = await client.GetEmbeddingsAsync(embeddingsOptions);
84+
//var embeddings = await client.(embeddingsOptions);
8685

87-
return embeddings.Value.Data[0].Embedding;
88-
}
86+
//return embeddings.Value.Data[0].Embedding;
8987

90-
private FunctionDefinition GetDefinition(FunctionBody function)
91-
{
92-
return new FunctionDefinition()
93-
{
94-
Name = function.Name,
95-
Description = function.Description,
96-
Parameters = function.Parameters,
97-
};
88+
throw new NotImplementedException();
9889
}
9990

91+
10092
/// <summary>
10193
/// get chat messages for a chat completions request.
10294
/// </summary>
10395
/// <param name="content">content of the user message</param>
10496
/// <param name="prompt">prompt message</param>
10597
/// <param name="chatHistory">chat context messages</param>
106-
private List<ChatRequestMessage> GetChatMessagesAsync(string content, string prompt, ChatMessages? chatHistory = null)
98+
private List<OpenAI.Chat.ChatMessage> GetChatMessagesAsync(string content, string prompt, ChatMessages? chatHistory = null)
10799
{
108-
var messages = new List<ChatRequestMessage>
100+
var messages = new List<OpenAI.Chat.ChatMessage>
109101
{
110-
new ChatRequestSystemMessage(prompt)
102+
new SystemChatMessage(prompt)
111103
};
112104

113105
if (chatHistory?.Messages != null && chatHistory.Messages.Count > 0)
@@ -118,7 +110,7 @@ private List<ChatRequestMessage> GetChatMessagesAsync(string content, string pro
118110
}
119111
}
120112

121-
messages.Add(new ChatRequestUserMessage(content));
113+
messages.Add(new UserChatMessage(content));
122114

123115
return messages;
124116
}
@@ -128,19 +120,19 @@ private List<ChatRequestMessage> GetChatMessagesAsync(string content, string pro
128120
/// </summary>
129121
/// <param name="message">chat message</param>
130122
/// <exception cref="ArgumentNullException"></exception>
131-
private ChatRequestMessage MapChatRequestMessage(ChatMessage message)
123+
private OpenAI.Chat.ChatMessage MapChatRequestMessage(Core.Entities.ChatMessage message)
132124
{
133-
ChatRequestMessage chatRequestMessage = null;
125+
OpenAI.Chat.ChatMessage chatRequestMessage = null;
134126
switch (message.Role.ToLower())
135127
{
136128
case "system":
137-
chatRequestMessage = new ChatRequestSystemMessage(message.Content);
129+
chatRequestMessage = new SystemChatMessage(message.Content);
138130
break;
139131
case "assistant":
140-
chatRequestMessage = new ChatRequestAssistantMessage(message.Content);
132+
chatRequestMessage = new AssistantChatMessage(message.Content);
141133
break;
142134
case "user":
143-
chatRequestMessage = new ChatRequestUserMessage(message.Content);
135+
chatRequestMessage = new UserChatMessage(message.Content);
144136
break;
145137
default:
146138
break;
@@ -160,15 +152,16 @@ private ChatRequestMessage MapChatRequestMessage(ChatMessage message)
160152
/// <param name="messages">Chat messages </param>
161153
/// <param name="settings">Chat completions settings</param>
162154
/// <returns></returns>
163-
private ChatCompletionsOptions MapChatCompletionOptions(List<ChatRequestMessage> messages, CompletionsSettings settings)
155+
private ChatCompletionOptions MapChatCompletionOptions(List<OpenAI.Chat.ChatMessage> messages, CompletionsSettings settings)
164156
{
165-
return new ChatCompletionsOptions(settings.DeploymentName, messages)
157+
return new ChatCompletionOptions()
166158
{
167159
Temperature = settings.Temperature,
168-
MaxTokens = settings.MaxTokens,
169-
NucleusSamplingFactor = settings.NucleusSamplingFactor,
160+
MaxOutputTokenCount = settings.MaxTokens,
161+
TopP = settings.NucleusSamplingFactor,
170162
FrequencyPenalty = settings.FrequencyPenalty,
171-
PresencePenalty = settings.PresencePenalty,
163+
PresencePenalty = settings.PresencePenalty
164+
172165
};
173166
}
174167
}

src/Liquid.ChatCompletions.OpenAi/OpenAiClientFactory.cs

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
using Liquid.Core.Entities;
55
using Liquid.Core.Settings;
66
using Microsoft.Extensions.Options;
7+
using OpenAI.Chat;
78
using System.Diagnostics.CodeAnalysis;
9+
using System.Net;
10+
using System.Reflection;
811

912
namespace Liquid.ChatCompletions.OpenAi
1013
{
@@ -13,7 +16,7 @@ namespace Liquid.ChatCompletions.OpenAi
1316
public class OpenAiClientFactory : IOpenAiClientFactory
1417
{
1518
private readonly IOptions<GenAiOptions> _settings;
16-
private readonly List<ClientDictionary<OpenAIClient>> _openAiClients;
19+
private readonly List<ClientDictionary<ChatClient>> _openAiClients;
1720

1821
/// <summary>
1922
/// Initialize a new instance of <see cref="OpenAiClientFactory"/>
@@ -23,11 +26,11 @@ public class OpenAiClientFactory : IOpenAiClientFactory
2326
public OpenAiClientFactory(IOptions<GenAiOptions> settings)
2427
{
2528
_settings = settings ?? throw new ArgumentNullException(nameof(settings));
26-
_openAiClients = new List<ClientDictionary<OpenAIClient>>();
29+
_openAiClients = new List<ClientDictionary<ChatClient>>();
2730
}
2831

2932
///<inheritdoc/>
30-
public OpenAIClient GetOpenAIClient(string clientId)
33+
public ChatClient GetOpenAIClient(string clientId)
3134
{
3235
var settings = _settings.Value.Settings.Where(x => x.ClientId == clientId).ToList();
3336

@@ -49,30 +52,31 @@ public OpenAIClient GetOpenAIClient(string clientId)
4952
}
5053
}
5154

52-
private OpenAIClient CreateClient(List<GenAiSettings> settings)
55+
private ChatClient CreateClient(List<GenAiSettings> settings)
5356
{
5457
if (settings == null || settings.Count == 0)
5558
{
5659
throw new ArgumentNullException(nameof(settings));
5760
}
5861

59-
OpenAIClient? client = null;
62+
ChatClient? client = null;
6063

6164
foreach (var setting in settings)
62-
{
65+
{
66+
67+
var options = new AzureOpenAIClientOptions();
6368

64-
var options = new OpenAIClientOptions();
69+
//options.Retry.MaxRetries = setting.MaxRetries;
70+
//options.Retry.Delay = TimeSpan.FromSeconds(setting.RetryMinDelay);
71+
//options.Retry.Mode = setting.ExponentialBackoff ? RetryMode.Exponential : RetryMode.Fixed;
72+
//options.Retry.MaxDelay = TimeSpan.FromSeconds(setting.RetryMaxDelay);
6573

66-
options.Retry.MaxRetries = setting.MaxRetries;
67-
options.Retry.Delay = TimeSpan.FromSeconds(setting.RetryMinDelay);
68-
options.Retry.Mode = setting.ExponentialBackoff ? RetryMode.Exponential : RetryMode.Fixed;
69-
options.Retry.MaxDelay = TimeSpan.FromSeconds(setting.RetryMaxDelay);
7074

75+
AzureOpenAIClient azureClient = new(new Uri(setting.Url), new AzureKeyCredential(setting.Key), options);
7176

72-
client = new OpenAIClient(new Uri(setting.Url),
73-
new AzureKeyCredential(setting.Key), options);
77+
client = azureClient.GetChatClient("");
7478

75-
_openAiClients.Add(new ClientDictionary<OpenAIClient>(setting.ClientId, client));
79+
_openAiClients.Add(new ClientDictionary<ChatClient>(setting.ClientId, client));
7680
}
7781

7882
return client;

0 commit comments

Comments
 (0)