Skip to content

Commit cc9169a

Browse files
authored
Fix deserialization of run steps when using file search and mitigate .NET runtime issue when serializing ChatResponseFormat (#206)
* Fixed the deserialization of run steps when using file search. The internal representation of File Search as an `IReadOnlyDictionary<string, string>` is incorrect and causing issues during deserialization after the latest service. This fix changes this internal representation to `IReadOnlyDictionary<string, BinaryData>` instead. * Mitigated a .NET runtime issue that prevented `ChatResponseFormat` from serializing correct on targets including Unity. * Renamed `SpeechGenerationOptions`'s `Speed` property to `SpeedRatio`. * Changed `GeneratedSpeechFormat` from an enum to an extensible enum.
1 parent 78f3f96 commit cc9169a

File tree

54 files changed

+647
-387
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+647
-387
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,14 @@
1212
- Updated fine-tuning pagination methods `GetJobs`, `GetEvents`, and `GetJobCheckpoints` to return `IEnumerable<ClientResult>` instead of `ClientResult`. (commit_hash)
1313
- Updated the batching pagination method `GetBatches` to return `IEnumerable<ClientResult>` instead of `ClientResult`. (commit_hash)
1414
- Changed `GeneratedSpeechVoice` from an enum to an "extensible enum". (commit_hash)
15+
- Changed `GeneratedSpeechFormat` from an enum to an "extensible enum". (commit_hash)
16+
- Renamed `SpeechGenerationOptions`'s `Speed` property to `SpeedRatio`. (commit_hash)
1517

1618
### Bugs Fixed
1719

20+
- Corrected an internal deserialization issue that caused recent updates to Assistants `file_search` to fail when streaming a run. Strongly typed support for `ranking_options` is not included but will arrive soon. (commit_hash)
21+
- Mitigated a .NET runtime issue that prevented `ChatResponseFormat` from serializing correct on targets including Unity. (commit_hash)
22+
1823
### Other Changes
1924

2025
- Reverted the removal of the version path parameter "v1" from the default endpoint URL. (commit_hash)

api/OpenAI.netstandard2.0.cs

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ public class CodeInterpreterToolDefinition : ToolDefinition, IJsonModel<CodeInte
342342
CodeInterpreterToolDefinition IPersistableModel<CodeInterpreterToolDefinition>.Create(BinaryData data, ModelReaderWriterOptions options);
343343
string IPersistableModel<CodeInterpreterToolDefinition>.GetFormatFromOptions(ModelReaderWriterOptions options);
344344
BinaryData IPersistableModel<CodeInterpreterToolDefinition>.Write(ModelReaderWriterOptions options);
345-
protected override void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
345+
protected internal override void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
346346
}
347347
public class CodeInterpreterToolResources : IJsonModel<CodeInterpreterToolResources>, IPersistableModel<CodeInterpreterToolResources> {
348348
public IList<string> FileIds { get; set; }
@@ -359,7 +359,7 @@ public class FileSearchToolDefinition : ToolDefinition, IJsonModel<FileSearchToo
359359
FileSearchToolDefinition IPersistableModel<FileSearchToolDefinition>.Create(BinaryData data, ModelReaderWriterOptions options);
360360
string IPersistableModel<FileSearchToolDefinition>.GetFormatFromOptions(ModelReaderWriterOptions options);
361361
BinaryData IPersistableModel<FileSearchToolDefinition>.Write(ModelReaderWriterOptions options);
362-
protected override void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
362+
protected internal override void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
363363
}
364364
public class FileSearchToolResources : IJsonModel<FileSearchToolResources>, IPersistableModel<FileSearchToolResources> {
365365
public IList<VectorStoreCreationHelper> NewVectorStores { get; }
@@ -382,7 +382,7 @@ public class FunctionToolDefinition : ToolDefinition, IJsonModel<FunctionToolDef
382382
FunctionToolDefinition IPersistableModel<FunctionToolDefinition>.Create(BinaryData data, ModelReaderWriterOptions options);
383383
string IPersistableModel<FunctionToolDefinition>.GetFormatFromOptions(ModelReaderWriterOptions options);
384384
BinaryData IPersistableModel<FunctionToolDefinition>.Write(ModelReaderWriterOptions options);
385-
protected override void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
385+
protected internal override void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
386386
}
387387
public class MessageCollectionOptions {
388388
public string AfterId { get; set; }
@@ -955,7 +955,7 @@ public abstract class ToolDefinition : IJsonModel<ToolDefinition>, IPersistableM
955955
ToolDefinition IPersistableModel<ToolDefinition>.Create(BinaryData data, ModelReaderWriterOptions options);
956956
string IPersistableModel<ToolDefinition>.GetFormatFromOptions(ModelReaderWriterOptions options);
957957
BinaryData IPersistableModel<ToolDefinition>.Write(ModelReaderWriterOptions options);
958-
protected abstract void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
958+
protected internal abstract void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
959959
}
960960
public class ToolOutput : IJsonModel<ToolOutput>, IPersistableModel<ToolOutput> {
961961
public ToolOutput();
@@ -1084,13 +1084,25 @@ public class AudioTranslationOptions : IJsonModel<AudioTranslationOptions>, IPer
10841084
string IPersistableModel<AudioTranslationOptions>.GetFormatFromOptions(ModelReaderWriterOptions options);
10851085
BinaryData IPersistableModel<AudioTranslationOptions>.Write(ModelReaderWriterOptions options);
10861086
}
1087-
public enum GeneratedSpeechFormat {
1088-
Mp3 = 0,
1089-
Opus = 1,
1090-
Aac = 2,
1091-
Flac = 3,
1092-
Wav = 4,
1093-
Pcm = 5
1087+
public readonly partial struct GeneratedSpeechFormat : IEquatable<GeneratedSpeechFormat> {
1088+
private readonly object _dummy;
1089+
private readonly int _dummyPrimitive;
1090+
public GeneratedSpeechFormat(string value);
1091+
public static GeneratedSpeechFormat Aac { get; }
1092+
public static GeneratedSpeechFormat Flac { get; }
1093+
public static GeneratedSpeechFormat Mp3 { get; }
1094+
public static GeneratedSpeechFormat Opus { get; }
1095+
public static GeneratedSpeechFormat Pcm { get; }
1096+
public static GeneratedSpeechFormat Wav { get; }
1097+
public readonly bool Equals(GeneratedSpeechFormat other);
1098+
[EditorBrowsable(EditorBrowsableState.Never)]
1099+
public override readonly bool Equals(object obj);
1100+
[EditorBrowsable(EditorBrowsableState.Never)]
1101+
public override readonly int GetHashCode();
1102+
public static bool operator ==(GeneratedSpeechFormat left, GeneratedSpeechFormat right);
1103+
public static implicit operator GeneratedSpeechFormat(string value);
1104+
public static bool operator !=(GeneratedSpeechFormat left, GeneratedSpeechFormat right);
1105+
public override readonly string ToString();
10941106
}
10951107
public readonly partial struct GeneratedSpeechVoice : IEquatable<GeneratedSpeechVoice> {
10961108
private readonly object _dummy;
@@ -1120,7 +1132,7 @@ public static class OpenAIAudioModelFactory {
11201132
}
11211133
public class SpeechGenerationOptions : IJsonModel<SpeechGenerationOptions>, IPersistableModel<SpeechGenerationOptions> {
11221134
public GeneratedSpeechFormat? ResponseFormat { get; set; }
1123-
public float? Speed { get; set; }
1135+
public float? SpeedRatio { get; set; }
11241136
SpeechGenerationOptions IJsonModel<SpeechGenerationOptions>.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options);
11251137
void IJsonModel<SpeechGenerationOptions>.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options);
11261138
SpeechGenerationOptions IPersistableModel<SpeechGenerationOptions>.Create(BinaryData data, ModelReaderWriterOptions options);
@@ -1203,7 +1215,7 @@ public class AssistantChatMessage : ChatMessage, IJsonModel<AssistantChatMessage
12031215
AssistantChatMessage IPersistableModel<AssistantChatMessage>.Create(BinaryData data, ModelReaderWriterOptions options);
12041216
string IPersistableModel<AssistantChatMessage>.GetFormatFromOptions(ModelReaderWriterOptions options);
12051217
BinaryData IPersistableModel<AssistantChatMessage>.Write(ModelReaderWriterOptions options);
1206-
protected override void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
1218+
protected internal override void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
12071219
}
12081220
public class ChatClient {
12091221
protected ChatClient();
@@ -1335,7 +1347,7 @@ public abstract class ChatMessage : IJsonModel<ChatMessage>, IPersistableModel<C
13351347
ChatMessage IPersistableModel<ChatMessage>.Create(BinaryData data, ModelReaderWriterOptions options);
13361348
string IPersistableModel<ChatMessage>.GetFormatFromOptions(ModelReaderWriterOptions options);
13371349
BinaryData IPersistableModel<ChatMessage>.Write(ModelReaderWriterOptions options);
1338-
protected abstract void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
1350+
protected internal abstract void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
13391351
}
13401352
public class ChatMessageContentPart : IJsonModel<ChatMessageContentPart>, IPersistableModel<ChatMessageContentPart> {
13411353
public BinaryData ImageBytes { get; }
@@ -1403,6 +1415,7 @@ public abstract class ChatResponseFormat : IEquatable<ChatResponseFormat>, IJson
14031415
[EditorBrowsable(EditorBrowsableState.Never)]
14041416
bool IEquatable<ChatResponseFormat>.Equals(ChatResponseFormat other);
14051417
public override string ToString();
1418+
protected internal abstract void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
14061419
}
14071420
public class ChatTokenLogProbabilityInfo : IJsonModel<ChatTokenLogProbabilityInfo>, IPersistableModel<ChatTokenLogProbabilityInfo> {
14081421
public float LogProbability { get; }
@@ -1510,7 +1523,7 @@ public class FunctionChatMessage : ChatMessage, IJsonModel<FunctionChatMessage>,
15101523
FunctionChatMessage IPersistableModel<FunctionChatMessage>.Create(BinaryData data, ModelReaderWriterOptions options);
15111524
string IPersistableModel<FunctionChatMessage>.GetFormatFromOptions(ModelReaderWriterOptions options);
15121525
BinaryData IPersistableModel<FunctionChatMessage>.Write(ModelReaderWriterOptions options);
1513-
protected override void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
1526+
protected internal override void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
15141527
}
15151528
public readonly partial struct ImageChatMessageContentPartDetail : IEquatable<ImageChatMessageContentPartDetail> {
15161529
private readonly object _dummy;
@@ -1589,7 +1602,7 @@ public class SystemChatMessage : ChatMessage, IJsonModel<SystemChatMessage>, IPe
15891602
SystemChatMessage IPersistableModel<SystemChatMessage>.Create(BinaryData data, ModelReaderWriterOptions options);
15901603
string IPersistableModel<SystemChatMessage>.GetFormatFromOptions(ModelReaderWriterOptions options);
15911604
BinaryData IPersistableModel<SystemChatMessage>.Write(ModelReaderWriterOptions options);
1592-
protected override void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
1605+
protected internal override void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
15931606
}
15941607
public class ToolChatMessage : ChatMessage, IJsonModel<ToolChatMessage>, IPersistableModel<ToolChatMessage> {
15951608
public ToolChatMessage(string toolCallId, params ChatMessageContentPart[] contentParts);
@@ -1601,7 +1614,7 @@ public class ToolChatMessage : ChatMessage, IJsonModel<ToolChatMessage>, IPersis
16011614
ToolChatMessage IPersistableModel<ToolChatMessage>.Create(BinaryData data, ModelReaderWriterOptions options);
16021615
string IPersistableModel<ToolChatMessage>.GetFormatFromOptions(ModelReaderWriterOptions options);
16031616
BinaryData IPersistableModel<ToolChatMessage>.Write(ModelReaderWriterOptions options);
1604-
protected override void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
1617+
protected internal override void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
16051618
}
16061619
public class UserChatMessage : ChatMessage, IJsonModel<UserChatMessage>, IPersistableModel<UserChatMessage> {
16071620
public UserChatMessage(params ChatMessageContentPart[] content);
@@ -1613,7 +1626,7 @@ public class UserChatMessage : ChatMessage, IJsonModel<UserChatMessage>, IPersis
16131626
UserChatMessage IPersistableModel<UserChatMessage>.Create(BinaryData data, ModelReaderWriterOptions options);
16141627
string IPersistableModel<UserChatMessage>.GetFormatFromOptions(ModelReaderWriterOptions options);
16151628
BinaryData IPersistableModel<UserChatMessage>.Write(ModelReaderWriterOptions options);
1616-
protected override void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
1629+
protected internal override void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
16171630
}
16181631
}
16191632
namespace OpenAI.Embeddings {

examples/CombinationExamples.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public void AlpacaArtAssessor()
5353
GeneratedSpeechVoice.Fable,
5454
new SpeechGenerationOptions()
5555
{
56-
Speed = 0.9f,
56+
SpeedRatio = 0.9f,
5757
ResponseFormat = GeneratedSpeechFormat.Opus,
5858
});
5959
FileInfo ttsFileInfo = new($"{chatCompletion.Id}.opus");
@@ -89,7 +89,7 @@ public async Task CuriousCreatureCreator()
8989
GeneratedSpeechVoice.Onyx,
9090
new SpeechGenerationOptions()
9191
{
92-
Speed = 1.1f,
92+
SpeedRatio = 1.1f,
9393
ResponseFormat = GeneratedSpeechFormat.Opus,
9494
});
9595
_ = Task.Run(async () =>
@@ -136,7 +136,7 @@ public async Task CuriousCreatureCreator()
136136
GeneratedSpeechVoice.Fable,
137137
new SpeechGenerationOptions()
138138
{
139-
Speed = 0.9f,
139+
SpeedRatio = 0.9f,
140140
ResponseFormat = GeneratedSpeechFormat.Opus,
141141
});
142142
FileInfo criticAudioFileInfo = new($"{criticalAppraisalResult.Value.Id}-appraisal.opus");

