openai/openai-dotnet

Public

mirrored from https://github.com/openai/openai-dotnetAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
copilot/move-addresponsesclient-methods

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

OpenAI/src/Utility/CustomSerializationHelpers.cs

171lines · modecode

1#nullable enable
2
3using System;
4using System.ClientModel.Primitives;
5using System.Collections.Generic;
6using System.Text.Json;
7
8namespace OpenAI;
9
10internal static partial class CustomSerializationHelpers
11{
12 internal static TOutput DeserializeNewInstance<TOutput, UInstanceInput>(
13 UInstanceInput existingInstance,
14 Func<JsonElement, ModelReaderWriterOptions?, TOutput> deserializationFunc,
15 ref Utf8JsonReader reader,
16 ModelReaderWriterOptions options)
17 where UInstanceInput : IJsonModel<TOutput>
18 {
19 options ??= new("W");
20 var format = options.Format == "W" ? ((IJsonModel<TOutput>)existingInstance).GetFormatFromOptions(options) : options.Format;
21 if (format != "J")
22 {
23 throw new FormatException($"The model {nameof(UInstanceInput)} does not support '{format}' format.");
24 }
25
26 using JsonDocument document = JsonDocument.ParseValue(ref reader);
27 return deserializationFunc.Invoke(document.RootElement, options);
28 }
29
30 internal static TOutput DeserializeNewInstance<TOutput, UInstanceInput>(
31 UInstanceInput existingInstance,
32 Func<JsonElement, ModelReaderWriterOptions, TOutput> deserializationFunc,
33 BinaryData data,
34 ModelReaderWriterOptions options)
35 where UInstanceInput : IPersistableModel<TOutput>
36 {
37 options ??= new("W");
38 var format = options.Format == "W" ? ((IPersistableModel<TOutput>)existingInstance).GetFormatFromOptions(options) : options.Format;
39
40 switch (format)
41 {
42 case "J":
43 {
44 using JsonDocument document = JsonDocument.Parse(data);
45 return deserializationFunc.Invoke(document.RootElement, options)!;
46 }
47 default:
48 throw new FormatException($"The model {nameof(UInstanceInput)} does not support '{format}' format.");
49 }
50 }
51
52 internal static void SerializeInstance<TOutput, UInstanceInput>(
53 UInstanceInput instance,
54 Action<UInstanceInput, Utf8JsonWriter, ModelReaderWriterOptions> serializationFunc,
55 Utf8JsonWriter writer,
56 ModelReaderWriterOptions options)
57 where UInstanceInput : IJsonModel<TOutput>
58 {
59 options ??= new ModelReaderWriterOptions("W");
60 AssertSupportedJsonWriteFormat<TOutput, UInstanceInput>(instance, options);
61 serializationFunc.Invoke(instance, writer, options);
62 }
63
64 internal static void SerializeInstance<T>(
65 T instance,
66 Action<T, Utf8JsonWriter, ModelReaderWriterOptions> serializationFunc,
67 Utf8JsonWriter writer,
68 ModelReaderWriterOptions options)
69 where T : IJsonModel<T>
70 => SerializeInstance<T, T>(instance, serializationFunc, writer, options);
71
72 internal static BinaryData SerializeInstance<TOutput, UInstanceInput>(
73 UInstanceInput instance,
74 ModelReaderWriterOptions options)
75 where UInstanceInput : IPersistableModel<TOutput>
76 {
77 options ??= new("W");
78 AssertSupportedPersistableWriteFormat<TOutput, UInstanceInput>(instance, options);
79#if OPENAI_RESPONSES
80 return ModelReaderWriter.Write(instance, options, OpenAI.Responses.OpenAIResponsesContext.Default);
81#else
82 return ModelReaderWriter.Write(instance, options, OpenAIContext.Default);
83#endif
84 }
85
86 internal static BinaryData SerializeInstance<T>(T instance, ModelReaderWriterOptions options)
87 where T : IPersistableModel<T>
88 => SerializeInstance<T, T>(instance, options);
89
90 internal static void AssertSupportedJsonWriteFormat<T>(T instance, ModelReaderWriterOptions options)
91 where T : IJsonModel<T>
92 => AssertSupportedJsonWriteFormat<T, T>(instance, options);
93
94 internal static void AssertSupportedJsonWriteFormat<TOutput, UInstanceInput>(UInstanceInput instance, ModelReaderWriterOptions options)
95 where UInstanceInput : IJsonModel<TOutput>
96 {
97 var format = options.Format == "W" ? ((IJsonModel<TOutput>)instance).GetFormatFromOptions(options) : options.Format;
98 if (format != "J")
99 {
100 throw new FormatException($"The model {nameof(UInstanceInput)} does not support '{format}' format.");
101 }
102 }
103
104 internal static void AssertSupportedPersistableWriteFormat<T>(T instance, ModelReaderWriterOptions options)
105 where T : IPersistableModel<T>
106 => AssertSupportedPersistableWriteFormat<T, T>(instance, options);
107
108 internal static void AssertSupportedPersistableWriteFormat<TOutput, UInstanceInput>(UInstanceInput instance, ModelReaderWriterOptions options)
109 where UInstanceInput : IPersistableModel<TOutput>
110 {
111 var format = options.Format == "W" ? ((IPersistableModel<TOutput>)instance).GetFormatFromOptions(options) : options.Format;
112 if (format != "J")
113 {
114 throw new FormatException($"The model {nameof(UInstanceInput)} does not support '{format}' format.");
115 }
116 }
117
118 internal static void WriteSerializedAdditionalRawData(this Utf8JsonWriter writer, IDictionary<string, BinaryData> dictionary, ModelReaderWriterOptions options)
119 {
120 if (true && dictionary != null)
121 {
122 foreach (var item in dictionary)
123 {
124 writer.WritePropertyName(item.Key);
125#if NET6_0_OR_GREATER
126 writer.WriteRawValue(item.Value);
127#else
128 using JsonDocument document = JsonDocument.Parse(item.Value);
129 JsonSerializer.Serialize(writer, document.RootElement);
130#endif
131 }
132 }
133 }
134
135 internal static void WriteOptionalProperty<T>(this Utf8JsonWriter writer, ReadOnlySpan<byte> name, T value, ModelReaderWriterOptions options)
136 {
137 if (Optional.IsDefined(value))
138 {
139 writer.WritePropertyName(name);
140 writer.WriteObjectValue(value, options);
141 }
142 }
143
144 internal static void WriteOptionalCollection<T>(this Utf8JsonWriter writer, ReadOnlySpan<byte> name, IEnumerable<T> values, ModelReaderWriterOptions options)
145 {
146 if (Optional.IsCollectionDefined(values))
147 {
148 writer.WritePropertyName(name);
149 writer.WriteStartArray();
150 foreach (T item in values)
151 {
152 writer.WriteObjectValue(item, options);
153 }
154 writer.WriteEndArray();
155 }
156 }
157
158 internal static void WriteFirstObject<T>(this Utf8JsonWriter writer, ModelReaderWriterOptions options, params T[] values)
159 where T : class, IJsonModel<T>
160 {
161 foreach (T value in values)
162 {
163 if (value is not null)
164 {
165 writer.WriteObjectValue(value, options);
166 break;
167 }
168 }
169
170 }
171}