From d685810dae61b25d57f39b5b21eae3da2cabd249 Mon Sep 17 00:00:00 2001 From: jhmoon Date: Sat, 24 Aug 2024 13:34:17 +0900 Subject: [PATCH 1/3] Add CreateChatCompletionRequest as a request payload definition --- .../Models/CreateChatCompletionRequest.cs | 139 ++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 src/AzureOpenAIProxy.ApiApp/Models/CreateChatCompletionRequest.cs diff --git a/src/AzureOpenAIProxy.ApiApp/Models/CreateChatCompletionRequest.cs b/src/AzureOpenAIProxy.ApiApp/Models/CreateChatCompletionRequest.cs new file mode 100644 index 00000000..f87876fa --- /dev/null +++ b/src/AzureOpenAIProxy.ApiApp/Models/CreateChatCompletionRequest.cs @@ -0,0 +1,139 @@ +using System.ComponentModel.DataAnnotations; +using System.Text.Json.Serialization; + +namespace AzureOpenAIProxy.ApiApp.Models; + +public class CreateChatCompletionRequest +{ + [JsonPropertyName("messages"), Required] + public List? Messages { get; set; } + + [JsonPropertyName("data_sources")] + public List? DataSources { get; set; } + + [JsonPropertyName("n")] + public int? N { get; set; } + + [JsonPropertyName("seed")] + public long? Seed { get; set; } + + [JsonPropertyName("logprobs")] + public bool? LogProbs { get; set; } + + [JsonPropertyName("top_logprobs")] + public int? TopLogProbs { get; set; } + + [JsonPropertyName("response_format")] + public ChatCompletionResponseFormat? ResponseFormat { get; set; } + + [JsonPropertyName("tools")] + public List? Tools { get; set; } + + [JsonPropertyName("tool_choice")] + public ChatCompletionToolChoiceOption? ToolChoice { get; set; } + +} + +public abstract class ChatCompletionRequestMessage +{ + [JsonPropertyName("role")] + public abstract ChatCompletionRequestMessageRole Role { get; } +} + +[JsonConverter(typeof(JsonStringEnumConverter))] +public enum ChatCompletionRequestMessageRole +{ + [JsonPropertyName("system")] + System, + + [JsonPropertyName("user")] + User, + + [JsonPropertyName("assistant")] + Assistant, + + [JsonPropertyName("tool")] + Tool, + + [JsonPropertyName("function")] + Function // Deprecated. +} + +public abstract class AzureChatExtensionConfiguration +{ + [JsonPropertyName("type")] + public abstract AzureChatExtensionType Type { get; } +} + +[JsonConverter(typeof(JsonStringEnumConverter))] +public enum AzureChatExtensionType +{ + [JsonPropertyName("azure_search")] + AzureSearch, + + [JsonPropertyName("azure_cosmos_db")] + AzureCosmosDb +} + + +[JsonConverter(typeof(JsonStringEnumConverter))] +public enum ChatCompletionResponseFormat +{ + [JsonPropertyName("text")] + Text, + + [JsonPropertyName("json_object")] + JsonObject +} + + +public class ChatCompletionTool +{ + [JsonPropertyName("type")] + [Required] + public ChatCompletionToolType Type { get; set; } + + [JsonPropertyName("function")] + [Required] + public ChatCompletionFunction Function { get; set; } +} + +public class ChatCompletionFunction +{ + [JsonPropertyName("description")] + public string Description { get; set; } + + [JsonPropertyName("name")] + [Required] + public string Name { get; set; } + + [JsonPropertyName("parameters")] + [Required] + public ChatCompletionFunctionParameters Parameters { get; set; } +} + +public class ChatCompletionFunctionParameters +{ + [JsonExtensionData] + public Dictionary AdditionalProperties { get; set; } = new Dictionary(); +} + +public enum ChatCompletionToolChoiceOption +{ + [JsonPropertyName("none")] + None, + + [JsonPropertyName("auto")] + Auto, + + [JsonPropertyName("required")] + Required +} + + +[JsonConverter(typeof(JsonStringEnumConverter))] +public enum ChatCompletionToolType +{ + [JsonPropertyName("function")] + Function +} \ No newline at end of file From 03a772f5396283996d1b6310368f2d909da67526 Mon Sep 17 00:00:00 2001 From: jhmoon Date: Fri, 30 Aug 2024 22:28:12 +0900 Subject: [PATCH 2/3] Add CreateChatCompletionRequest request field --- .../Models/CreateChatCompletionRequest.cs | 166 +++++------------- .../CreateChatCompletionRequestTests.cs | 47 +++++ 2 files changed, 89 insertions(+), 124 deletions(-) create mode 100644 test/AzureOpenAIProxy.ApiApp.Tests/Models/CreateChatCompletionRequestTests.cs diff --git a/src/AzureOpenAIProxy.ApiApp/Models/CreateChatCompletionRequest.cs b/src/AzureOpenAIProxy.ApiApp/Models/CreateChatCompletionRequest.cs index f87876fa..07873607 100644 --- a/src/AzureOpenAIProxy.ApiApp/Models/CreateChatCompletionRequest.cs +++ b/src/AzureOpenAIProxy.ApiApp/Models/CreateChatCompletionRequest.cs @@ -1,139 +1,57 @@ using System.ComponentModel.DataAnnotations; using System.Text.Json.Serialization; +using System.Text.Json; -namespace AzureOpenAIProxy.ApiApp.Models; - -public class CreateChatCompletionRequest -{ - [JsonPropertyName("messages"), Required] - public List? Messages { get; set; } - - [JsonPropertyName("data_sources")] - public List? DataSources { get; set; } - - [JsonPropertyName("n")] - public int? N { get; set; } - - [JsonPropertyName("seed")] - public long? Seed { get; set; } - - [JsonPropertyName("logprobs")] - public bool? LogProbs { get; set; } - - [JsonPropertyName("top_logprobs")] - public int? TopLogProbs { get; set; } - - [JsonPropertyName("response_format")] - public ChatCompletionResponseFormat? ResponseFormat { get; set; } - - [JsonPropertyName("tools")] - public List? Tools { get; set; } - - [JsonPropertyName("tool_choice")] - public ChatCompletionToolChoiceOption? ToolChoice { get; set; } - -} - -public abstract class ChatCompletionRequestMessage +namespace AzureOpenAIProxy.ApiApp.Models { - [JsonPropertyName("role")] - public abstract ChatCompletionRequestMessageRole Role { get; } -} + public class CreateChatCompletionRequest + { + [JsonPropertyName("messages"), Required] + public List? Messages { get; set; } -[JsonConverter(typeof(JsonStringEnumConverter))] -public enum ChatCompletionRequestMessageRole -{ - [JsonPropertyName("system")] - System, + } - [JsonPropertyName("user")] - User, + public class ChatCompletionRequestMessage + { + [JsonPropertyName("role")] + public ChatCompletionRequestMessageRole Role { get; set; } - [JsonPropertyName("assistant")] - Assistant, + [JsonPropertyName("content")] + public string? Content { get; set; } + } - [JsonPropertyName("tool")] - Tool, + public class UserChatCompletionRequestMessage : ChatCompletionRequestMessage + { + public UserChatCompletionRequestMessage() + { + Role = ChatCompletionRequestMessageRole.User; + } + } - [JsonPropertyName("function")] - Function // Deprecated. -} + public class AssistantChatCompletionRequestMessage : ChatCompletionRequestMessage + { + public AssistantChatCompletionRequestMessage() + { + Role = ChatCompletionRequestMessageRole.Assistant; + } + } -public abstract class AzureChatExtensionConfiguration -{ - [JsonPropertyName("type")] - public abstract AzureChatExtensionType Type { get; } -} + [JsonConverter(typeof(JsonStringEnumConverter))] + public enum ChatCompletionRequestMessageRole + { + [JsonPropertyName("system")] + System, -[JsonConverter(typeof(JsonStringEnumConverter))] -public enum AzureChatExtensionType -{ - [JsonPropertyName("azure_search")] - AzureSearch, + [JsonPropertyName("user")] + User, - [JsonPropertyName("azure_cosmos_db")] - AzureCosmosDb -} + [JsonPropertyName("assistant")] + Assistant, + [JsonPropertyName("tool")] + Tool, -[JsonConverter(typeof(JsonStringEnumConverter))] -public enum ChatCompletionResponseFormat -{ - [JsonPropertyName("text")] - Text, - - [JsonPropertyName("json_object")] - JsonObject + [JsonPropertyName("function")] + Function // Deprecated. + } } - - -public class ChatCompletionTool -{ - [JsonPropertyName("type")] - [Required] - public ChatCompletionToolType Type { get; set; } - - [JsonPropertyName("function")] - [Required] - public ChatCompletionFunction Function { get; set; } -} - -public class ChatCompletionFunction -{ - [JsonPropertyName("description")] - public string Description { get; set; } - - [JsonPropertyName("name")] - [Required] - public string Name { get; set; } - - [JsonPropertyName("parameters")] - [Required] - public ChatCompletionFunctionParameters Parameters { get; set; } -} - -public class ChatCompletionFunctionParameters -{ - [JsonExtensionData] - public Dictionary AdditionalProperties { get; set; } = new Dictionary(); -} - -public enum ChatCompletionToolChoiceOption -{ - [JsonPropertyName("none")] - None, - - [JsonPropertyName("auto")] - Auto, - - [JsonPropertyName("required")] - Required -} - - -[JsonConverter(typeof(JsonStringEnumConverter))] -public enum ChatCompletionToolType -{ - [JsonPropertyName("function")] - Function -} \ No newline at end of file diff --git a/test/AzureOpenAIProxy.ApiApp.Tests/Models/CreateChatCompletionRequestTests.cs b/test/AzureOpenAIProxy.ApiApp.Tests/Models/CreateChatCompletionRequestTests.cs new file mode 100644 index 00000000..8cd50f88 --- /dev/null +++ b/test/AzureOpenAIProxy.ApiApp.Tests/Models/CreateChatCompletionRequestTests.cs @@ -0,0 +1,47 @@ +using AzureOpenAIProxy.ApiApp.Models; + + + +using System.Text.Json; + + +namespace AzureOpenAIProxy.ApiApp.Tests.Models +{ + public class CreateChatCompletionRequestTests + { + [Fact] + public void Given_ChatCompletionsJson_When_Deserialized_Then_ShouldReturnCreateChatCompletionRequest() + { + // Arrange + var json = @" + { + ""messages"": [ + { + ""role"": ""system"", + ""content"": ""you are a helpful assistant that talks like a pirate"" + }, + { + ""role"": ""user"", + ""content"": ""can you tell me how to care for a parrot?"" + } + ] + }"; + + // Act + var result = JsonSerializer.Deserialize(json); + + // Assert + Assert.NotNull(result); + Assert.NotNull(result.Messages); // Ensure Messages is not null + Assert.Equal(2, result.Messages.Count); + + var firstMessage = result.Messages[0]; + Assert.Equal(ChatCompletionRequestMessageRole.System, firstMessage.Role); + Assert.Equal("you are a helpful assistant that talks like a pirate", firstMessage.Content); + + var secondMessage = result.Messages[1]; + Assert.Equal(ChatCompletionRequestMessageRole.User, secondMessage.Role); + Assert.Equal("can you tell me how to care for a parrot?", secondMessage.Content); + } + } +} From 3974a2d9ac0fdc3d84e6fa966b32de360f3ae342 Mon Sep 17 00:00:00 2001 From: jhmoon Date: Fri, 30 Aug 2024 23:09:00 +0900 Subject: [PATCH 3/3] Refactor CreateChatCompletionRequest messages field --- .../Models/CreateChatCompletionRequest.cs | 23 ++----------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/src/AzureOpenAIProxy.ApiApp/Models/CreateChatCompletionRequest.cs b/src/AzureOpenAIProxy.ApiApp/Models/CreateChatCompletionRequest.cs index 07873607..a7369add 100644 --- a/src/AzureOpenAIProxy.ApiApp/Models/CreateChatCompletionRequest.cs +++ b/src/AzureOpenAIProxy.ApiApp/Models/CreateChatCompletionRequest.cs @@ -13,29 +13,13 @@ public class CreateChatCompletionRequest public class ChatCompletionRequestMessage { - [JsonPropertyName("role")] - public ChatCompletionRequestMessageRole Role { get; set; } + [JsonPropertyName("role"), Required] + public ChatCompletionRequestMessageRole? Role { get; set; } [JsonPropertyName("content")] public string? Content { get; set; } } - public class UserChatCompletionRequestMessage : ChatCompletionRequestMessage - { - public UserChatCompletionRequestMessage() - { - Role = ChatCompletionRequestMessageRole.User; - } - } - - public class AssistantChatCompletionRequestMessage : ChatCompletionRequestMessage - { - public AssistantChatCompletionRequestMessage() - { - Role = ChatCompletionRequestMessageRole.Assistant; - } - } - [JsonConverter(typeof(JsonStringEnumConverter))] public enum ChatCompletionRequestMessageRole { @@ -50,8 +34,5 @@ public enum ChatCompletionRequestMessageRole [JsonPropertyName("tool")] Tool, - - [JsonPropertyName("function")] - Function // Deprecated. } }