src/Custom/Assistants/CodeInterpreterToolDefinition.Serialization.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ void IJsonModel<CodeInterpreterToolDefinition>.Write(Utf8JsonWriter writer, Mode
1212
internal static void SerializeCodeInterpreterToolDefinition(CodeInterpreterToolDefinition instance, Utf8JsonWriter writer, ModelReaderWriterOptions options)
1313
=> instance.WriteCore(writer, options);
1414

15-
protected override void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options)
15+
protected internal override void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options)
1616
{
1717
writer.WriteStartObject();
1818
writer.WritePropertyName("type"u8);

src/Custom/Assistants/FileSearchToolDefinition.Serialization.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ void IJsonModel<FileSearchToolDefinition>.Write(Utf8JsonWriter writer, ModelRead
1212
internal static void SerializeFileSearchToolDefinition(FileSearchToolDefinition instance, Utf8JsonWriter writer, ModelReaderWriterOptions options)
1313
=> instance.WriteCore(writer, options);
1414

15-
protected override void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options)
15+
protected internal override void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options)
1616
{
1717
writer.WriteStartObject();
1818
writer.WritePropertyName("type"u8);

src/Custom/Assistants/FunctionToolDefinition.Serialization.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ void IJsonModel<FunctionToolDefinition>.Write(Utf8JsonWriter writer, ModelReader
1212
internal static void SerializeFunctionToolDefinition(FunctionToolDefinition instance, Utf8JsonWriter writer, ModelReaderWriterOptions options)
1313
=> instance.WriteCore(writer, options);
1414

15-
protected override void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options)
15+
protected internal override void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options)
1616
{
1717
writer.WriteStartObject();
1818
writer.WritePropertyName("function"u8);

src/Custom/Assistants/Internal/UnknownAssistantToolDefinition.Serialization.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ void IJsonModel<ToolDefinition>.Write(Utf8JsonWriter writer, ModelReaderWriterOp
1212
internal static void SerializeUnknownAssistantToolDefinition(UnknownAssistantToolDefinition instance, Utf8JsonWriter writer, ModelReaderWriterOptions options)
1313
=> instance.WriteCore(writer, options);
1414

15-
protected override void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options)
15+
protected internal override void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options)
1616
{
1717
writer.WriteStartObject();
1818
writer.WritePropertyName("type"u8);

src/Custom/Assistants/ToolDefinition.Serialization.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,5 @@ void IJsonModel<ToolDefinition>.Write(Utf8JsonWriter writer, ModelReaderWriterOp
1212
internal static void WriteCore(ToolDefinition instance, Utf8JsonWriter writer, ModelReaderWriterOptions options)
1313
=> instance.WriteCore(writer, options);
1414

15-
protected abstract void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
15+
protected internal abstract void WriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
1616
}
Lines changed: 2 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,7 @@
11
namespace OpenAI.Audio;
22

3-
/// <summary>
4-
/// Represents an audio data format available as either input or output into an audio operation.
5-
/// </summary>
3+
/// <summary> The audio format in which to generate the speech. </summary>
64
[CodeGenModel("CreateSpeechRequestResponseFormat")]
7-
public enum GeneratedSpeechFormat
5+
public readonly partial struct GeneratedSpeechFormat
86
{
9-
/// <summary> MP3. /// </summary>
10-
[CodeGenMember("Mp3")]
11-
Mp3,
12-
13-
/// <summary> Opus. /// </summary>
14-
[CodeGenMember("Opus")]
15-
Opus,
16-
17-
/// <summary> AAC (advanced audio coding). /// </summary>
18-
[CodeGenMember("Aac")]
19-
Aac,
20-
21-
/// <summary> FLAC (free lossless audio codec). /// </summary>
22-
[CodeGenMember("Flac")]
23-
Flac,
24-
25-
/// <summary> WAV. /// </summary>
26-
[CodeGenMember("Wav")]
27-
Wav,
28-
29-
/// <summary> PCM (pulse-code modulation). /// </summary>
30-
[CodeGenMember("Pcm")]
31-
Pcm,
327
}
Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,40 @@
11
namespace OpenAI.Audio;
22

3-
/// <summary>
4-
/// A representation of additional options available to control the behavior of a text-to-speech audio generation
5-
/// operation.
6-
/// </summary>
3+
/// <summary> The options to configure text-to-speech audio generation. </summary>
74
[CodeGenModel("CreateSpeechRequest")]
85
[CodeGenSuppress("SpeechGenerationOptions", typeof(InternalCreateSpeechRequestModel), typeof(string), typeof(GeneratedSpeechVoice))]
96
public partial class SpeechGenerationOptions
107
{
118
// CUSTOM:
129
// - Made internal. The model is specified by the client.
1310
// - Added setter.
14-
/// <summary> One of the available [TTS models](/docs/models/tts): `tts-1` or `tts-1-hd`. </summary>
11+
[CodeGenMember("Model")]
1512
internal InternalCreateSpeechRequestModel Model { get; set; }
1613

1714
// CUSTOM:
1815
// - Made internal. This value comes from a parameter on the client method.
1916
// - Added setter.
2017
/// <summary> The text to generate audio for. The maximum length is 4096 characters. </summary>
18+
[CodeGenMember("Input")]
2119
internal string Input { get; set; }
2220

2321
// CUSTOM:
2422
// - Made internal. This value comes from a parameter on the client method.
2523
// - Added setter.
26-
/// <summary>
27-
/// The voice to use when generating the audio. Supported voices are `alloy`, `echo`, `fable`,
28-
/// `onyx`, `nova`, and `shimmer`. Previews of the voices are available in the
29-
/// [Text to speech guide](/docs/guides/text-to-speech/voice-options).
30-
/// </summary>
24+
[CodeGenMember("Voice")]
3125
internal GeneratedSpeechVoice Voice { get; set; }
3226

3327
// CUSTOM: Made public now that there are no required properties.
3428
/// <summary> Initializes a new instance of <see cref="SpeechGenerationOptions"/>. </summary>
3529
public SpeechGenerationOptions()
3630
{
3731
}
32+
33+
// CUSTOM: Renamed.
34+
/// <summary>
35+
/// The speed of the generated audio expressed as a ratio between 0.5 and 2.0. The default is 1.0.
36+
/// </summary>
37+
[CodeGenMember("Speed")]
38+
39+
public float? SpeedRatio { get; set; }
3840
}

0 commit comments

Comments
 (0)