From 9f2be35c1d75f40b1aa0638981ad18f213d9d34f Mon Sep 17 00:00:00 2001 From: Stephen Hodgson Date: Tue, 28 Jan 2025 09:21:58 -0500 Subject: [PATCH] OpenAI-DotNet 8.5.3 (#411) - Fix JsonStringEnumConverter for ChatRequests - Fix Chat.Role serialization --- OpenAI-DotNet/Common/ReasoningEffort.cs | 5 ++ OpenAI-DotNet/Common/Role.cs | 17 ++++-- .../Extensions/JsonStringEnumConverter.cs | 57 +++++++++---------- OpenAI-DotNet/OpenAI-DotNet.csproj | 4 +- 4 files changed, 48 insertions(+), 35 deletions(-) diff --git a/OpenAI-DotNet/Common/ReasoningEffort.cs b/OpenAI-DotNet/Common/ReasoningEffort.cs index 844d8e6b..9a4a262f 100644 --- a/OpenAI-DotNet/Common/ReasoningEffort.cs +++ b/OpenAI-DotNet/Common/ReasoningEffort.cs @@ -1,5 +1,7 @@ // Licensed under the MIT License. See LICENSE in the project root for license information. +using System.Runtime.Serialization; + namespace OpenAI { /// @@ -11,8 +13,11 @@ namespace OpenAI /// public enum ReasoningEffort { + [EnumMember(Value = "low")] Low = 1, + [EnumMember(Value = "medium")] Medium, + [EnumMember(Value = "high")] High } } diff --git a/OpenAI-DotNet/Common/Role.cs b/OpenAI-DotNet/Common/Role.cs index 693c4886..187b5146 100644 --- a/OpenAI-DotNet/Common/Role.cs +++ b/OpenAI-DotNet/Common/Role.cs @@ -1,17 +1,24 @@ // Licensed under the MIT License. See LICENSE in the project root for license information. using System; +using System.Runtime.Serialization; namespace OpenAI { public enum Role { + [EnumMember(Value = "system")] System = 1, - Developer = 1, - Assistant = 2, - User = 3, + [EnumMember(Value = "developer")] + Developer, + [EnumMember(Value = "assistant")] + Assistant, + [EnumMember(Value = "user")] + User, [Obsolete("Use Tool")] - Function = 4, - Tool = 4 + [EnumMember(Value = "function")] + Function, + [EnumMember(Value = "tool")] + Tool } } diff --git a/OpenAI-DotNet/Extensions/JsonStringEnumConverter.cs b/OpenAI-DotNet/Extensions/JsonStringEnumConverter.cs index f59c2099..c4cc9d2a 100644 --- a/OpenAI-DotNet/Extensions/JsonStringEnumConverter.cs +++ b/OpenAI-DotNet/Extensions/JsonStringEnumConverter.cs @@ -14,6 +14,7 @@ namespace OpenAI.Extensions /// internal sealed class JsonStringEnumConverter : JsonConverter where TEnum : struct, Enum { + private const string ValueField = "value__"; private readonly JsonNamingPolicy namingPolicy; private readonly Dictionary numberToEnum = new(); private readonly Dictionary enumToString = new(); @@ -31,59 +32,57 @@ public JsonStringEnumConverter() var attribute = enumMember.GetCustomAttributes(typeof(EnumMemberAttribute), false) .Cast() .FirstOrDefault(); - var index = Convert.ToInt32(type.GetField("value__")?.GetValue(value)); + var index = Convert.ToInt32(type.GetField(ValueField)?.GetValue(value)); if (attribute?.Value != null) { - numberToEnum.Add(index, value); - enumToString.Add(value, attribute.Value); - stringToEnum.Add(attribute.Value, value); + numberToEnum.TryAdd(index, value); + enumToString.TryAdd(value, attribute.Value); + stringToEnum.TryAdd(attribute.Value, value); } else { var convertedName = namingPolicy != null ? namingPolicy.ConvertName(value.ToString()) : value.ToString(); - numberToEnum.Add(index, value); - enumToString.Add(value, convertedName); - stringToEnum.Add(convertedName, value); + numberToEnum.TryAdd(index, value); + enumToString.TryAdd(value, convertedName); + stringToEnum.TryAdd(convertedName, value); } } } public override TEnum Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - var type = reader.TokenType; - - switch (type) + switch (reader.TokenType) { case JsonTokenType.String: + { + var stringValue = reader.GetString(); + + if (stringValue != null) { - var stringValue = reader.GetString(); + var value = namingPolicy != null + ? namingPolicy.ConvertName(stringValue) + : stringValue; - if (stringValue != null) + if (stringToEnum.TryGetValue(value, out var enumValue)) { - var value = namingPolicy != null - ? namingPolicy.ConvertName(stringValue) - : stringValue; - - if (stringToEnum.TryGetValue(value, out var enumValue)) - { - return enumValue; - } + return enumValue; } - - break; } + + return default; + } case JsonTokenType.Number: - { - var numValue = reader.GetInt32(); - numberToEnum.TryGetValue(numValue, out var enumValue); - return enumValue; - } + { + var numValue = reader.GetInt32(); + numberToEnum.TryGetValue(numValue, out var enumValue); + return enumValue; + } + default: + return default; } - - return default; } public override void Write(Utf8JsonWriter writer, TEnum value, JsonSerializerOptions options) diff --git a/OpenAI-DotNet/OpenAI-DotNet.csproj b/OpenAI-DotNet/OpenAI-DotNet.csproj index 722cb633..829681b5 100644 --- a/OpenAI-DotNet/OpenAI-DotNet.csproj +++ b/OpenAI-DotNet/OpenAI-DotNet.csproj @@ -29,8 +29,10 @@ More context [on Roger Pincombe's blog](https://rogerpincombe.com/openai-dotnet- OpenAI-DotNet.pfx true true - 8.5.1 + 8.5.3 +Version 8.5.3 +- Fix JsonStringEnumConverter for ChatRequests Version 8.5.1 - Fix ChatRequest serialization for ReasoningEffort Version 8.5.0