diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..5002c4566 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,188 @@ +# editorconfig.org + +# top-most EditorConfig file +root = true + +[*] +trim_trailing_whitespace = true + +# Default settings: +# A newline ending every file +# Use 4 spaces as indentation +[sdk/*/{Azure.*,System.*}/**] +insert_final_newline = true +indent_style = space +indent_size = 4 + +# C# files +[src/*/{Custom.*}/**.cs] +# New line preferences +csharp_new_line_before_open_brace = all # vs-default: any +csharp_new_line_before_else = true # vs-default: true +csharp_new_line_before_catch = true # vs-default: true +csharp_new_line_before_finally = true # vs-default: true +csharp_new_line_before_members_in_object_initializers = true # vs-default: true +csharp_new_line_before_members_in_anonymous_types = true # vs-default: true +csharp_new_line_between_query_expression_clauses = true # vs-default: true + +# Indentation preferences +csharp_indent_block_contents = true # vs-default: true +csharp_indent_braces = false # vs-default: false +csharp_indent_case_contents = true # vs-default: true +csharp_indent_case_contents_when_block = true +csharp_indent_switch_labels = true # vs-default: true +csharp_indent_labels = one_less_than_current # vs-default: one_less_than_current + +# Modifier preferences +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion + +# avoid this. unless absolutely necessary +dotnet_style_qualification_for_field = false:suggestion # vs-default: false:none +dotnet_style_qualification_for_property = false:suggestion # vs-default: false:none +dotnet_style_qualification_for_method = false:suggestion # vs-default: false:none +dotnet_style_qualification_for_event = false:suggestion # vs-default: false:none + +# only use var when it's obvious what the variable type is +csharp_style_var_for_built_in_types = false:none # vs-default: true:none +csharp_style_var_when_type_is_apparent = false:none # vs-default: true:none +csharp_style_var_elsewhere = false:suggestion # vs-default: true:none + +# use language keywords instead of BCL types +dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion # vs-default: true:none +dotnet_style_predefined_type_for_member_access = true:suggestion # vs-default: true:none + +# name all constant fields using PascalCase +dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields +dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style + +dotnet_naming_symbols.constant_fields.applicable_kinds = field +dotnet_naming_symbols.constant_fields.required_modifiers = const + +dotnet_naming_style.pascal_case_style.capitalization = pascal_case + +# static fields should have s_ prefix +dotnet_naming_rule.static_fields_should_have_prefix.severity = suggestion +dotnet_naming_rule.static_fields_should_have_prefix.symbols = static_fields +dotnet_naming_rule.static_fields_should_have_prefix.style = static_prefix_style + +dotnet_naming_symbols.static_fields.applicable_kinds = field +dotnet_naming_symbols.static_fields.required_modifiers = static +dotnet_naming_symbols.static_fields.applicable_accessibilities = private, internal, private_protected +dotnet_naming_style.static_prefix_style.required_prefix = s_ +dotnet_naming_style.static_prefix_style.capitalization = camel_case + +# internal and private fields should be _camelCase +dotnet_naming_rule.camel_case_for_private_internal_fields.severity = suggestion +dotnet_naming_rule.camel_case_for_private_internal_fields.symbols = private_internal_fields +dotnet_naming_rule.camel_case_for_private_internal_fields.style = camel_case_underscore_style + +dotnet_naming_symbols.private_internal_fields.applicable_kinds = field +dotnet_naming_symbols.private_internal_fields.applicable_accessibilities = private, internal + +dotnet_naming_style.camel_case_underscore_style.required_prefix = _ +dotnet_naming_style.camel_case_underscore_style.capitalization = camel_case + +# Code style defaults +csharp_using_directive_placement = outside_namespace:suggestion +dotnet_sort_system_directives_first = true # vs-default: true +csharp_prefer_braces = true:refactoring +csharp_preserve_single_line_blocks = true # vs-default: true +csharp_preserve_single_line_statements = false # vs-default: true +csharp_prefer_static_local_function = true:suggestion +csharp_prefer_simple_using_statement = false:none +csharp_style_prefer_switch_expression = true:suggestion + +# Code quality +dotnet_style_readonly_field = true:suggestion +dotnet_code_quality_unused_parameters = non_public:suggestion + +# Expression-level preferences +dotnet_style_object_initializer = true:suggestion # vs-default: true:suggestion +dotnet_style_collection_initializer = true:suggestion # vs-default: true:suggestion +dotnet_style_explicit_tuple_names = true:suggestion # vs-default: true:suggestion +dotnet_style_coalesce_expression = true:suggestion # vs-default: true:suggestion +dotnet_style_null_propagation = true:suggestion # vs-default: true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_auto_properties = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:refactoring +dotnet_style_prefer_conditional_expression_over_return = true:refactoring +csharp_prefer_simple_default_expression = true:suggestion + +# Expression-bodied members +csharp_style_expression_bodied_methods = false:none # vs-default: false:none +csharp_style_expression_bodied_constructors = false:none # vs-default: false:none +csharp_style_expression_bodied_operators = false:none # vs-default: false:none +csharp_style_expression_bodied_properties = true:none # vs-default: true:none +csharp_style_expression_bodied_indexers = true:none # vs-default: true:none +csharp_style_expression_bodied_accessors = true:none # vs-default: true:none +csharp_style_expression_bodied_lambdas = true:refactoring +csharp_style_expression_bodied_local_functions = true:refactoring + +# Pattern matching +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion # vs-default: true:suggestion +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion # vs-default: true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion # vs-default: true:suggestion + +# Null checking preferences +csharp_style_throw_expression = true:suggestion # vs-default: true:suggestion +csharp_style_conditional_delegate_call = true:suggestion # vs-default: true:suggestion + +# Other features +csharp_style_prefer_index_operator = false:none +csharp_style_prefer_range_operator = false:none +csharp_style_pattern_local_over_anonymous_function = false:none + +# Space preferences +csharp_space_after_cast = false # vs-default: false +csharp_space_after_colon_in_inheritance_clause = true # vs-default: true +csharp_space_after_comma = true # vs-default: true +csharp_space_after_dot = false # vs-default: false +csharp_space_after_keywords_in_control_flow_statements = true # vs-default: true +csharp_space_after_semicolon_in_for_statement = true # vs-default: true +csharp_space_around_binary_operators = before_and_after # vs-default: before_and_after +csharp_space_around_declaration_statements = do_not_ignore # vs-default: false +csharp_space_before_colon_in_inheritance_clause = true # vs-default: true +csharp_space_before_comma = false # vs-default: false +csharp_space_before_dot = false # vs-default: false +csharp_space_before_open_square_brackets = false # vs-default: false +csharp_space_before_semicolon_in_for_statement = false # vs-default: false +csharp_space_between_empty_square_brackets = false # vs-default: false +csharp_space_between_method_call_empty_parameter_list_parentheses = false # vs-default: false +csharp_space_between_method_call_name_and_opening_parenthesis = false # vs-default: false +csharp_space_between_method_call_parameter_list_parentheses = false # vs-default: false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false # vs-default: false +csharp_space_between_method_declaration_name_and_open_parenthesis = false # vs-default: false +csharp_space_between_method_declaration_parameter_list_parentheses = false # vs-default: false +csharp_space_between_parentheses = false # vs-default: false +csharp_space_between_square_brackets = false # vs-default: false + +# Require accessibility modifiers +dotnet_style_require_accessibility_modifiers = for_non_interface_members:suggestion # vs-default: for_non_interface_members:none + +# Analyzers +dotnet_code_quality.ca1802.api_surface = private, internal + +# Xml project files +[*.{csproj,vcxproj,vcxproj.filters,proj,nativeproj,locproj}] +indent_size = 2 + +# Xml build files +[*.builds] +indent_size = 2 + +# Xml files +[*.{xml,stylecop,resx,ruleset}] +indent_size = 2 + +# Xml config files +[*.{props,targets,config,nuspec}] +indent_size = 2 + +# Shell scripts +[*.sh] +end_of_line = lf +[*.{cmd, bat}] +end_of_line = crlf \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 276d75def..f311bd285 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,26 @@ # Release History +## 2.1.0-beta.2 (Unreleased) + +### Features added + +- Added a `StoredOutputEnabled` property to `ChatCompletionOptions` ([`store` in the REST API](https://platform.openai.com/docs/api-reference/chat/create#chat-create-store)). (commit_hash) + - Use this property to indicate whether or not to store the output of the chat completion for use in model distillation or evals. +- Added a `Metadata` property to `ChatCompletionOptions` ([`metadata` in the REST API](https://platform.openai.com/docs/api-reference/chat/create#chat-create-metadata)). (commit_hash) + - Use this property to add custom tags and values to the chat completions for filtering in the OpenAI dashboard. +- Added an `InputTokenDetails` property to `ChatTokenUsage` ([`usage.prompt_token_details` in the REST API](https://platform.openai.com/docs/api-reference/chat/object#chat/object-usage)). (commit_hash) + - The property is of a new type called `ChatInputTokenUsageDetails`, which contains properties for `AudioTokenCount` and `CachedTokenCount` for usage with supported models. +- Added an `AudioTokenCount` property to `ChatOutputTokenUsageDetails` ([`usage.completion_token_details` in the REST API](https://platform.openai.com/docs/api-reference/chat/object#chat/object-usage)). Audio support in chat completions is coming soon. (commit_hash) +- Added `Illicit` and `IllictViolent` properties `ModerationResult` to represent these two new moderation categories. (commit_hash) +- Made improvements to the experimental Realtime API. Please note this features area is currently under rapid development and not all changes may be reflected here. (commit_hash) + - Several types have been renamed for consistency and clarity. + - `ConversationRateLimitsUpdate` (previously `ConversationRateLimitsUpdatedUpdate`) now includes named `RequestDetails` and `TokenDetails` properties, mapping to the corresponding named items in the underlying `rate_limits` command payload. + +### Other Changes + +- Updated the `System.ClientModel` dependency to version `1.2.1`. (commit_hash) + - This updates the `System.Text.Json` transitive dependency to version `6.0.10`, which includes a security compliance fix for [CVE-2024-43485](https://github.com/advisories/GHSA-8g4q-xg66-9fp4). Please note that the OpenAI library was not impacted by this vulnerability since it does not use the `[JsonExtensionData]` feature. + ## 2.1.0-beta.1 (2024-10-01) With this updated preview library release, we're excited to bring early support for the newly-announced `/realtime` beta API. You can read more about `/realtime` here: https://openai.com/index/introducing-the-realtime-api/ diff --git a/README.md b/README.md index a00a238c0..0f5a75d9b 100644 --- a/README.md +++ b/README.md @@ -856,4 +856,4 @@ By default, the client classes will automatically retry the following errors up ### Observability -OpenAI .NET library supports experimental distributed tracing and metrics with OpenTelemetry. Check out [Observability with OpenTelemetry](./docs/observability.md) for more details. +OpenAI .NET library supports experimental distributed tracing and metrics with OpenTelemetry. Check out [Observability with OpenTelemetry](./docs/observability.md) for more details. \ No newline at end of file diff --git a/api/OpenAI.netstandard2.0.cs b/api/OpenAI.netstandard2.0.cs index 7f0e8779c..90fdcfcd1 100644 --- a/api/OpenAI.netstandard2.0.cs +++ b/api/OpenAI.netstandard2.0.cs @@ -1380,10 +1380,12 @@ public class ChatCompletionOptions : IJsonModel, IPersist public bool? IncludeLogProbabilities { get; set; } public IDictionary LogitBiases { get; } public int? MaxOutputTokenCount { get; set; } + public IDictionary Metadata { get; } public float? PresencePenalty { get; set; } public ChatResponseFormat ResponseFormat { get; set; } public long? Seed { get; set; } public IList StopSequences { get; } + public bool? StoredOutputEnabled { get; set; } public float? Temperature { get; set; } public ChatToolChoice ToolChoice { get; set; } public IList Tools { get; } @@ -1453,6 +1455,15 @@ public class ChatFunctionChoice : IJsonModel, IPersistableMo public static bool operator !=(ChatImageDetailLevel left, ChatImageDetailLevel right); public override readonly string ToString(); } + public class ChatInputTokenUsageDetails : IJsonModel, IPersistableModel { + public int? AudioTokenCount { get; } + public int? CachedTokenCount { get; } + ChatInputTokenUsageDetails IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); + ChatInputTokenUsageDetails IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); + } public class ChatMessage : IJsonModel, IPersistableModel { public ChatMessageContent Content { get; } public static AssistantChatMessage CreateAssistantMessage(ChatCompletion chatCompletion); @@ -1517,6 +1528,7 @@ public enum ChatMessageRole { Function = 4 } public class ChatOutputTokenUsageDetails : IJsonModel, IPersistableModel { + public int? AudioTokenCount { get; } public int ReasoningTokenCount { get; } ChatOutputTokenUsageDetails IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); @@ -1557,6 +1569,7 @@ public class ChatTokenTopLogProbabilityDetails : IJsonModel, IPersistableModel { public int InputTokenCount { get; } + public ChatInputTokenUsageDetails InputTokenDetails { get; } public int OutputTokenCount { get; } public ChatOutputTokenUsageDetails OutputTokenDetails { get; } public int TotalTokenCount { get; } @@ -1620,10 +1633,11 @@ public class FunctionChatMessage : ChatMessage, IJsonModel, } public static class OpenAIChatModelFactory { public static ChatCompletion ChatCompletion(string id = null, ChatFinishReason finishReason = ChatFinishReason.Stop, ChatMessageContent content = null, string refusal = null, IEnumerable toolCalls = null, ChatMessageRole role = ChatMessageRole.System, ChatFunctionCall functionCall = null, IEnumerable contentTokenLogProbabilities = null, IEnumerable refusalTokenLogProbabilities = null, DateTimeOffset createdAt = default, string model = null, string systemFingerprint = null, ChatTokenUsage usage = null); - public static ChatOutputTokenUsageDetails ChatOutputTokenUsageDetails(int reasoningTokenCount = 0); + public static ChatInputTokenUsageDetails ChatInputTokenUsageDetails(int? audioTokenCount = null, int? cachedTokenCount = null); + public static ChatOutputTokenUsageDetails ChatOutputTokenUsageDetails(int reasoningTokenCount = 0, int? audioTokenCount = null); public static ChatTokenLogProbabilityDetails ChatTokenLogProbabilityDetails(string token = null, float logProbability = 0, ReadOnlyMemory? utf8Bytes = null, IEnumerable topLogProbabilities = null); public static ChatTokenTopLogProbabilityDetails ChatTokenTopLogProbabilityDetails(string token = null, float logProbability = 0, ReadOnlyMemory? utf8Bytes = null); - public static ChatTokenUsage ChatTokenUsage(int outputTokenCount = 0, int inputTokenCount = 0, int totalTokenCount = 0, ChatOutputTokenUsageDetails outputTokenDetails = null); + public static ChatTokenUsage ChatTokenUsage(int outputTokenCount = 0, int inputTokenCount = 0, int totalTokenCount = 0, ChatOutputTokenUsageDetails outputTokenDetails = null, ChatInputTokenUsageDetails inputTokenDetails = null); public static StreamingChatCompletionUpdate StreamingChatCompletionUpdate(string completionId = null, ChatMessageContent contentUpdate = null, StreamingChatFunctionCallUpdate functionCallUpdate = null, IEnumerable toolCallUpdates = null, ChatMessageRole? role = null, string refusalUpdate = null, IEnumerable contentTokenLogProbabilities = null, IEnumerable refusalTokenLogProbabilities = null, ChatFinishReason? finishReason = null, DateTimeOffset createdAt = default, string model = null, string systemFingerprint = null, ChatTokenUsage usage = null); [Obsolete("This class is obsolete. Please use StreamingChatToolCallUpdate instead.")] public static StreamingChatFunctionCallUpdate StreamingChatFunctionCallUpdate(string functionName = null, BinaryData functionArgumentsUpdate = null); @@ -2155,7 +2169,15 @@ public static class OpenAIModelsModelFactory { } } namespace OpenAI.Moderations { + [Flags] + public enum ModerationApplicableInputKinds { + None = 0, + Other = 1, + Text = 2, + Image = 4 + } public class ModerationCategory { + public ModerationApplicableInputKinds ApplicableInputKinds { get; } public bool Flagged { get; } public float Score { get; } } @@ -2181,6 +2203,8 @@ public class ModerationResult : IJsonModel, IPersistableModel< public ModerationCategory HarassmentThreatening { get; } public ModerationCategory Hate { get; } public ModerationCategory HateThreatening { get; } + public ModerationCategory Illicit { get; } + public ModerationCategory IllicitViolent { get; } public ModerationCategory SelfHarm { get; } public ModerationCategory SelfHarmInstructions { get; } public ModerationCategory SelfHarmIntent { get; } @@ -2204,35 +2228,12 @@ public class ModerationResultCollection : ObjectModel.ReadOnlyCollection.Write(ModelReaderWriterOptions options); } public static class OpenAIModerationsModelFactory { - public static ModerationCategory ModerationCategory(bool flagged = false, float score = 0); - public static ModerationResult ModerationResult(bool flagged = false, ModerationCategory hate = null, ModerationCategory hateThreatening = null, ModerationCategory harassment = null, ModerationCategory harassmentThreatening = null, ModerationCategory selfHarm = null, ModerationCategory selfHarmIntent = null, ModerationCategory selfHarmInstructions = null, ModerationCategory sexual = null, ModerationCategory sexualMinors = null, ModerationCategory violence = null, ModerationCategory violenceGraphic = null); + public static ModerationCategory ModerationCategory(bool flagged = false, float score = 0, ModerationApplicableInputKinds applicableInputKinds = ModerationApplicableInputKinds.None); + public static ModerationResult ModerationResult(bool flagged = false, ModerationCategory hate = null, ModerationCategory hateThreatening = null, ModerationCategory harassment = null, ModerationCategory harassmentThreatening = null, ModerationCategory selfHarm = null, ModerationCategory selfHarmIntent = null, ModerationCategory selfHarmInstructions = null, ModerationCategory sexual = null, ModerationCategory sexualMinors = null, ModerationCategory violence = null, ModerationCategory violenceGraphic = null, ModerationCategory illicit = null, ModerationCategory illicitViolent = null); public static ModerationResultCollection ModerationResultCollection(string id = null, string model = null, IEnumerable items = null); } } namespace OpenAI.RealtimeConversation { - public class ConversationAudioDeltaUpdate : ConversationUpdate, IJsonModel, IPersistableModel { - public int ContentIndex { get; } - public BinaryData Delta { get; } - public string ItemId { get; } - public int OutputIndex { get; } - public string ResponseId { get; } - ConversationAudioDeltaUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); - ConversationAudioDeltaUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); - } - public class ConversationAudioDoneUpdate : ConversationUpdate, IJsonModel, IPersistableModel { - public int ContentIndex { get; } - public string ItemId { get; } - public int OutputIndex { get; } - public string ResponseId { get; } - ConversationAudioDoneUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); - ConversationAudioDoneUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); - } public readonly partial struct ConversationAudioFormat : IEquatable { private readonly object _dummy; private readonly int _dummyPrimitive; @@ -2256,9 +2257,8 @@ public enum ConversationContentModalities { Audio = 2 } public abstract class ConversationContentPart : IJsonModel, IPersistableModel { - public string AudioTranscriptValue { get; } - public ConversationContentPartKind Kind { get; } - public string TextValue { get; } + public string AudioTranscript { get; } + public string Text { get; } public static ConversationContentPart FromInputAudioTranscript(string transcript = null); public static ConversationContentPart FromInputText(string text); public static ConversationContentPart FromOutputAudioTranscript(string transcript = null); @@ -2270,28 +2270,14 @@ public abstract class ConversationContentPart : IJsonModel.GetFormatFromOptions(ModelReaderWriterOptions options); BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); } - public class ConversationContentPartFinishedUpdate : ConversationUpdate, IJsonModel, IPersistableModel { - public string AudioTranscript { get; } - public int ContentIndex { get; } - public ConversationContentPartKind ContentKind { get; } - public string ItemId { get; } - public int OutputIndex { get; } - public string ResponseId { get; } - public string Text { get; } - ConversationContentPartFinishedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); - ConversationContentPartFinishedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); - } public readonly partial struct ConversationContentPartKind : IEquatable { private readonly object _dummy; private readonly int _dummyPrimitive; public ConversationContentPartKind(string value); - public static ConversationContentPartKind Audio { get; } public static ConversationContentPartKind InputAudio { get; } public static ConversationContentPartKind InputText { get; } - public static ConversationContentPartKind Text { get; } + public static ConversationContentPartKind OutputAudio { get; } + public static ConversationContentPartKind OutputText { get; } public readonly bool Equals(ConversationContentPartKind other); [EditorBrowsable(EditorBrowsableState.Never)] public override readonly bool Equals(object obj); @@ -2302,56 +2288,17 @@ public class ConversationContentPartFinishedUpdate : ConversationUpdate, IJsonMo public static bool operator !=(ConversationContentPartKind left, ConversationContentPartKind right); public override readonly string ToString(); } - public class ConversationContentPartStartedUpdate : ConversationUpdate, IJsonModel, IPersistableModel { - public string AudioTranscript { get; } - public int ContentIndex { get; } - public ConversationContentPartKind ContentKind { get; } - public string ItemId { get; } - public int OutputIndex { get; } - public string ResponseId { get; } - public string Text { get; } - ConversationContentPartStartedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); - ConversationContentPartStartedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); - } public class ConversationErrorUpdate : ConversationUpdate, IJsonModel, IPersistableModel { public string ErrorCode { get; } public string ErrorEventId { get; } - public string ErrorMessage { get; } - public string ErrorParameterName { get; } + public string Message { get; } + public string ParameterName { get; } ConversationErrorUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); ConversationErrorUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); } - public class ConversationFunctionCallArgumentsDeltaUpdate : ConversationUpdate, IJsonModel, IPersistableModel { - public string CallId { get; } - public string Delta { get; } - public string ItemId { get; } - public int OutputIndex { get; } - public string ResponseId { get; } - ConversationFunctionCallArgumentsDeltaUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); - ConversationFunctionCallArgumentsDeltaUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); - } - public class ConversationFunctionCallArgumentsDoneUpdate : ConversationUpdate, IJsonModel, IPersistableModel { - public string Arguments { get; } - public string CallId { get; } - public string ItemId { get; } - public string Name { get; } - public int OutputIndex { get; } - public string ResponseId { get; } - ConversationFunctionCallArgumentsDoneUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); - ConversationFunctionCallArgumentsDoneUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); - } public class ConversationFunctionTool : ConversationTool, IJsonModel, IPersistableModel { public ConversationFunctionTool(); public ConversationFunctionTool(string name); @@ -2364,24 +2311,24 @@ public class ConversationFunctionTool : ConversationTool, IJsonModel.GetFormatFromOptions(ModelReaderWriterOptions options); BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); } - public class ConversationInputAudioBufferClearedUpdate : ConversationUpdate, IJsonModel, IPersistableModel { - ConversationInputAudioBufferClearedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); - ConversationInputAudioBufferClearedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); + public class ConversationInputAudioClearedUpdate : ConversationUpdate, IJsonModel, IPersistableModel { + ConversationInputAudioClearedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); + ConversationInputAudioClearedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); } - public class ConversationInputAudioBufferCommittedUpdate : ConversationUpdate, IJsonModel, IPersistableModel { + public class ConversationInputAudioCommittedUpdate : ConversationUpdate, IJsonModel, IPersistableModel { public string ItemId { get; } public string PreviousItemId { get; } - ConversationInputAudioBufferCommittedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); - ConversationInputAudioBufferCommittedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); + ConversationInputAudioCommittedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); + ConversationInputAudioCommittedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); } public class ConversationInputSpeechFinishedUpdate : ConversationUpdate, IJsonModel, IPersistableModel { - public int AudioEndMs { get; } + public TimeSpan AudioEndTime { get; } public string ItemId { get; } ConversationInputSpeechFinishedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); @@ -2390,7 +2337,7 @@ public class ConversationInputSpeechFinishedUpdate : ConversationUpdate, IJsonMo BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); } public class ConversationInputSpeechStartedUpdate : ConversationUpdate, IJsonModel, IPersistableModel { - public int AudioStartMs { get; } + public TimeSpan AudioStartTime { get; } public string ItemId { get; } ConversationInputSpeechStartedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); @@ -2456,13 +2403,20 @@ public abstract class ConversationItem : IJsonModel, IPersista string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); } - public class ConversationItemAcknowledgedUpdate : ConversationUpdate, IJsonModel, IPersistableModel { - public ConversationItem Item { get; } - ConversationItemAcknowledgedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); - ConversationItemAcknowledgedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); + public class ConversationItemCreatedUpdate : ConversationUpdate, IJsonModel, IPersistableModel { + public string FunctionCallArguments { get; } + public string FunctionCallId { get; } + public string FunctionCallOutput { get; } + public string FunctionName { get; } + public string ItemId { get; } + public IReadOnlyList MessageContentParts { get; } + public ConversationMessageRole? MessageRole { get; } + public string PreviousItemId { get; } + ConversationItemCreatedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); + ConversationItemCreatedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); } public class ConversationItemDeletedUpdate : ConversationUpdate, IJsonModel, IPersistableModel { public string ItemId { get; } @@ -2472,56 +2426,124 @@ public class ConversationItemDeletedUpdate : ConversationUpdate, IJsonModel.GetFormatFromOptions(ModelReaderWriterOptions options); BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); } - public class ConversationItemFinishedUpdate : ConversationUpdate, IJsonModel, IPersistableModel { + public readonly partial struct ConversationItemStatus : IEquatable { + private readonly object _dummy; + private readonly int _dummyPrimitive; + public ConversationItemStatus(string value); + public static ConversationItemStatus Completed { get; } + public static ConversationItemStatus Incomplete { get; } + public static ConversationItemStatus InProgress { get; } + public readonly bool Equals(ConversationItemStatus other); + [EditorBrowsable(EditorBrowsableState.Never)] + public override readonly bool Equals(object obj); + [EditorBrowsable(EditorBrowsableState.Never)] + public override readonly int GetHashCode(); + public static bool operator ==(ConversationItemStatus left, ConversationItemStatus right); + public static implicit operator ConversationItemStatus(string value); + public static bool operator !=(ConversationItemStatus left, ConversationItemStatus right); + public override readonly string ToString(); + } + public class ConversationItemStreamingAudioFinishedUpdate : ConversationUpdate, IJsonModel, IPersistableModel { + public int ContentIndex { get; } + public string ItemId { get; } + public int OutputIndex { get; } + public string ResponseId { get; } + ConversationItemStreamingAudioFinishedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); + ConversationItemStreamingAudioFinishedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); + } + public class ConversationItemStreamingAudioTranscriptionFinishedUpdate : ConversationUpdate, IJsonModel, IPersistableModel { + public int ContentIndex { get; } + public string ItemId { get; } + public int OutputIndex { get; } + public string ResponseId { get; } + public string Transcript { get; } + ConversationItemStreamingAudioTranscriptionFinishedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); + ConversationItemStreamingAudioTranscriptionFinishedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); + } + public class ConversationItemStreamingFinishedUpdate : ConversationUpdate, IJsonModel, IPersistableModel { public string FunctionCallArguments { get; } public string FunctionCallId { get; } public string FunctionCallOutput { get; } public string FunctionName { get; } + public string ItemId { get; } public IReadOnlyList MessageContentParts { get; } public ConversationMessageRole? MessageRole { get; } public int OutputIndex { get; } public string ResponseId { get; } - ConversationItemFinishedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); - ConversationItemFinishedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); + ConversationItemStreamingFinishedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); + ConversationItemStreamingFinishedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); + } + public class ConversationItemStreamingPartDeltaUpdate : ConversationUpdate, IJsonModel, IPersistableModel { + public BinaryData AudioBytes { get; } + public string AudioTranscript { get; } + public int ContentPartIndex { get; } + public string FunctionArguments { get; } + public string FunctionCallId { get; } + public string ItemId { get; } + public int ItemIndex { get; } + public string ResponseId { get; } + public string Text { get; } + ConversationItemStreamingPartDeltaUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); + ConversationItemStreamingPartDeltaUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); + } + public class ConversationItemStreamingPartFinishedUpdate : ConversationUpdate, IJsonModel, IPersistableModel { + public string AudioTranscript { get; } + public int ContentPartIndex { get; } + public string FunctionArguments { get; } + public string FunctionCallId { get; } + public string ItemId { get; } + public int ItemIndex { get; } + public string ResponseId { get; } + public string Text { get; } + ConversationItemStreamingPartFinishedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); + ConversationItemStreamingPartFinishedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); } - public class ConversationItemStartedUpdate : ConversationUpdate, IJsonModel, IPersistableModel { + public class ConversationItemStreamingStartedUpdate : ConversationUpdate, IJsonModel, IPersistableModel { public string FunctionCallArguments { get; } public string FunctionCallId { get; } public string FunctionCallOutput { get; } public string FunctionName { get; } + public string ItemId { get; } + public int ItemIndex { get; } public IReadOnlyList MessageContentParts { get; } public ConversationMessageRole? MessageRole { get; } - public int OutputIndex { get; } public string ResponseId { get; } - ConversationItemStartedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); - ConversationItemStartedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); + ConversationItemStreamingStartedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); + ConversationItemStreamingStartedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); } - public readonly partial struct ConversationItemStatus : IEquatable { - private readonly object _dummy; - private readonly int _dummyPrimitive; - public ConversationItemStatus(string value); - public static ConversationItemStatus Completed { get; } - public static ConversationItemStatus Incomplete { get; } - public static ConversationItemStatus InProgress { get; } - public readonly bool Equals(ConversationItemStatus other); - [EditorBrowsable(EditorBrowsableState.Never)] - public override readonly bool Equals(object obj); - [EditorBrowsable(EditorBrowsableState.Never)] - public override readonly int GetHashCode(); - public static bool operator ==(ConversationItemStatus left, ConversationItemStatus right); - public static implicit operator ConversationItemStatus(string value); - public static bool operator !=(ConversationItemStatus left, ConversationItemStatus right); - public override readonly string ToString(); + public class ConversationItemStreamingTextFinishedUpdate : ConversationUpdate, IJsonModel, IPersistableModel { + public int ContentIndex { get; } + public string ItemId { get; } + public int OutputIndex { get; } + public string ResponseId { get; } + public string Text { get; } + ConversationItemStreamingTextFinishedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); + ConversationItemStreamingTextFinishedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); } public class ConversationItemTruncatedUpdate : ConversationUpdate, IJsonModel, IPersistableModel { public int AudioEndMs { get; } - public int Index { get; } + public int ContentIndex { get; } public string ItemId { get; } ConversationItemTruncatedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); @@ -2568,52 +2590,33 @@ public class ConversationOutputTokenUsageDetails : IJsonModel.GetFormatFromOptions(ModelReaderWriterOptions options); BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); } - public class ConversationOutputTranscriptionDeltaUpdate : ConversationUpdate, IJsonModel, IPersistableModel { - public int ContentIndex { get; } - public string Delta { get; } - public string ItemId { get; } - public int OutputIndex { get; } - public string ResponseId { get; } - ConversationOutputTranscriptionDeltaUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); - ConversationOutputTranscriptionDeltaUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); - } - public class ConversationOutputTranscriptionFinishedUpdate : ConversationUpdate, IJsonModel, IPersistableModel { - public int ContentIndex { get; } - public string ItemId { get; } - public int OutputIndex { get; } - public string ResponseId { get; } - ConversationOutputTranscriptionFinishedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); - ConversationOutputTranscriptionFinishedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); - } public class ConversationRateLimitDetailsItem : IJsonModel, IPersistableModel { - public int Limit { get; } + public int MaximumCount { get; } public string Name { get; } - public int Remaining { get; } - public float ResetSeconds { get; } + public int RemainingCount { get; } + public TimeSpan TimeUntilReset { get; } ConversationRateLimitDetailsItem IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); ConversationRateLimitDetailsItem IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); } - public class ConversationRateLimitsUpdatedUpdate : ConversationUpdate, IJsonModel, IPersistableModel { - public IReadOnlyList RateLimits { get; } - ConversationRateLimitsUpdatedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); - ConversationRateLimitsUpdatedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); + public class ConversationRateLimitsUpdate : ConversationUpdate, IJsonModel, IPersistableModel { + public IReadOnlyList AllDetails { get; } + public ConversationRateLimitDetailsItem RequestDetails { get; } + public ConversationRateLimitDetailsItem TokenDetails { get; } + ConversationRateLimitsUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); + ConversationRateLimitsUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); } public class ConversationResponseFinishedUpdate : ConversationUpdate, IJsonModel, IPersistableModel { public IReadOnlyList CreatedItems { get; } - public string Id { get; } + public string ResponseId { get; } public ConversationStatus? Status { get; } + public ConversationStatusDetails StatusDetails { get; } + public ConversationTokenUsage Usage { get; } ConversationResponseFinishedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); ConversationResponseFinishedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); @@ -2621,6 +2624,11 @@ public class ConversationResponseFinishedUpdate : ConversationUpdate, IJsonModel BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); } public class ConversationResponseStartedUpdate : ConversationUpdate, IJsonModel, IPersistableModel { + public IReadOnlyList CreatedItems { get; } + public string ResponseId { get; } + public ConversationStatus Status { get; } + public ConversationStatusDetails StatusDetails { get; } + public ConversationTokenUsage Usage { get; } ConversationResponseStartedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); ConversationResponseStartedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); @@ -2630,6 +2638,7 @@ public class ConversationResponseStartedUpdate : ConversationUpdate, IJsonModel< public class ConversationSessionConfiguredUpdate : ConversationUpdate, IJsonModel, IPersistableModel { public ConversationContentModalities ContentModalities { get; } public ConversationAudioFormat InputAudioFormat { get; } + public ConversationInputTranscriptionOptions InputTranscriptionOptions { get; } public string Instructions { get; } public ConversationMaxTokensChoice MaxOutputTokens { get; } public string Model { get; } @@ -2638,8 +2647,7 @@ public class ConversationSessionConfiguredUpdate : ConversationUpdate, IJsonMode public float Temperature { get; } public ConversationToolChoice ToolChoice { get; } public IReadOnlyList Tools { get; } - public ConversationInputTranscriptionOptions TranscriptionSettings { get; } - public ConversationTurnDetectionOptions TurnDetectionSettings { get; } + public ConversationTurnDetectionOptions TurnDetectionOptions { get; } public ConversationVoice Voice { get; } ConversationSessionConfiguredUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); @@ -2652,8 +2660,7 @@ public class ConversationSessionOptions : IJsonModel public ConversationAudioFormat? InputAudioFormat { get; set; } public ConversationInputTranscriptionOptions InputTranscriptionOptions { get; set; } public string Instructions { get; set; } - public ConversationMaxTokensChoice MaxResponseOutputTokens { get; set; } - public string Model { get; set; } + public ConversationMaxTokensChoice MaxOutputTokens { get; set; } public ConversationAudioFormat? OutputAudioFormat { get; set; } public float? Temperature { get; set; } public ConversationToolChoice ToolChoice { get; set; } @@ -2669,6 +2676,7 @@ public class ConversationSessionOptions : IJsonModel public class ConversationSessionStartedUpdate : ConversationUpdate, IJsonModel, IPersistableModel { public ConversationContentModalities ContentModalities { get; } public ConversationAudioFormat InputAudioFormat { get; } + public ConversationInputTranscriptionOptions InputTranscriptionOptions { get; } public string Instructions { get; } public ConversationMaxTokensChoice MaxOutputTokens { get; } public string Model { get; } @@ -2677,8 +2685,7 @@ public class ConversationSessionStartedUpdate : ConversationUpdate, IJsonModel Tools { get; } - public ConversationInputTranscriptionOptions TranscriptionSettings { get; } - public ConversationTurnDetectionOptions TurnDetectionSettings { get; } + public ConversationTurnDetectionOptions TurnDetectionOptions { get; } public ConversationVoice Voice { get; } ConversationSessionStartedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); @@ -2705,29 +2712,13 @@ public class ConversationSessionStartedUpdate : ConversationUpdate, IJsonModel, IPersistableModel { - public int ContentIndex { get; } - public string Delta { get; } - public string ItemId { get; } - public int OutputIndex { get; } - public string ResponseId { get; } - ConversationTextDeltaUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); - ConversationTextDeltaUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); - } - public class ConversationTextDoneUpdate : ConversationUpdate, IJsonModel, IPersistableModel { - public int ContentIndex { get; } - public string ItemId { get; } - public int OutputIndex { get; } - public string ResponseId { get; } - public string Value { get; } - ConversationTextDoneUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); - ConversationTextDoneUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); + public abstract class ConversationStatusDetails : IJsonModel, IPersistableModel { + public ConversationStatus StatusKind { get; } + ConversationStatusDetails IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options); + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options); + ConversationStatusDetails IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options); + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options); + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); } public class ConversationTokenUsage : IJsonModel, IPersistableModel { public ConversationInputTokenUsageDetails InputTokenDetails { get; } @@ -2825,33 +2816,35 @@ public abstract class ConversationUpdate : IJsonModel, IPers BinaryData IPersistableModel.Write(ModelReaderWriterOptions options); } public enum ConversationUpdateKind { - SessionStarted = 0, - SessionConfigured = 1, - ItemAcknowledged = 2, - ItemDeleted = 3, - ItemTruncated = 4, - ResponseStarted = 5, - ResponseFinished = 6, - RateLimitsUpdated = 7, - ItemStarted = 8, - ItemFinished = 9, - ContentPartStarted = 10, - ContentPartFinished = 11, - ResponseAudioDelta = 12, - ResponseAudioDone = 13, - ResponseAudioTranscriptDelta = 14, - ResponseAudioTranscriptDone = 15, - ResponseTextDelta = 16, - ResponseTextDone = 17, - ResponseFunctionCallArgumentsDelta = 18, - ResponseFunctionCallArgumentsDone = 19, - InputAudioBufferSpeechStarted = 20, - InputAudioBufferSpeechStopped = 21, - ItemInputAudioTranscriptionCompleted = 22, - ItemInputAudioTranscriptionFailed = 23, - InputAudioBufferCommitted = 24, - InputAudioBufferCleared = 25, - Error = 26 + Unknown = 0, + SessionStarted = 1, + SessionConfigured = 2, + ItemCreated = 3, + ConversationCreated = 4, + ItemDeleted = 5, + ItemTruncated = 6, + ResponseStarted = 7, + ResponseFinished = 8, + RateLimitsUpdated = 9, + ItemStreamingStarted = 10, + ItemStreamingFinished = 11, + ItemContentPartStarted = 12, + ItemContentPartFinished = 13, + ItemStreamingPartAudioDelta = 14, + ItemStreamingPartAudioFinished = 15, + ItemStreamingPartAudioTranscriptionDelta = 16, + ItemStreamingPartAudioTranscriptionFinished = 17, + ItemStreamingPartTextDelta = 18, + ItemStreamingPartTextFinished = 19, + ItemStreamingFunctionCallArgumentsDelta = 20, + ItemStreamingFunctionCallArgumentsFinished = 21, + InputSpeechStarted = 22, + InputSpeechStopped = 23, + InputTranscriptionFinished = 24, + InputTranscriptionFailed = 25, + InputAudioCommitted = 26, + InputAudioCleared = 27, + Error = 28 } public readonly partial struct ConversationVoice : IEquatable { private readonly object _dummy; @@ -2883,32 +2876,49 @@ public class RealtimeConversationClient { public virtual Task StartConversationSessionAsync(CancellationToken cancellationToken = default); } public class RealtimeConversationSession : IDisposable { - protected Net.WebSockets.ClientWebSocket _clientWebSocket; protected internal RealtimeConversationSession(RealtimeConversationClient parentClient, Uri endpoint, ApiKeyCredential credential); - public Task AddItemAsync(ConversationItem item, string previousItemId, CancellationToken cancellationToken = default); - public Task AddItemAsync(ConversationItem item, CancellationToken cancellationToken = default); - public Task CancelResponseTurnAsync(CancellationToken cancellationToken = default); - public Task CommitPendingAudioAsync(CancellationToken cancellationToken = default); - public Task ConfigureSessionAsync(ConversationSessionOptions sessionOptions, CancellationToken cancellationToken = default); + public Net.WebSockets.WebSocket WebSocket { get; protected set; } + public virtual void AddItem(ConversationItem item, string previousItemId, CancellationToken cancellationToken = default); + public virtual void AddItem(ConversationItem item, CancellationToken cancellationToken = default); + public virtual Task AddItemAsync(ConversationItem item, string previousItemId, CancellationToken cancellationToken = default); + public virtual Task AddItemAsync(ConversationItem item, CancellationToken cancellationToken = default); + public virtual void CancelResponse(CancellationToken cancellationToken = default); + public virtual Task CancelResponseAsync(CancellationToken cancellationToken = default); + public virtual void ClearInputAudio(CancellationToken cancellationToken = default); + public virtual Task ClearInputAudioAsync(CancellationToken cancellationToken = default); + public virtual void CommitPendingAudio(CancellationToken cancellationToken = default); + public virtual Task CommitPendingAudioAsync(CancellationToken cancellationToken = default); + public virtual void ConfigureSession(ConversationSessionOptions sessionOptions, CancellationToken cancellationToken = default); + public virtual Task ConfigureSessionAsync(ConversationSessionOptions sessionOptions, CancellationToken cancellationToken = default); [EditorBrowsable(EditorBrowsableState.Never)] protected internal virtual void Connect(RequestOptions options); [EditorBrowsable(EditorBrowsableState.Never)] protected internal virtual Task ConnectAsync(RequestOptions options); - public Task DeleteItemAsync(string itemId, CancellationToken cancellationToken = default); + public virtual void DeleteItem(string itemId, CancellationToken cancellationToken = default); + public virtual Task DeleteItemAsync(string itemId, CancellationToken cancellationToken = default); public void Dispose(); - public Task InterruptTurnAsync(CancellationToken cancellationToken = default); + public virtual void InterruptResponse(CancellationToken cancellationToken = default); + public virtual Task InterruptResponseAsync(CancellationToken cancellationToken = default); [EditorBrowsable(EditorBrowsableState.Never)] public virtual IEnumerable ReceiveUpdates(RequestOptions options); + public virtual IEnumerable ReceiveUpdates(CancellationToken cancellationToken = default); [EditorBrowsable(EditorBrowsableState.Never)] public virtual IAsyncEnumerable ReceiveUpdatesAsync(RequestOptions options); - public IAsyncEnumerable ReceiveUpdatesAsync(CancellationToken cancellationToken = default); - public Task SendAudioAsync(BinaryData audio, CancellationToken cancellationToken = default); - public Task SendAudioAsync(Stream audio, CancellationToken cancellationToken = default); + public virtual IAsyncEnumerable ReceiveUpdatesAsync(CancellationToken cancellationToken = default); [EditorBrowsable(EditorBrowsableState.Never)] public virtual void SendCommand(BinaryData data, RequestOptions options); [EditorBrowsable(EditorBrowsableState.Never)] public virtual Task SendCommandAsync(BinaryData data, RequestOptions options); - public Task StartResponseTurnAsync(CancellationToken cancellationToken = default); + public virtual void SendInputAudio(BinaryData audio, CancellationToken cancellationToken = default); + public virtual void SendInputAudio(Stream audio, CancellationToken cancellationToken = default); + public virtual Task SendInputAudioAsync(BinaryData audio, CancellationToken cancellationToken = default); + public virtual Task SendInputAudioAsync(Stream audio, CancellationToken cancellationToken = default); + public virtual void StartResponse(ConversationSessionOptions sessionOptionOverrides, CancellationToken cancellationToken = default); + public virtual void StartResponse(CancellationToken cancellationToken = default); + public virtual Task StartResponseAsync(ConversationSessionOptions sessionOptionOverrides, CancellationToken cancellationToken = default); + public virtual Task StartResponseAsync(CancellationToken cancellationToken = default); + public virtual void TruncateItem(string itemId, int contentPartIndex, TimeSpan audioDuration, CancellationToken cancellationToken = default); + public virtual Task TruncateItemAsync(string itemId, int contentPartIndex, TimeSpan audioDuration, CancellationToken cancellationToken = default); } } namespace OpenAI.VectorStores { diff --git a/tests/Assets/whats_the_weather_pcm16_24khz_mono.wav b/examples/Assets/realtime_whats_the_weather_pcm16_24khz_mono.wav similarity index 100% rename from tests/Assets/whats_the_weather_pcm16_24khz_mono.wav rename to examples/Assets/realtime_whats_the_weather_pcm16_24khz_mono.wav diff --git a/examples/Assistants/Example01_RetrievalAugmentedGenerationAsync.cs b/examples/Assistants/Example01_RetrievalAugmentedGenerationAsync.cs index 42c7733d9..7f07a57eb 100644 --- a/examples/Assistants/Example01_RetrievalAugmentedGenerationAsync.cs +++ b/examples/Assistants/Example01_RetrievalAugmentedGenerationAsync.cs @@ -100,7 +100,7 @@ public async Task Example01_RetrievalAugmentedGenerationAsync() // Finally, we'll print out the full history for the thread that includes the augmented generation AsyncCollectionResult messages = assistantClient.GetMessagesAsync(threadRun.ThreadId, new MessageCollectionOptions() { Order = MessageCollectionOrder.Ascending }); - + await foreach (ThreadMessage message in messages) { Console.Write($"[{message.Role.ToString().ToUpper()}]: "); diff --git a/examples/Assistants/Example02_FunctionCalling.cs b/examples/Assistants/Example02_FunctionCalling.cs index 89d0e8dff..aed48c9b1 100644 --- a/examples/Assistants/Example02_FunctionCalling.cs +++ b/examples/Assistants/Example02_FunctionCalling.cs @@ -152,7 +152,7 @@ string GetCurrentWeather(string location, string unit = "celsius") { CollectionResult messages = client.GetMessages(run.ThreadId, new MessageCollectionOptions() { Order = MessageCollectionOrder.Ascending }); - + foreach (ThreadMessage message in messages) { Console.WriteLine($"[{message.Role.ToString().ToUpper()}]: "); diff --git a/examples/Assistants/Example02_FunctionCallingAsync.cs b/examples/Assistants/Example02_FunctionCallingAsync.cs index 004c20fa0..54ec21f31 100644 --- a/examples/Assistants/Example02_FunctionCallingAsync.cs +++ b/examples/Assistants/Example02_FunctionCallingAsync.cs @@ -152,7 +152,7 @@ string GetCurrentWeather(string location, string unit = "celsius") { AsyncCollectionResult messages = client.GetMessagesAsync(run.ThreadId, new MessageCollectionOptions() { Order = MessageCollectionOrder.Ascending }); - + await foreach (ThreadMessage message in messages) { Console.WriteLine($"[{message.Role.ToString().ToUpper()}]: "); diff --git a/examples/Assistants/Example02b_FunctionCallingStreaming.cs b/examples/Assistants/Example02b_FunctionCallingStreaming.cs index b5107963f..da6c33fc9 100644 --- a/examples/Assistants/Example02b_FunctionCallingStreaming.cs +++ b/examples/Assistants/Example02b_FunctionCallingStreaming.cs @@ -16,7 +16,7 @@ public async Task Example02b_FunctionCallingStreaming() // This example parallels the content at the following location: // https://platform.openai.com/docs/assistants/tools/function-calling/function-calling-beta #region Step 1 - Define Functions - + // First, define the functions that the assistant will use in its defined tools. FunctionToolDefinition getTemperatureTool = new() diff --git a/examples/Assistants/Example04_AllTheTools.cs b/examples/Assistants/Example04_AllTheTools.cs index 96851ec24..41297d1ea 100644 --- a/examples/Assistants/Example04_AllTheTools.cs +++ b/examples/Assistants/Example04_AllTheTools.cs @@ -169,8 +169,8 @@ CollectionResult messages #region List run steps for details about tool calls CollectionResult runSteps = client.GetRunSteps( - run.ThreadId, - run.Id, + run.ThreadId, + run.Id, new RunStepCollectionOptions() { Order = RunStepCollectionOrder.Ascending diff --git a/examples/Chat/Example03_FunctionCalling.cs b/examples/Chat/Example03_FunctionCalling.cs index 9f1972bc1..7413e2304 100644 --- a/examples/Chat/Example03_FunctionCalling.cs +++ b/examples/Chat/Example03_FunctionCalling.cs @@ -57,7 +57,7 @@ public void Example03_FunctionCalling() ChatClient client = new("gpt-4-turbo", Environment.GetEnvironmentVariable("OPENAI_API_KEY")); #region - List messages = + List messages = [ new UserChatMessage("What's the weather like today?"), ]; diff --git a/examples/Embeddings/Example01_SimpleEmbeddingAsync.cs b/examples/Embeddings/Example01_SimpleEmbeddingAsync.cs index 190618500..8345c679d 100644 --- a/examples/Embeddings/Example01_SimpleEmbeddingAsync.cs +++ b/examples/Embeddings/Example01_SimpleEmbeddingAsync.cs @@ -17,7 +17,7 @@ public async Task Example01_SimpleEmbeddingAsync() + " attractions. We highly recommend this hotel."; OpenAIEmbedding embedding = await client.GenerateEmbeddingAsync(description); - ReadOnlyMemory vector = embedding.ToFloats(); + ReadOnlyMemory vector = embedding.ToFloats(); Console.WriteLine($"Dimension: {vector.Length}"); Console.WriteLine($"Floats: "); diff --git a/examples/Embeddings/Example02_EmbeddingWithOptionsAsync.cs b/examples/Embeddings/Example02_EmbeddingWithOptionsAsync.cs index 4c359dde2..5b4449f7a 100644 --- a/examples/Embeddings/Example02_EmbeddingWithOptionsAsync.cs +++ b/examples/Embeddings/Example02_EmbeddingWithOptionsAsync.cs @@ -19,7 +19,7 @@ public async Task Example02_EmbeddingWithOptionsAsync() EmbeddingGenerationOptions options = new() { Dimensions = 512 }; OpenAIEmbedding embedding = await client.GenerateEmbeddingAsync(description, options); - ReadOnlyMemory vector = embedding.ToFloats(); + ReadOnlyMemory vector = embedding.ToFloats(); Console.WriteLine($"Dimension: {vector.Length}"); Console.WriteLine($"Floats: "); diff --git a/examples/Realtime/Example01_AudioFromFileWithToolsAsync.cs b/examples/Realtime/Example01_AudioFromFileWithToolsAsync.cs new file mode 100644 index 000000000..c4e16d7f0 --- /dev/null +++ b/examples/Realtime/Example01_AudioFromFileWithToolsAsync.cs @@ -0,0 +1,215 @@ +using NUnit.Framework; +using OpenAI.Images; +using OpenAI.RealtimeConversation; +using System; +using System.ClientModel; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; + +namespace OpenAI.Examples; + +#pragma warning disable OPENAI002 + +public partial class RealtimeExamples +{ + [Test] + public async Task Example01_AudioFromFileWithToolsAsync() + { + RealtimeConversationClient client = new( + model: "gpt-4o-realtime-preview", + credential: new ApiKeyCredential(Environment.GetEnvironmentVariable("OPENAI_API_KEY"))); + using RealtimeConversationSession session = await client.StartConversationSessionAsync(); + + // Session options control connection-wide behavior shared across all conversations, + // including audio input format and voice activity detection settings. + ConversationSessionOptions sessionOptions = new() + { + Instructions = "You are a cheerful assistant that talks like a pirate. " + + "Always inform the user when you are about to call a tool. " + + "Prefer to call tools whenever applicable.", + Voice = ConversationVoice.Alloy, + Tools = { CreateSampleWeatherTool() }, + InputAudioFormat = ConversationAudioFormat.Pcm16, + OutputAudioFormat = ConversationAudioFormat.Pcm16, + // Input transcription options must be provided to enable transcribed feedback for input audio + InputTranscriptionOptions = new() + { + Model = "whisper-1", + }, + }; + + await session.ConfigureSessionAsync(sessionOptions); + + // Conversation history or text input are provided by adding messages to the conversation. + // Adding a message will not automatically begin a response turn. + await session.AddItemAsync( + ConversationItem.CreateUserMessage(["I'm trying to decide what to wear on my trip."])); + + string inputAudioPath = FindFile("Assets\\realtime_whats_the_weather_pcm16_24khz_mono.wav"); + using Stream inputAudioStream = File.OpenRead(inputAudioPath); + _ = session.SendInputAudioAsync(inputAudioStream); + + Dictionary outputAudioStreamsById = []; + + await foreach (ConversationUpdate update in session.ReceiveUpdatesAsync()) + { + if (update is ConversationSessionStartedUpdate sessionStartedUpdate) + { + Console.WriteLine($"<<< Session started. ID: {sessionStartedUpdate.SessionId}"); + Console.WriteLine(); + } + + if (update is ConversationInputSpeechStartedUpdate speechStartedUpdate) + { + Console.WriteLine( + $" -- Voice activity detection started at {speechStartedUpdate.AudioStartTime}"); + } + + if (update is ConversationInputSpeechFinishedUpdate speechFinishedUpdate) + { + Console.WriteLine( + $" -- Voice activity detection ended at {speechFinishedUpdate.AudioEndTime}"); + } + + // Item started updates notify that the model generation process will insert a new item into + // the conversation and begin streaming its content via content updates. + if (update is ConversationItemStreamingStartedUpdate itemStreamingStartedUpdate) + { + Console.WriteLine($" -- Begin streaming of new item"); + if (!string.IsNullOrEmpty(itemStreamingStartedUpdate.FunctionName)) + { + Console.Write($" {itemStreamingStartedUpdate.FunctionName}: "); + } + } + + if (update is ConversationItemStreamingPartDeltaUpdate deltaUpdate) + { + // With audio output enabled, the audio transcript of the delta update contains an approximation of + // the words spoken by the model. Without audio output, the text of the delta update will contain + // the segments making up the text content of a message. + Console.Write(deltaUpdate.AudioTranscript); + Console.Write(deltaUpdate.Text); + Console.Write(deltaUpdate.FunctionArguments); + if (deltaUpdate.AudioBytes is not null) + { + if (!outputAudioStreamsById.TryGetValue(deltaUpdate.ItemId, out Stream value)) + { + string filename = $"output_{sessionOptions.OutputAudioFormat}_{deltaUpdate.ItemId}.raw"; + value = File.OpenWrite(filename); + outputAudioStreamsById[deltaUpdate.ItemId] = value; + } + + value.Write(deltaUpdate.AudioBytes); + } + } + + // Item finished updates arrive when all streamed data for an item has arrived and the + // accumulated results are available. In the case of function calls, this is the point + // where all arguments are expected to be present. + if (update is ConversationItemStreamingFinishedUpdate itemStreamingFinishedUpdate) + { + Console.WriteLine(); + Console.WriteLine($" -- Item streaming finished, item_id={itemStreamingFinishedUpdate.ItemId}"); + + if (itemStreamingFinishedUpdate.FunctionCallId is not null) + { + Console.WriteLine($" + Responding to tool invoked by item: {itemStreamingFinishedUpdate.FunctionName}"); + ConversationItem functionOutputItem = ConversationItem.CreateFunctionCallOutput( + callId: itemStreamingFinishedUpdate.FunctionCallId, + output: "70 degrees Fahrenheit and sunny"); + await session.AddItemAsync(functionOutputItem); + } + else if (itemStreamingFinishedUpdate.MessageContentParts?.Count > 0) + { + Console.Write($" + [{itemStreamingFinishedUpdate.MessageRole}]: "); + foreach (ConversationContentPart contentPart in itemStreamingFinishedUpdate.MessageContentParts) + { + Console.Write(contentPart.AudioTranscript); + } + Console.WriteLine(); + } + } + + if (update is ConversationInputTranscriptionFinishedUpdate transcriptionCompletedUpdate) + { + Console.WriteLine(); + Console.WriteLine($" -- User audio transcript: {transcriptionCompletedUpdate.Transcript}"); + Console.WriteLine(); + } + + if (update is ConversationResponseFinishedUpdate turnFinishedUpdate) + { + Console.WriteLine($" -- Model turn generation finished. Status: {turnFinishedUpdate.Status}"); + + // Here, if we processed tool calls in the course of the model turn, we finish the + // client turn to resume model generation. The next model turn will reflect the tool + // responses that were already provided. + if (turnFinishedUpdate.CreatedItems.Any(item => item.FunctionName?.Length > 0)) + { + Console.WriteLine($" -- Ending client turn for pending tool responses"); + await session.StartResponseAsync(); + } + else + { + break; + } + } + + if (update is ConversationErrorUpdate errorUpdate) + { + Console.WriteLine(); + Console.WriteLine($"ERROR: {errorUpdate.Message}"); + break; + } + } + + foreach ((string itemId, Stream outputAudioStream) in outputAudioStreamsById) + { + Console.WriteLine($"Raw audio output for {itemId}: {outputAudioStream.Length} bytes"); + outputAudioStream.Dispose(); + } + } + + private static ConversationFunctionTool CreateSampleWeatherTool() + { + return new ConversationFunctionTool() + { + Name = "get_weather_for_location", + Description = "gets the weather for a location", + Parameters = BinaryData.FromString(""" + { + "type": "object", + "properties": { + "location": { + "type": "string", + "description": "The city and state, e.g. San Francisco, CA" + }, + "unit": { + "type": "string", + "enum": ["c","f"] + } + }, + "required": ["location","unit"] + } + """) + }; + } + + private static string FindFile(string fileName) + { + for (string currentDirectory = Directory.GetCurrentDirectory(); + currentDirectory != null && currentDirectory != Path.GetPathRoot(currentDirectory); + currentDirectory = Directory.GetParent(currentDirectory)?.FullName!) + { + string filePath = Path.Combine(currentDirectory, fileName); + if (File.Exists(filePath)) + { + return filePath; + } + } + + throw new FileNotFoundException($"File '{fileName}' not found."); + } +} diff --git a/src/Custom/Assistants/AssistantClient.Protocol.cs b/src/Custom/Assistants/AssistantClient.Protocol.cs index 8b0074b48..73e154142 100644 --- a/src/Custom/Assistants/AssistantClient.Protocol.cs +++ b/src/Custom/Assistants/AssistantClient.Protocol.cs @@ -488,7 +488,7 @@ public virtual AsyncCollectionResult GetRunStepsAsync(string threadId, string ru Argument.AssertNotNullOrEmpty(threadId, nameof(threadId)); Argument.AssertNotNullOrEmpty(runId, nameof(runId)); - return new AsyncRunStepCollectionResult(_runSubClient, options,threadId, runId, limit, order, after, before); + return new AsyncRunStepCollectionResult(_runSubClient, options, threadId, runId, limit, order, after, before); } /// diff --git a/src/Custom/Assistants/AssistantClient.cs b/src/Custom/Assistants/AssistantClient.cs index d31290397..0a6b88b54 100644 --- a/src/Custom/Assistants/AssistantClient.cs +++ b/src/Custom/Assistants/AssistantClient.cs @@ -1155,7 +1155,7 @@ public virtual AsyncCollectionResult GetRunStepsAsync( RunStepCollectionPageToken pageToken = RunStepCollectionPageToken.FromToken(firstPageToken); AsyncCollectionResult result = GetRunStepsAsync(pageToken?.ThreadId, pageToken?.RunId, pageToken?.Limit, pageToken?.Order, pageToken?.After, pageToken?.Before, cancellationToken.ToRequestOptions()); - + if (result is not AsyncCollectionResult collection) { throw new InvalidOperationException("Failed to cast protocol return type to expected collection type 'AsyncCollectionResult'."); diff --git a/src/Custom/Assistants/FileSearchRankingOptions.cs b/src/Custom/Assistants/FileSearchRankingOptions.cs index 9afa871a0..4f39634c6 100644 --- a/src/Custom/Assistants/FileSearchRankingOptions.cs +++ b/src/Custom/Assistants/FileSearchRankingOptions.cs @@ -20,10 +20,10 @@ required public float ScoreThreshold private float _scoreThreshold; public FileSearchRankingOptions() - {} + { } [SetsRequiredMembers] - public FileSearchRankingOptions(float scoreThreshold) + public FileSearchRankingOptions(float scoreThreshold) { ScoreThreshold = scoreThreshold; } diff --git a/src/Custom/Assistants/Internal/Pagination/AsyncRunCollectionResult.cs b/src/Custom/Assistants/Internal/Pagination/AsyncRunCollectionResult.cs index 889f1a486..1a8250935 100644 --- a/src/Custom/Assistants/Internal/Pagination/AsyncRunCollectionResult.cs +++ b/src/Custom/Assistants/Internal/Pagination/AsyncRunCollectionResult.cs @@ -24,7 +24,7 @@ internal class AsyncRunCollectionResult : AsyncCollectionResult public AsyncRunCollectionResult(InternalAssistantRunClient runClient, RequestOptions? options, - string threadId, + string threadId, int? limit, string? order, string? after, string? before) { _runClient = runClient; diff --git a/src/Custom/Assistants/Internal/Pagination/AsyncRunStepCollectionResult.cs b/src/Custom/Assistants/Internal/Pagination/AsyncRunStepCollectionResult.cs index 2de890853..c4198cfef 100644 --- a/src/Custom/Assistants/Internal/Pagination/AsyncRunStepCollectionResult.cs +++ b/src/Custom/Assistants/Internal/Pagination/AsyncRunStepCollectionResult.cs @@ -25,7 +25,7 @@ internal class AsyncRunStepCollectionResult : AsyncCollectionResult public AsyncRunStepCollectionResult(InternalAssistantRunClient runClient, RequestOptions? options, - string threadId, string runId, + string threadId, string runId, int? limit, string? order, string? after, string? before) { _runClient = runClient; diff --git a/src/Custom/Assistants/Internal/Pagination/MessageCollectionResult.cs b/src/Custom/Assistants/Internal/Pagination/MessageCollectionResult.cs index a89b93ec7..d6803ae71 100644 --- a/src/Custom/Assistants/Internal/Pagination/MessageCollectionResult.cs +++ b/src/Custom/Assistants/Internal/Pagination/MessageCollectionResult.cs @@ -59,7 +59,7 @@ protected override IEnumerable GetValuesFromPage(ClientResult pag { Argument.AssertNotNull(page, nameof(page)); - return MessageCollectionPageToken.FromResponse(page, _threadId, _limit, _order, _before); + return MessageCollectionPageToken.FromResponse(page, _threadId, _limit, _order, _before); } public ClientResult GetFirstPage() diff --git a/src/Custom/Assistants/Internal/Pagination/RunStepCollectionResult.cs b/src/Custom/Assistants/Internal/Pagination/RunStepCollectionResult.cs index a001a3446..b6c3e7545 100644 --- a/src/Custom/Assistants/Internal/Pagination/RunStepCollectionResult.cs +++ b/src/Custom/Assistants/Internal/Pagination/RunStepCollectionResult.cs @@ -22,7 +22,7 @@ internal class RunStepCollectionResult : CollectionResult public RunStepCollectionResult(InternalAssistantRunClient runClient, RequestOptions? options, - string threadId, string runId, + string threadId, string runId, int? limit, string? order, string? after, string? before) { _runClient = runClient; diff --git a/src/Custom/Assistants/Streaming/AsyncStreamingUpdateCollection.cs b/src/Custom/Assistants/Streaming/AsyncStreamingUpdateCollection.cs index d7ced2fbd..9fbdce2e8 100644 --- a/src/Custom/Assistants/Streaming/AsyncStreamingUpdateCollection.cs +++ b/src/Custom/Assistants/Streaming/AsyncStreamingUpdateCollection.cs @@ -19,8 +19,8 @@ internal class AsyncStreamingUpdateCollection : AsyncCollectionResult> _sendRequestAsync; private readonly CancellationToken _cancellationToken; - public AsyncStreamingUpdateCollection(Func> sendRequestAsync, - CancellationToken cancellationToken) + public AsyncStreamingUpdateCollection(Func> sendRequestAsync, + CancellationToken cancellationToken) { Argument.AssertNotNull(sendRequestAsync, nameof(sendRequestAsync)); diff --git a/src/Custom/Assistants/Streaming/StreamingUpdateCollection.cs b/src/Custom/Assistants/Streaming/StreamingUpdateCollection.cs index 7643bef64..3ddf7d609 100644 --- a/src/Custom/Assistants/Streaming/StreamingUpdateCollection.cs +++ b/src/Custom/Assistants/Streaming/StreamingUpdateCollection.cs @@ -19,7 +19,7 @@ internal class StreamingUpdateCollection : CollectionResult private readonly CancellationToken _cancellationToken; public StreamingUpdateCollection( - Func< ClientResult> sendRequest, + Func sendRequest, CancellationToken cancellationToken) { Argument.AssertNotNull(sendRequest, nameof(sendRequest)); diff --git a/src/Custom/Audio/AudioTranscriptionFormat.cs b/src/Custom/Audio/AudioTranscriptionFormat.cs index 4f38552ca..d1096cfa9 100644 --- a/src/Custom/Audio/AudioTranscriptionFormat.cs +++ b/src/Custom/Audio/AudioTranscriptionFormat.cs @@ -1,41 +1,35 @@ +using System; using System.ComponentModel; namespace OpenAI.Audio; -// CUSTOM: Renamed. /// The format of the transcription. -[CodeGenModel("CreateTranscriptionRequestResponseFormat1")] +[CodeGenModel("TranscriptionAudioResponseFormat")] public readonly partial struct AudioTranscriptionFormat { - // CUSTOM: - // - Applied the EditorBrowsable attribute. - // - Added custom doc comments. + // CUSTOM: Hide from browsing as this is equivalent to Simple /// Plain text only. [EditorBrowsable(EditorBrowsableState.Never)] [CodeGenMember("Text")] - public static AudioTranscriptionFormat Text { get; } = new AudioTranscriptionFormat(TextValue); + public static AudioTranscriptionFormat Text { get; } = new(TextValue); - // CUSTOM: - // - Renamed. - // - Added custom doc comments. + // CUSTOM: Rename, reflecting convergence with Text /// Plain text only. [CodeGenMember("Json")] - public static AudioTranscriptionFormat Simple { get; } = new AudioTranscriptionFormat(SimpleValue); + public static AudioTranscriptionFormat Simple { get; } = new(SimpleValue); - // CUSTOM: - // - Renamed. - // - Added custom doc comments. + // CUSTOM: Rename. /// Plain text provided with additional metadata, such as duration and timestamps. [CodeGenMember("VerboseJson")] - public static AudioTranscriptionFormat Verbose { get; } = new AudioTranscriptionFormat(VerboseValue); + public static AudioTranscriptionFormat Verbose { get; } = new(VerboseValue); // CUSTOM: Added custom doc comments. /// Text formatted as SubRip (.srt) file. [CodeGenMember("Srt")] - public static AudioTranscriptionFormat Srt { get; } = new AudioTranscriptionFormat(SrtValue); + public static AudioTranscriptionFormat Srt { get; } = new(SrtValue); // CUSTOM: Added custom doc comments. /// Text formatted as a Web Video Text Tracks, a.k.a. WebVTT, (.vtt) file. [CodeGenMember("Vtt")] - public static AudioTranscriptionFormat Vtt { get; } = new AudioTranscriptionFormat(VttValue); + public static AudioTranscriptionFormat Vtt { get; } = new(VttValue); } \ No newline at end of file diff --git a/src/Custom/Audio/AudioTranslationFormat.cs b/src/Custom/Audio/AudioTranslationFormat.cs index b31457f56..33f8cbf56 100644 --- a/src/Custom/Audio/AudioTranslationFormat.cs +++ b/src/Custom/Audio/AudioTranslationFormat.cs @@ -1,41 +1,35 @@ +using System; using System.ComponentModel; namespace OpenAI.Audio; -// CUSTOM: Renamed. -/// The format of the translation. -[CodeGenModel("CreateTranslationRequestResponseFormat")] +/// The format of the transcription. +[CodeGenModel("TranslationAudioResponseFormat")] public readonly partial struct AudioTranslationFormat { - // CUSTOM: - // - Applied the EditorBrowsable attribute. - // - Added custom doc comments. + // CUSTOM: Hide from browsing as this is equivalent to Simple /// Plain text only. [EditorBrowsable(EditorBrowsableState.Never)] [CodeGenMember("Text")] - public static AudioTranslationFormat Text { get; } = new AudioTranslationFormat(TextValue); + public static AudioTranslationFormat Text { get; } = new(TextValue); - // CUSTOM: - // - Renamed. - // - Added custom doc comments. + // CUSTOM: Rename, reflecting convergence with Text /// Plain text only. [CodeGenMember("Json")] - public static AudioTranslationFormat Simple { get; } = new AudioTranslationFormat(SimpleValue); + public static AudioTranslationFormat Simple { get; } = new(SimpleValue); - // CUSTOM: - // - Renamed. - // - Added custom doc comments. + // CUSTOM: Rename. /// Plain text provided with additional metadata, such as duration and timestamps. [CodeGenMember("VerboseJson")] - public static AudioTranslationFormat Verbose { get; } = new AudioTranslationFormat(VerboseValue); + public static AudioTranslationFormat Verbose { get; } = new(VerboseValue); // CUSTOM: Added custom doc comments. /// Text formatted as SubRip (.srt) file. [CodeGenMember("Srt")] - public static AudioTranslationFormat Srt { get; } = new AudioTranslationFormat(SrtValue); + public static AudioTranslationFormat Srt { get; } = new(SrtValue); // CUSTOM: Added custom doc comments. /// Text formatted as a Web Video Text Tracks, a.k.a. WebVTT, (.vtt) file. [CodeGenMember("Vtt")] - public static AudioTranslationFormat Vtt { get; } = new AudioTranslationFormat(VttValue); + public static AudioTranslationFormat Vtt { get; } = new(VttValue); } \ No newline at end of file diff --git a/src/Custom/Audio/Internal/GeneratorStubs.cs b/src/Custom/Audio/Internal/GeneratorStubs.cs index 22859b0d0..daa56322d 100644 --- a/src/Custom/Audio/Internal/GeneratorStubs.cs +++ b/src/Custom/Audio/Internal/GeneratorStubs.cs @@ -24,4 +24,7 @@ internal readonly partial struct InternalCreateTranslationRequestModel { } internal partial class InternalCreateTranslationResponseJson { } [CodeGenModel("CreateTranslationResponseVerboseJsonTask")] -internal readonly partial struct InternalCreateTranslationResponseVerboseJsonTask { } \ No newline at end of file +internal readonly partial struct InternalCreateTranslationResponseVerboseJsonTask { } + +[CodeGenModel("AudioResponseFormat")] +internal readonly partial struct InternalAudioResponseFormat { } \ No newline at end of file diff --git a/src/Custom/Audio/SpeechGenerationOptions.cs b/src/Custom/Audio/SpeechGenerationOptions.cs index 387d3c5b2..dc94bc72c 100644 --- a/src/Custom/Audio/SpeechGenerationOptions.cs +++ b/src/Custom/Audio/SpeechGenerationOptions.cs @@ -8,14 +8,14 @@ public partial class SpeechGenerationOptions // CUSTOM: // - Made internal. The model is specified by the client. // - Added setter. - [CodeGenMember("Model")] + [CodeGenMember("Model")] internal InternalCreateSpeechRequestModel Model { get; set; } // CUSTOM: // - Made internal. This value comes from a parameter on the client method. // - Added setter. /// The text to generate audio for. The maximum length is 4096 characters. - [CodeGenMember("Input")] + [CodeGenMember("Input")] internal string Input { get; set; } // CUSTOM: diff --git a/src/Custom/Chat/ChatCompletionOptions.cs b/src/Custom/Chat/ChatCompletionOptions.cs index dfbbbba86..401782e1a 100644 --- a/src/Custom/Chat/ChatCompletionOptions.cs +++ b/src/Custom/Chat/ChatCompletionOptions.cs @@ -159,4 +159,12 @@ public ChatCompletionOptions() // CUSTOM: Added the Obsolete attribute. [Obsolete($"This property is obsolete. Please use {nameof(Tools)} instead.")] public IList Functions { get; } + + // CUSTOM: Removed public setter. + [CodeGenMember("Metadata")] + public IDictionary Metadata { get; } = new ChangeTrackingDictionary(); + + // CUSTOM: Renamed. + [CodeGenMember("Store")] + public bool? StoredOutputEnabled { get; set; } } diff --git a/src/Custom/Chat/ChatInputTokenUsageDetails.cs b/src/Custom/Chat/ChatInputTokenUsageDetails.cs new file mode 100644 index 000000000..79a135a63 --- /dev/null +++ b/src/Custom/Chat/ChatInputTokenUsageDetails.cs @@ -0,0 +1,16 @@ +namespace OpenAI.Chat; + +/// +/// A collection of additional information about the value reported in . +/// +[CodeGenModel("CompletionUsagePromptTokensDetails")] +public partial class ChatInputTokenUsageDetails +{ + // CUSTOM: Renamed. + [CodeGenMember("AudioTokens")] + public int? AudioTokenCount { get; } + + // CUSTOM: Renamed. + [CodeGenMember("CachedTokens")] + public int? CachedTokenCount { get; } +} \ No newline at end of file diff --git a/src/Custom/Chat/ChatMessage.cs b/src/Custom/Chat/ChatMessage.cs index c140b382f..a88b3daba 100644 --- a/src/Custom/Chat/ChatMessage.cs +++ b/src/Custom/Chat/ChatMessage.cs @@ -55,7 +55,7 @@ namespace OpenAI.Chat; [CodeGenModel("ChatCompletionRequestMessage")] [CodeGenSerialization(nameof(Content), SerializationValueHook = nameof(SerializeContentValue), DeserializationValueHook = nameof(DeserializeContentValue))] public partial class ChatMessage -{ +{ // CUSTOM: Changed type from string to ChatMessageRole. [CodeGenMember("Role")] internal ChatMessageRole Role { get; set; } diff --git a/src/Custom/Chat/ChatMessageContent.cs b/src/Custom/Chat/ChatMessageContent.cs index 03a98746d..f7a63114d 100644 --- a/src/Custom/Chat/ChatMessageContent.cs +++ b/src/Custom/Chat/ChatMessageContent.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; @@ -8,7 +9,7 @@ namespace OpenAI.Chat; public partial class ChatMessageContent : Collection { public ChatMessageContent() - : this([]) + : this(Array.Empty()) { } diff --git a/src/Custom/Chat/ChatOutputTokenUsageDetails.cs b/src/Custom/Chat/ChatOutputTokenUsageDetails.cs index 1875a5a42..fdd3cf896 100644 --- a/src/Custom/Chat/ChatOutputTokenUsageDetails.cs +++ b/src/Custom/Chat/ChatOutputTokenUsageDetails.cs @@ -21,4 +21,7 @@ public partial class ChatOutputTokenUsageDetails /// [CodeGenMember("ReasoningTokens")] public int ReasoningTokenCount { get; } + + [CodeGenMember("AudioTokens")] + public int? AudioTokenCount { get; } } \ No newline at end of file diff --git a/src/Custom/Chat/ChatTokenUsage.cs b/src/Custom/Chat/ChatTokenUsage.cs index ca0da0132..9fe7f2893 100644 --- a/src/Custom/Chat/ChatTokenUsage.cs +++ b/src/Custom/Chat/ChatTokenUsage.cs @@ -38,4 +38,12 @@ public partial class ChatTokenUsage /// [CodeGenMember("CompletionTokensDetails")] public ChatOutputTokenUsageDetails OutputTokenDetails { get; } + + // CUSTOM: Renamed. + /// + /// Additional information about the tokens represented by , including the count of + /// audio tokens, if applicable to the model. + /// + [CodeGenMember("PromptTokensDetails")] + public ChatInputTokenUsageDetails InputTokenDetails { get; } } \ No newline at end of file diff --git a/src/Custom/Chat/OpenAIChatModelFactory.cs b/src/Custom/Chat/OpenAIChatModelFactory.cs index 524d66aeb..8dff6b239 100644 --- a/src/Custom/Chat/OpenAIChatModelFactory.cs +++ b/src/Custom/Chat/OpenAIChatModelFactory.cs @@ -90,21 +90,35 @@ public static ChatTokenTopLogProbabilityDetails ChatTokenTopLogProbabilityDetail /// Initializes a new instance of . /// A new instance for mocking. - public static ChatTokenUsage ChatTokenUsage(int outputTokenCount = default, int inputTokenCount = default, int totalTokenCount = default, ChatOutputTokenUsageDetails outputTokenDetails = null) + public static ChatTokenUsage ChatTokenUsage(int outputTokenCount = default, int inputTokenCount = default, int totalTokenCount = default, ChatOutputTokenUsageDetails outputTokenDetails = null, ChatInputTokenUsageDetails inputTokenDetails = null) { return new ChatTokenUsage( outputTokenCount, inputTokenCount, totalTokenCount, outputTokenDetails, + inputTokenDetails, + serializedAdditionalRawData: null); + } + + /// Initializes a new instance of . + /// A new instance for mocking. + public static ChatInputTokenUsageDetails ChatInputTokenUsageDetails(int? audioTokenCount = null, int? cachedTokenCount = null) + { + return new ChatInputTokenUsageDetails( + audioTokenCount: audioTokenCount, + cachedTokenCount: cachedTokenCount, serializedAdditionalRawData: null); } /// Initializes a new instance of . /// A new instance for mocking. - public static ChatOutputTokenUsageDetails ChatOutputTokenUsageDetails(int reasoningTokenCount = default) + public static ChatOutputTokenUsageDetails ChatOutputTokenUsageDetails(int reasoningTokenCount = default, int? audioTokenCount = null) { - return new ChatOutputTokenUsageDetails(reasoningTokenCount, serializedAdditionalRawData: null); + return new ChatOutputTokenUsageDetails( + audioTokenCount: audioTokenCount, + reasoningTokenCount: reasoningTokenCount, + serializedAdditionalRawData: null); } /// Initializes a new instance of . @@ -169,8 +183,8 @@ public static StreamingChatCompletionUpdate StreamingChatCompletionUpdate( public static StreamingChatFunctionCallUpdate StreamingChatFunctionCallUpdate(string functionName = null, BinaryData functionArgumentsUpdate = null) { return new StreamingChatFunctionCallUpdate( - functionName, - functionArgumentsUpdate, + functionName: functionName, + functionArgumentsUpdate: functionArgumentsUpdate, serializedAdditionalRawData: null); } diff --git a/src/Custom/Chat/Streaming/InternalStreamingChatCompletionUpdateCollection.cs b/src/Custom/Chat/Streaming/InternalStreamingChatCompletionUpdateCollection.cs index 8759ca4b3..e8ecb2648 100644 --- a/src/Custom/Chat/Streaming/InternalStreamingChatCompletionUpdateCollection.cs +++ b/src/Custom/Chat/Streaming/InternalStreamingChatCompletionUpdateCollection.cs @@ -20,7 +20,7 @@ internal class InternalStreamingChatCompletionUpdateCollection : CollectionResul private readonly CancellationToken _cancellationToken; public InternalStreamingChatCompletionUpdateCollection( - Func< ClientResult> sendRequest, + Func sendRequest, CancellationToken cancellationToken) { Argument.AssertNotNull(sendRequest, nameof(sendRequest)); diff --git a/src/Custom/Common/Internal/InternalResponseFormatJsonSchemaJsonSchema.cs b/src/Custom/Common/Internal/InternalResponseFormatJsonSchemaJsonSchema.cs index 7fa1d70fd..452c7c078 100644 --- a/src/Custom/Common/Internal/InternalResponseFormatJsonSchemaJsonSchema.cs +++ b/src/Custom/Common/Internal/InternalResponseFormatJsonSchemaJsonSchema.cs @@ -4,7 +4,7 @@ namespace OpenAI.Internal; [CodeGenModel("ResponseFormatJsonSchemaJsonSchema")] internal partial class InternalResponseFormatJsonSchemaJsonSchema -{ +{ [CodeGenMember("Schema")] public BinaryData Schema { get; set; } } \ No newline at end of file diff --git a/src/Custom/FineTuning/FineTuningJobOperation.Protocol.cs b/src/Custom/FineTuning/FineTuningJobOperation.Protocol.cs index 0eac14b0b..35ccda72e 100644 --- a/src/Custom/FineTuning/FineTuningJobOperation.Protocol.cs +++ b/src/Custom/FineTuning/FineTuningJobOperation.Protocol.cs @@ -288,7 +288,7 @@ public virtual AsyncCollectionResult GetJobEventsAsync(string? after, int? limit /// The request options, which can override default behaviors of the client pipeline on a per-call basis. /// Service returned a non-success status code. /// The response returned from the service. - public virtual CollectionResult GetJobEvents( string? after, int? limit, RequestOptions options) + public virtual CollectionResult GetJobEvents(string? after, int? limit, RequestOptions options) { return new FineTuningJobEventCollectionResult(this, options, limit, after); } @@ -369,9 +369,9 @@ internal virtual async Task GetJobEventsPageAsync(string? after, i internal virtual ClientResult GetJobEventsPage(string? after, int? limit, RequestOptions? options) { - using PipelineMessage message = CreateGetFineTuningEventsRequest(_jobId, after, limit, options); - return ClientResult.FromResponse(_pipeline.ProcessMessage(message, options)); - + using PipelineMessage message = CreateGetFineTuningEventsRequest(_jobId, after, limit, options); + return ClientResult.FromResponse(_pipeline.ProcessMessage(message, options)); + } internal virtual PipelineMessage CreateRetrieveFineTuningJobRequest(string fineTuningJobId, RequestOptions? options) diff --git a/src/Custom/FineTuning/Internal/Pagination/AsyncFineTuningJobCheckpointCollectionResult.cs b/src/Custom/FineTuning/Internal/Pagination/AsyncFineTuningJobCheckpointCollectionResult.cs index 2e027835c..c030d9400 100644 --- a/src/Custom/FineTuning/Internal/Pagination/AsyncFineTuningJobCheckpointCollectionResult.cs +++ b/src/Custom/FineTuning/Internal/Pagination/AsyncFineTuningJobCheckpointCollectionResult.cs @@ -46,7 +46,7 @@ public async override IAsyncEnumerable GetRawPagesAsync() { Argument.AssertNotNull(page, nameof(page)); - return FineTuningJobEventCollectionPageToken.FromResponse(page, _operation.JobId, _limit); + return FineTuningJobEventCollectionPageToken.FromResponse(page, _operation.JobId, _limit); } public async Task GetFirstPageAsync() diff --git a/src/Custom/Moderations/Internal/GeneratorStubs.cs b/src/Custom/Moderations/Internal/GeneratorStubs.cs index 4e11648b7..ab9f19b35 100644 --- a/src/Custom/Moderations/Internal/GeneratorStubs.cs +++ b/src/Custom/Moderations/Internal/GeneratorStubs.cs @@ -1,4 +1,25 @@ namespace OpenAI.Moderations; [CodeGenModel("CreateModerationRequestModel")] -internal readonly partial struct InternalCreateModerationRequestModel { } \ No newline at end of file +internal readonly partial struct InternalCreateModerationRequestModel { } + +[CodeGenModel("CreateModerationRequestInput2")] +internal partial class InternalCreateModerationRequestInput2 { } + +[CodeGenModel("CreateModerationRequestInput2Type")] +internal readonly partial struct InternalCreateModerationRequestInput2Type { } + +[CodeGenModel("CreateModerationRequestInput3")] +internal partial class InternalCreateModerationRequestInput3 { } + +[CodeGenModel("CreateModerationRequestInput3Type")] +internal readonly partial struct InternalCreateModerationRequestInput3Type { } + +[CodeGenModel("CreateModerationRequestInputImageUrl")] +internal partial class InternalCreateModerationRequestInputImageUrl { } + +[CodeGenModel("CreateModerationResponseResultCategories")] +internal partial class InternalModerationCategories { } + +[CodeGenModel("CreateModerationResponseResultCategoryScores")] +internal partial class InternalModerationCategoryScores { } diff --git a/src/Custom/Moderations/Internal/InternalCreateModerationResponseResultCategoryAppliedInputTypes.cs b/src/Custom/Moderations/Internal/InternalCreateModerationResponseResultCategoryAppliedInputTypes.cs new file mode 100644 index 000000000..a01ee12fa --- /dev/null +++ b/src/Custom/Moderations/Internal/InternalCreateModerationResponseResultCategoryAppliedInputTypes.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace OpenAI.Moderations; + +[CodeGenModel("CreateModerationResponseResultCategoryAppliedInputTypes")] +internal partial class InternalCreateModerationResponseResultCategoryAppliedInputTypes +{ + // CUSTOM: normalize to List for internal representation + public IReadOnlyList Hate { get; } + public IReadOnlyList HateThreatening { get; } + public IReadOnlyList Harassment { get; } + public IReadOnlyList HarassmentThreatening { get; } + public IReadOnlyList Illicit { get; } + public IReadOnlyList IllicitViolent { get; } + public IReadOnlyList SelfHarm { get; } + public IReadOnlyList SelfHarmIntent { get; } + public IReadOnlyList SelfHarmInstructions { get; } + public IReadOnlyList Sexual { get; } + public IReadOnlyList SexualMinors { get; } + public IReadOnlyList Violence { get; } + public IReadOnlyList ViolenceGraphic { get; } +} diff --git a/src/Custom/Moderations/Internal/InternalModerationCategories.cs b/src/Custom/Moderations/Internal/InternalModerationCategories.cs deleted file mode 100644 index 1a8898c2c..000000000 --- a/src/Custom/Moderations/Internal/InternalModerationCategories.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace OpenAI.Moderations; - -[CodeGenModel("CreateModerationResponseResultCategories")] -internal partial class InternalModerationCategories -{ -} - diff --git a/src/Custom/Moderations/Internal/InternalModerationCategoryScores.cs b/src/Custom/Moderations/Internal/InternalModerationCategoryScores.cs deleted file mode 100644 index 464a1a5da..000000000 --- a/src/Custom/Moderations/Internal/InternalModerationCategoryScores.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace OpenAI.Moderations; - -[CodeGenModel("CreateModerationResponseResultCategoryScores")] -internal partial class InternalModerationCategoryScores -{ -} diff --git a/src/Custom/Moderations/ModerationApplicableInputKinds.Serialization.cs b/src/Custom/Moderations/ModerationApplicableInputKinds.Serialization.cs new file mode 100644 index 000000000..8283ff2fd --- /dev/null +++ b/src/Custom/Moderations/ModerationApplicableInputKinds.Serialization.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; + +namespace OpenAI.Moderations; + +internal static partial class ModerationApplicableInputKindsExtensions +{ + internal static IReadOnlyList ToInternalApplicableInputKinds(this ModerationApplicableInputKinds inputKinds) + { + List internalInputKinds = []; + if (inputKinds.HasFlag(ModerationApplicableInputKinds.Text)) + { + internalInputKinds.Add("text"); + } + if (inputKinds.HasFlag(ModerationApplicableInputKinds.Image)) + { + internalInputKinds.Add("image"); + } + // if (inputKinds.HasFlag(ModerationInputKinds.Audio)) + // { + // internalInputKinds.Add("audio"); + // } + return internalInputKinds; + } + + internal static ModerationApplicableInputKinds FromInternalApplicableInputKinds(IEnumerable internalInputKinds) + { + ModerationApplicableInputKinds result = 0; + foreach (string internalInputKind in internalInputKinds ?? []) + { + if (StringComparer.OrdinalIgnoreCase.Equals(internalInputKind, "text")) + { + result |= ModerationApplicableInputKinds.Text; + } + else if (StringComparer.OrdinalIgnoreCase.Equals(internalInputKind, "image")) + { + result |= ModerationApplicableInputKinds.Image; + } + // else if (StringComparer.OrdinalIgnoreCase.Equals(internalInputKind, "audio")) + // { + // result |= ModerationInputKinds.Audio; + // } + else + { + result |= ModerationApplicableInputKinds.Other; + } + } + return result; + } + + internal static string ToSerialString(this ModerationApplicableInputKinds value) + => throw new NotImplementedException(); + + internal static ModerationApplicableInputKinds ToModerationApplicableInputKinds(this string value) + => throw new NotImplementedException(); +} \ No newline at end of file diff --git a/src/Custom/Moderations/ModerationApplicableInputKinds.cs b/src/Custom/Moderations/ModerationApplicableInputKinds.cs new file mode 100644 index 000000000..14ef517d8 --- /dev/null +++ b/src/Custom/Moderations/ModerationApplicableInputKinds.cs @@ -0,0 +1,16 @@ +using System; + +namespace OpenAI.Moderations; + +[Flags] +[CodeGenModel("ModerationAppliedInputType")] +public enum ModerationApplicableInputKinds : int +{ + None = 0, + Other = 1 << 0, + [CodeGenMember("Text")] + Text = 1 << 1, + [CodeGenMember("Image")] + Image = 1 << 2, + // Audio = 1 << 3, +} \ No newline at end of file diff --git a/src/Custom/Moderations/ModerationCategory.cs b/src/Custom/Moderations/ModerationCategory.cs index d36fc6202..688336a66 100644 --- a/src/Custom/Moderations/ModerationCategory.cs +++ b/src/Custom/Moderations/ModerationCategory.cs @@ -1,13 +1,17 @@ +using System.Collections.Generic; + namespace OpenAI.Moderations; public partial class ModerationCategory { - internal ModerationCategory(bool flagged, float score) + internal ModerationCategory(bool flagged, float score, ModerationApplicableInputKinds applicableInputKinds) { Flagged = flagged; Score = score; + ApplicableInputKinds = applicableInputKinds; } public bool Flagged { get; } public float Score { get; } + public ModerationApplicableInputKinds ApplicableInputKinds { get; } } diff --git a/src/Custom/Moderations/ModerationResult.Serialization.cs b/src/Custom/Moderations/ModerationResult.Serialization.cs index 592b17e39..2088857a5 100644 --- a/src/Custom/Moderations/ModerationResult.Serialization.cs +++ b/src/Custom/Moderations/ModerationResult.Serialization.cs @@ -1,6 +1,7 @@ using System; using System.ClientModel.Primitives; using System.Collections.Generic; +using System.Linq; using System.Text.Json; namespace OpenAI.Moderations @@ -27,37 +28,63 @@ void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriter if (SerializedAdditionalRawData?.ContainsKey("categories") != true) { writer.WritePropertyName("categories"u8); - InternalModerationCategories internalCategories = new InternalModerationCategories( + InternalModerationCategories internalCategories = new( hate: Hate.Flagged, hateThreatening: HateThreatening.Flagged, harassment: Harassment.Flagged, harassmentThreatening: HarassmentThreatening.Flagged, + illicit: Illicit.Flagged, + illicitViolent: IllicitViolent.Flagged, selfHarm: SelfHarm.Flagged, selfHarmIntent: SelfHarmIntent.Flagged, selfHarmInstructions: SelfHarmInstructions.Flagged, sexual: Sexual.Flagged, sexualMinors: SexualMinors.Flagged, violence: Violence.Flagged, - violenceGraphic: ViolenceGraphic.Flagged); + violenceGraphic: ViolenceGraphic.Flagged, + serializedAdditionalRawData: null); writer.WriteObjectValue(internalCategories, options); } if (SerializedAdditionalRawData?.ContainsKey("category_scores") != true) { writer.WritePropertyName("category_scores"u8); - InternalModerationCategoryScores internalCategoryScores = new InternalModerationCategoryScores( + InternalModerationCategoryScores internalCategoryScores = new( hate: Hate.Score, hateThreatening: HateThreatening.Score, harassment: Harassment.Score, harassmentThreatening: HarassmentThreatening.Score, + illicit: Illicit.Score, + illicitViolent: IllicitViolent.Score, selfHarm: SelfHarm.Score, selfHarmIntent: SelfHarmIntent.Score, selfHarmInstructions: SelfHarmInstructions.Score, sexual: Sexual.Score, sexualMinors: SexualMinors.Score, violence: Violence.Score, - violenceGraphic: ViolenceGraphic.Score); + violenceGraphic: ViolenceGraphic.Score, + serializedAdditionalRawData: null); writer.WriteObjectValue(internalCategoryScores, options); } + if (SerializedAdditionalRawData?.ContainsKey("category_applied_input_types") != true) + { + writer.WritePropertyName("category_applied_input_types"u8); + InternalCreateModerationResponseResultCategoryAppliedInputTypes internalAppliedInputTypes = new( + hate: Hate.ApplicableInputKinds.ToInternalApplicableInputKinds(), + hateThreatening: HateThreatening.ApplicableInputKinds.ToInternalApplicableInputKinds(), + harassment: Harassment.ApplicableInputKinds.ToInternalApplicableInputKinds(), + harassmentThreatening: HarassmentThreatening.ApplicableInputKinds.ToInternalApplicableInputKinds(), + illicit: Illicit.ApplicableInputKinds.ToInternalApplicableInputKinds(), + illicitViolent: IllicitViolent.ApplicableInputKinds.ToInternalApplicableInputKinds(), + selfHarm: SelfHarm.ApplicableInputKinds.ToInternalApplicableInputKinds(), + selfHarmIntent: SelfHarmIntent.ApplicableInputKinds.ToInternalApplicableInputKinds(), + selfHarmInstructions: SelfHarmInstructions.ApplicableInputKinds.ToInternalApplicableInputKinds(), + sexual: Sexual.ApplicableInputKinds.ToInternalApplicableInputKinds(), + sexualMinors: SexualMinors.ApplicableInputKinds.ToInternalApplicableInputKinds(), + violence: Violence.ApplicableInputKinds.ToInternalApplicableInputKinds(), + violenceGraphic: ViolenceGraphic.ApplicableInputKinds.ToInternalApplicableInputKinds(), + serializedAdditionalRawData: null); + writer.WriteObjectValue(internalAppliedInputTypes, options); + } if (SerializedAdditionalRawData != null) { foreach (var item in SerializedAdditionalRawData) @@ -92,6 +119,7 @@ internal static ModerationResult DeserializeModerationResult(JsonElement element InternalModerationCategories internalCategories = default; InternalModerationCategoryScores internalCategoryScores = default; + InternalCreateModerationResponseResultCategoryAppliedInputTypes internalAppliedInputTypes = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); foreach (var property in element.EnumerateObject()) @@ -111,26 +139,54 @@ internal static ModerationResult DeserializeModerationResult(JsonElement element internalCategoryScores = InternalModerationCategoryScores.DeserializeInternalModerationCategoryScores(property.Value, options); continue; } + if (property.NameEquals("category_applied_input_types"u8)) + { + internalAppliedInputTypes = InternalCreateModerationResponseResultCategoryAppliedInputTypes.DeserializeInternalCreateModerationResponseResultCategoryAppliedInputTypes(property.Value, options); + continue; + } if (true) { rawDataDictionary ??= new Dictionary(); rawDataDictionary.Add(property.Name, BinaryData.FromString(property.Value.GetRawText())); } } + + ModerationCategory MakeCategory( + Func categoryFlaggedGetter, + Func scoreGetter, + Func< + InternalCreateModerationResponseResultCategoryAppliedInputTypes, + IReadOnlyList + > internalAppliedInputTypesGetter) + { + IReadOnlyList genericInputTypes + = internalAppliedInputTypes is null ? null + : internalAppliedInputTypesGetter.Invoke(internalAppliedInputTypes); + IReadOnlyList stringInputTypes = + (genericInputTypes as IReadOnlyList) + ?? genericInputTypes?.Select(t => t.ToString()).ToList().AsReadOnly(); + return new ModerationCategory( + categoryFlaggedGetter.Invoke(internalCategories), + scoreGetter.Invoke(internalCategoryScores), + ModerationApplicableInputKindsExtensions.FromInternalApplicableInputKinds(stringInputTypes)); + } + serializedAdditionalRawData = rawDataDictionary; return new ModerationResult( flagged: flagged, - hate: new ModerationCategory(internalCategories.Hate, internalCategoryScores.Hate), - hateThreatening: new ModerationCategory(internalCategories.HateThreatening, internalCategoryScores.HateThreatening), - harassment: new ModerationCategory(internalCategories.Harassment, internalCategoryScores.Harassment), - harassmentThreatening: new ModerationCategory(internalCategories.HarassmentThreatening, internalCategoryScores.HarassmentThreatening), - selfHarm: new ModerationCategory(internalCategories.SelfHarm, internalCategoryScores.SelfHarm), - selfHarmIntent: new ModerationCategory(internalCategories.SelfHarmIntent, internalCategoryScores.SelfHarmIntent), - selfHarmInstructions: new ModerationCategory(internalCategories.SelfHarmInstructions, internalCategoryScores.SelfHarmInstructions), - sexual: new ModerationCategory(internalCategories.Sexual, internalCategoryScores.Sexual), - sexualMinors: new ModerationCategory(internalCategories.SexualMinors, internalCategoryScores.SexualMinors), - violence: new ModerationCategory(internalCategories.Violence, internalCategoryScores.Violence), - violenceGraphic: new ModerationCategory(internalCategories.ViolenceGraphic, internalCategoryScores.ViolenceGraphic), + hate: MakeCategory(cats => cats.Hate, catScores => catScores.Hate, types => types.Hate), + hateThreatening: MakeCategory(cats => cats.HateThreatening, catScores => catScores.HateThreatening, types => types.HateThreatening), + harassment: MakeCategory(cats => cats.Harassment, catScores => catScores.Harassment, types => types.Harassment), + harassmentThreatening: MakeCategory(cats => cats.HarassmentThreatening, catScores => catScores.HarassmentThreatening, types => types.HarassmentThreatening), + illicit: MakeCategory(cats => cats.Illicit, catScores => catScores.Illicit, types => types.Illicit), + illicitViolent: MakeCategory(cats => cats.IllicitViolent, catScores => catScores.IllicitViolent, types => types.IllicitViolent), + selfHarm: MakeCategory(cats => cats.SelfHarm, catScores => catScores.SelfHarm, types => types.SelfHarm), + selfHarmIntent: MakeCategory(cats => cats.SelfHarmIntent, catScores => catScores.SelfHarmIntent, types => types.SelfHarmIntent), + selfHarmInstructions: MakeCategory(cats => cats.SelfHarmInstructions, catScores => catScores.SelfHarmInstructions, types => types.SelfHarmInstructions), + sexual: MakeCategory(cats => cats.Sexual, catScores => catScores.Sexual, types => types.Sexual), + sexualMinors: MakeCategory(cats => cats.SexualMinors, catScores => catScores.SexualMinors, types => types.SexualMinors), + violence: MakeCategory(cats => cats.Violence, catScores => catScores.Violence, types => types.Violence), + violenceGraphic: MakeCategory(cats => cats.ViolenceGraphic, catScores => catScores.ViolenceGraphic, types => types.ViolenceGraphic), serializedAdditionalRawData: serializedAdditionalRawData); } } diff --git a/src/Custom/Moderations/ModerationResult.cs b/src/Custom/Moderations/ModerationResult.cs index d9338fa56..342aa2477 100644 --- a/src/Custom/Moderations/ModerationResult.cs +++ b/src/Custom/Moderations/ModerationResult.cs @@ -8,19 +8,22 @@ namespace OpenAI.Moderations; [CodeGenModel("CreateModerationResponseResult")] [CodeGenSuppress("Categories")] [CodeGenSuppress("CategoryScores")] -[CodeGenSuppress(nameof(ModerationResult), typeof(bool), typeof(InternalModerationCategories), typeof(InternalModerationCategoryScores))] -[CodeGenSuppress(nameof(ModerationResult), typeof(bool), typeof(InternalModerationCategories), typeof(InternalModerationCategoryScores), typeof(IDictionary))] +[CodeGenSuppress("CategoryAppliedInputTypes")] +[CodeGenSuppress(nameof(ModerationResult), typeof(bool), typeof(InternalModerationCategories), typeof(InternalModerationCategoryScores), typeof(InternalCreateModerationResponseResultCategoryAppliedInputTypes))] +[CodeGenSuppress(nameof(ModerationResult), typeof(bool), typeof(InternalModerationCategories), typeof(InternalModerationCategoryScores), typeof(InternalCreateModerationResponseResultCategoryAppliedInputTypes), typeof(IDictionary))] public partial class ModerationResult { internal IDictionary SerializedAdditionalRawData { get; set; } - internal ModerationResult(bool flagged, ModerationCategory hate, ModerationCategory hateThreatening, ModerationCategory harassment, ModerationCategory harassmentThreatening, ModerationCategory selfHarm, ModerationCategory selfHarmIntent, ModerationCategory selfHarmInstructions, ModerationCategory sexual, ModerationCategory sexualMinors, ModerationCategory violence, ModerationCategory violenceGraphic) + internal ModerationResult(bool flagged, ModerationCategory hate, ModerationCategory hateThreatening, ModerationCategory harassment, ModerationCategory harassmentThreatening, ModerationCategory illicit, ModerationCategory illicitViolent, ModerationCategory selfHarm, ModerationCategory selfHarmIntent, ModerationCategory selfHarmInstructions, ModerationCategory sexual, ModerationCategory sexualMinors, ModerationCategory violence, ModerationCategory violenceGraphic) { Flagged = flagged; Hate = hate; HateThreatening = hateThreatening; Harassment = harassment; HarassmentThreatening = harassmentThreatening; + Illicit = illicit; + IllicitViolent = illicitViolent; SelfHarm = selfHarm; SelfHarmIntent = selfHarmIntent; SelfHarmInstructions = selfHarmInstructions; @@ -30,13 +33,15 @@ internal ModerationResult(bool flagged, ModerationCategory hate, ModerationCateg ViolenceGraphic = violenceGraphic; } - internal ModerationResult(bool flagged, ModerationCategory hate, ModerationCategory hateThreatening, ModerationCategory harassment, ModerationCategory harassmentThreatening, ModerationCategory selfHarm, ModerationCategory selfHarmIntent, ModerationCategory selfHarmInstructions, ModerationCategory sexual, ModerationCategory sexualMinors, ModerationCategory violence, ModerationCategory violenceGraphic, IDictionary serializedAdditionalRawData) + internal ModerationResult(bool flagged, ModerationCategory hate, ModerationCategory hateThreatening, ModerationCategory harassment, ModerationCategory harassmentThreatening, ModerationCategory illicit, ModerationCategory illicitViolent, ModerationCategory selfHarm, ModerationCategory selfHarmIntent, ModerationCategory selfHarmInstructions, ModerationCategory sexual, ModerationCategory sexualMinors, ModerationCategory violence, ModerationCategory violenceGraphic, IDictionary serializedAdditionalRawData) { Flagged = flagged; Hate = hate; HateThreatening = hateThreatening; Harassment = harassment; HarassmentThreatening = harassmentThreatening; + Illicit = illicit; + IllicitViolent = illicitViolent; SelfHarm = selfHarm; SelfHarmIntent = selfHarmIntent; SelfHarmInstructions = selfHarmInstructions; @@ -59,6 +64,10 @@ internal ModerationResult() public ModerationCategory HarassmentThreatening { get; } + public ModerationCategory Illicit { get; } + + public ModerationCategory IllicitViolent { get; } + public ModerationCategory SelfHarm { get; } public ModerationCategory SelfHarmIntent { get; } diff --git a/src/Custom/Moderations/OpenAIModerationsModelFactory.cs b/src/Custom/Moderations/OpenAIModerationsModelFactory.cs index d88a72534..9860b78a5 100644 --- a/src/Custom/Moderations/OpenAIModerationsModelFactory.cs +++ b/src/Custom/Moderations/OpenAIModerationsModelFactory.cs @@ -8,9 +8,9 @@ public static partial class OpenAIModerationsModelFactory { /// Initializes a new instance of . /// A new instance for mocking. - public static ModerationCategory ModerationCategory(bool flagged = default, float score = default) + public static ModerationCategory ModerationCategory(bool flagged = default, float score = default, ModerationApplicableInputKinds applicableInputKinds = 0) { - return new ModerationCategory(flagged, score); + return new ModerationCategory(flagged, score, applicableInputKinds); } /// Initializes a new instance of . @@ -28,7 +28,7 @@ public static ModerationResultCollection ModerationResultCollection(string id = /// Initializes a new instance of . /// A new instance for mocking. - public static ModerationResult ModerationResult(bool flagged = default, ModerationCategory hate = default, ModerationCategory hateThreatening = default, ModerationCategory harassment = default, ModerationCategory harassmentThreatening = default, ModerationCategory selfHarm = default, ModerationCategory selfHarmIntent = default, ModerationCategory selfHarmInstructions = default, ModerationCategory sexual = default, ModerationCategory sexualMinors = default, ModerationCategory violence = default, ModerationCategory violenceGraphic = default) + public static ModerationResult ModerationResult(bool flagged = default, ModerationCategory hate = default, ModerationCategory hateThreatening = default, ModerationCategory harassment = default, ModerationCategory harassmentThreatening = default, ModerationCategory selfHarm = default, ModerationCategory selfHarmIntent = default, ModerationCategory selfHarmInstructions = default, ModerationCategory sexual = default, ModerationCategory sexualMinors = default, ModerationCategory violence = default, ModerationCategory violenceGraphic = default, ModerationCategory illicit = default, ModerationCategory illicitViolent = default) { return new ModerationResult( flagged, @@ -36,6 +36,8 @@ public static ModerationResult ModerationResult(bool flagged = default, Moderati hateThreatening, harassment, harassmentThreatening, + illicit, + illicitViolent, selfHarm, selfHarmIntent, selfHarmInstructions, diff --git a/src/Custom/RealtimeConversation/AlphaDesignNotes.md b/src/Custom/RealtimeConversation/AlphaDesignNotes.md deleted file mode 100644 index 6add76a62..000000000 --- a/src/Custom/RealtimeConversation/AlphaDesignNotes.md +++ /dev/null @@ -1,36 +0,0 @@ -# Development notes for .NET `/realtime` -- alpha - -This document is intended to capture some of the exploratory design choices made when exposing the `/realtime` API in the .NET library. - -## Naming and structure - -"Realtime" does not describe "what" the capability does, but rather "how" it does it; `RealtimeClient`, while a faithful translation from REST, would not be descriptive or idiomatic. `AudioClient` has operations that let you send or receive audio; `ChatClient` is about all about getting chat (completion) responses; EmbeddingClient generates embeddings; `${NAME}Client` does *not* let you send or receive "realtimes." - -A number of names could work. `Conversation` was chosen as an expedient placeholder. - -Because the `/realtime` API involves simultaneously sending and receiving data on a single WebSocket, the primary logic vehicle is an `IDisposable` `ConversationSession` type -- this is configured by its originating `ConversationClient` and manages a `ClientWebSocket` instance. `ConversationClient` then provides task-based methods like `SendText` and `SubmitToolResponse` -- methods that allow the abstraction of client-originated request messages -- while exposing an `IAsyncEnumerable` collection of (response) `ConversationMessage` instances via `ReceiveMessagesAsync`. - -The initial design approach for `ConversationMessage` feature uses a "squish" strategy; the many variant concrete message types are internalized, then composed into the single wrapper that conditionally populates appropriate properties based on the underlying message. This is a reapplication of the general principles applied to Chat Completion and Assistants streaming, though it's a larger single-type "squish" than previously pursued. - -This is intended to facilitate a low barrier to entry, as explicit knowledge about different message types is not necessary to work with the operation. For example, a basic "hello world" may just do something like the following: - -```csharp -using ConversationSession conversation = await client.StartConversationAsync(); - -await conversation.SendTextAsync("Hello, world!"); - -await foreach (ConversationMessage message in client.ReceiveMessagesAsync()) -{ - Console.Write(message.Text); -} -``` - -## Turn-based data buffering - -A repeated piece of early alpha feedback was that a client-integrated mechanism to automatically accumulate incoming response data (not requiring manual, do-it-yourself accumulation) would be valuable. - -To explore accomplishing this, `ConversationSession` includes a pair of properties, `LastTurnFullResponseText` and `LastTurnFullResponseAudio`, that will automatically be populated with accumulated data when a `turn_finished` event is received. This is consistent with the "snapshot" mechanism used in several instances within Stainless SDK libraries, which likewise feature automatically accumulated data being populated into an appropriate location. - -As this requires visibility into the response body, automatic accumulation is only performed when using the convenience method variant of `ReceiveMessagesAsync`. - -Because this accumulated text and (especially) audio data can quickly grow in size to hundreds of kilobytes, a client-only property for `LastTurnResponseAccumulationEnabled` is inserted into `ConversationOptions`. In contexts with many parallel operations and high sensitive to memory footprint, the setting can thus opt out of the behavior. \ No newline at end of file diff --git a/src/Custom/RealtimeConversation/ConversationContentModalities.Serialization.cs b/src/Custom/RealtimeConversation/ConversationContentModalities.Serialization.cs index 95478aa8a..134a83526 100644 --- a/src/Custom/RealtimeConversation/ConversationContentModalities.Serialization.cs +++ b/src/Custom/RealtimeConversation/ConversationContentModalities.Serialization.cs @@ -7,29 +7,30 @@ namespace OpenAI.RealtimeConversation; [Experimental("OPENAI002")] internal static partial class ConversationContentModalitiesExtensions { - internal static void ToInternalModalities(this ConversationContentModalities modalities, IList internalModalities) + internal static IList ToInternalModalities(this ConversationContentModalities modalities) { - internalModalities.Clear(); + List internalModalities = []; if (modalities.HasFlag(ConversationContentModalities.Text)) { - internalModalities.Add(InternalRealtimeRequestSessionUpdateCommandSessionModality.Text); + internalModalities.Add(InternalRealtimeRequestSessionModality.Text); } if (modalities.HasFlag(ConversationContentModalities.Audio)) { - internalModalities.Add(InternalRealtimeRequestSessionUpdateCommandSessionModality.Audio); + internalModalities.Add(InternalRealtimeRequestSessionModality.Audio); } + return internalModalities; } - internal static ConversationContentModalities FromInternalModalities(IEnumerable internalModalities) + internal static ConversationContentModalities FromInternalModalities(IEnumerable internalModalities) { ConversationContentModalities result = 0; - foreach (InternalRealtimeRequestSessionUpdateCommandSessionModality internalModality in internalModalities ?? []) + foreach (InternalRealtimeRequestSessionModality internalModality in internalModalities ?? []) { - if (internalModality == InternalRealtimeRequestSessionUpdateCommandSessionModality.Text) + if (internalModality == InternalRealtimeRequestSessionModality.Text) { result |= ConversationContentModalities.Text; } - else if (internalModality == InternalRealtimeRequestSessionUpdateCommandSessionModality.Audio) + else if (internalModality == InternalRealtimeRequestSessionModality.Audio) { result |= ConversationContentModalities.Audio; } diff --git a/src/Custom/RealtimeConversation/ConversationContentPart.cs b/src/Custom/RealtimeConversation/ConversationContentPart.cs index c1e20f9d5..6329dae8f 100644 --- a/src/Custom/RealtimeConversation/ConversationContentPart.cs +++ b/src/Custom/RealtimeConversation/ConversationContentPart.cs @@ -8,27 +8,26 @@ namespace OpenAI.RealtimeConversation; [CodeGenModel("RealtimeContentPart")] public partial class ConversationContentPart { - [CodeGenMember("Type")] - internal ConversationContentPartKind Type; + public string Text => + (this as InternalRealtimeRequestTextContentPart)?.InternalTextValue + ?? (this as InternalRealtimeResponseTextContentPart)?.InternalTextValue; - public ConversationContentPartKind Kind => Type; - - public string TextValue => - (this as InternalRealtimeRequestTextContentPart)?.Text - ?? (this as InternalRealtimeResponseTextContentPart)?.Text; - - public string AudioTranscriptValue => - (this as InternalRealtimeRequestAudioContentPart)?.Transcript - ?? (this as InternalRealtimeResponseAudioContentPart)?.Transcript; + public string AudioTranscript => + (this as InternalRealtimeRequestAudioContentPart)?.InternalTranscriptValue + ?? (this as InternalRealtimeResponseAudioContentPart)?.InternalTranscriptValue; public static ConversationContentPart FromInputText(string text) => new InternalRealtimeRequestTextContentPart(text); - public static ConversationContentPart FromInputAudioTranscript(string transcript = null) => new InternalRealtimeRequestAudioContentPart() - { - Transcript = transcript, - }; + + public static ConversationContentPart FromInputAudioTranscript(string transcript = null) + => new InternalRealtimeRequestAudioContentPart() + { + InternalTranscriptValue = transcript, + }; + public static ConversationContentPart FromOutputText(string text) => new InternalRealtimeResponseTextContentPart(text); + public static ConversationContentPart FromOutputAudioTranscript(string transcript = null) => new InternalRealtimeResponseAudioContentPart(transcript); diff --git a/src/Custom/RealtimeConversation/ConversationContentPartKind.cs b/src/Custom/RealtimeConversation/ConversationContentPartKind.cs new file mode 100644 index 000000000..fab135e12 --- /dev/null +++ b/src/Custom/RealtimeConversation/ConversationContentPartKind.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; + +namespace OpenAI.RealtimeConversation; + +[Experimental("OPENAI002")] +[CodeGenModel("RealtimeContentPartType")] +public readonly partial struct ConversationContentPartKind +{ + [CodeGenMember("Audio")] + public static ConversationContentPartKind OutputAudio { get; } = new(OutputAudioValue); + + [CodeGenMember("Text")] + public static ConversationContentPartKind OutputText { get; } = new(OutputTextValue); +} \ No newline at end of file diff --git a/src/Custom/RealtimeConversation/ConversationRateLimitDetailsItem.cs b/src/Custom/RealtimeConversation/ConversationRateLimitDetailsItem.cs new file mode 100644 index 000000000..7f8fa721c --- /dev/null +++ b/src/Custom/RealtimeConversation/ConversationRateLimitDetailsItem.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; + +namespace OpenAI.RealtimeConversation; + +[Experimental("OPENAI002")] +[CodeGenModel("RealtimeServerEventRateLimitsUpdatedRateLimitsItem")] +public partial class ConversationRateLimitDetailsItem +{ + [CodeGenMember("Limit")] + public int MaximumCount { get; } + + [CodeGenMember("Remaining")] + public int RemainingCount { get; } + + [CodeGenMember("ResetSeconds")] + public TimeSpan TimeUntilReset { get; } +} diff --git a/src/Custom/RealtimeConversation/ConversationSessionOptions.cs b/src/Custom/RealtimeConversation/ConversationSessionOptions.cs index 2d0290280..a4b4d1222 100644 --- a/src/Custom/RealtimeConversation/ConversationSessionOptions.cs +++ b/src/Custom/RealtimeConversation/ConversationSessionOptions.cs @@ -6,20 +6,16 @@ namespace OpenAI.RealtimeConversation; [Experimental("OPENAI002")] -[CodeGenModel("RealtimeRequestSessionUpdateCommandSession")] +[CodeGenModel("RealtimeRequestSession")] public partial class ConversationSessionOptions { - [CodeGenMember("Model")] - public string Model { get; set; } - [CodeGenMember("Modalities")] - private readonly IList _internalModalities - = new ChangeTrackingList(); + private IList _internalModalities; public ConversationContentModalities ContentModalities { get => ConversationContentModalitiesExtensions.FromInternalModalities(_internalModalities); - set => value.ToInternalModalities(_internalModalities); + set => _internalModalities = value.ToInternalModalities(); } [CodeGenMember("ToolChoice")] @@ -37,7 +33,7 @@ public ConversationToolChoice ToolChoice [CodeGenMember("MaxResponseOutputTokens")] private BinaryData _maxResponseOutputTokens; - public ConversationMaxTokensChoice MaxResponseOutputTokens + public ConversationMaxTokensChoice MaxOutputTokens { get => ConversationMaxTokensChoice.FromBinaryData(_maxResponseOutputTokens); set diff --git a/src/Custom/RealtimeConversation/ConversationStatusDetails.cs b/src/Custom/RealtimeConversation/ConversationStatusDetails.cs new file mode 100644 index 000000000..fc4a7f94e --- /dev/null +++ b/src/Custom/RealtimeConversation/ConversationStatusDetails.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; + +namespace OpenAI.RealtimeConversation; + +[Experimental("OPENAI002")] +[CodeGenModel("RealtimeResponseStatusDetails")] +public partial class ConversationStatusDetails +{ + [CodeGenMember("Kind")] + public ConversationStatus StatusKind { get; } +} \ No newline at end of file diff --git a/src/Custom/RealtimeConversation/ConversationTurnDetectionOptions.Serialization.cs b/src/Custom/RealtimeConversation/ConversationTurnDetectionOptions.Serialization.cs index 726583841..7ae01a2e9 100644 --- a/src/Custom/RealtimeConversation/ConversationTurnDetectionOptions.Serialization.cs +++ b/src/Custom/RealtimeConversation/ConversationTurnDetectionOptions.Serialization.cs @@ -1,6 +1,4 @@ -using System; -using System.ClientModel.Primitives; -using System.Diagnostics.CodeAnalysis; +using System.ClientModel.Primitives; using System.Text.Json; namespace OpenAI.RealtimeConversation; @@ -20,7 +18,9 @@ internal static ConversationTurnDetectionOptions DeserializeConversationTurnDete { switch (discriminator.GetString()) { + case "none": return InternalRealtimeNoTurnDetection.DeserializeInternalRealtimeNoTurnDetection(element, options); case "server_vad": return InternalRealtimeServerVadTurnDetection.DeserializeInternalRealtimeServerVadTurnDetection(element, options); + default: return null; } } return UnknownRealtimeTurnDetection.DeserializeUnknownRealtimeTurnDetection(element, options); diff --git a/src/Custom/RealtimeConversation/GeneratorStubs.cs b/src/Custom/RealtimeConversation/GeneratorStubs.cs index 38f6a5cf5..e5594d79e 100644 --- a/src/Custom/RealtimeConversation/GeneratorStubs.cs +++ b/src/Custom/RealtimeConversation/GeneratorStubs.cs @@ -5,27 +5,9 @@ namespace OpenAI.RealtimeConversation; [Experimental("OPENAI002")][CodeGenModel("RealtimeAudioFormat")] public readonly partial struct ConversationAudioFormat { } [Experimental("OPENAI002")][CodeGenModel("RealtimeAudioInputTranscriptionModel")] public readonly partial struct ConversationTranscriptionModel { } [Experimental("OPENAI002")][CodeGenModel("RealtimeAudioInputTranscriptionSettings")] public partial class ConversationInputTranscriptionOptions { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeContentPartType")] public readonly partial struct ConversationContentPartKind { } [Experimental("OPENAI002")][CodeGenModel("RealtimeItemStatus")] public readonly partial struct ConversationItemStatus { } [Experimental("OPENAI002")][CodeGenModel("RealtimeMessageRole")] public readonly partial struct ConversationMessageRole { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeResponseAudioDeltaCommand")] public partial class ConversationAudioDeltaUpdate{ } -[Experimental("OPENAI002")][CodeGenModel("RealtimeResponseAudioDoneCommand")] public partial class ConversationAudioDoneUpdate{ } -[Experimental("OPENAI002")][CodeGenModel("RealtimeResponseAudioTranscriptDeltaCommand")] public partial class ConversationOutputTranscriptionDeltaUpdate { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeResponseAudioTranscriptDoneCommand")] public partial class ConversationOutputTranscriptionFinishedUpdate { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeResponseFunctionCallArgumentsDeltaCommand")] public partial class ConversationFunctionCallArgumentsDeltaUpdate { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeResponseFunctionCallArgumentsDoneCommand")] public partial class ConversationFunctionCallArgumentsDoneUpdate { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeResponseInputAudioBufferClearedCommand")] public partial class ConversationInputAudioBufferClearedUpdate { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeResponseInputAudioBufferCommittedCommand")] public partial class ConversationInputAudioBufferCommittedUpdate { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeResponseInputAudioBufferSpeechStartedCommand")] public partial class ConversationInputSpeechStartedUpdate { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeResponseInputAudioBufferSpeechStoppedCommand")] public partial class ConversationInputSpeechFinishedUpdate { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeResponseItemDeletedCommand")] public partial class ConversationItemDeletedUpdate { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeResponseItemInputAudioTranscriptionCompletedCommand")] public partial class ConversationInputTranscriptionFinishedUpdate { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeResponseItemTruncatedCommand")] public partial class ConversationItemTruncatedUpdate { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeResponseRateLimitDetailsItem")] public partial class ConversationRateLimitDetailsItem { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeResponseRateLimitsUpdatedCommand")] public partial class ConversationRateLimitsUpdatedUpdate{ } [Experimental("OPENAI002")][CodeGenModel("RealtimeResponseStatus")] public readonly partial struct ConversationStatus { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeResponseTextDeltaCommand")] public partial class ConversationTextDeltaUpdate{ } -[Experimental("OPENAI002")][CodeGenModel("RealtimeResponseTextDoneCommand")] public partial class ConversationTextDoneUpdate{ } [Experimental("OPENAI002")][CodeGenModel("RealtimeResponseUsage")] public partial class ConversationTokenUsage { } [Experimental("OPENAI002")][CodeGenModel("RealtimeResponseUsageInputTokenDetails")] public partial class ConversationInputTokenUsageDetails { } [Experimental("OPENAI002")][CodeGenModel("RealtimeResponseUsageOutputTokenDetails")] public partial class ConversationOutputTokenUsageDetails { } diff --git a/src/Custom/RealtimeConversation/Internal/AsyncWebsocketMessageCollectionResult.cs b/src/Custom/RealtimeConversation/Internal/AsyncWebsocketMessageCollectionResult.cs index 439f977f2..270d5d501 100644 --- a/src/Custom/RealtimeConversation/Internal/AsyncWebsocketMessageCollectionResult.cs +++ b/src/Custom/RealtimeConversation/Internal/AsyncWebsocketMessageCollectionResult.cs @@ -1,11 +1,6 @@ -using OpenAI.Chat; -using System; using System.ClientModel; -using System.ClientModel.Primitives; using System.Collections.Generic; -using System.Net.ServerSentEvents; using System.Net.WebSockets; -using System.Text.Json; using System.Threading; using System.Threading.Tasks; @@ -13,16 +8,16 @@ namespace OpenAI.RealtimeConversation; internal partial class AsyncWebsocketMessageCollectionResult : AsyncCollectionResult { - private readonly ClientWebSocket _clientWebSocket; + private readonly WebSocket _webSocket; private readonly CancellationToken _cancellationToken; public AsyncWebsocketMessageCollectionResult( - ClientWebSocket clientWebSocket, + WebSocket webSocket, CancellationToken cancellationToken) { - Argument.AssertNotNull(clientWebSocket, nameof(clientWebSocket)); + Argument.AssertNotNull(webSocket, nameof(webSocket)); - _clientWebSocket = clientWebSocket; + _webSocket = webSocket; _cancellationToken = cancellationToken; } @@ -33,7 +28,7 @@ public override ContinuationToken GetContinuationToken(ClientResult page) public override async IAsyncEnumerable GetRawPagesAsync() { - await using IAsyncEnumerator enumerator = new AsyncWebsocketMessageResultEnumerator(_clientWebSocket, _cancellationToken); + await using IAsyncEnumerator enumerator = new AsyncWebsocketMessageResultEnumerator(_webSocket, _cancellationToken); while (await enumerator.MoveNextAsync().ConfigureAwait(false)) { yield return enumerator.Current; diff --git a/src/Custom/RealtimeConversation/Internal/AsyncWebsocketMessageEnumerator.cs b/src/Custom/RealtimeConversation/Internal/AsyncWebsocketMessageEnumerator.cs index 1d9edbe76..3df40ef6f 100644 --- a/src/Custom/RealtimeConversation/Internal/AsyncWebsocketMessageEnumerator.cs +++ b/src/Custom/RealtimeConversation/Internal/AsyncWebsocketMessageEnumerator.cs @@ -12,12 +12,12 @@ internal partial class AsyncWebsocketMessageResultEnumerator : IAsyncEnumerator< { public ClientResult Current { get; private set; } private readonly CancellationToken _cancellationToken; - private readonly ClientWebSocket _clientWebSocket; + private readonly WebSocket _webSocket; private readonly byte[] _receiveBuffer; - public AsyncWebsocketMessageResultEnumerator(ClientWebSocket clientWebSocket, CancellationToken cancellationToken) + public AsyncWebsocketMessageResultEnumerator(WebSocket webSocket, CancellationToken cancellationToken) { - _clientWebSocket = clientWebSocket; + _webSocket = webSocket; // 18K buffer size based on traffic observation; the connection will appropriately negotiate and use // fragmented messages if the buffer size is inadequate. _receiveBuffer = ArrayPool.Shared.Rent(1024 * 18); @@ -26,7 +26,7 @@ public AsyncWebsocketMessageResultEnumerator(ClientWebSocket clientWebSocket, Ca public ValueTask DisposeAsync() { - _clientWebSocket?.Dispose(); + _webSocket?.Dispose(); return new ValueTask(Task.CompletedTask); } @@ -35,7 +35,7 @@ public async ValueTask MoveNextAsync() WebsocketPipelineResponse websocketPipelineResponse = new(); for (int partialMessageCount = 1; !websocketPipelineResponse.IsComplete; partialMessageCount++) { - WebSocketReceiveResult receiveResult = await _clientWebSocket.ReceiveAsync(new(_receiveBuffer), _cancellationToken); + WebSocketReceiveResult receiveResult = await _webSocket.ReceiveAsync(new(_receiveBuffer), _cancellationToken); if (receiveResult.CloseStatus.HasValue) { Current = null; diff --git a/src/Custom/RealtimeConversation/Internal/GeneratorStubs.cs b/src/Custom/RealtimeConversation/Internal/GeneratorStubs.cs index 12d44116e..d88f51b6c 100644 --- a/src/Custom/RealtimeConversation/Internal/GeneratorStubs.cs +++ b/src/Custom/RealtimeConversation/Internal/GeneratorStubs.cs @@ -2,51 +2,43 @@ namespace OpenAI.RealtimeConversation; -[Experimental("OPENAI002")][CodeGenModel("RealtimeItemType")] internal readonly partial struct InternalRealtimeRequestItemType { } +[Experimental("OPENAI002")][CodeGenModel("RealtimeClientEvent")] internal partial class InternalRealtimeClientEvent { } +[Experimental("OPENAI002")][CodeGenModel("RealtimeClientEventConversationItemCreate")] internal partial class InternalRealtimeClientEventConversationItemCreate { } +[Experimental("OPENAI002")][CodeGenModel("RealtimeClientEventConversationItemDelete")] internal partial class InternalRealtimeClientEventConversationItemDelete { } +[Experimental("OPENAI002")][CodeGenModel("RealtimeClientEventConversationItemTruncate")] internal partial class InternalRealtimeClientEventConversationItemTruncate { } +[Experimental("OPENAI002")][CodeGenModel("RealtimeClientEventInputAudioBufferAppend")] internal partial class InternalRealtimeClientEventInputAudioBufferAppend { } +[Experimental("OPENAI002")][CodeGenModel("RealtimeClientEventInputAudioBufferClear")] internal partial class InternalRealtimeClientEventInputAudioBufferClear { } +[Experimental("OPENAI002")][CodeGenModel("RealtimeClientEventInputAudioBufferCommit")] internal partial class InternalRealtimeClientEventInputAudioBufferCommit { } +[Experimental("OPENAI002")][CodeGenModel("RealtimeClientEventResponseCancel")] internal partial class InternalRealtimeClientEventResponseCancel { } +[Experimental("OPENAI002")][CodeGenModel("RealtimeClientEventSessionUpdate")] internal partial class InternalRealtimeClientEventSessionUpdate { } +[Experimental("OPENAI002")][CodeGenModel("RealtimeClientEventType")] internal readonly partial struct InternalRealtimeClientEventType { } +[Experimental("OPENAI002")][CodeGenModel("RealtimeItemType")] internal readonly partial struct InternalRealtimeItemType { } [Experimental("OPENAI002")][CodeGenModel("RealtimeRequestAudioContentPart")] internal partial class InternalRealtimeRequestAudioContentPart { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeRequestCommand")] internal partial class InternalRealtimeRequestCommand { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeRequestCommandType")] internal readonly partial struct InternalRealtimeRequestCommandType { } [Experimental("OPENAI002")][CodeGenModel("RealtimeRequestFunctionCallItem")] internal partial class InternalRealtimeRequestFunctionCallItem { } [Experimental("OPENAI002")][CodeGenModel("RealtimeRequestFunctionCallOutputItem")] internal partial class InternalRealtimeRequestFunctionCallOutputItem { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeRequestInputAudioBufferAppendCommand")] internal partial class InternalRealtimeRequestInputAudioBufferAppendCommand { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeRequestInputAudioBufferClearCommand")] internal partial class InternalRealtimeRequestInputAudioBufferClearCommand { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeRequestInputAudioBufferCommitCommand")] internal partial class InternalRealtimeRequestInputAudioBufferCommitCommand { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeRequestItemCreateCommand")] internal partial class InternalRealtimeRequestItemCreateCommand { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeRequestItemDeleteCommand")] internal partial class InternalRealtimeRequestItemDeleteCommand { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeRequestItemTruncateCommand")] internal partial class InternalRealtimeRequestItemTruncateCommand { } [Experimental("OPENAI002")][CodeGenModel("RealtimeRequestMessageItem")] internal partial class InternalRealtimeRequestMessageItem { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeRequestModel")] internal readonly partial struct InternalRealtimeRequestModel { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeRequestResponseCancelCommand")] internal partial class InternalRealtimeRequestResponseCancelCommand { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeRequestResponseCreateCommandResponse")] internal partial class InternalRealtimeRequestResponseCreateCommandResponse { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeRequestSessionUpdateCommand")] internal partial class InternalRealtimeRequestSessionUpdateCommand { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeRequestSessionUpdateCommandSessionModality")] internal readonly partial struct InternalRealtimeRequestSessionUpdateCommandSessionModality { } +[Experimental("OPENAI002")][CodeGenModel("RealtimeRequestSessionModality")] internal readonly partial struct InternalRealtimeRequestSessionModality { } [Experimental("OPENAI002")][CodeGenModel("RealtimeRequestTextContentPart")] internal partial class InternalRealtimeRequestTextContentPart { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeResponseApiError")] internal partial class InternalRealtimeResponseApiError { } [Experimental("OPENAI002")][CodeGenModel("RealtimeResponseAudioContentPart")] internal partial class InternalRealtimeResponseAudioContentPart { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeResponseCancelledStatusDetails")] internal partial class InternalRealtimeResponseCancelledStatusDetails { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeResponseCancelledStatusDetailsReason")] internal readonly partial struct InternalRealtimeResponseCancelledStatusDetailsReason { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeResponseFailedStatusDetails")] internal partial class RealtimeResponseFailedStatusDetails { } [Experimental("OPENAI002")][CodeGenModel("RealtimeResponseFunctionCallItem")] internal partial class InternalRealtimeResponseFunctionCallItem { } [Experimental("OPENAI002")][CodeGenModel("RealtimeResponseFunctionCallOutputItem")] internal partial class InternalRealtimeResponseFunctionCallOutputItem { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeResponseIncompleteStatusDetails")] internal partial class InternalRealtimeResponseIncompleteStatusDetails { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeResponseIncompleteStatusDetailsReason")] internal readonly partial struct InternalRealtimeResponseIncompleteStatusDetailsReason { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeResponseIncompleteStatusReason")] internal readonly partial struct InternalRealtimeResponseIncompleteStatusReason { } [Experimental("OPENAI002")][CodeGenModel("RealtimeResponseItemObject")] internal readonly partial struct InternalRealtimeResponseItemObject { } [Experimental("OPENAI002")][CodeGenModel("RealtimeResponseObject")] internal readonly partial struct InternalRealtimeResponseObject { } [Experimental("OPENAI002")][CodeGenModel("RealtimeResponseSessionObject")] internal readonly partial struct InternalRealtimeResponseSessionObject { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeResponseStatusDetails")] internal partial class InternalRealtimeResponseStatusDetails { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeResponseStatusDetailsType")] internal readonly partial struct InternalRealtimeResponseStatusDetailsType { } [Experimental("OPENAI002")][CodeGenModel("RealtimeResponseTextContentPart")] internal partial class InternalRealtimeResponseTextContentPart { } +[Experimental("OPENAI002")][CodeGenModel("RealtimeServerEventConversationCreated")] internal partial class InternalRealtimeServerEventConversationCreated { } +[Experimental("OPENAI002")][CodeGenModel("RealtimeServerEventConversationCreatedConversation")] internal partial class InternalRealtimeServerEventConversationCreatedConversation { } +[Experimental("OPENAI002")][CodeGenModel("RealtimeServerEventConversationItemInputAudioTranscriptionFailedError")] internal partial class InternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError { } +[Experimental("OPENAI002")][CodeGenModel("RealtimeServerEventErrorError")] internal partial class InternalRealtimeServerEventErrorError { } [Experimental("OPENAI002")][CodeGenModel("RealtimeToolChoiceFunctionObject")] internal partial class InternalRealtimeToolChoiceFunctionObject { } [Experimental("OPENAI002")][CodeGenModel("RealtimeToolChoiceFunctionObjectFunction")] internal partial class InternalRealtimeToolChoiceFunctionObjectFunction { } [Experimental("OPENAI002")][CodeGenModel("RealtimeToolChoiceObject")] internal partial class InternalRealtimeToolChoiceObject { } +[Experimental("OPENAI002")][CodeGenModel("UnknownRealtimeClientEvent")] internal partial class UnknownRealtimeClientEvent { } [Experimental("OPENAI002")][CodeGenModel("UnknownRealtimeContentPart")] internal partial class UnknownRealtimeContentPart { } -[Experimental("OPENAI002")][CodeGenModel("UnknownRealtimeRequestCommand")] internal partial class UnknownRealtimeRequestCommand { } [Experimental("OPENAI002")][CodeGenModel("UnknownRealtimeRequestItem")] internal partial class UnknownRealtimeRequestItem { } -[Experimental("OPENAI002")][CodeGenModel("UnknownRealtimeResponseCommand")] internal partial class UnknownRealtimeResponseCommand { } [Experimental("OPENAI002")][CodeGenModel("UnknownRealtimeResponseItem")] internal partial class UnknownRealtimeResponseItem { } [Experimental("OPENAI002")][CodeGenModel("UnknownRealtimeResponseStatusDetails")] internal partial class UnknownRealtimeResponseStatusDetails { } +[Experimental("OPENAI002")][CodeGenModel("UnknownRealtimeServerEvent")] internal partial class UnknownRealtimeServerEvent { } [Experimental("OPENAI002")][CodeGenModel("UnknownRealtimeTool")] internal partial class UnknownRealtimeTool { } [Experimental("OPENAI002")][CodeGenModel("UnknownRealtimeToolChoiceObject")] internal partial class UnknownRealtimeToolChoiceObject { } [Experimental("OPENAI002")][CodeGenModel("UnknownRealtimeTurnDetection")] internal partial class UnknownRealtimeTurnDetection { } -[Experimental("OPENAI002")][CodeGenModel("RealtimeResponseError")] internal partial class InternalRealtimeResponseError { } diff --git a/src/Custom/RealtimeConversation/Internal/InternalRealtimeClientEventResponseCreate.cs b/src/Custom/RealtimeConversation/Internal/InternalRealtimeClientEventResponseCreate.cs new file mode 100644 index 000000000..8524b830f --- /dev/null +++ b/src/Custom/RealtimeConversation/Internal/InternalRealtimeClientEventResponseCreate.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.ClientModel.Primitives; +using System.Text.Json; +using System.Diagnostics.CodeAnalysis; + +namespace OpenAI.RealtimeConversation; + +[Experimental("OPENAI002")] +[CodeGenModel("RealtimeClientEventResponseCreate")] +internal partial class InternalRealtimeClientEventResponseCreate +{ +} diff --git a/src/Custom/RealtimeConversation/Internal/InternalRealtimeClientEventResponseCreateResponse.cs b/src/Custom/RealtimeConversation/Internal/InternalRealtimeClientEventResponseCreateResponse.cs new file mode 100644 index 000000000..46a1d56ed --- /dev/null +++ b/src/Custom/RealtimeConversation/Internal/InternalRealtimeClientEventResponseCreateResponse.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.ClientModel.Primitives; +using System.Text.Json; +using System.Diagnostics.CodeAnalysis; +using System.Linq; + +namespace OpenAI.RealtimeConversation; + +[Experimental("OPENAI002")] +[CodeGenModel("RealtimeClientEventResponseCreateResponse")] +internal partial class InternalRealtimeClientEventResponseCreateResponse +{ + [CodeGenMember("ToolChoice")] + public BinaryData ToolChoice { get; set; } + + public static InternalRealtimeClientEventResponseCreateResponse FromSessionOptions( + ConversationSessionOptions sessionOptions) + { + Argument.AssertNotNull(sessionOptions, nameof(sessionOptions)); + if (Optional.IsDefined(sessionOptions.InputAudioFormat)) + { + throw new InvalidOperationException($"{nameof(sessionOptions.InputAudioFormat)} cannot be overriden" + + " per response."); + } + BinaryData maxTokensChoice = Optional.IsDefined(sessionOptions.MaxOutputTokens) + ? ModelReaderWriter.Write(sessionOptions.MaxOutputTokens) + : null; + IList internalModalities + = sessionOptions.ContentModalities.ToInternalModalities(); + IList rawModalities = internalModalities.Count > 0 + ? internalModalities.Select(modality => modality.ToString()).ToList() + : new ChangeTrackingList(); + BinaryData toolChoice = Optional.IsDefined(sessionOptions.ToolChoice) + ? ModelReaderWriter.Write(sessionOptions.ToolChoice) + : null; + InternalRealtimeClientEventResponseCreateResponse internalOptions = new( + modalities: rawModalities, + instructions: sessionOptions.Instructions, + voice: sessionOptions.Voice?.ToString(), + outputAudioFormat: sessionOptions.OutputAudioFormat?.ToString(), + tools: sessionOptions.Tools, + toolChoice: toolChoice, + temperature: sessionOptions.Temperature, + maxOutputTokens: maxTokensChoice, + serializedAdditionalRawData: null); + return internalOptions; + } +} diff --git a/src/Custom/RealtimeConversation/Internal/InternalRealtimeRequestAudioContentPart.cs b/src/Custom/RealtimeConversation/Internal/InternalRealtimeRequestAudioContentPart.cs new file mode 100644 index 000000000..3425d65e3 --- /dev/null +++ b/src/Custom/RealtimeConversation/Internal/InternalRealtimeRequestAudioContentPart.cs @@ -0,0 +1,9 @@ +using System; +using System.Collections.Generic; + +namespace OpenAI.RealtimeConversation; +internal partial class InternalRealtimeRequestAudioContentPart : ConversationContentPart +{ + [CodeGenMember("Transcript")] + public string InternalTranscriptValue { get; set; } +} diff --git a/src/Custom/RealtimeConversation/Internal/InternalRealtimeRequestResponseCreateCommand.cs b/src/Custom/RealtimeConversation/Internal/InternalRealtimeRequestResponseCreateCommand.cs deleted file mode 100644 index aa271a0ee..000000000 --- a/src/Custom/RealtimeConversation/Internal/InternalRealtimeRequestResponseCreateCommand.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ClientModel.Primitives; -using System.Text.Json; -using System.Diagnostics.CodeAnalysis; - -namespace OpenAI.RealtimeConversation; - -[Experimental("OPENAI002")] -[CodeGenModel("RealtimeRequestResponseCreateCommand")] -internal partial class InternalRealtimeRequestResponseCreateCommand -{ - [CodeGenMember("MaxOutputTokens")] - private BinaryData _maxOutputTokens; - - public ConversationMaxTokensChoice MaxResponseOutputTokens - { - get => ConversationMaxTokensChoice.FromBinaryData(_maxOutputTokens); - set - { - _maxOutputTokens = value == null ? null : ModelReaderWriter.Write(value); - } - } -} diff --git a/src/Custom/RealtimeConversation/Internal/InternalRealtimeRequestTextContentPart.cs b/src/Custom/RealtimeConversation/Internal/InternalRealtimeRequestTextContentPart.cs new file mode 100644 index 000000000..b8eb013d3 --- /dev/null +++ b/src/Custom/RealtimeConversation/Internal/InternalRealtimeRequestTextContentPart.cs @@ -0,0 +1,9 @@ +using System; +using System.Collections.Generic; + +namespace OpenAI.RealtimeConversation; +internal partial class InternalRealtimeRequestTextContentPart : ConversationContentPart +{ + [CodeGenMember("Text")] + public string InternalTextValue { get; set; } +} diff --git a/src/Custom/RealtimeConversation/Internal/InternalRealtimeRequestUserMessageItem.cs b/src/Custom/RealtimeConversation/Internal/InternalRealtimeRequestUserMessageItem.cs index 26d440981..c99493667 100644 --- a/src/Custom/RealtimeConversation/Internal/InternalRealtimeRequestUserMessageItem.cs +++ b/src/Custom/RealtimeConversation/Internal/InternalRealtimeRequestUserMessageItem.cs @@ -15,7 +15,7 @@ public InternalRealtimeRequestUserMessageItem(IEnumerable (this as InternalRealtimeResponseMessageItem)?.ResponseId + ?? (this as InternalRealtimeResponseFunctionCallItem)?.ResponseId + ?? (this as InternalRealtimeResponseFunctionCallOutputItem)?.ResponseId; + public ConversationMessageRole? MessageRole => (this as InternalRealtimeResponseMessageItem)?.Role; diff --git a/src/Custom/RealtimeConversation/Internal/InternalRealtimeResponseTextContentPart.cs b/src/Custom/RealtimeConversation/Internal/InternalRealtimeResponseTextContentPart.cs new file mode 100644 index 000000000..b27711434 --- /dev/null +++ b/src/Custom/RealtimeConversation/Internal/InternalRealtimeResponseTextContentPart.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; + +namespace OpenAI.RealtimeConversation; + +internal partial class InternalRealtimeResponseTextContentPart : ConversationContentPart +{ + [CodeGenMember("Text")] + public string InternalTextValue { get; } +} diff --git a/src/Custom/RealtimeConversation/Internal/InternalRealtimeServerEventResponseAudioDelta.cs b/src/Custom/RealtimeConversation/Internal/InternalRealtimeServerEventResponseAudioDelta.cs new file mode 100644 index 000000000..734e4388a --- /dev/null +++ b/src/Custom/RealtimeConversation/Internal/InternalRealtimeServerEventResponseAudioDelta.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.ClientModel.Primitives; +using System.Text.Json; +using System.Diagnostics.CodeAnalysis; + +namespace OpenAI.RealtimeConversation; + +/// +/// The update (response command) of type response.audio.delta, which is received after correlated +/// (response.output_item.added), +/// (conversation.item.created), and +/// (response.content_part.added) commands that initialize +/// an audio content part. This and other related delta events append audio data into the associated content part. +/// +[Experimental("OPENAI002")] +[CodeGenModel("RealtimeServerEventResponseAudioDelta")] +internal partial class InternalRealtimeServerEventResponseAudioDelta +{ } diff --git a/src/Custom/RealtimeConversation/Internal/InternalRealtimeServerEventResponseAudioTranscriptDelta.cs b/src/Custom/RealtimeConversation/Internal/InternalRealtimeServerEventResponseAudioTranscriptDelta.cs new file mode 100644 index 000000000..f55388fac --- /dev/null +++ b/src/Custom/RealtimeConversation/Internal/InternalRealtimeServerEventResponseAudioTranscriptDelta.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.ClientModel.Primitives; +using System.Text.Json; +using System.Diagnostics.CodeAnalysis; + +namespace OpenAI.RealtimeConversation; + +/// +/// The update (response command) of type response.audio_transcript.delta, which is received while populating +/// an output audio content part of a conversation item. +/// +[Experimental("OPENAI002")] +[CodeGenModel("RealtimeServerEventResponseAudioTranscriptDelta")] +internal partial class InternalRealtimeServerEventResponseAudioTranscriptDelta +{ } diff --git a/src/Custom/RealtimeConversation/Internal/InternalRealtimeServerEventResponseContentPartAdded.cs b/src/Custom/RealtimeConversation/Internal/InternalRealtimeServerEventResponseContentPartAdded.cs new file mode 100644 index 000000000..c576fc459 --- /dev/null +++ b/src/Custom/RealtimeConversation/Internal/InternalRealtimeServerEventResponseContentPartAdded.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; + +namespace OpenAI.RealtimeConversation; + +/// +/// The update (response command) of type response.content_part.added, which is received when a response turn +/// has begun emission of a content part within a conversation item. This will be followed by some number of +/// *delta commands (e.g. or +/// ) before finalization via a +/// command (response.content_part.done). +/// +[Experimental("OPENAI002")] +[CodeGenModel("RealtimeServerEventResponseContentPartAdded")] +internal partial class InternalRealtimeServerEventResponseContentPartAdded +{ + [CodeGenMember("Part")] + private readonly ConversationContentPart _internalContentPart; + + public ConversationContentPartKind ContentPartKind => _internalContentPart switch + { + InternalRealtimeResponseTextContentPart => ConversationContentPartKind.InputText, + InternalRealtimeResponseAudioContentPart => ConversationContentPartKind.InputAudio, + _ => null, + }; + + public string Text => (_internalContentPart as InternalRealtimeResponseTextContentPart)?.InternalTextValue; + public string AudioTranscript => (_internalContentPart as InternalRealtimeResponseAudioContentPart)?.InternalTranscriptValue; +} diff --git a/src/Custom/RealtimeConversation/Internal/InternalRealtimeServerEventResponseContentPartDone.cs b/src/Custom/RealtimeConversation/Internal/InternalRealtimeServerEventResponseContentPartDone.cs new file mode 100644 index 000000000..167698f34 --- /dev/null +++ b/src/Custom/RealtimeConversation/Internal/InternalRealtimeServerEventResponseContentPartDone.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; + +namespace OpenAI.RealtimeConversation; + +/// +/// The update (response command) of type response.content_part.done, which is received when a response turn +/// has completed emission of a content part within a conversation item. This will be preceded by a +/// command (response.content_part.added) and some number of +/// *delta commands (e.g. or +/// ). +/// +[Experimental("OPENAI002")] +[CodeGenModel("RealtimeServerEventResponseContentPartDone")] +internal partial class InternalRealtimeServerEventResponseContentPartDone +{ + [CodeGenMember("Part")] + private readonly ConversationContentPart _internalContentPart; + + public ConversationContentPartKind ContentPartKind => _internalContentPart switch + { + InternalRealtimeResponseTextContentPart => ConversationContentPartKind.InputText, + InternalRealtimeResponseAudioContentPart => ConversationContentPartKind.InputAudio, + _ => null, + }; + + public string Text => (_internalContentPart as InternalRealtimeResponseTextContentPart)?.InternalTextValue; + public string AudioTranscript => (_internalContentPart as InternalRealtimeResponseAudioContentPart)?.InternalTranscriptValue; +} diff --git a/src/Custom/RealtimeConversation/Internal/InternalRealtimeServerEventResponseFunctionCallArgumentsDelta.cs b/src/Custom/RealtimeConversation/Internal/InternalRealtimeServerEventResponseFunctionCallArgumentsDelta.cs new file mode 100644 index 000000000..712967a6d --- /dev/null +++ b/src/Custom/RealtimeConversation/Internal/InternalRealtimeServerEventResponseFunctionCallArgumentsDelta.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.ClientModel.Primitives; +using System.Text.Json; +using System.Diagnostics.CodeAnalysis; + +namespace OpenAI.RealtimeConversation; + +/// +/// The update (response command) of type response.function_call_arguments.delta, which is received after correlated +/// (response.output_item.added) and +/// (conversation.item.created) commands that initialize +/// a conversation function call item. This and other related delta events append function arguments to the item as +/// incremental JSON. +/// +/// +/// Each delta payload only contains a small, incremental portion of the overall function call argument payload +/// and is not a valid JSON document on its own. For the complete JSON arguments, refer to +/// commands or +/// . Using this incremental JSON deltas requires the +/// use of a compatible, incremental parser. +/// +[Experimental("OPENAI002")] +[CodeGenModel("RealtimeServerEventResponseFunctionCallArgumentsDelta")] +internal partial class InternalRealtimeServerEventResponseFunctionCallArgumentsDelta +{ } diff --git a/src/Custom/RealtimeConversation/Internal/InternalRealtimeServerEventResponseFunctionCallArgumentsDone.cs b/src/Custom/RealtimeConversation/Internal/InternalRealtimeServerEventResponseFunctionCallArgumentsDone.cs new file mode 100644 index 000000000..cbddbf1d4 --- /dev/null +++ b/src/Custom/RealtimeConversation/Internal/InternalRealtimeServerEventResponseFunctionCallArgumentsDone.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ClientModel.Primitives; +using System.Text.Json; +using System.Diagnostics.CodeAnalysis; + +namespace OpenAI.RealtimeConversation; + +/// +/// The update (response command) of type response.function_call_arguments.done, which is received after all +/// associated commands have finished incrementally +/// streaming the arguments to a conversation function call item. This update contains the complete body of the +/// function call arguments and is typically interpreted as a JSON document with parameterization matching the +/// associated function definition. +/// +[CodeGenModel("RealtimeServerEventResponseFunctionCallArgumentsDone")] +internal partial class InternalRealtimeServerEventResponseFunctionCallArgumentsDone +{ } diff --git a/src/Custom/RealtimeConversation/Internal/InternalRealtimeServerEventResponseTextDelta.cs b/src/Custom/RealtimeConversation/Internal/InternalRealtimeServerEventResponseTextDelta.cs new file mode 100644 index 000000000..e28a8629f --- /dev/null +++ b/src/Custom/RealtimeConversation/Internal/InternalRealtimeServerEventResponseTextDelta.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.ClientModel.Primitives; +using System.Text.Json; +using System.Diagnostics.CodeAnalysis; + +namespace OpenAI.RealtimeConversation; + +/// +/// The update (response command) of type response.text.delta, which is received after correlated +/// (response.output_item.added), +/// (conversation.item.created), and +/// (response.content_part.added) commands that initialize +/// a text content part. This and other related delta events append text data into the associated content part. +/// +[Experimental("OPENAI002")] +[CodeGenModel("RealtimeServerEventResponseTextDelta")] +internal partial class InternalRealtimeServerEventResponseTextDelta +{ } diff --git a/src/Custom/RealtimeConversation/RealtimeConversationClient.cs b/src/Custom/RealtimeConversation/RealtimeConversationClient.cs index 15665d03f..26ffb89e3 100644 --- a/src/Custom/RealtimeConversation/RealtimeConversationClient.cs +++ b/src/Custom/RealtimeConversation/RealtimeConversationClient.cs @@ -9,9 +9,9 @@ namespace OpenAI.RealtimeConversation; [CodeGenClient("Realtime")] -[CodeGenSuppress("StartRealtimeSessionAsync", typeof(IEnumerable))] +[CodeGenSuppress("StartRealtimeSessionAsync", typeof(IEnumerable))] [CodeGenSuppress("StartRealtimeSessionAsync", typeof(BinaryContent), typeof(RequestOptions))] -[CodeGenSuppress("StartRealtimeSession", typeof(IEnumerable))] +[CodeGenSuppress("StartRealtimeSession", typeof(IEnumerable))] [CodeGenSuppress("StartRealtimeSession", typeof(BinaryContent), typeof(RequestOptions))] [CodeGenSuppress("CreateStartRealtimeSessionRequest", typeof(BinaryContent), typeof(RequestOptions))] [Experimental("OPENAI002")] diff --git a/src/Custom/RealtimeConversation/RealtimeConversationSession.Protocol.cs b/src/Custom/RealtimeConversation/RealtimeConversationSession.Protocol.cs index c7767fd77..fa6c7d749 100644 --- a/src/Custom/RealtimeConversation/RealtimeConversationSession.Protocol.cs +++ b/src/Custom/RealtimeConversation/RealtimeConversationSession.Protocol.cs @@ -11,17 +11,30 @@ namespace OpenAI.RealtimeConversation; public partial class RealtimeConversationSession { - protected ClientWebSocket _clientWebSocket; private readonly SemaphoreSlim _clientSendSemaphore = new(initialCount: 1, maxCount: 1); private readonly object _singleReceiveLock = new(); private AsyncWebsocketMessageCollectionResult _receiveCollectionResult; + /// + /// Initializes an underlying instance for communication with the /realtime edpoint and + /// then connects to the service using this socket. + /// + /// + /// [EditorBrowsable(EditorBrowsableState.Never)] protected internal virtual async Task ConnectAsync(RequestOptions options) { - _clientWebSocket.Options.AddSubProtocol("realtime"); - await _clientWebSocket.ConnectAsync(_endpoint, options?.CancellationToken ?? default) + WebSocket?.Dispose(); + _credential.Deconstruct(out string dangerousCredential); + ClientWebSocket clientWebSocket = new(); + clientWebSocket.Options.AddSubProtocol("realtime"); + clientWebSocket.Options.SetRequestHeader("openai-beta", $"realtime=v1"); + clientWebSocket.Options.SetRequestHeader("Authorization", $"Bearer {dangerousCredential}"); + + await clientWebSocket.ConnectAsync(_endpoint, options?.CancellationToken ?? default) .ConfigureAwait(false); + + WebSocket = clientWebSocket; } [EditorBrowsable(EditorBrowsableState.Never)] @@ -44,7 +57,7 @@ public virtual async Task SendCommandAsync(BinaryData data, RequestOptions optio await _clientSendSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false); try { - await _clientWebSocket.SendAsync( + await WebSocket.SendAsync( messageBytes, WebSocketMessageType.Text, // TODO: extensibility for binary messages -- via "content"? endOfMessage: true, @@ -61,7 +74,7 @@ await _clientWebSocket.SendAsync( public virtual void SendCommand(BinaryData data, RequestOptions options) { // ClientWebSocket does **not** include a synchronous Send() - SendCommandAsync(data, options).Wait(); + SendCommandAsync(data, options).ConfigureAwait(false).GetAwaiter().GetResult(); } [EditorBrowsable(EditorBrowsableState.Never)] @@ -69,7 +82,7 @@ public virtual async IAsyncEnumerable ReceiveUpdatesAsync(RequestO { lock (_singleReceiveLock) { - _receiveCollectionResult ??= new(_clientWebSocket, options?.CancellationToken ?? default); + _receiveCollectionResult ??= new(WebSocket, options?.CancellationToken ?? default); } await foreach (ClientResult result in _receiveCollectionResult) { diff --git a/src/Custom/RealtimeConversation/RealtimeConversationSession.cs b/src/Custom/RealtimeConversation/RealtimeConversationSession.cs index 9ecc09870..960f817e7 100644 --- a/src/Custom/RealtimeConversation/RealtimeConversationSession.cs +++ b/src/Custom/RealtimeConversation/RealtimeConversationSession.cs @@ -7,7 +7,6 @@ using System.IO; using System.Net.WebSockets; using System.Runtime.CompilerServices; -using System.Text; using System.Threading; using System.Threading.Tasks; @@ -16,6 +15,8 @@ namespace OpenAI.RealtimeConversation; [Experimental("OPENAI002")] public partial class RealtimeConversationSession : IDisposable { + public WebSocket WebSocket { get; protected set; } + private readonly RealtimeConversationClient _parentClient; private readonly Uri _endpoint; private readonly ApiKeyCredential _credential; @@ -35,11 +36,6 @@ protected internal RealtimeConversationSession( _parentClient = parentClient; _endpoint = endpoint; _credential = credential; - _clientWebSocket = new ClientWebSocket(); - - _credential.Deconstruct(out string dangerousCredential); - _clientWebSocket.Options.SetRequestHeader("openai-beta", $"realtime=v1"); - _clientWebSocket.Options.SetRequestHeader("Authorization", $"Bearer {dangerousCredential}"); } /// @@ -48,8 +44,9 @@ protected internal RealtimeConversationSession( /// The audio stream to transmit. /// An optional cancellation token. /// - public async Task SendAudioAsync(Stream audio, CancellationToken cancellationToken = default) + public virtual async Task SendInputAudioAsync(Stream audio, CancellationToken cancellationToken = default) { + Argument.AssertNotNull(audio, nameof(audio)); lock (_sendingAudioLock) { if (_isSendingAudio) @@ -71,7 +68,7 @@ public async Task SendAudioAsync(Stream audio, CancellationToken cancellationTok ReadOnlyMemory audioMemory = buffer.AsMemory(0, bytesRead); BinaryData audioData = BinaryData.FromBytes(audioMemory); - InternalRealtimeRequestInputAudioBufferAppendCommand internalCommand = new(audioData); + InternalRealtimeClientEventInputAudioBufferAppend internalCommand = new(audioData); BinaryData requestData = ModelReaderWriter.Write(internalCommand); await SendCommandAsync(requestData, cancellationToken.ToRequestOptions()).ConfigureAwait(false); } @@ -85,6 +82,44 @@ public async Task SendAudioAsync(Stream audio, CancellationToken cancellationTok } } + public virtual void SendInputAudio(Stream audio, CancellationToken cancellationToken = default) + { + Argument.AssertNotNull(audio, nameof(audio)); + lock (_sendingAudioLock) + { + if (_isSendingAudio) + { + throw new InvalidOperationException($"Only one stream of audio may be sent at once."); + } + _isSendingAudio = true; + } + try + { + byte[] buffer = ArrayPool.Shared.Rent(1024 * 16); + while (true) + { + int bytesRead = audio.Read(buffer, 0, buffer.Length); + if (bytesRead == 0) + { + break; + } + + ReadOnlyMemory audioMemory = buffer.AsMemory(0, bytesRead); + BinaryData audioData = BinaryData.FromBytes(audioMemory); + InternalRealtimeClientEventInputAudioBufferAppend internalCommand = new(audioData); + BinaryData requestData = ModelReaderWriter.Write(internalCommand); + SendCommand(requestData, cancellationToken.ToRequestOptions()); + } + } + finally + { + lock (_sendingAudioLock) + { + _isSendingAudio = false; + } + } + } + /// /// Transmits a single chunk of audio. /// @@ -92,8 +127,9 @@ public async Task SendAudioAsync(Stream audio, CancellationToken cancellationTok /// /// /// - public async Task SendAudioAsync(BinaryData audio, CancellationToken cancellationToken = default) + public virtual async Task SendInputAudioAsync(BinaryData audio, CancellationToken cancellationToken = default) { + Argument.AssertNotNull(audio, nameof(audio)); lock (_sendingAudioLock) { if (_isSendingAudio) @@ -103,68 +139,190 @@ public async Task SendAudioAsync(BinaryData audio, CancellationToken cancellatio _isSendingAudio = true; } // TODO: consider automatically limiting/breaking size of chunk (as with streaming) - InternalRealtimeRequestInputAudioBufferAppendCommand internalCommand = new(audio); + InternalRealtimeClientEventInputAudioBufferAppend internalCommand = new(audio); BinaryData requestData = ModelReaderWriter.Write(internalCommand); await SendCommandAsync(requestData, cancellationToken.ToRequestOptions()).ConfigureAwait(false); } - public async Task ConfigureSessionAsync(ConversationSessionOptions sessionOptions, CancellationToken cancellationToken = default) + /// + /// Transmits a single chunk of audio. + /// + /// + /// + /// + /// + public virtual void SendInputAudio(BinaryData audio, CancellationToken cancellationToken = default) { - InternalRealtimeRequestSessionUpdateCommand internalCommand = new(sessionOptions); + Argument.AssertNotNull(audio, nameof(audio)); + lock (_sendingAudioLock) + { + if (_isSendingAudio) + { + throw new InvalidOperationException($"Cannot send a standalone audio chunk while a stream is already in progress."); + } + _isSendingAudio = true; + } + // TODO: consider automatically limiting/breaking size of chunk (as with streaming) + InternalRealtimeClientEventInputAudioBufferAppend internalCommand = new(audio); + BinaryData requestData = ModelReaderWriter.Write(internalCommand); + SendCommand(requestData, cancellationToken.ToRequestOptions()); + } + + public virtual async Task ClearInputAudioAsync(CancellationToken cancellationToken = default) + { + InternalRealtimeClientEventInputAudioBufferClear internalCommand = new(); await SendCommandAsync(internalCommand, cancellationToken).ConfigureAwait(false); } - public async Task AddItemAsync(ConversationItem item, CancellationToken cancellationToken = default) - => await AddItemAsync(item, null, cancellationToken).ConfigureAwait(false); + public virtual void ClearInputAudio(CancellationToken cancellationToken = default) + { + InternalRealtimeClientEventInputAudioBufferClear internalCommand = new(); + SendCommand(internalCommand, cancellationToken); + } - public async Task AddItemAsync(ConversationItem item, string previousItemId, CancellationToken cancellationToken = default) + public virtual async Task ConfigureSessionAsync(ConversationSessionOptions sessionOptions, CancellationToken cancellationToken = default) { - InternalRealtimeRequestItemCreateCommand internalCommand = new(item) + Argument.AssertNotNull(sessionOptions, nameof(sessionOptions)); + InternalRealtimeClientEventSessionUpdate internalCommand = new(sessionOptions); + await SendCommandAsync(internalCommand, cancellationToken).ConfigureAwait(false); + } + + public virtual void ConfigureSession(ConversationSessionOptions sessionOptions, CancellationToken cancellationToken = default) + { + Argument.AssertNotNull(sessionOptions, nameof(sessionOptions)); + InternalRealtimeClientEventSessionUpdate internalCommand = new(sessionOptions); + SendCommand(internalCommand, cancellationToken); + } + + public virtual async Task AddItemAsync(ConversationItem item, CancellationToken cancellationToken = default) + => await AddItemAsync(item, previousItemId: null, cancellationToken).ConfigureAwait(false); + + public virtual void AddItem(ConversationItem item, CancellationToken cancellationToken = default) + => AddItem(item, previousItemId: null, cancellationToken); + + public virtual async Task AddItemAsync(ConversationItem item, string previousItemId, CancellationToken cancellationToken = default) + { + Argument.AssertNotNull(item, nameof(item)); + InternalRealtimeClientEventConversationItemCreate internalCommand = new(item) { PreviousItemId = previousItemId, }; await SendCommandAsync(internalCommand, cancellationToken).ConfigureAwait(false); } - public async Task DeleteItemAsync(string itemId, CancellationToken cancellationToken = default) + public virtual void AddItem(ConversationItem item, string previousItemId, CancellationToken cancellationToken = default) + { + Argument.AssertNotNull(item, nameof(item)); + InternalRealtimeClientEventConversationItemCreate internalCommand = new(item) + { + PreviousItemId = previousItemId, + }; + SendCommand(internalCommand, cancellationToken); + } + + public virtual async Task DeleteItemAsync(string itemId, CancellationToken cancellationToken = default) { Argument.AssertNotNull(itemId, nameof(itemId)); - await SendCommandAsync(new InternalRealtimeRequestItemDeleteCommand(itemId), cancellationToken).ConfigureAwait(false); + InternalRealtimeClientEventConversationItemDelete internalCommand = new(itemId); + await SendCommandAsync(internalCommand, cancellationToken).ConfigureAwait(false); } - public async Task CommitPendingAudioAsync(CancellationToken cancellationToken = default) + public virtual void DeleteItem(string itemId, CancellationToken cancellationToken = default) { - await SendCommandAsync(new InternalRealtimeRequestInputAudioBufferCommitCommand(), cancellationToken).ConfigureAwait(false); + Argument.AssertNotNull(itemId, nameof(itemId)); + InternalRealtimeClientEventConversationItemDelete internalCommand = new(itemId); + SendCommand(internalCommand, cancellationToken); } - public async Task InterruptTurnAsync(CancellationToken cancellationToken = default) + public virtual async Task TruncateItemAsync(string itemId, int contentPartIndex, TimeSpan audioDuration, CancellationToken cancellationToken = default) { - await SendCommandAsync(new InternalRealtimeRequestResponseCancelCommand(), cancellationToken).ConfigureAwait(false); + Argument.AssertNotNull(itemId, nameof(itemId)); + InternalRealtimeClientEventConversationItemTruncate internalCommand = new( + itemId: itemId, + contentIndex: contentPartIndex, + audioEndMs: (int)audioDuration.TotalMilliseconds); + await SendCommandAsync(internalCommand, cancellationToken).ConfigureAwait(false); } - public async Task StartResponseTurnAsync(CancellationToken cancellationToken = default) + public virtual void TruncateItem(string itemId, int contentPartIndex, TimeSpan audioDuration, CancellationToken cancellationToken = default) { - InternalRealtimeRequestResponseCreateCommand internalCommand = new() - { - Response = new(commit: true, cancelPrevious: true) - }; + Argument.AssertNotNull(itemId, nameof(itemId)); + InternalRealtimeClientEventConversationItemTruncate internalCommand = new( + itemId: itemId, + contentIndex: contentPartIndex, + audioEndMs: (int)audioDuration.TotalMilliseconds); + SendCommand(internalCommand, cancellationToken); + } + + public virtual async Task CommitPendingAudioAsync(CancellationToken cancellationToken = default) + { + InternalRealtimeClientEventInputAudioBufferCommit internalCommand = new(); await SendCommandAsync(internalCommand, cancellationToken).ConfigureAwait(false); } - public async Task CancelResponseTurnAsync(CancellationToken cancellationToken = default) + public virtual void CommitPendingAudio(CancellationToken cancellationToken = default) { - InternalRealtimeRequestResponseCancelCommand internalCommand = new(); + InternalRealtimeClientEventInputAudioBufferCommit internalCommand = new(); + SendCommand(internalCommand, cancellationToken); + } + + public virtual async Task InterruptResponseAsync(CancellationToken cancellationToken = default) + { + InternalRealtimeClientEventResponseCancel internalCommand = new(); await SendCommandAsync(internalCommand, cancellationToken).ConfigureAwait(false); } - internal virtual async Task SendCommandAsync(InternalRealtimeRequestCommand command, CancellationToken cancellationToken = default) + public virtual void InterruptResponse(CancellationToken cancellationToken = default) { - BinaryData requestData = ModelReaderWriter.Write(command); - RequestOptions cancellationOptions = cancellationToken.ToRequestOptions(); - await SendCommandAsync(requestData, cancellationOptions).ConfigureAwait(false); + InternalRealtimeClientEventResponseCancel internalCommand = new(); + SendCommand(internalCommand, cancellationToken); } - public async IAsyncEnumerable ReceiveUpdatesAsync([EnumeratorCancellation] CancellationToken cancellationToken = default) + public virtual async Task StartResponseAsync(CancellationToken cancellationToken = default) + { + InternalRealtimeClientEventResponseCreateResponse internalOptions = new(); + InternalRealtimeClientEventResponseCreate internalCommand = new(internalOptions); + await SendCommandAsync(internalCommand, cancellationToken).ConfigureAwait(false); + } + + public virtual void StartResponse(CancellationToken cancellationToken = default) + { + InternalRealtimeClientEventResponseCreateResponse internalOptions = new(); + InternalRealtimeClientEventResponseCreate internalCommand = new(internalOptions); + SendCommand(internalCommand, cancellationToken); + } + + public virtual async Task StartResponseAsync(ConversationSessionOptions sessionOptionOverrides, CancellationToken cancellationToken = default) + { + Argument.AssertNotNull(sessionOptionOverrides, nameof(sessionOptionOverrides)); + InternalRealtimeClientEventResponseCreateResponse internalOptions + = InternalRealtimeClientEventResponseCreateResponse.FromSessionOptions(sessionOptionOverrides); + InternalRealtimeClientEventResponseCreate internalCommand = new(internalOptions); + await SendCommandAsync(internalCommand, cancellationToken).ConfigureAwait(false); + } + + public virtual void StartResponse(ConversationSessionOptions sessionOptionOverrides, CancellationToken cancellationToken = default) + { + Argument.AssertNotNull(sessionOptionOverrides, nameof(sessionOptionOverrides)); + InternalRealtimeClientEventResponseCreateResponse internalOptions + = InternalRealtimeClientEventResponseCreateResponse.FromSessionOptions(sessionOptionOverrides); + InternalRealtimeClientEventResponseCreate internalCommand = new(internalOptions); + SendCommand(internalCommand, cancellationToken); + } + + public virtual async Task CancelResponseAsync(CancellationToken cancellationToken = default) + { + InternalRealtimeClientEventResponseCancel internalCommand = new(); + await SendCommandAsync(internalCommand, cancellationToken).ConfigureAwait(false); + } + + public virtual void CancelResponse(CancellationToken cancellationToken = default) + { + InternalRealtimeClientEventResponseCancel internalCommand = new(); + SendCommand(internalCommand, cancellationToken); + } + + public virtual async IAsyncEnumerable ReceiveUpdatesAsync([EnumeratorCancellation] CancellationToken cancellationToken = default) { await foreach (ClientResult protocolEvent in ReceiveUpdatesAsync(cancellationToken.ToRequestOptions())) { @@ -173,8 +331,27 @@ public async IAsyncEnumerable ReceiveUpdatesAsync([Enumerato } } + public virtual IEnumerable ReceiveUpdates(CancellationToken cancellationToken = default) + { + throw new NotImplementedException(); + } + + internal virtual async Task SendCommandAsync(InternalRealtimeClientEvent command, CancellationToken cancellationToken = default) + { + BinaryData requestData = ModelReaderWriter.Write(command); + RequestOptions cancellationOptions = cancellationToken.ToRequestOptions(); + await SendCommandAsync(requestData, cancellationOptions).ConfigureAwait(false); + } + + internal virtual void SendCommand(InternalRealtimeClientEvent command, CancellationToken cancellationToken = default) + { + BinaryData requestData = ModelReaderWriter.Write(command); + RequestOptions cancellationOptions = cancellationToken.ToRequestOptions(); + SendCommand(requestData, cancellationOptions); + } + public void Dispose() { - _clientWebSocket?.Dispose(); + WebSocket?.Dispose(); } } \ No newline at end of file diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationContentPartFinishedUpdate.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationContentPartFinishedUpdate.cs deleted file mode 100644 index c9c568cf5..000000000 --- a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationContentPartFinishedUpdate.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; - -namespace OpenAI.RealtimeConversation; - -[Experimental("OPENAI002")] -[CodeGenModel("RealtimeResponseContentPartDoneCommand")] -public partial class ConversationContentPartFinishedUpdate -{ - [CodeGenMember("Part")] - private readonly ConversationContentPart _internalContentPart; - - public ConversationContentPartKind ContentKind => _internalContentPart switch - { - InternalRealtimeResponseTextContentPart => ConversationContentPartKind.InputText, - InternalRealtimeResponseAudioContentPart => ConversationContentPartKind.InputAudio, - _ => null, - }; - - public string Text => (_internalContentPart as InternalRealtimeResponseTextContentPart)?.Text; - public string AudioTranscript => (_internalContentPart as InternalRealtimeResponseAudioContentPart)?.Transcript; -} diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationContentPartStartedUpdate.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationContentPartStartedUpdate.cs deleted file mode 100644 index 5bd021df1..000000000 --- a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationContentPartStartedUpdate.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; - -namespace OpenAI.RealtimeConversation; - -[Experimental("OPENAI002")] -[CodeGenModel("RealtimeResponseContentPartAddedCommand")] -public partial class ConversationContentPartStartedUpdate -{ - [CodeGenMember("Part")] - private readonly ConversationContentPart _internalContentPart; - - public ConversationContentPartKind ContentKind => _internalContentPart switch - { - InternalRealtimeResponseTextContentPart => ConversationContentPartKind.InputText, - InternalRealtimeResponseAudioContentPart => ConversationContentPartKind.InputAudio, - _ => null, - }; - - public string Text => (_internalContentPart as InternalRealtimeResponseTextContentPart)?.Text; - public string AudioTranscript => (_internalContentPart as InternalRealtimeResponseAudioContentPart)?.Transcript; -} diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationErrorUpdate.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationErrorUpdate.cs index 2b1c09e8e..4ee9b0383 100644 --- a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationErrorUpdate.cs +++ b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationErrorUpdate.cs @@ -6,15 +6,22 @@ namespace OpenAI.RealtimeConversation; +/// +/// The update (response command) of type error, which is received when a problem is encountered while +/// processing a request command or generating another response command. +/// [Experimental("OPENAI002")] -[CodeGenModel("RealtimeResponseErrorCommand")] +[CodeGenModel("RealtimeServerEventError")] public partial class ConversationErrorUpdate { [CodeGenMember("Error")] - private readonly InternalRealtimeResponseError _error; + private readonly InternalRealtimeServerEventErrorError _error; public string ErrorCode => _error?.Code; - public string ErrorMessage => _error?.Message; - public string ErrorParameterName => _error?.Param; + /// + /// Gets the identifier that correlates to a prior event associated with this error. + /// public string ErrorEventId => _error?.EventId; + public string Message => _error?.Message; + public string ParameterName => _error?.Param; } \ No newline at end of file diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationInputAudioClearedUpdate.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationInputAudioClearedUpdate.cs new file mode 100644 index 000000000..df2aee87b --- /dev/null +++ b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationInputAudioClearedUpdate.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ClientModel.Primitives; +using System.Text.Json; +using System.Diagnostics.CodeAnalysis; + +namespace OpenAI.RealtimeConversation; + +/// +/// The update (response command) of type input_audio_buffer.cleared, which is received when a preceding +/// input_audio_buffer.clear command +/// ( has completed +/// purging the user audio input buffer. +/// +[Experimental("OPENAI002")] +[CodeGenModel("RealtimeServerEventInputAudioBufferCleared")] +public partial class ConversationInputAudioClearedUpdate +{ } diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationInputAudioCommittedUpdate.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationInputAudioCommittedUpdate.cs new file mode 100644 index 000000000..bb9478f06 --- /dev/null +++ b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationInputAudioCommittedUpdate.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ClientModel.Primitives; +using System.Text.Json; +using System.Diagnostics.CodeAnalysis; + +namespace OpenAI.RealtimeConversation; + +/// +/// The update (response command) of type input_audio_buffer.committed, which is received when a preceding +/// input_audio_buffer.commit command +/// ( has +/// completed submission of the user audio input buffer. +/// +[Experimental("OPENAI002")] +[CodeGenModel("RealtimeServerEventInputAudioBufferCommitted")] +public partial class ConversationInputAudioCommittedUpdate +{ } diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationInputSpeechFinishedUpdate.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationInputSpeechFinishedUpdate.cs new file mode 100644 index 000000000..ca2c65105 --- /dev/null +++ b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationInputSpeechFinishedUpdate.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.ClientModel.Primitives; +using System.Text.Json; +using System.Diagnostics.CodeAnalysis; + +namespace OpenAI.RealtimeConversation; + +/// +/// The update (response command) of type input_audio_buffer.speech_started, which is received when a configured +/// server_vad turn_detection (including the default) processes the beginning of evaluated human speech +/// within the input audio buffer. This will be paired with a matching +/// when the end of speech is detected. +/// +[Experimental("OPENAI002")] +[CodeGenModel("RealtimeServerEventInputAudioBufferSpeechStopped")] +public partial class ConversationInputSpeechFinishedUpdate +{ + [CodeGenMember("AudioEndMs")] + private readonly int _audioEndMs; + + public TimeSpan AudioEndTime => _audioEndTime ??= TimeSpan.FromMilliseconds(_audioEndMs); + private TimeSpan? _audioEndTime; +} diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationInputSpeechStartedUpdate.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationInputSpeechStartedUpdate.cs new file mode 100644 index 000000000..d08e69217 --- /dev/null +++ b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationInputSpeechStartedUpdate.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.ClientModel.Primitives; +using System.Text.Json; +using System.Diagnostics.CodeAnalysis; + +namespace OpenAI.RealtimeConversation; + +/// +/// The update (response command) of type input_audio_buffer.speech_started, which is received when a configured +/// server_vad turn_detection (including the default) processes the end of evaluated human speech +/// within the input audio buffer. This will be paired with a matching +/// that precedes this command, received when the beginning of human +/// speech is detected. +/// +[Experimental("OPENAI002")] +[CodeGenModel("RealtimeServerEventInputAudioBufferSpeechStarted")] +public partial class ConversationInputSpeechStartedUpdate +{ + [CodeGenMember("AudioStartMs")] + private readonly int _audioStartMs; + + public TimeSpan AudioStartTime => _audioStartTime ??= TimeSpan.FromMilliseconds(_audioStartMs); + private TimeSpan? _audioStartTime; +} diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationInputTranscriptionFailedUpdate.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationInputTranscriptionFailedUpdate.cs index a236af055..583341c43 100644 --- a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationInputTranscriptionFailedUpdate.cs +++ b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationInputTranscriptionFailedUpdate.cs @@ -6,12 +6,18 @@ namespace OpenAI.RealtimeConversation; +/// +/// The update (response command) of type conversation.item.input_audio_transcription.failed, which is received +/// when a problem is encountered while processing transcription of the user audio input buffer via configured +/// (input_audio_transcription in session.update) +/// settings. +/// [Experimental("OPENAI002")] -[CodeGenModel("RealtimeResponseItemInputAudioTranscriptionFailedCommand")] +[CodeGenModel("RealtimeServerEventConversationItemInputAudioTranscriptionFailed")] public partial class ConversationInputTranscriptionFailedUpdate { [CodeGenMember("Error")] - private readonly InternalRealtimeResponseApiError _error; + private readonly InternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError _error; public string ErrorCode => _error?.Code; public string ErrorMessage => _error?.Message; diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationInputTranscriptionFinishedUpdate.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationInputTranscriptionFinishedUpdate.cs new file mode 100644 index 000000000..00a13bacb --- /dev/null +++ b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationInputTranscriptionFinishedUpdate.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.ClientModel.Primitives; +using System.Text.Json; +using System.Diagnostics.CodeAnalysis; + +namespace OpenAI.RealtimeConversation; + +/// +/// The update (response command) of type conversation.item.input_audio_transcription.completed, which is +/// received when a configured input_audio_transcription has completed its parallel processing of the user +/// audio input buffer. +/// +[Experimental("OPENAI002")] +[CodeGenModel("RealtimeServerEventConversationItemInputAudioTranscriptionCompleted")] +public partial class ConversationInputTranscriptionFinishedUpdate +{ } diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemAcknowledgedUpdate.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemAcknowledgedUpdate.cs deleted file mode 100644 index 5a5f0953c..000000000 --- a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemAcknowledgedUpdate.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; - -namespace OpenAI.RealtimeConversation; - -[Experimental("OPENAI002")] -[CodeGenModel("RealtimeResponseItemCreatedCommand")] -public partial class ConversationItemAcknowledgedUpdate -{ - [CodeGenMember("Item")] - public ConversationItem Item { get; } -} diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemCreatedUpdate.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemCreatedUpdate.cs new file mode 100644 index 000000000..9b98488e4 --- /dev/null +++ b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemCreatedUpdate.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; + +namespace OpenAI.RealtimeConversation; + +/// +/// The update (response command) of type conversation.item.created, which is received when a new item has +/// been emplaced into the conversation. In the case of model-generated items, this may be preceded by a +/// (response.output_item.added) command, in which case the newly- +/// created item associated with this update will not yet have content associated with it and will instead have +/// content streamed via *delta commands before finalization via a +/// (response.output_item.done). +/// +[Experimental("OPENAI002")] +[CodeGenModel("RealtimeServerEventConversationItemCreated")] +public partial class ConversationItemCreatedUpdate +{ + [CodeGenMember("Item")] + private readonly InternalRealtimeResponseItem _internalItem; + + public string ItemId => _internalItem.Id; + + public ConversationMessageRole? MessageRole => _internalItem.MessageRole; + + public IReadOnlyList MessageContentParts => _internalItem.MessageContentParts; + + public string FunctionName => _internalItem.FunctionName; + + public string FunctionCallId => _internalItem.FunctionCallId; + + public string FunctionCallArguments => _internalItem.FunctionCallArguments; + + public string FunctionCallOutput => _internalItem.FunctionCallOutput; +} diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemDeletedUpdate.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemDeletedUpdate.cs new file mode 100644 index 000000000..62a406b5e --- /dev/null +++ b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemDeletedUpdate.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.ClientModel.Primitives; +using System.Text.Json; +using System.Diagnostics.CodeAnalysis; + +namespace OpenAI.RealtimeConversation; + +/// +/// The update (response command) of type conversation.item.deleted, which is received in response to a +/// conversation.item.delete request command +/// (). +/// +[Experimental("OPENAI002")] +[CodeGenModel("RealtimeServerEventConversationItemDeleted")] +public partial class ConversationItemDeletedUpdate +{ } diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStreamingAudioFinishedUpdate.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStreamingAudioFinishedUpdate.cs new file mode 100644 index 000000000..dbfcf96cf --- /dev/null +++ b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStreamingAudioFinishedUpdate.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.ClientModel.Primitives; +using System.Text.Json; +using System.Diagnostics.CodeAnalysis; + +namespace OpenAI.RealtimeConversation; + +/// +/// The update (response command) of type response.audio.done, which is received after correlated +/// (response.output_item.added), +/// (conversation.item.created), +/// (response.content_part.added), and +/// commands. This update indicates that all streamed delta content +/// has completed and the associated content part will soon be completed. +/// +[Experimental("OPENAI002")] +[CodeGenModel("RealtimeServerEventResponseAudioDone")] +public partial class ConversationItemStreamingAudioFinishedUpdate +{ } diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStreamingAudioTranscriptionFinishedUpdate.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStreamingAudioTranscriptionFinishedUpdate.cs new file mode 100644 index 000000000..1a889ca15 --- /dev/null +++ b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStreamingAudioTranscriptionFinishedUpdate.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.ClientModel.Primitives; +using System.Text.Json; +using System.Diagnostics.CodeAnalysis; + +namespace OpenAI.RealtimeConversation; + +/// +/// The update (response command) of type response.audio_transcript.done, which is received after all +/// commands for an output audio content part have been +/// received. +/// +[Experimental("OPENAI002")] +[CodeGenModel("RealtimeServerEventResponseAudioTranscriptDone")] +public partial class ConversationItemStreamingAudioTranscriptionFinishedUpdate +{ } diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemFinishedUpdate.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStreamingFinishedUpdate.cs similarity index 53% rename from src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemFinishedUpdate.cs rename to src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStreamingFinishedUpdate.cs index ee364a0f4..86881012d 100644 --- a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemFinishedUpdate.cs +++ b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStreamingFinishedUpdate.cs @@ -4,13 +4,21 @@ namespace OpenAI.RealtimeConversation; +/// +/// The update (response command) of type response.output_item.done, which is received when a new item that was +/// added to a conversation by the model has finished streaming all of its content parts and other data. This update +/// is preceded by a and some number of *delta commands (such as +/// ). +/// [Experimental("OPENAI002")] -[CodeGenModel("RealtimeResponseOutputItemDoneCommand")] -public partial class ConversationItemFinishedUpdate +[CodeGenModel("RealtimeServerEventResponseOutputItemDone")] +public partial class ConversationItemStreamingFinishedUpdate { [CodeGenMember("Item")] private readonly InternalRealtimeResponseItem _internalItem; + public string ItemId => _internalItem.Id; + public ConversationMessageRole? MessageRole => _internalItem.MessageRole; public IReadOnlyList MessageContentParts => _internalItem.MessageContentParts; diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStreamingPartDeltaUpdate.Serialization.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStreamingPartDeltaUpdate.Serialization.cs new file mode 100644 index 000000000..2dd0c9009 --- /dev/null +++ b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStreamingPartDeltaUpdate.Serialization.cs @@ -0,0 +1,76 @@ +using System; +using System.ClientModel.Primitives; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Text.Json; + +namespace OpenAI.RealtimeConversation; + +public partial class ConversationItemStreamingPartDeltaUpdate : IJsonModel +{ + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + => CustomSerializationHelpers.SerializeInstance(this, SerializeConversationContentPartDeltaUpdate, writer, options); + + ConversationItemStreamingPartDeltaUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + => CustomSerializationHelpers.DeserializeNewInstance(this, DeserializeItemStreamingPartDeltaUpdate, ref reader, options); + + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + => CustomSerializationHelpers.SerializeInstance(this, options); + + ConversationItemStreamingPartDeltaUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + => CustomSerializationHelpers.DeserializeNewInstance(this, DeserializeItemStreamingPartDeltaUpdate, data, options); + + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + + internal static void SerializeConversationContentPartDeltaUpdate(ConversationItemStreamingPartDeltaUpdate instance, Utf8JsonWriter writer, ModelReaderWriterOptions options) + { + List possibleUnionVariants = + [ + instance._contentPartAdded, + instance._audioDelta, + instance._outputTranscriptionDelta, + instance._textDelta, + instance._functionArgumentsDelta + ]; + + foreach (ConversationUpdate unionVariant in possibleUnionVariants) + { + if (unionVariant is not null) + { + writer.WriteObjectValue(unionVariant, options); + break; + } + } + } + + internal static ConversationItemStreamingPartDeltaUpdate DeserializeItemStreamingPartDeltaUpdate(JsonElement element, ModelReaderWriterOptions options = null) + { + if (element.ValueKind != JsonValueKind.Object) + { + return null; + } + foreach (JsonProperty elementProperty in element.EnumerateObject()) + { + if (elementProperty.NameEquals("type"u8)) + { + string updateType = elementProperty.Value.ToString(); + + ConversationUpdate baseUpdate = + StringComparer.OrdinalIgnoreCase.Equals(updateType, ConversationUpdateKind.ItemContentPartStarted.ToSerialString()) + ? InternalRealtimeServerEventResponseContentPartAdded.DeserializeInternalRealtimeServerEventResponseContentPartAdded(element, options) + : StringComparer.OrdinalIgnoreCase.Equals(updateType, ConversationUpdateKind.ItemStreamingPartAudioDelta.ToSerialString()) + ? InternalRealtimeServerEventResponseAudioDelta.DeserializeInternalRealtimeServerEventResponseAudioDelta(element, options) + : StringComparer.OrdinalIgnoreCase.Equals(updateType, ConversationUpdateKind.ItemStreamingPartAudioTranscriptionDelta.ToSerialString()) + ? InternalRealtimeServerEventResponseAudioTranscriptDelta.DeserializeInternalRealtimeServerEventResponseAudioTranscriptDelta(element, options) + : StringComparer.OrdinalIgnoreCase.Equals(updateType, ConversationUpdateKind.ItemStreamingPartTextDelta.ToSerialString()) + ? InternalRealtimeServerEventResponseTextDelta.DeserializeInternalRealtimeServerEventResponseTextDelta(element, options) + : StringComparer.OrdinalIgnoreCase.Equals(updateType, ConversationUpdateKind.ItemStreamingFunctionCallArgumentsDelta.ToSerialString()) + ? InternalRealtimeServerEventResponseFunctionCallArgumentsDelta.DeserializeInternalRealtimeServerEventResponseFunctionCallArgumentsDelta(element, options) + : null; + + return new ConversationItemStreamingPartDeltaUpdate(baseUpdate); + } + } + return null; + } +} diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStreamingPartDeltaUpdate.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStreamingPartDeltaUpdate.cs new file mode 100644 index 000000000..fa0a9c0db --- /dev/null +++ b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStreamingPartDeltaUpdate.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; + +namespace OpenAI.RealtimeConversation; + +/// +/// +/// +/// This type is a shared representation of the following response command types: +/// +/// response.content_part.added +/// response.audio.delta +/// response.text.delta +/// response.audio_transcript.delta +/// response.function_call_arguments.delta +/// +/// +[Experimental("OPENAI002")] +public partial class ConversationItemStreamingPartDeltaUpdate : ConversationUpdate +{ + private readonly InternalRealtimeServerEventResponseContentPartAdded _contentPartAdded; + private readonly InternalRealtimeServerEventResponseAudioDelta _audioDelta; + private readonly InternalRealtimeServerEventResponseAudioTranscriptDelta _outputTranscriptionDelta; + private readonly InternalRealtimeServerEventResponseTextDelta _textDelta; + private readonly InternalRealtimeServerEventResponseFunctionCallArgumentsDelta _functionArgumentsDelta; + + public string ResponseId + => _contentPartAdded?.ResponseId + ?? _audioDelta?.ResponseId + ?? _outputTranscriptionDelta?.ResponseId + ?? _textDelta?.ResponseId + ?? _functionArgumentsDelta?.ResponseId; + + public string ItemId + => _contentPartAdded?.ItemId + ?? _audioDelta?.ItemId + ?? _outputTranscriptionDelta?.ItemId + ?? _textDelta?.ItemId + ?? _functionArgumentsDelta?.ItemId; + + public int ItemIndex + => _contentPartAdded?.OutputIndex + ?? _audioDelta?.OutputIndex + ?? _outputTranscriptionDelta?.OutputIndex + ?? _textDelta?.OutputIndex + ?? _functionArgumentsDelta?.OutputIndex + ?? 0; + + public int ContentPartIndex + => _contentPartAdded?.ContentIndex + ?? _audioDelta?.ContentIndex + ?? _outputTranscriptionDelta?.ContentIndex + ?? _textDelta?.ContentIndex + ?? 0; + + public BinaryData AudioBytes + => _audioDelta?.Delta; + + public string AudioTranscript + => _contentPartAdded?.AudioTranscript + ?? _outputTranscriptionDelta?.Delta; + + public string Text + => _contentPartAdded?.Text + ?? _textDelta?.Delta; + + public string FunctionCallId + => _functionArgumentsDelta?.CallId; + + public string FunctionArguments + => _functionArgumentsDelta?.Delta; + + internal ConversationItemStreamingPartDeltaUpdate(ConversationUpdate baseUpdate) + : base(baseUpdate.Kind, baseUpdate.EventId, serializedAdditionalRawData: null) + { + _contentPartAdded = baseUpdate as InternalRealtimeServerEventResponseContentPartAdded; + _audioDelta = baseUpdate as InternalRealtimeServerEventResponseAudioDelta; + _outputTranscriptionDelta = baseUpdate as InternalRealtimeServerEventResponseAudioTranscriptDelta; + _textDelta = baseUpdate as InternalRealtimeServerEventResponseTextDelta; + _functionArgumentsDelta = baseUpdate as InternalRealtimeServerEventResponseFunctionCallArgumentsDelta; + } +} diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStreamingPartFinishedUpdate.Serialization.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStreamingPartFinishedUpdate.Serialization.cs new file mode 100644 index 000000000..587a660d4 --- /dev/null +++ b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStreamingPartFinishedUpdate.Serialization.cs @@ -0,0 +1,67 @@ +using System; +using System.ClientModel.Primitives; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Text.Json; + +namespace OpenAI.RealtimeConversation; + +public partial class ConversationItemStreamingPartFinishedUpdate : IJsonModel +{ + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + => CustomSerializationHelpers.SerializeInstance(this, SerializeConversationContentPartDeltaUpdate, writer, options); + + ConversationItemStreamingPartFinishedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + => CustomSerializationHelpers.DeserializeNewInstance(this, DeserializeItemStreamingPartFinishedUpdate, ref reader, options); + + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + => CustomSerializationHelpers.SerializeInstance(this, options); + + ConversationItemStreamingPartFinishedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + => CustomSerializationHelpers.DeserializeNewInstance(this, DeserializeItemStreamingPartFinishedUpdate, data, options); + + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + + internal static void SerializeConversationContentPartDeltaUpdate(ConversationItemStreamingPartFinishedUpdate instance, Utf8JsonWriter writer, ModelReaderWriterOptions options) + { + List possibleUnionVariants = + [ + instance._contentPartDone, + instance._functionCallArgumentsDone, + ]; + + foreach (ConversationUpdate unionVariant in possibleUnionVariants) + { + if (unionVariant is not null) + { + writer.WriteObjectValue(unionVariant, options); + break; + } + } + } + + internal static ConversationItemStreamingPartFinishedUpdate DeserializeItemStreamingPartFinishedUpdate(JsonElement element, ModelReaderWriterOptions options = null) + { + if (element.ValueKind != JsonValueKind.Object) + { + return null; + } + foreach (JsonProperty elementProperty in element.EnumerateObject()) + { + if (elementProperty.NameEquals("type"u8)) + { + string updateType = elementProperty.Value.ToString(); + + ConversationUpdate baseUpdate = + StringComparer.OrdinalIgnoreCase.Equals(updateType, ConversationUpdateKind.ItemContentPartFinished.ToSerialString()) + ? InternalRealtimeServerEventResponseContentPartDone.DeserializeInternalRealtimeServerEventResponseContentPartDone(element, options) + : StringComparer.OrdinalIgnoreCase.Equals(updateType, ConversationUpdateKind.ItemStreamingFunctionCallArgumentsFinished.ToSerialString()) + ? InternalRealtimeServerEventResponseFunctionCallArgumentsDone.DeserializeInternalRealtimeServerEventResponseFunctionCallArgumentsDone(element, options) + : null; + + return new ConversationItemStreamingPartFinishedUpdate(baseUpdate); + } + } + return null; + } +} diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStreamingPartFinishedUpdate.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStreamingPartFinishedUpdate.cs new file mode 100644 index 000000000..085da7027 --- /dev/null +++ b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStreamingPartFinishedUpdate.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; + +namespace OpenAI.RealtimeConversation; + +/// +/// +/// +/// This type is a shared representation of the response.function_call_arguments.done and +/// response.content_part.done response commands. +/// +public partial class ConversationItemStreamingPartFinishedUpdate : ConversationUpdate +{ + private readonly InternalRealtimeServerEventResponseContentPartDone _contentPartDone; + private readonly InternalRealtimeServerEventResponseFunctionCallArgumentsDone _functionCallArgumentsDone; + + public string ResponseId + => _contentPartDone?.ResponseId + ?? _functionCallArgumentsDone?.ResponseId; + + public string ItemId + => _contentPartDone?.ItemId + ?? _functionCallArgumentsDone?.ItemId; + + public int ItemIndex + => _contentPartDone?.OutputIndex + ?? _functionCallArgumentsDone?.OutputIndex + ?? 0; + + public int ContentPartIndex + => _contentPartDone?.ContentIndex + ?? 0; + + public string AudioTranscript => _contentPartDone?.AudioTranscript; + + public string Text => _contentPartDone?.Text; + + public string FunctionCallId => _functionCallArgumentsDone?.CallId; + + public string FunctionArguments => _functionCallArgumentsDone?.Arguments; + + + internal ConversationItemStreamingPartFinishedUpdate(ConversationUpdate baseUpdate) + : base(baseUpdate.Kind, baseUpdate.EventId, serializedAdditionalRawData: null) + { + _contentPartDone = baseUpdate as InternalRealtimeServerEventResponseContentPartDone; + _functionCallArgumentsDone = baseUpdate as InternalRealtimeServerEventResponseFunctionCallArgumentsDone; + } +} diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStartedUpdate.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStreamingStartedUpdate.cs similarity index 55% rename from src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStartedUpdate.cs rename to src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStreamingStartedUpdate.cs index 61e7fe374..d1d4b538a 100644 --- a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStartedUpdate.cs +++ b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStreamingStartedUpdate.cs @@ -4,13 +4,23 @@ namespace OpenAI.RealtimeConversation; +/// +/// The update (response command) of type response.output_item.added, which is received when a response turn +/// has begun generation of a new conversation item. This new item will have content streamed via *delta +/// commands and paired with an ending response.output_item.done update. +/// [Experimental("OPENAI002")] -[CodeGenModel("RealtimeResponseOutputItemAddedCommand")] -public partial class ConversationItemStartedUpdate +[CodeGenModel("RealtimeServerEventResponseOutputItemAdded")] +public partial class ConversationItemStreamingStartedUpdate { [CodeGenMember("Item")] private readonly InternalRealtimeResponseItem _internalItem; + public string ItemId => _internalItem.Id; + + [CodeGenMember("OutputIndex")] + public int ItemIndex { get; } + public ConversationMessageRole? MessageRole => _internalItem.MessageRole; public IReadOnlyList MessageContentParts => _internalItem.MessageContentParts; diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStreamingTextFinishedUpdate.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStreamingTextFinishedUpdate.cs new file mode 100644 index 000000000..83de35b2f --- /dev/null +++ b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemStreamingTextFinishedUpdate.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.ClientModel.Primitives; +using System.Text.Json; +using System.Diagnostics.CodeAnalysis; + +namespace OpenAI.RealtimeConversation; + +/// +/// The update (response command) of type response.text.done, which is received after correlated +/// (response.output_item.added), +/// (conversation.item.created), +/// (response.content_part.added), and +/// commands. This update indicates that all streamed delta content +/// has completed and the associated content part will soon be completed. +/// +[Experimental("OPENAI002")] +[CodeGenModel("RealtimeServerEventResponseTextDone")] +public partial class ConversationItemStreamingTextFinishedUpdate +{ } diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemTruncatedUpdate.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemTruncatedUpdate.cs new file mode 100644 index 000000000..942771cf2 --- /dev/null +++ b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationItemTruncatedUpdate.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.ClientModel.Primitives; +using System.Text.Json; +using System.Diagnostics.CodeAnalysis; + +namespace OpenAI.RealtimeConversation; + +/// +/// The update (response command) of type conversation.item.truncated, which is received in response to a +/// conversation.item.truncate request command +/// (). +/// +[Experimental("OPENAI002")] +[CodeGenModel("RealtimeServerEventConversationItemTruncated")] +public partial class ConversationItemTruncatedUpdate +{ } diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationRateLimitsUpdate.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationRateLimitsUpdate.cs new file mode 100644 index 000000000..01119164f --- /dev/null +++ b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationRateLimitsUpdate.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; + +namespace OpenAI.RealtimeConversation; + +/// +/// The update (response command) of type rate_limits_updated, which is received during a response and provides +/// the most recent information about configured rate limits. +/// +[Experimental("OPENAI002")] +[CodeGenModel("RealtimeServerEventRateLimitsUpdated")] +public partial class ConversationRateLimitsUpdate +{ + public ConversationRateLimitDetailsItem TokenDetails + => _tokenDetails ??= AllDetails.FirstOrDefault(item => item.Name == "tokens"); + private ConversationRateLimitDetailsItem _tokenDetails; + public ConversationRateLimitDetailsItem RequestDetails + => _tokenDetails ??= AllDetails.FirstOrDefault(item => item.Name == "requests"); + + [CodeGenMember("RateLimits")] + public IReadOnlyList AllDetails { get; } +} \ No newline at end of file diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationResponseFinishedUpdate.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationResponseFinishedUpdate.cs index a37b4cab6..df314a7aa 100644 --- a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationResponseFinishedUpdate.cs +++ b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationResponseFinishedUpdate.cs @@ -4,19 +4,25 @@ namespace OpenAI.RealtimeConversation; +/// +/// The update (response command) of type response.done, which is received when a model response turn has +/// completed and no further content part or item information will be transmitted. +/// [Experimental("OPENAI002")] -[CodeGenModel("RealtimeResponseDoneCommand")] +[CodeGenModel("RealtimeServerEventResponseDone")] public partial class ConversationResponseFinishedUpdate { [CodeGenMember("Response")] internal readonly InternalRealtimeResponse _internalResponse; - public string Id => _internalResponse?.Id; + public string ResponseId => _internalResponse?.Id; + public ConversationStatus? Status => _internalResponse?.Status; - // TODO - internal InternalRealtimeResponseStatusDetails StatusDetails { get; } + public ConversationStatusDetails StatusDetails => _internalResponse.StatusDetails; [CodeGenMember("Output")] public IReadOnlyList CreatedItems => _internalResponse?.Output ?? []; + + public ConversationTokenUsage Usage => _internalResponse.Usage; } diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationResponseStartedUpdate.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationResponseStartedUpdate.cs index 7fff76078..b0bb3a136 100644 --- a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationResponseStartedUpdate.cs +++ b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationResponseStartedUpdate.cs @@ -3,10 +3,28 @@ namespace OpenAI.RealtimeConversation; +/// +/// The update (response command) of type response.created, which is received when a new service response turn +/// has been initiated. A response will snapshot conversation and input audio buffer state for the duration of +/// generation and may be triggered by either configured voice activity detection at end of speech or by a caller- +/// initiated response.create +/// (). +/// [Experimental("OPENAI002")] -[CodeGenModel("RealtimeResponseCreatedCommand")] +[CodeGenModel("RealtimeServerEventResponseCreated")] public partial class ConversationResponseStartedUpdate { [CodeGenMember("Response")] internal readonly InternalRealtimeResponse _internalResponse; + + public string ResponseId => _internalResponse.Id; + + public ConversationStatus Status => _internalResponse.Status; + + public ConversationStatusDetails StatusDetails => _internalResponse.StatusDetails; + + [CodeGenMember("Output")] + public IReadOnlyList CreatedItems => _internalResponse?.Output ?? []; + + public ConversationTokenUsage Usage => _internalResponse.Usage; } diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationSessionConfiguredUpdate.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationSessionConfiguredUpdate.cs index 8ffcfb86c..4de52d8c3 100644 --- a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationSessionConfiguredUpdate.cs +++ b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationSessionConfiguredUpdate.cs @@ -4,8 +4,15 @@ namespace OpenAI.RealtimeConversation; +/// +/// The update (response command) of type session.updated, which is received when a preceding +/// session.update request command +/// () +/// has been applied to the session. New session configuration related to response generation will not take effect +/// until the next response; shared session configuration, such as input audio format, will apply immediately. +/// [Experimental("OPENAI002")] -[CodeGenModel("RealtimeResponseSessionUpdatedCommand")] +[CodeGenModel("RealtimeServerEventSessionUpdated")] public partial class ConversationSessionConfiguredUpdate { [CodeGenMember("Session")] @@ -25,8 +32,8 @@ public ConversationContentModalities ContentModalities public ConversationAudioFormat InputAudioFormat => _internalSession.InputAudioFormat; public ConversationAudioFormat OutputAudioFormat => _internalSession.OutputAudioFormat; - public ConversationInputTranscriptionOptions TranscriptionSettings => _internalSession.InputAudioTranscription; - public ConversationTurnDetectionOptions TurnDetectionSettings => _internalSession.TurnDetection; + public ConversationInputTranscriptionOptions InputTranscriptionOptions => _internalSession.InputAudioTranscription; + public ConversationTurnDetectionOptions TurnDetectionOptions => _internalSession.TurnDetection; public IReadOnlyList Tools => _internalSession.Tools; public ConversationToolChoice ToolChoice => ConversationToolChoice.FromBinaryData(_internalSession.ToolChoice); public float Temperature => _internalSession.Temperature; diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationSessionStartedUpdate.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationSessionStartedUpdate.cs index 19def6f09..317cac277 100644 --- a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationSessionStartedUpdate.cs +++ b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationSessionStartedUpdate.cs @@ -4,8 +4,15 @@ namespace OpenAI.RealtimeConversation; +/// +/// The update (response command) of type session.created, which is received when a new session has been +/// established. This is typically received immediately following connection and the session properties reflect +/// the initial, default state of the session. Configuration changes can be made via the session.update request +/// command +/// (). +/// [Experimental("OPENAI002")] -[CodeGenModel("RealtimeResponseSessionCreatedCommand")] +[CodeGenModel("RealtimeServerEventSessionCreated")] public partial class ConversationSessionStartedUpdate { [CodeGenMember("Session")] @@ -25,8 +32,8 @@ public ConversationContentModalities ContentModalities public ConversationAudioFormat InputAudioFormat => _internalSession.InputAudioFormat; public ConversationAudioFormat OutputAudioFormat => _internalSession.OutputAudioFormat; - public ConversationInputTranscriptionOptions TranscriptionSettings => _internalSession.InputAudioTranscription; - public ConversationTurnDetectionOptions TurnDetectionSettings => _internalSession.TurnDetection; + public ConversationInputTranscriptionOptions InputTranscriptionOptions => _internalSession.InputAudioTranscription; + public ConversationTurnDetectionOptions TurnDetectionOptions => _internalSession.TurnDetection; public IReadOnlyList Tools => _internalSession.Tools; public ConversationToolChoice ToolChoice => ConversationToolChoice.FromBinaryData(_internalSession.ToolChoice); public float Temperature => _internalSession.Temperature; diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationUpdate.Serialization.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationUpdate.Serialization.cs new file mode 100644 index 000000000..8c3f22aa2 --- /dev/null +++ b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationUpdate.Serialization.cs @@ -0,0 +1,61 @@ +using System; +using System.ClientModel.Primitives; +using System.Diagnostics.CodeAnalysis; +using System.Text.Json; + +namespace OpenAI.RealtimeConversation; + +public partial class ConversationUpdate +{ + internal static ConversationUpdate DeserializeConversationUpdate(JsonElement element, ModelReaderWriterOptions options = null) + { + options ??= ModelSerializationExtensions.WireOptions; + + if (element.ValueKind == JsonValueKind.Null) + { + return null; + } + if (element.TryGetProperty("type", out JsonElement discriminator)) + { + return discriminator.GetString() switch + { + "conversation.created" => InternalRealtimeServerEventConversationCreated.DeserializeInternalRealtimeServerEventConversationCreated(element, options), + "conversation.item.created" => ConversationItemCreatedUpdate.DeserializeConversationItemCreatedUpdate(element, options), + "conversation.item.deleted" => ConversationItemDeletedUpdate.DeserializeConversationItemDeletedUpdate(element, options), + "conversation.item.input_audio_transcription.completed" => ConversationInputTranscriptionFinishedUpdate.DeserializeConversationInputTranscriptionFinishedUpdate(element, options), + "conversation.item.input_audio_transcription.failed" => ConversationInputTranscriptionFailedUpdate.DeserializeConversationInputTranscriptionFailedUpdate(element, options), + "conversation.item.truncated" => ConversationItemTruncatedUpdate.DeserializeConversationItemTruncatedUpdate(element, options), + "error" => ConversationErrorUpdate.DeserializeConversationErrorUpdate(element, options), + "input_audio_buffer.cleared" => ConversationInputAudioClearedUpdate.DeserializeConversationInputAudioClearedUpdate(element, options), + "input_audio_buffer.committed" => ConversationInputAudioCommittedUpdate.DeserializeConversationInputAudioCommittedUpdate(element, options), + "input_audio_buffer.speech_started" => ConversationInputSpeechStartedUpdate.DeserializeConversationInputSpeechStartedUpdate(element, options), + "input_audio_buffer.speech_stopped" => ConversationInputSpeechFinishedUpdate.DeserializeConversationInputSpeechFinishedUpdate(element, options), + "rate_limits.updated" => ConversationRateLimitsUpdate.DeserializeConversationRateLimitsUpdate(element, options), + "response.created" => ConversationResponseStartedUpdate.DeserializeConversationResponseStartedUpdate(element, options), + "response.done" => ConversationResponseFinishedUpdate.DeserializeConversationResponseFinishedUpdate(element, options), + "session.created" => ConversationSessionStartedUpdate.DeserializeConversationSessionStartedUpdate(element, options), + "session.updated" => ConversationSessionConfiguredUpdate.DeserializeConversationSessionConfiguredUpdate(element, options), + + "response.output_item.added" => ConversationItemStreamingStartedUpdate.DeserializeConversationItemStreamingStartedUpdate(element, options), + "response.output_item.done" => ConversationItemStreamingFinishedUpdate.DeserializeConversationItemStreamingFinishedUpdate(element, options), + + "response.content_part.added" + or "response.audio_transcript.delta" + or "response.audio.delta" + or "response.text.delta" + or "response.function_call_arguments.delta" => ConversationItemStreamingPartDeltaUpdate.DeserializeItemStreamingPartDeltaUpdate(element, options), + + "response.text.done" => ConversationItemStreamingTextFinishedUpdate.DeserializeConversationItemStreamingTextFinishedUpdate(element, options), + "response.audio_transcript.done" => ConversationItemStreamingAudioTranscriptionFinishedUpdate.DeserializeConversationItemStreamingAudioTranscriptionFinishedUpdate(element, options), + "response.audio.done" => ConversationItemStreamingAudioFinishedUpdate.DeserializeConversationItemStreamingAudioFinishedUpdate(element, options), + + "response.function_call_arguments.done" + or "response.content_part.done" => ConversationItemStreamingPartFinishedUpdate.DeserializeItemStreamingPartFinishedUpdate(element, options), + + _ => UnknownRealtimeServerEvent.DeserializeUnknownRealtimeServerEvent(element, options), + + }; + } + return UnknownRealtimeServerEvent.DeserializeUnknownRealtimeServerEvent(element, options); + } +} \ No newline at end of file diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationUpdate.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationUpdate.cs index bd86dc2c2..dd47e04b6 100644 --- a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationUpdate.cs +++ b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationUpdate.cs @@ -5,7 +5,7 @@ namespace OpenAI.RealtimeConversation; [Experimental("OPENAI002")] -[CodeGenModel("RealtimeResponseCommand")] +[CodeGenModel("RealtimeServerEvent")] public partial class ConversationUpdate { [CodeGenMember("Kind")] diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationUpdateKind.Serialization.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationUpdateKind.Serialization.cs new file mode 100644 index 000000000..ab32d4daa --- /dev/null +++ b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationUpdateKind.Serialization.cs @@ -0,0 +1,71 @@ +using System; + +namespace OpenAI.RealtimeConversation; +internal static partial class ConversationUpdateKindExtensions +{ + public static string ToSerialString(this ConversationUpdateKind value) => value switch + { + ConversationUpdateKind.SessionStarted => "session.created", + ConversationUpdateKind.SessionConfigured => "session.updated", + // ConversationUpdateKind.ConversationCreated => "conversation.created", + ConversationUpdateKind.ItemCreated => "conversation.item.created", + ConversationUpdateKind.ItemDeleted => "conversation.item.deleted", + ConversationUpdateKind.ItemTruncated => "conversation.item.truncated", + ConversationUpdateKind.ResponseStarted => "response.created", + ConversationUpdateKind.ResponseFinished => "response.done", + ConversationUpdateKind.RateLimitsUpdated => "rate_limits.updated", + ConversationUpdateKind.ItemStreamingStarted => "response.output_item.added", + ConversationUpdateKind.ItemStreamingFinished => "response.output_item.done", + ConversationUpdateKind.ItemContentPartStarted => "response.content_part.added", + ConversationUpdateKind.ItemContentPartFinished => "response.content_part.done", + ConversationUpdateKind.ItemStreamingPartAudioDelta => "response.audio.delta", + ConversationUpdateKind.ItemStreamingPartAudioFinished => "response.audio.done", + ConversationUpdateKind.ItemStreamingPartAudioTranscriptionDelta => "response.audio_transcript.delta", + ConversationUpdateKind.ItemStreamingPartAudioTranscriptionFinished => "response.audio_transcript.done", + ConversationUpdateKind.ItemStreamingPartTextDelta => "response.text.delta", + ConversationUpdateKind.ItemStreamingPartTextFinished => "response.text.done", + ConversationUpdateKind.ItemStreamingFunctionCallArgumentsDelta => "response.function_call_arguments.delta", + ConversationUpdateKind.ItemStreamingFunctionCallArgumentsFinished => "response.function_call_arguments.done", + ConversationUpdateKind.InputSpeechStarted => "input_audio_buffer.speech_started", + ConversationUpdateKind.InputSpeechStopped => "input_audio_buffer.speech_stopped", + ConversationUpdateKind.InputTranscriptionFinished => "conversation.item.input_audio_transcription.completed", + ConversationUpdateKind.InputTranscriptionFailed => "conversation.item.input_audio_transcription.failed", + ConversationUpdateKind.InputAudioCommitted => "input_audio_buffer.committed", + ConversationUpdateKind.InputAudioCleared => "input_audio_buffer.cleared", + ConversationUpdateKind.Error => "error", + _ => null, + }; + + public static ConversationUpdateKind ToConversationUpdateKind(this string value) + { + if (StringComparer.OrdinalIgnoreCase.Equals(value, "session.created")) return ConversationUpdateKind.SessionStarted; + if (StringComparer.OrdinalIgnoreCase.Equals(value, "session.updated")) return ConversationUpdateKind.SessionConfigured; + // if (StringComparer.OrdinalIgnoreCase.Equals(value, "conversation.created")) return ConversationUpdateKind.ConversationCreated; + if (StringComparer.OrdinalIgnoreCase.Equals(value, "conversation.item.created")) return ConversationUpdateKind.ItemCreated; + if (StringComparer.OrdinalIgnoreCase.Equals(value, "conversation.item.deleted")) return ConversationUpdateKind.ItemDeleted; + if (StringComparer.OrdinalIgnoreCase.Equals(value, "conversation.item.truncated")) return ConversationUpdateKind.ItemTruncated; + if (StringComparer.OrdinalIgnoreCase.Equals(value, "response.created")) return ConversationUpdateKind.ResponseStarted; + if (StringComparer.OrdinalIgnoreCase.Equals(value, "response.done")) return ConversationUpdateKind.ResponseFinished; + if (StringComparer.OrdinalIgnoreCase.Equals(value, "rate_limits.updated")) return ConversationUpdateKind.RateLimitsUpdated; + if (StringComparer.OrdinalIgnoreCase.Equals(value, "response.output_item.added")) return ConversationUpdateKind.ItemStreamingStarted; + if (StringComparer.OrdinalIgnoreCase.Equals(value, "response.output_item.done")) return ConversationUpdateKind.ItemStreamingFinished; + if (StringComparer.OrdinalIgnoreCase.Equals(value, "response.content_part.added")) return ConversationUpdateKind.ItemContentPartStarted; + if (StringComparer.OrdinalIgnoreCase.Equals(value, "response.content_part.done")) return ConversationUpdateKind.ItemContentPartFinished; + if (StringComparer.OrdinalIgnoreCase.Equals(value, "response.audio.delta")) return ConversationUpdateKind.ItemStreamingPartAudioDelta; + if (StringComparer.OrdinalIgnoreCase.Equals(value, "response.audio.done")) return ConversationUpdateKind.ItemStreamingPartAudioFinished; + if (StringComparer.OrdinalIgnoreCase.Equals(value, "response.audio_transcript.delta")) return ConversationUpdateKind.ItemStreamingPartAudioTranscriptionDelta; + if (StringComparer.OrdinalIgnoreCase.Equals(value, "response.audio_transcript.done")) return ConversationUpdateKind.ItemStreamingPartAudioTranscriptionFinished; + if (StringComparer.OrdinalIgnoreCase.Equals(value, "response.text.delta")) return ConversationUpdateKind.ItemStreamingPartTextDelta; + if (StringComparer.OrdinalIgnoreCase.Equals(value, "response.text.done")) return ConversationUpdateKind.ItemStreamingPartTextFinished; + if (StringComparer.OrdinalIgnoreCase.Equals(value, "response.function_call_arguments.delta")) return ConversationUpdateKind.ItemStreamingFunctionCallArgumentsDelta; + if (StringComparer.OrdinalIgnoreCase.Equals(value, "response.function_call_arguments.done")) return ConversationUpdateKind.ItemStreamingFunctionCallArgumentsFinished; + if (StringComparer.OrdinalIgnoreCase.Equals(value, "input_audio_buffer.speech_started")) return ConversationUpdateKind.InputSpeechStarted; + if (StringComparer.OrdinalIgnoreCase.Equals(value, "input_audio_buffer.speech_stopped")) return ConversationUpdateKind.InputSpeechStopped; + if (StringComparer.OrdinalIgnoreCase.Equals(value, "conversation.item.input_audio_transcription.completed")) return ConversationUpdateKind.InputTranscriptionFinished; + if (StringComparer.OrdinalIgnoreCase.Equals(value, "conversation.item.input_audio_transcription.failed")) return ConversationUpdateKind.InputTranscriptionFailed; + if (StringComparer.OrdinalIgnoreCase.Equals(value, "input_audio_buffer.committed")) return ConversationUpdateKind.InputAudioCommitted; + if (StringComparer.OrdinalIgnoreCase.Equals(value, "input_audio_buffer.cleared")) return ConversationUpdateKind.InputAudioCleared; + if (StringComparer.OrdinalIgnoreCase.Equals(value, "error")) return ConversationUpdateKind.Error; + return ConversationUpdateKind.Unknown; + } +} diff --git a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationUpdateKind.cs b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationUpdateKind.cs index 2ad123160..d8da3878d 100644 --- a/src/Custom/RealtimeConversation/ResponseUpdates/ConversationUpdateKind.cs +++ b/src/Custom/RealtimeConversation/ResponseUpdates/ConversationUpdateKind.cs @@ -5,9 +5,13 @@ namespace OpenAI.RealtimeConversation; [Experimental("OPENAI002")] -[CodeGenModel("RealtimeResponseCommandType")] +[CodeGenModel("RealtimeServerEventType")] public enum ConversationUpdateKind { + /// + /// A response command that does not map to a type currently handled by the library. + /// + Unknown, /// /// The session.created response command. /// @@ -18,17 +22,27 @@ public enum ConversationUpdateKind /// [CodeGenMember("SessionUpdated")] SessionConfigured, - [CodeGenMember("ItemCreated")] - ItemAcknowledged, + /// + /// The conversation.item.created response command. + /// + [CodeGenMember("ConversationItemCreated")] + ItemCreated, + /// + /// The conversation.c.reated response command. + /// + /// + /// This update kind is currently unused. + /// + ConversationCreated, /// /// The conversation.item.deleted response command. /// - [CodeGenMember("ItemDeleted")] + [CodeGenMember("ConversationItemDeleted")] ItemDeleted, /// /// The conversation.item.truncated response command. /// - [CodeGenMember("ItemTruncated")] + [CodeGenMember("ConversationItemTruncated")] ItemTruncated, /// /// The response.created response command. @@ -40,56 +54,104 @@ public enum ConversationUpdateKind /// [CodeGenMember("ResponseDone")] ResponseFinished, + /// + /// The rate_limits.updated response command. + /// [CodeGenMember("RateLimitsUpdated")] RateLimitsUpdated, /// /// The response.output_item.added response command. /// [CodeGenMember("ResponseOutputItemAdded")] - ItemStarted, + ItemStreamingStarted, /// /// The response.output_item.done response command. /// [CodeGenMember("ResponseOutputItemDone")] - ItemFinished, + ItemStreamingFinished, /// /// The response.content_part.added response command. /// [CodeGenMember("ResponseContentPartAdded")] - ContentPartStarted, + ItemContentPartStarted, /// /// The response.content_part.done response command. /// [CodeGenMember("ResponseContentPartDone")] - ContentPartFinished, + ItemContentPartFinished, + /// + /// The response.audio.delta response command. + /// [CodeGenMember("ResponseAudioDelta")] - ResponseAudioDelta, + ItemStreamingPartAudioDelta, + /// + /// The response.audio.done response command. + /// [CodeGenMember("ResponseAudioDone")] - ResponseAudioDone, + ItemStreamingPartAudioFinished, + /// + /// The response.audio_transcript.delta response command. + /// [CodeGenMember("ResponseAudioTranscriptDelta")] - ResponseAudioTranscriptDelta, + ItemStreamingPartAudioTranscriptionDelta, + /// + /// The response.audio_transcript.done response command. + /// [CodeGenMember("ResponseAudioTranscriptDone")] - ResponseAudioTranscriptDone, + ItemStreamingPartAudioTranscriptionFinished, + /// + /// The response.text.delta response command. + /// [CodeGenMember("ResponseTextDelta")] - ResponseTextDelta, + ItemStreamingPartTextDelta, + /// + /// The response.text.done response command. + /// [CodeGenMember("ResponseTextDone")] - ResponseTextDone, + ItemStreamingPartTextFinished, + /// + /// The response.function_call_arguments.delta response command. + /// [CodeGenMember("ResponseFunctionCallArgumentsDelta")] - ResponseFunctionCallArgumentsDelta, + ItemStreamingFunctionCallArgumentsDelta, + /// + /// The response.function_call_arguments.done response command. + /// [CodeGenMember("ResponseFunctionCallArgumentsDone")] - ResponseFunctionCallArgumentsDone, + ItemStreamingFunctionCallArgumentsFinished, + /// + /// The input_audio_buffer.speech_started response command. + /// [CodeGenMember("InputAudioBufferSpeechStarted")] - InputAudioBufferSpeechStarted, + InputSpeechStarted, + /// + /// The input_audio_buffer.speech_stopped response command. + /// [CodeGenMember("InputAudioBufferSpeechStopped")] - InputAudioBufferSpeechStopped, - [CodeGenMember("ItemInputAudioTranscriptionCompleted")] - ItemInputAudioTranscriptionCompleted, - [CodeGenMember("ItemInputAudioTranscriptionFailed")] - ItemInputAudioTranscriptionFailed, + InputSpeechStopped, + /// + /// The conversation.item.input_audio_transcription.completed response command. + /// + [CodeGenMember("ConversationItemInputAudioTranscriptionCompleted")] + InputTranscriptionFinished, + /// + /// The conversation.item.input_audio_transcription.failed response command. + /// + [CodeGenMember("ConversationItemInputAudioTranscriptionFailed")] + InputTranscriptionFailed, + /// + /// The input_audio_buffer.committed response command. + /// [CodeGenMember("InputAudioBufferCommitted")] - InputAudioBufferCommitted, + InputAudioCommitted, + /// + /// The input_audio_buffer.cleared response command. + /// [CodeGenMember("InputAudioBufferCleared")] - InputAudioBufferCleared, + InputAudioCleared, + /// + /// The error response command. + /// [CodeGenMember("Error")] Error } \ No newline at end of file diff --git a/src/Custom/VectorStores/Internal/CreateVectorStoreOperationToken.cs b/src/Custom/VectorStores/Internal/CreateVectorStoreOperationToken.cs index 00eca795a..2e6d1baec 100644 --- a/src/Custom/VectorStores/Internal/CreateVectorStoreOperationToken.cs +++ b/src/Custom/VectorStores/Internal/CreateVectorStoreOperationToken.cs @@ -24,7 +24,7 @@ public override BinaryData ToBytes() writer.WriteStartObject(); writer.WriteString("vectorStoreId", VectorStoreId); - + writer.WriteEndObject(); writer.Flush(); diff --git a/src/Custom/VectorStores/Internal/Pagination/AsyncVectorStoreFileBatchCollectionResult.cs b/src/Custom/VectorStores/Internal/Pagination/AsyncVectorStoreFileBatchCollectionResult.cs index 04f51eb76..80707e361 100644 --- a/src/Custom/VectorStores/Internal/Pagination/AsyncVectorStoreFileBatchCollectionResult.cs +++ b/src/Custom/VectorStores/Internal/Pagination/AsyncVectorStoreFileBatchCollectionResult.cs @@ -27,7 +27,7 @@ internal class AsyncVectorStoreFileBatchCollectionResult : AsyncCollectionResult public AsyncVectorStoreFileBatchCollectionResult(VectorStoreClient messageClient, ClientPipeline pipeline, RequestOptions options, - string vectorStoreId, string batchId, + string vectorStoreId, string batchId, int? limit, string? order, string? after, string? before, string? filter) { _vectorStoreClient = messageClient; diff --git a/src/Custom/VectorStores/Internal/Pagination/AsyncVectorStoreFileCollectionResult.cs b/src/Custom/VectorStores/Internal/Pagination/AsyncVectorStoreFileCollectionResult.cs index 3425e2e9f..0fdc218fc 100644 --- a/src/Custom/VectorStores/Internal/Pagination/AsyncVectorStoreFileCollectionResult.cs +++ b/src/Custom/VectorStores/Internal/Pagination/AsyncVectorStoreFileCollectionResult.cs @@ -26,7 +26,7 @@ internal class AsyncVectorStoreFileCollectionResult : AsyncCollectionResult.Write(Utf8JsonWriter writer, ModelReaderW writer.WritePropertyName("model"u8); writer.WriteStringValue(Model.ToString()); } + if (SerializedAdditionalRawData?.ContainsKey("store") != true && Optional.IsDefined(StoredOutputEnabled)) + { + if (StoredOutputEnabled != null) + { + writer.WritePropertyName("store"u8); + writer.WriteBooleanValue(StoredOutputEnabled.Value); + } + else + { + writer.WriteNull("store"); + } + } + if (SerializedAdditionalRawData?.ContainsKey("metadata") != true && Optional.IsCollectionDefined(Metadata)) + { + if (Metadata != null) + { + writer.WritePropertyName("metadata"u8); + writer.WriteStartObject(); + foreach (var item in Metadata) + { + writer.WritePropertyName(item.Key); + writer.WriteStringValue(item.Value); + } + writer.WriteEndObject(); + } + else + { + writer.WriteNull("metadata"); + } + } if (SerializedAdditionalRawData?.ContainsKey("frequency_penalty") != true && Optional.IsDefined(FrequencyPenalty)) { if (FrequencyPenalty != null) @@ -300,6 +330,8 @@ internal static ChatCompletionOptions DeserializeChatCompletionOptions(JsonEleme } IList messages = default; InternalCreateChatCompletionRequestModel model = default; + bool? store = default; + IDictionary metadata = default; float? frequencyPenalty = default; IDictionary logitBias = default; bool? logprobs = default; @@ -341,6 +373,30 @@ internal static ChatCompletionOptions DeserializeChatCompletionOptions(JsonEleme model = new InternalCreateChatCompletionRequestModel(property.Value.GetString()); continue; } + if (property.NameEquals("store"u8)) + { + if (property.Value.ValueKind == JsonValueKind.Null) + { + store = null; + continue; + } + store = property.Value.GetBoolean(); + continue; + } + if (property.NameEquals("metadata"u8)) + { + if (property.Value.ValueKind == JsonValueKind.Null) + { + continue; + } + Dictionary dictionary = new Dictionary(); + foreach (var property0 in property.Value.EnumerateObject()) + { + dictionary.Add(property0.Name, property0.Value.GetString()); + } + metadata = dictionary; + continue; + } if (property.NameEquals("frequency_penalty"u8)) { if (property.Value.ValueKind == JsonValueKind.Null) @@ -560,6 +616,8 @@ internal static ChatCompletionOptions DeserializeChatCompletionOptions(JsonEleme return new ChatCompletionOptions( messages, model, + store, + metadata ?? new ChangeTrackingDictionary(), frequencyPenalty, logitBias ?? new ChangeTrackingDictionary(), logprobs, diff --git a/src/Generated/Models/ChatCompletionOptions.cs b/src/Generated/Models/ChatCompletionOptions.cs index 342461bbd..68127ece8 100644 --- a/src/Generated/Models/ChatCompletionOptions.cs +++ b/src/Generated/Models/ChatCompletionOptions.cs @@ -12,10 +12,12 @@ public partial class ChatCompletionOptions { internal IDictionary SerializedAdditionalRawData { get; set; } - internal ChatCompletionOptions(IList messages, InternalCreateChatCompletionRequestModel model, float? frequencyPenalty, IDictionary logitBiases, bool? includeLogProbabilities, int? topLogProbabilityCount, int? deprecatedMaxTokens, int? maxOutputTokenCount, int? n, float? presencePenalty, ChatResponseFormat responseFormat, long? seed, InternalCreateChatCompletionRequestServiceTier? serviceTier, IList stopSequences, bool? stream, InternalChatCompletionStreamOptions streamOptions, float? temperature, float? topP, IList tools, ChatToolChoice toolChoice, bool? allowParallelToolCalls, string endUserId, ChatFunctionChoice functionChoice, IList functions, IDictionary serializedAdditionalRawData) + internal ChatCompletionOptions(IList messages, InternalCreateChatCompletionRequestModel model, bool? storedOutputEnabled, IDictionary metadata, float? frequencyPenalty, IDictionary logitBiases, bool? includeLogProbabilities, int? topLogProbabilityCount, int? deprecatedMaxTokens, int? maxOutputTokenCount, int? n, float? presencePenalty, ChatResponseFormat responseFormat, long? seed, InternalCreateChatCompletionRequestServiceTier? serviceTier, IList stopSequences, bool? stream, InternalChatCompletionStreamOptions streamOptions, float? temperature, float? topP, IList tools, ChatToolChoice toolChoice, bool? allowParallelToolCalls, string endUserId, ChatFunctionChoice functionChoice, IList functions, IDictionary serializedAdditionalRawData) { Messages = messages; Model = model; + StoredOutputEnabled = storedOutputEnabled; + Metadata = metadata; FrequencyPenalty = frequencyPenalty; LogitBiases = logitBiases; IncludeLogProbabilities = includeLogProbabilities; diff --git a/src/Generated/Models/ChatInputTokenUsageDetails.Serialization.cs b/src/Generated/Models/ChatInputTokenUsageDetails.Serialization.cs new file mode 100644 index 000000000..2fcfd0a2f --- /dev/null +++ b/src/Generated/Models/ChatInputTokenUsageDetails.Serialization.cs @@ -0,0 +1,152 @@ +// + +#nullable disable + +using System; +using System.ClientModel; +using System.ClientModel.Primitives; +using System.Collections.Generic; +using System.Text.Json; + +namespace OpenAI.Chat +{ + public partial class ChatInputTokenUsageDetails : IJsonModel + { + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + { + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + if (format != "J") + { + throw new FormatException($"The model {nameof(ChatInputTokenUsageDetails)} does not support writing '{format}' format."); + } + + writer.WriteStartObject(); + if (SerializedAdditionalRawData?.ContainsKey("audio_tokens") != true && Optional.IsDefined(AudioTokenCount)) + { + writer.WritePropertyName("audio_tokens"u8); + writer.WriteNumberValue(AudioTokenCount.Value); + } + if (SerializedAdditionalRawData?.ContainsKey("cached_tokens") != true && Optional.IsDefined(CachedTokenCount)) + { + writer.WritePropertyName("cached_tokens"u8); + writer.WriteNumberValue(CachedTokenCount.Value); + } + if (SerializedAdditionalRawData != null) + { + foreach (var item in SerializedAdditionalRawData) + { + if (ModelSerializationExtensions.IsSentinelValue(item.Value)) + { + continue; + } + writer.WritePropertyName(item.Key); +#if NET6_0_OR_GREATER + writer.WriteRawValue(item.Value); +#else + using (JsonDocument document = JsonDocument.Parse(item.Value)) + { + JsonSerializer.Serialize(writer, document.RootElement); + } +#endif + } + } + writer.WriteEndObject(); + } + + ChatInputTokenUsageDetails IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + { + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + if (format != "J") + { + throw new FormatException($"The model {nameof(ChatInputTokenUsageDetails)} does not support reading '{format}' format."); + } + + using JsonDocument document = JsonDocument.ParseValue(ref reader); + return DeserializeChatInputTokenUsageDetails(document.RootElement, options); + } + + internal static ChatInputTokenUsageDetails DeserializeChatInputTokenUsageDetails(JsonElement element, ModelReaderWriterOptions options = null) + { + options ??= ModelSerializationExtensions.WireOptions; + + if (element.ValueKind == JsonValueKind.Null) + { + return null; + } + int? audioTokens = default; + int? cachedTokens = default; + IDictionary serializedAdditionalRawData = default; + Dictionary rawDataDictionary = new Dictionary(); + foreach (var property in element.EnumerateObject()) + { + if (property.NameEquals("audio_tokens"u8)) + { + if (property.Value.ValueKind == JsonValueKind.Null) + { + continue; + } + audioTokens = property.Value.GetInt32(); + continue; + } + if (property.NameEquals("cached_tokens"u8)) + { + if (property.Value.ValueKind == JsonValueKind.Null) + { + continue; + } + cachedTokens = property.Value.GetInt32(); + continue; + } + if (true) + { + rawDataDictionary ??= new Dictionary(); + rawDataDictionary.Add(property.Name, BinaryData.FromString(property.Value.GetRawText())); + } + } + serializedAdditionalRawData = rawDataDictionary; + return new ChatInputTokenUsageDetails(audioTokens, cachedTokens, serializedAdditionalRawData); + } + + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + { + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + + switch (format) + { + case "J": + return ModelReaderWriter.Write(this, options); + default: + throw new FormatException($"The model {nameof(ChatInputTokenUsageDetails)} does not support writing '{options.Format}' format."); + } + } + + ChatInputTokenUsageDetails IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + { + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + + switch (format) + { + case "J": + { + using JsonDocument document = JsonDocument.Parse(data); + return DeserializeChatInputTokenUsageDetails(document.RootElement, options); + } + default: + throw new FormatException($"The model {nameof(ChatInputTokenUsageDetails)} does not support reading '{options.Format}' format."); + } + } + + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + + internal static ChatInputTokenUsageDetails FromResponse(PipelineResponse response) + { + using var document = JsonDocument.Parse(response.Content); + return DeserializeChatInputTokenUsageDetails(document.RootElement); + } + + internal virtual BinaryContent ToBinaryContent() + { + return BinaryContent.Create(this, ModelSerializationExtensions.WireOptions); + } + } +} diff --git a/src/Generated/Models/ChatInputTokenUsageDetails.cs b/src/Generated/Models/ChatInputTokenUsageDetails.cs new file mode 100644 index 000000000..6164fe03d --- /dev/null +++ b/src/Generated/Models/ChatInputTokenUsageDetails.cs @@ -0,0 +1,24 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; + +namespace OpenAI.Chat +{ + public partial class ChatInputTokenUsageDetails + { + internal IDictionary SerializedAdditionalRawData { get; set; } + internal ChatInputTokenUsageDetails() + { + } + + internal ChatInputTokenUsageDetails(int? audioTokenCount, int? cachedTokenCount, IDictionary serializedAdditionalRawData) + { + AudioTokenCount = audioTokenCount; + CachedTokenCount = cachedTokenCount; + SerializedAdditionalRawData = serializedAdditionalRawData; + } + } +} diff --git a/src/Generated/Models/ChatOutputTokenUsageDetails.Serialization.cs b/src/Generated/Models/ChatOutputTokenUsageDetails.Serialization.cs index 3ef3edc7a..390ad1010 100644 --- a/src/Generated/Models/ChatOutputTokenUsageDetails.Serialization.cs +++ b/src/Generated/Models/ChatOutputTokenUsageDetails.Serialization.cs @@ -21,6 +21,11 @@ void IJsonModel.Write(Utf8JsonWriter writer, ModelR } writer.WriteStartObject(); + if (SerializedAdditionalRawData?.ContainsKey("audio_tokens") != true && Optional.IsDefined(AudioTokenCount)) + { + writer.WritePropertyName("audio_tokens"u8); + writer.WriteNumberValue(AudioTokenCount.Value); + } if (SerializedAdditionalRawData?.ContainsKey("reasoning_tokens") != true) { writer.WritePropertyName("reasoning_tokens"u8); @@ -68,11 +73,21 @@ internal static ChatOutputTokenUsageDetails DeserializeChatOutputTokenUsageDetai { return null; } + int? audioTokens = default; int reasoningTokens = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); foreach (var property in element.EnumerateObject()) { + if (property.NameEquals("audio_tokens"u8)) + { + if (property.Value.ValueKind == JsonValueKind.Null) + { + continue; + } + audioTokens = property.Value.GetInt32(); + continue; + } if (property.NameEquals("reasoning_tokens"u8)) { if (property.Value.ValueKind == JsonValueKind.Null) @@ -89,7 +104,7 @@ internal static ChatOutputTokenUsageDetails DeserializeChatOutputTokenUsageDetai } } serializedAdditionalRawData = rawDataDictionary; - return new ChatOutputTokenUsageDetails(reasoningTokens, serializedAdditionalRawData); + return new ChatOutputTokenUsageDetails(audioTokens, reasoningTokens, serializedAdditionalRawData); } BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) diff --git a/src/Generated/Models/ChatOutputTokenUsageDetails.cs b/src/Generated/Models/ChatOutputTokenUsageDetails.cs index 88bc8370c..fbbf7f962 100644 --- a/src/Generated/Models/ChatOutputTokenUsageDetails.cs +++ b/src/Generated/Models/ChatOutputTokenUsageDetails.cs @@ -14,8 +14,9 @@ internal ChatOutputTokenUsageDetails() { } - internal ChatOutputTokenUsageDetails(int reasoningTokenCount, IDictionary serializedAdditionalRawData) + internal ChatOutputTokenUsageDetails(int? audioTokenCount, int reasoningTokenCount, IDictionary serializedAdditionalRawData) { + AudioTokenCount = audioTokenCount; ReasoningTokenCount = reasoningTokenCount; SerializedAdditionalRawData = serializedAdditionalRawData; } diff --git a/src/Generated/Models/ChatTokenUsage.Serialization.cs b/src/Generated/Models/ChatTokenUsage.Serialization.cs index 8a2854fb9..4dbcb7383 100644 --- a/src/Generated/Models/ChatTokenUsage.Serialization.cs +++ b/src/Generated/Models/ChatTokenUsage.Serialization.cs @@ -41,6 +41,11 @@ void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOp writer.WritePropertyName("completion_tokens_details"u8); writer.WriteObjectValue(OutputTokenDetails, options); } + if (SerializedAdditionalRawData?.ContainsKey("prompt_tokens_details") != true && Optional.IsDefined(InputTokenDetails)) + { + writer.WritePropertyName("prompt_tokens_details"u8); + writer.WriteObjectValue(InputTokenDetails, options); + } if (SerializedAdditionalRawData != null) { foreach (var item in SerializedAdditionalRawData) @@ -87,6 +92,7 @@ internal static ChatTokenUsage DeserializeChatTokenUsage(JsonElement element, Mo int promptTokens = default; int totalTokens = default; ChatOutputTokenUsageDetails completionTokensDetails = default; + ChatInputTokenUsageDetails promptTokensDetails = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); foreach (var property in element.EnumerateObject()) @@ -115,6 +121,15 @@ internal static ChatTokenUsage DeserializeChatTokenUsage(JsonElement element, Mo completionTokensDetails = ChatOutputTokenUsageDetails.DeserializeChatOutputTokenUsageDetails(property.Value, options); continue; } + if (property.NameEquals("prompt_tokens_details"u8)) + { + if (property.Value.ValueKind == JsonValueKind.Null) + { + continue; + } + promptTokensDetails = ChatInputTokenUsageDetails.DeserializeChatInputTokenUsageDetails(property.Value, options); + continue; + } if (true) { rawDataDictionary ??= new Dictionary(); @@ -122,7 +137,13 @@ internal static ChatTokenUsage DeserializeChatTokenUsage(JsonElement element, Mo } } serializedAdditionalRawData = rawDataDictionary; - return new ChatTokenUsage(completionTokens, promptTokens, totalTokens, completionTokensDetails, serializedAdditionalRawData); + return new ChatTokenUsage( + completionTokens, + promptTokens, + totalTokens, + completionTokensDetails, + promptTokensDetails, + serializedAdditionalRawData); } BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) diff --git a/src/Generated/Models/ChatTokenUsage.cs b/src/Generated/Models/ChatTokenUsage.cs index 098738c93..ca981e89f 100644 --- a/src/Generated/Models/ChatTokenUsage.cs +++ b/src/Generated/Models/ChatTokenUsage.cs @@ -17,12 +17,13 @@ internal ChatTokenUsage(int outputTokenCount, int inputTokenCount, int totalToke TotalTokenCount = totalTokenCount; } - internal ChatTokenUsage(int outputTokenCount, int inputTokenCount, int totalTokenCount, ChatOutputTokenUsageDetails outputTokenDetails, IDictionary serializedAdditionalRawData) + internal ChatTokenUsage(int outputTokenCount, int inputTokenCount, int totalTokenCount, ChatOutputTokenUsageDetails outputTokenDetails, ChatInputTokenUsageDetails inputTokenDetails, IDictionary serializedAdditionalRawData) { OutputTokenCount = outputTokenCount; InputTokenCount = inputTokenCount; TotalTokenCount = totalTokenCount; OutputTokenDetails = outputTokenDetails; + InputTokenDetails = inputTokenDetails; SerializedAdditionalRawData = serializedAdditionalRawData; } diff --git a/src/Generated/Models/ConversationAudioDeltaUpdate.cs b/src/Generated/Models/ConversationAudioDeltaUpdate.cs deleted file mode 100644 index 28a01035f..000000000 --- a/src/Generated/Models/ConversationAudioDeltaUpdate.cs +++ /dev/null @@ -1,45 +0,0 @@ -// - -#nullable disable - -using System; -using System.Collections.Generic; - -namespace OpenAI.RealtimeConversation -{ - public partial class ConversationAudioDeltaUpdate : ConversationUpdate - { - internal ConversationAudioDeltaUpdate(string eventId, string responseId, string itemId, int outputIndex, int contentIndex, BinaryData delta) : base(eventId) - { - Argument.AssertNotNull(responseId, nameof(responseId)); - Argument.AssertNotNull(itemId, nameof(itemId)); - Argument.AssertNotNull(delta, nameof(delta)); - - Kind = ConversationUpdateKind.ResponseAudioDelta; - ResponseId = responseId; - ItemId = itemId; - OutputIndex = outputIndex; - ContentIndex = contentIndex; - Delta = delta; - } - - internal ConversationAudioDeltaUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string responseId, string itemId, int outputIndex, int contentIndex, BinaryData delta) : base(kind, eventId, serializedAdditionalRawData) - { - ResponseId = responseId; - ItemId = itemId; - OutputIndex = outputIndex; - ContentIndex = contentIndex; - Delta = delta; - } - - internal ConversationAudioDeltaUpdate() - { - } - - public string ResponseId { get; } - public string ItemId { get; } - public int OutputIndex { get; } - public int ContentIndex { get; } - public BinaryData Delta { get; } - } -} diff --git a/src/Generated/Models/ConversationAudioDoneUpdate.Serialization.cs b/src/Generated/Models/ConversationAudioDoneUpdate.Serialization.cs deleted file mode 100644 index c3f9dba5a..000000000 --- a/src/Generated/Models/ConversationAudioDoneUpdate.Serialization.cs +++ /dev/null @@ -1,219 +0,0 @@ -// - -#nullable disable - -using System; -using System.ClientModel; -using System.ClientModel.Primitives; -using System.Collections.Generic; -using System.Text.Json; - -namespace OpenAI.RealtimeConversation -{ - public partial class ConversationAudioDoneUpdate : IJsonModel - { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) - { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; - if (format != "J") - { - throw new FormatException($"The model {nameof(ConversationAudioDoneUpdate)} does not support writing '{format}' format."); - } - - writer.WriteStartObject(); - if (SerializedAdditionalRawData?.ContainsKey("type") != true) - { - writer.WritePropertyName("type"u8); - writer.WriteStringValue(Type); - } - if (SerializedAdditionalRawData?.ContainsKey("response_id") != true) - { - writer.WritePropertyName("response_id"u8); - writer.WriteStringValue(ResponseId); - } - if (SerializedAdditionalRawData?.ContainsKey("item_id") != true) - { - writer.WritePropertyName("item_id"u8); - writer.WriteStringValue(ItemId); - } - if (SerializedAdditionalRawData?.ContainsKey("output_index") != true) - { - writer.WritePropertyName("output_index"u8); - writer.WriteNumberValue(OutputIndex); - } - if (SerializedAdditionalRawData?.ContainsKey("content_index") != true) - { - writer.WritePropertyName("content_index"u8); - writer.WriteNumberValue(ContentIndex); - } - if (SerializedAdditionalRawData?.ContainsKey("type") != true) - { - writer.WritePropertyName("type"u8); - writer.WriteStringValue(Kind.ToSerialString()); - } - if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) - { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } - } - if (SerializedAdditionalRawData != null) - { - foreach (var item in SerializedAdditionalRawData) - { - if (ModelSerializationExtensions.IsSentinelValue(item.Value)) - { - continue; - } - writer.WritePropertyName(item.Key); -#if NET6_0_OR_GREATER - writer.WriteRawValue(item.Value); -#else - using (JsonDocument document = JsonDocument.Parse(item.Value)) - { - JsonSerializer.Serialize(writer, document.RootElement); - } -#endif - } - } - writer.WriteEndObject(); - } - - ConversationAudioDoneUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) - { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; - if (format != "J") - { - throw new FormatException($"The model {nameof(ConversationAudioDoneUpdate)} does not support reading '{format}' format."); - } - - using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeConversationAudioDoneUpdate(document.RootElement, options); - } - - internal static ConversationAudioDoneUpdate DeserializeConversationAudioDoneUpdate(JsonElement element, ModelReaderWriterOptions options = null) - { - options ??= ModelSerializationExtensions.WireOptions; - - if (element.ValueKind == JsonValueKind.Null) - { - return null; - } - string type = default; - string responseId = default; - string itemId = default; - int outputIndex = default; - int contentIndex = default; - ConversationUpdateKind type0 = default; - string eventId = default; - IDictionary serializedAdditionalRawData = default; - Dictionary rawDataDictionary = new Dictionary(); - foreach (var property in element.EnumerateObject()) - { - if (property.NameEquals("type"u8)) - { - type = property.Value.GetString(); - continue; - } - if (property.NameEquals("response_id"u8)) - { - responseId = property.Value.GetString(); - continue; - } - if (property.NameEquals("item_id"u8)) - { - itemId = property.Value.GetString(); - continue; - } - if (property.NameEquals("output_index"u8)) - { - outputIndex = property.Value.GetInt32(); - continue; - } - if (property.NameEquals("content_index"u8)) - { - contentIndex = property.Value.GetInt32(); - continue; - } - if (property.NameEquals("type"u8)) - { - type0 = property.Value.GetString().ToConversationUpdateKind(); - continue; - } - if (property.NameEquals("event_id"u8)) - { - if (property.Value.ValueKind == JsonValueKind.Null) - { - eventId = null; - continue; - } - eventId = property.Value.GetString(); - continue; - } - if (true) - { - rawDataDictionary ??= new Dictionary(); - rawDataDictionary.Add(property.Name, BinaryData.FromString(property.Value.GetRawText())); - } - } - serializedAdditionalRawData = rawDataDictionary; - return new ConversationAudioDoneUpdate( - type0, - eventId, - serializedAdditionalRawData, - type, - responseId, - itemId, - outputIndex, - contentIndex); - } - - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) - { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; - - switch (format) - { - case "J": - return ModelReaderWriter.Write(this, options); - default: - throw new FormatException($"The model {nameof(ConversationAudioDoneUpdate)} does not support writing '{options.Format}' format."); - } - } - - ConversationAudioDoneUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) - { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; - - switch (format) - { - case "J": - { - using JsonDocument document = JsonDocument.Parse(data); - return DeserializeConversationAudioDoneUpdate(document.RootElement, options); - } - default: - throw new FormatException($"The model {nameof(ConversationAudioDoneUpdate)} does not support reading '{options.Format}' format."); - } - } - - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - - internal static new ConversationAudioDoneUpdate FromResponse(PipelineResponse response) - { - using var document = JsonDocument.Parse(response.Content); - return DeserializeConversationAudioDoneUpdate(document.RootElement); - } - - internal override BinaryContent ToBinaryContent() - { - return BinaryContent.Create(this, ModelSerializationExtensions.WireOptions); - } - } -} diff --git a/src/Generated/Models/ConversationContentPart.Serialization.cs b/src/Generated/Models/ConversationContentPart.Serialization.cs index 94b9103b2..d499c65d4 100644 --- a/src/Generated/Models/ConversationContentPart.Serialization.cs +++ b/src/Generated/Models/ConversationContentPart.Serialization.cs @@ -24,7 +24,7 @@ void IJsonModel.Write(Utf8JsonWriter writer, ModelReade if (SerializedAdditionalRawData?.ContainsKey("type") != true) { writer.WritePropertyName("type"u8); - writer.WriteStringValue(Type.ToString()); + writer.WriteStringValue(Kind.ToString()); } if (SerializedAdditionalRawData != null) { diff --git a/src/Generated/Models/ConversationContentPart.cs b/src/Generated/Models/ConversationContentPart.cs index 1ee1dc7ea..868e21f83 100644 --- a/src/Generated/Models/ConversationContentPart.cs +++ b/src/Generated/Models/ConversationContentPart.cs @@ -14,10 +14,12 @@ protected ConversationContentPart() { } - internal ConversationContentPart(ConversationContentPartKind type, IDictionary serializedAdditionalRawData) + internal ConversationContentPart(ConversationContentPartKind kind, IDictionary serializedAdditionalRawData) { - Type = type; + Kind = kind; SerializedAdditionalRawData = serializedAdditionalRawData; } + + internal ConversationContentPartKind Kind { get; set; } } } diff --git a/src/Generated/Models/ConversationContentPartKind.cs b/src/Generated/Models/ConversationContentPartKind.cs index a0052ae37..97c714033 100644 --- a/src/Generated/Models/ConversationContentPartKind.cs +++ b/src/Generated/Models/ConversationContentPartKind.cs @@ -18,13 +18,11 @@ public ConversationContentPartKind(string value) private const string InputTextValue = "input_text"; private const string InputAudioValue = "input_audio"; - private const string TextValue = "text"; - private const string AudioValue = "audio"; + private const string OutputTextValue = "text"; + private const string OutputAudioValue = "audio"; public static ConversationContentPartKind InputText { get; } = new ConversationContentPartKind(InputTextValue); public static ConversationContentPartKind InputAudio { get; } = new ConversationContentPartKind(InputAudioValue); - public static ConversationContentPartKind Text { get; } = new ConversationContentPartKind(TextValue); - public static ConversationContentPartKind Audio { get; } = new ConversationContentPartKind(AudioValue); public static bool operator ==(ConversationContentPartKind left, ConversationContentPartKind right) => left.Equals(right); public static bool operator !=(ConversationContentPartKind left, ConversationContentPartKind right) => !left.Equals(right); public static implicit operator ConversationContentPartKind(string value) => new ConversationContentPartKind(value); diff --git a/src/Generated/Models/ConversationErrorUpdate.Serialization.cs b/src/Generated/Models/ConversationErrorUpdate.Serialization.cs index cf0ff1418..6c8d27e98 100644 --- a/src/Generated/Models/ConversationErrorUpdate.Serialization.cs +++ b/src/Generated/Models/ConversationErrorUpdate.Serialization.cs @@ -24,7 +24,7 @@ void IJsonModel.Write(Utf8JsonWriter writer, ModelReade if (SerializedAdditionalRawData?.ContainsKey("error") != true) { writer.WritePropertyName("error"u8); - writer.WriteObjectValue(_error, options); + writer.WriteObjectValue(_error, options); } if (SerializedAdditionalRawData?.ContainsKey("type") != true) { @@ -33,15 +33,8 @@ void IJsonModel.Write(Utf8JsonWriter writer, ModelReade } if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -85,7 +78,7 @@ internal static ConversationErrorUpdate DeserializeConversationErrorUpdate(JsonE { return null; } - InternalRealtimeResponseError error = default; + InternalRealtimeServerEventErrorError error = default; ConversationUpdateKind type = default; string eventId = default; IDictionary serializedAdditionalRawData = default; @@ -94,7 +87,7 @@ internal static ConversationErrorUpdate DeserializeConversationErrorUpdate(JsonE { if (property.NameEquals("error"u8)) { - error = InternalRealtimeResponseError.DeserializeInternalRealtimeResponseError(property.Value, options); + error = InternalRealtimeServerEventErrorError.DeserializeInternalRealtimeServerEventErrorError(property.Value, options); continue; } if (property.NameEquals("type"u8)) @@ -104,11 +97,6 @@ internal static ConversationErrorUpdate DeserializeConversationErrorUpdate(JsonE } if (property.NameEquals("event_id"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - eventId = null; - continue; - } eventId = property.Value.GetString(); continue; } diff --git a/src/Generated/Models/ConversationErrorUpdate.cs b/src/Generated/Models/ConversationErrorUpdate.cs index 1040232ff..861ce8204 100644 --- a/src/Generated/Models/ConversationErrorUpdate.cs +++ b/src/Generated/Models/ConversationErrorUpdate.cs @@ -9,15 +9,16 @@ namespace OpenAI.RealtimeConversation { public partial class ConversationErrorUpdate : ConversationUpdate { - internal ConversationErrorUpdate(string eventId, InternalRealtimeResponseError error) : base(eventId) + internal ConversationErrorUpdate(string eventId, InternalRealtimeServerEventErrorError error) : base(eventId) { + Argument.AssertNotNull(eventId, nameof(eventId)); Argument.AssertNotNull(error, nameof(error)); Kind = ConversationUpdateKind.Error; _error = error; } - internal ConversationErrorUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, InternalRealtimeResponseError error) : base(kind, eventId, serializedAdditionalRawData) + internal ConversationErrorUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, InternalRealtimeServerEventErrorError error) : base(kind, eventId, serializedAdditionalRawData) { _error = error; } diff --git a/src/Generated/Models/ConversationInputAudioBufferClearedUpdate.cs b/src/Generated/Models/ConversationInputAudioBufferClearedUpdate.cs deleted file mode 100644 index f185bbba7..000000000 --- a/src/Generated/Models/ConversationInputAudioBufferClearedUpdate.cs +++ /dev/null @@ -1,25 +0,0 @@ -// - -#nullable disable - -using System; -using System.Collections.Generic; - -namespace OpenAI.RealtimeConversation -{ - public partial class ConversationInputAudioBufferClearedUpdate : ConversationUpdate - { - internal ConversationInputAudioBufferClearedUpdate(string eventId) : base(eventId) - { - Kind = ConversationUpdateKind.InputAudioBufferCleared; - } - - internal ConversationInputAudioBufferClearedUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData) : base(kind, eventId, serializedAdditionalRawData) - { - } - - internal ConversationInputAudioBufferClearedUpdate() - { - } - } -} diff --git a/src/Generated/Models/ConversationInputAudioBufferCommittedUpdate.cs b/src/Generated/Models/ConversationInputAudioBufferCommittedUpdate.cs deleted file mode 100644 index 255ee74e2..000000000 --- a/src/Generated/Models/ConversationInputAudioBufferCommittedUpdate.cs +++ /dev/null @@ -1,33 +0,0 @@ -// - -#nullable disable - -using System; -using System.Collections.Generic; - -namespace OpenAI.RealtimeConversation -{ - public partial class ConversationInputAudioBufferCommittedUpdate : ConversationUpdate - { - internal ConversationInputAudioBufferCommittedUpdate(string eventId, string itemId) : base(eventId) - { - Argument.AssertNotNull(itemId, nameof(itemId)); - - Kind = ConversationUpdateKind.InputAudioBufferCommitted; - ItemId = itemId; - } - - internal ConversationInputAudioBufferCommittedUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string itemId, string previousItemId) : base(kind, eventId, serializedAdditionalRawData) - { - ItemId = itemId; - PreviousItemId = previousItemId; - } - - internal ConversationInputAudioBufferCommittedUpdate() - { - } - - public string ItemId { get; } - public string PreviousItemId { get; } - } -} diff --git a/src/Generated/Models/RealtimeResponseFailedStatusDetails.Serialization.cs b/src/Generated/Models/ConversationInputAudioClearedUpdate.Serialization.cs similarity index 59% rename from src/Generated/Models/RealtimeResponseFailedStatusDetails.Serialization.cs rename to src/Generated/Models/ConversationInputAudioClearedUpdate.Serialization.cs index 4bc9d5382..e88bfd7c1 100644 --- a/src/Generated/Models/RealtimeResponseFailedStatusDetails.Serialization.cs +++ b/src/Generated/Models/ConversationInputAudioClearedUpdate.Serialization.cs @@ -10,33 +10,26 @@ namespace OpenAI.RealtimeConversation { - internal partial class RealtimeResponseFailedStatusDetails : IJsonModel + public partial class ConversationInputAudioClearedUpdate : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(RealtimeResponseFailedStatusDetails)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(ConversationInputAudioClearedUpdate)} does not support writing '{format}' format."); } writer.WriteStartObject(); - if (SerializedAdditionalRawData?.ContainsKey("error") != true) - { - writer.WritePropertyName("error"u8); -#if NET6_0_OR_GREATER - writer.WriteRawValue(Error); -#else - using (JsonDocument document = JsonDocument.Parse(Error)) - { - JsonSerializer.Serialize(writer, document.RootElement); - } -#endif - } if (SerializedAdditionalRawData?.ContainsKey("type") != true) { writer.WritePropertyName("type"u8); - writer.WriteStringValue(Type.ToString()); + writer.WriteStringValue(Kind.ToSerialString()); + } + if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) + { + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -60,19 +53,19 @@ void IJsonModel.Write(Utf8JsonWriter writer writer.WriteEndObject(); } - RealtimeResponseFailedStatusDetails IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + ConversationInputAudioClearedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(RealtimeResponseFailedStatusDetails)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(ConversationInputAudioClearedUpdate)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeRealtimeResponseFailedStatusDetails(document.RootElement, options); + return DeserializeConversationInputAudioClearedUpdate(document.RootElement, options); } - internal static RealtimeResponseFailedStatusDetails DeserializeRealtimeResponseFailedStatusDetails(JsonElement element, ModelReaderWriterOptions options = null) + internal static ConversationInputAudioClearedUpdate DeserializeConversationInputAudioClearedUpdate(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -80,20 +73,20 @@ internal static RealtimeResponseFailedStatusDetails DeserializeRealtimeResponseF { return null; } - BinaryData error = default; - ConversationStatus type = default; + ConversationUpdateKind type = default; + string eventId = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); foreach (var property in element.EnumerateObject()) { - if (property.NameEquals("error"u8)) + if (property.NameEquals("type"u8)) { - error = BinaryData.FromString(property.Value.GetRawText()); + type = property.Value.GetString().ToConversationUpdateKind(); continue; } - if (property.NameEquals("type"u8)) + if (property.NameEquals("event_id"u8)) { - type = new ConversationStatus(property.Value.GetString()); + eventId = property.Value.GetString(); continue; } if (true) @@ -103,44 +96,44 @@ internal static RealtimeResponseFailedStatusDetails DeserializeRealtimeResponseF } } serializedAdditionalRawData = rawDataDictionary; - return new RealtimeResponseFailedStatusDetails(type, serializedAdditionalRawData, error); + return new ConversationInputAudioClearedUpdate(type, eventId, serializedAdditionalRawData); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(RealtimeResponseFailedStatusDetails)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(ConversationInputAudioClearedUpdate)} does not support writing '{options.Format}' format."); } } - RealtimeResponseFailedStatusDetails IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + ConversationInputAudioClearedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeRealtimeResponseFailedStatusDetails(document.RootElement, options); + return DeserializeConversationInputAudioClearedUpdate(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(RealtimeResponseFailedStatusDetails)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(ConversationInputAudioClearedUpdate)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new RealtimeResponseFailedStatusDetails FromResponse(PipelineResponse response) + internal static new ConversationInputAudioClearedUpdate FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeRealtimeResponseFailedStatusDetails(document.RootElement); + return DeserializeConversationInputAudioClearedUpdate(document.RootElement); } internal override BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/ConversationInputAudioClearedUpdate.cs b/src/Generated/Models/ConversationInputAudioClearedUpdate.cs new file mode 100644 index 000000000..69c9b597c --- /dev/null +++ b/src/Generated/Models/ConversationInputAudioClearedUpdate.cs @@ -0,0 +1,27 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; + +namespace OpenAI.RealtimeConversation +{ + public partial class ConversationInputAudioClearedUpdate : ConversationUpdate + { + internal ConversationInputAudioClearedUpdate(string eventId) : base(eventId) + { + Argument.AssertNotNull(eventId, nameof(eventId)); + + Kind = ConversationUpdateKind.InputAudioCleared; + } + + internal ConversationInputAudioClearedUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData) : base(kind, eventId, serializedAdditionalRawData) + { + } + + internal ConversationInputAudioClearedUpdate() + { + } + } +} diff --git a/src/Generated/Models/ConversationInputAudioBufferCommittedUpdate.Serialization.cs b/src/Generated/Models/ConversationInputAudioCommittedUpdate.Serialization.cs similarity index 63% rename from src/Generated/Models/ConversationInputAudioBufferCommittedUpdate.Serialization.cs rename to src/Generated/Models/ConversationInputAudioCommittedUpdate.Serialization.cs index 591b40f5c..6a3da8605 100644 --- a/src/Generated/Models/ConversationInputAudioBufferCommittedUpdate.Serialization.cs +++ b/src/Generated/Models/ConversationInputAudioCommittedUpdate.Serialization.cs @@ -10,27 +10,27 @@ namespace OpenAI.RealtimeConversation { - public partial class ConversationInputAudioBufferCommittedUpdate : IJsonModel + public partial class ConversationInputAudioCommittedUpdate : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationInputAudioBufferCommittedUpdate)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(ConversationInputAudioCommittedUpdate)} does not support writing '{format}' format."); } writer.WriteStartObject(); + if (SerializedAdditionalRawData?.ContainsKey("previous_item_id") != true) + { + writer.WritePropertyName("previous_item_id"u8); + writer.WriteStringValue(PreviousItemId); + } if (SerializedAdditionalRawData?.ContainsKey("item_id") != true) { writer.WritePropertyName("item_id"u8); writer.WriteStringValue(ItemId); } - if (SerializedAdditionalRawData?.ContainsKey("previous_item_id") != true && Optional.IsDefined(PreviousItemId)) - { - writer.WritePropertyName("previous_item_id"u8); - writer.WriteStringValue(PreviousItemId); - } if (SerializedAdditionalRawData?.ContainsKey("type") != true) { writer.WritePropertyName("type"u8); @@ -38,15 +38,8 @@ void IJsonModel.Write(Utf8JsonWrite } if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -70,19 +63,19 @@ void IJsonModel.Write(Utf8JsonWrite writer.WriteEndObject(); } - ConversationInputAudioBufferCommittedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + ConversationInputAudioCommittedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationInputAudioBufferCommittedUpdate)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(ConversationInputAudioCommittedUpdate)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeConversationInputAudioBufferCommittedUpdate(document.RootElement, options); + return DeserializeConversationInputAudioCommittedUpdate(document.RootElement, options); } - internal static ConversationInputAudioBufferCommittedUpdate DeserializeConversationInputAudioBufferCommittedUpdate(JsonElement element, ModelReaderWriterOptions options = null) + internal static ConversationInputAudioCommittedUpdate DeserializeConversationInputAudioCommittedUpdate(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -90,22 +83,22 @@ internal static ConversationInputAudioBufferCommittedUpdate DeserializeConversat { return null; } - string itemId = default; string previousItemId = default; + string itemId = default; ConversationUpdateKind type = default; string eventId = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); foreach (var property in element.EnumerateObject()) { - if (property.NameEquals("item_id"u8)) + if (property.NameEquals("previous_item_id"u8)) { - itemId = property.Value.GetString(); + previousItemId = property.Value.GetString(); continue; } - if (property.NameEquals("previous_item_id"u8)) + if (property.NameEquals("item_id"u8)) { - previousItemId = property.Value.GetString(); + itemId = property.Value.GetString(); continue; } if (property.NameEquals("type"u8)) @@ -115,11 +108,6 @@ internal static ConversationInputAudioBufferCommittedUpdate DeserializeConversat } if (property.NameEquals("event_id"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - eventId = null; - continue; - } eventId = property.Value.GetString(); continue; } @@ -130,44 +118,44 @@ internal static ConversationInputAudioBufferCommittedUpdate DeserializeConversat } } serializedAdditionalRawData = rawDataDictionary; - return new ConversationInputAudioBufferCommittedUpdate(type, eventId, serializedAdditionalRawData, itemId, previousItemId); + return new ConversationInputAudioCommittedUpdate(type, eventId, serializedAdditionalRawData, previousItemId, itemId); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(ConversationInputAudioBufferCommittedUpdate)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(ConversationInputAudioCommittedUpdate)} does not support writing '{options.Format}' format."); } } - ConversationInputAudioBufferCommittedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + ConversationInputAudioCommittedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeConversationInputAudioBufferCommittedUpdate(document.RootElement, options); + return DeserializeConversationInputAudioCommittedUpdate(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(ConversationInputAudioBufferCommittedUpdate)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(ConversationInputAudioCommittedUpdate)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new ConversationInputAudioBufferCommittedUpdate FromResponse(PipelineResponse response) + internal static new ConversationInputAudioCommittedUpdate FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeConversationInputAudioBufferCommittedUpdate(document.RootElement); + return DeserializeConversationInputAudioCommittedUpdate(document.RootElement); } internal override BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/ConversationInputAudioCommittedUpdate.cs b/src/Generated/Models/ConversationInputAudioCommittedUpdate.cs new file mode 100644 index 000000000..a7ba4389e --- /dev/null +++ b/src/Generated/Models/ConversationInputAudioCommittedUpdate.cs @@ -0,0 +1,36 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; + +namespace OpenAI.RealtimeConversation +{ + public partial class ConversationInputAudioCommittedUpdate : ConversationUpdate + { + internal ConversationInputAudioCommittedUpdate(string eventId, string previousItemId, string itemId) : base(eventId) + { + Argument.AssertNotNull(eventId, nameof(eventId)); + Argument.AssertNotNull(previousItemId, nameof(previousItemId)); + Argument.AssertNotNull(itemId, nameof(itemId)); + + Kind = ConversationUpdateKind.InputAudioCommitted; + PreviousItemId = previousItemId; + ItemId = itemId; + } + + internal ConversationInputAudioCommittedUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string previousItemId, string itemId) : base(kind, eventId, serializedAdditionalRawData) + { + PreviousItemId = previousItemId; + ItemId = itemId; + } + + internal ConversationInputAudioCommittedUpdate() + { + } + + public string PreviousItemId { get; } + public string ItemId { get; } + } +} diff --git a/src/Generated/Models/ConversationInputSpeechFinishedUpdate.Serialization.cs b/src/Generated/Models/ConversationInputSpeechFinishedUpdate.Serialization.cs index 17563841e..2d5d424bb 100644 --- a/src/Generated/Models/ConversationInputSpeechFinishedUpdate.Serialization.cs +++ b/src/Generated/Models/ConversationInputSpeechFinishedUpdate.Serialization.cs @@ -24,7 +24,7 @@ void IJsonModel.Write(Utf8JsonWriter writ if (SerializedAdditionalRawData?.ContainsKey("audio_end_ms") != true) { writer.WritePropertyName("audio_end_ms"u8); - writer.WriteNumberValue(AudioEndMs); + writer.WriteNumberValue(_audioEndMs); } if (SerializedAdditionalRawData?.ContainsKey("item_id") != true) { @@ -38,15 +38,8 @@ void IJsonModel.Write(Utf8JsonWriter writ } if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -115,11 +108,6 @@ internal static ConversationInputSpeechFinishedUpdate DeserializeConversationInp } if (property.NameEquals("event_id"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - eventId = null; - continue; - } eventId = property.Value.GetString(); continue; } diff --git a/src/Generated/Models/ConversationInputSpeechFinishedUpdate.cs b/src/Generated/Models/ConversationInputSpeechFinishedUpdate.cs index 890260322..e1698b3af 100644 --- a/src/Generated/Models/ConversationInputSpeechFinishedUpdate.cs +++ b/src/Generated/Models/ConversationInputSpeechFinishedUpdate.cs @@ -11,24 +11,23 @@ public partial class ConversationInputSpeechFinishedUpdate : ConversationUpdate { internal ConversationInputSpeechFinishedUpdate(string eventId, int audioEndMs, string itemId) : base(eventId) { + Argument.AssertNotNull(eventId, nameof(eventId)); Argument.AssertNotNull(itemId, nameof(itemId)); - Kind = ConversationUpdateKind.InputAudioBufferSpeechStopped; - AudioEndMs = audioEndMs; + Kind = ConversationUpdateKind.InputSpeechStopped; + _audioEndMs = audioEndMs; ItemId = itemId; } internal ConversationInputSpeechFinishedUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, int audioEndMs, string itemId) : base(kind, eventId, serializedAdditionalRawData) { - AudioEndMs = audioEndMs; + _audioEndMs = audioEndMs; ItemId = itemId; } internal ConversationInputSpeechFinishedUpdate() { } - - public int AudioEndMs { get; } public string ItemId { get; } } } diff --git a/src/Generated/Models/ConversationInputSpeechStartedUpdate.Serialization.cs b/src/Generated/Models/ConversationInputSpeechStartedUpdate.Serialization.cs index 14fe6656e..6d9913523 100644 --- a/src/Generated/Models/ConversationInputSpeechStartedUpdate.Serialization.cs +++ b/src/Generated/Models/ConversationInputSpeechStartedUpdate.Serialization.cs @@ -24,7 +24,7 @@ void IJsonModel.Write(Utf8JsonWriter write if (SerializedAdditionalRawData?.ContainsKey("audio_start_ms") != true) { writer.WritePropertyName("audio_start_ms"u8); - writer.WriteNumberValue(AudioStartMs); + writer.WriteNumberValue(_audioStartMs); } if (SerializedAdditionalRawData?.ContainsKey("item_id") != true) { @@ -38,15 +38,8 @@ void IJsonModel.Write(Utf8JsonWriter write } if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -115,11 +108,6 @@ internal static ConversationInputSpeechStartedUpdate DeserializeConversationInpu } if (property.NameEquals("event_id"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - eventId = null; - continue; - } eventId = property.Value.GetString(); continue; } diff --git a/src/Generated/Models/ConversationInputSpeechStartedUpdate.cs b/src/Generated/Models/ConversationInputSpeechStartedUpdate.cs index 8cf4492f3..361347232 100644 --- a/src/Generated/Models/ConversationInputSpeechStartedUpdate.cs +++ b/src/Generated/Models/ConversationInputSpeechStartedUpdate.cs @@ -11,24 +11,23 @@ public partial class ConversationInputSpeechStartedUpdate : ConversationUpdate { internal ConversationInputSpeechStartedUpdate(string eventId, int audioStartMs, string itemId) : base(eventId) { + Argument.AssertNotNull(eventId, nameof(eventId)); Argument.AssertNotNull(itemId, nameof(itemId)); - Kind = ConversationUpdateKind.InputAudioBufferSpeechStarted; - AudioStartMs = audioStartMs; + Kind = ConversationUpdateKind.InputSpeechStarted; + _audioStartMs = audioStartMs; ItemId = itemId; } internal ConversationInputSpeechStartedUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, int audioStartMs, string itemId) : base(kind, eventId, serializedAdditionalRawData) { - AudioStartMs = audioStartMs; + _audioStartMs = audioStartMs; ItemId = itemId; } internal ConversationInputSpeechStartedUpdate() { } - - public int AudioStartMs { get; } public string ItemId { get; } } } diff --git a/src/Generated/Models/ConversationInputTranscriptionFailedUpdate.Serialization.cs b/src/Generated/Models/ConversationInputTranscriptionFailedUpdate.Serialization.cs index d9d89b35b..35fbb1c8c 100644 --- a/src/Generated/Models/ConversationInputTranscriptionFailedUpdate.Serialization.cs +++ b/src/Generated/Models/ConversationInputTranscriptionFailedUpdate.Serialization.cs @@ -34,7 +34,7 @@ void IJsonModel.Write(Utf8JsonWriter if (SerializedAdditionalRawData?.ContainsKey("error") != true) { writer.WritePropertyName("error"u8); - writer.WriteObjectValue(_error, options); + writer.WriteObjectValue(_error, options); } if (SerializedAdditionalRawData?.ContainsKey("type") != true) { @@ -43,15 +43,8 @@ void IJsonModel.Write(Utf8JsonWriter } if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -97,7 +90,7 @@ internal static ConversationInputTranscriptionFailedUpdate DeserializeConversati } string itemId = default; int contentIndex = default; - InternalRealtimeResponseApiError error = default; + InternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError error = default; ConversationUpdateKind type = default; string eventId = default; IDictionary serializedAdditionalRawData = default; @@ -116,7 +109,7 @@ internal static ConversationInputTranscriptionFailedUpdate DeserializeConversati } if (property.NameEquals("error"u8)) { - error = InternalRealtimeResponseApiError.DeserializeInternalRealtimeResponseApiError(property.Value, options); + error = InternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError.DeserializeInternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError(property.Value, options); continue; } if (property.NameEquals("type"u8)) @@ -126,11 +119,6 @@ internal static ConversationInputTranscriptionFailedUpdate DeserializeConversati } if (property.NameEquals("event_id"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - eventId = null; - continue; - } eventId = property.Value.GetString(); continue; } diff --git a/src/Generated/Models/ConversationInputTranscriptionFailedUpdate.cs b/src/Generated/Models/ConversationInputTranscriptionFailedUpdate.cs index 824472383..eed7cccb0 100644 --- a/src/Generated/Models/ConversationInputTranscriptionFailedUpdate.cs +++ b/src/Generated/Models/ConversationInputTranscriptionFailedUpdate.cs @@ -9,18 +9,19 @@ namespace OpenAI.RealtimeConversation { public partial class ConversationInputTranscriptionFailedUpdate : ConversationUpdate { - internal ConversationInputTranscriptionFailedUpdate(string eventId, string itemId, int contentIndex, InternalRealtimeResponseApiError error) : base(eventId) + internal ConversationInputTranscriptionFailedUpdate(string eventId, string itemId, int contentIndex, InternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError error) : base(eventId) { + Argument.AssertNotNull(eventId, nameof(eventId)); Argument.AssertNotNull(itemId, nameof(itemId)); Argument.AssertNotNull(error, nameof(error)); - Kind = ConversationUpdateKind.ItemInputAudioTranscriptionFailed; + Kind = ConversationUpdateKind.InputTranscriptionFailed; ItemId = itemId; ContentIndex = contentIndex; _error = error; } - internal ConversationInputTranscriptionFailedUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string itemId, int contentIndex, InternalRealtimeResponseApiError error) : base(kind, eventId, serializedAdditionalRawData) + internal ConversationInputTranscriptionFailedUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string itemId, int contentIndex, InternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError error) : base(kind, eventId, serializedAdditionalRawData) { ItemId = itemId; ContentIndex = contentIndex; diff --git a/src/Generated/Models/ConversationInputTranscriptionFinishedUpdate.Serialization.cs b/src/Generated/Models/ConversationInputTranscriptionFinishedUpdate.Serialization.cs index 4a6c1ea65..7459b3fad 100644 --- a/src/Generated/Models/ConversationInputTranscriptionFinishedUpdate.Serialization.cs +++ b/src/Generated/Models/ConversationInputTranscriptionFinishedUpdate.Serialization.cs @@ -43,15 +43,8 @@ void IJsonModel.Write(Utf8JsonWrit } if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -126,11 +119,6 @@ internal static ConversationInputTranscriptionFinishedUpdate DeserializeConversa } if (property.NameEquals("event_id"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - eventId = null; - continue; - } eventId = property.Value.GetString(); continue; } diff --git a/src/Generated/Models/ConversationInputTranscriptionFinishedUpdate.cs b/src/Generated/Models/ConversationInputTranscriptionFinishedUpdate.cs index 0960c8032..3c840f8f5 100644 --- a/src/Generated/Models/ConversationInputTranscriptionFinishedUpdate.cs +++ b/src/Generated/Models/ConversationInputTranscriptionFinishedUpdate.cs @@ -11,10 +11,11 @@ public partial class ConversationInputTranscriptionFinishedUpdate : Conversation { internal ConversationInputTranscriptionFinishedUpdate(string eventId, string itemId, int contentIndex, string transcript) : base(eventId) { + Argument.AssertNotNull(eventId, nameof(eventId)); Argument.AssertNotNull(itemId, nameof(itemId)); Argument.AssertNotNull(transcript, nameof(transcript)); - Kind = ConversationUpdateKind.ItemInputAudioTranscriptionCompleted; + Kind = ConversationUpdateKind.InputTranscriptionFinished; ItemId = itemId; ContentIndex = contentIndex; Transcript = transcript; diff --git a/src/Generated/Models/ConversationItem.cs b/src/Generated/Models/ConversationItem.cs index dd157049a..174f85a0d 100644 --- a/src/Generated/Models/ConversationItem.cs +++ b/src/Generated/Models/ConversationItem.cs @@ -14,14 +14,14 @@ protected ConversationItem() { } - internal ConversationItem(InternalRealtimeRequestItemType type, string id, IDictionary serializedAdditionalRawData) + internal ConversationItem(InternalRealtimeItemType type, string id, IDictionary serializedAdditionalRawData) { Type = type; Id = id; SerializedAdditionalRawData = serializedAdditionalRawData; } - internal InternalRealtimeRequestItemType Type { get; set; } + internal InternalRealtimeItemType Type { get; set; } public string Id { get; set; } } } diff --git a/src/Generated/Models/ConversationItemAcknowledgedUpdate.cs b/src/Generated/Models/ConversationItemAcknowledgedUpdate.cs deleted file mode 100644 index 64894df82..000000000 --- a/src/Generated/Models/ConversationItemAcknowledgedUpdate.cs +++ /dev/null @@ -1,29 +0,0 @@ -// - -#nullable disable - -using System; -using System.Collections.Generic; - -namespace OpenAI.RealtimeConversation -{ - public partial class ConversationItemAcknowledgedUpdate : ConversationUpdate - { - internal ConversationItemAcknowledgedUpdate(string eventId, ConversationItem item) : base(eventId) - { - Argument.AssertNotNull(item, nameof(item)); - - Kind = ConversationUpdateKind.ItemAcknowledged; - Item = item; - } - - internal ConversationItemAcknowledgedUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, ConversationItem item) : base(kind, eventId, serializedAdditionalRawData) - { - Item = item; - } - - internal ConversationItemAcknowledgedUpdate() - { - } - } -} diff --git a/src/Generated/Models/ConversationItemAcknowledgedUpdate.Serialization.cs b/src/Generated/Models/ConversationItemCreatedUpdate.Serialization.cs similarity index 59% rename from src/Generated/Models/ConversationItemAcknowledgedUpdate.Serialization.cs rename to src/Generated/Models/ConversationItemCreatedUpdate.Serialization.cs index 4cbe4f2d4..acf144430 100644 --- a/src/Generated/Models/ConversationItemAcknowledgedUpdate.Serialization.cs +++ b/src/Generated/Models/ConversationItemCreatedUpdate.Serialization.cs @@ -10,21 +10,26 @@ namespace OpenAI.RealtimeConversation { - public partial class ConversationItemAcknowledgedUpdate : IJsonModel + public partial class ConversationItemCreatedUpdate : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationItemAcknowledgedUpdate)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(ConversationItemCreatedUpdate)} does not support writing '{format}' format."); } writer.WriteStartObject(); + if (SerializedAdditionalRawData?.ContainsKey("previous_item_id") != true) + { + writer.WritePropertyName("previous_item_id"u8); + writer.WriteStringValue(PreviousItemId); + } if (SerializedAdditionalRawData?.ContainsKey("item") != true) { writer.WritePropertyName("item"u8); - writer.WriteObjectValue(Item, options); + writer.WriteObjectValue(_internalItem, options); } if (SerializedAdditionalRawData?.ContainsKey("type") != true) { @@ -33,15 +38,8 @@ void IJsonModel.Write(Utf8JsonWriter writer, } if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -65,19 +63,19 @@ void IJsonModel.Write(Utf8JsonWriter writer, writer.WriteEndObject(); } - ConversationItemAcknowledgedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + ConversationItemCreatedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationItemAcknowledgedUpdate)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(ConversationItemCreatedUpdate)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeConversationItemAcknowledgedUpdate(document.RootElement, options); + return DeserializeConversationItemCreatedUpdate(document.RootElement, options); } - internal static ConversationItemAcknowledgedUpdate DeserializeConversationItemAcknowledgedUpdate(JsonElement element, ModelReaderWriterOptions options = null) + internal static ConversationItemCreatedUpdate DeserializeConversationItemCreatedUpdate(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -85,16 +83,22 @@ internal static ConversationItemAcknowledgedUpdate DeserializeConversationItemAc { return null; } - ConversationItem item = default; + string previousItemId = default; + InternalRealtimeResponseItem item = default; ConversationUpdateKind type = default; string eventId = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); foreach (var property in element.EnumerateObject()) { + if (property.NameEquals("previous_item_id"u8)) + { + previousItemId = property.Value.GetString(); + continue; + } if (property.NameEquals("item"u8)) { - item = ConversationItem.DeserializeConversationItem(property.Value, options); + item = InternalRealtimeResponseItem.DeserializeInternalRealtimeResponseItem(property.Value, options); continue; } if (property.NameEquals("type"u8)) @@ -104,11 +108,6 @@ internal static ConversationItemAcknowledgedUpdate DeserializeConversationItemAc } if (property.NameEquals("event_id"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - eventId = null; - continue; - } eventId = property.Value.GetString(); continue; } @@ -119,44 +118,44 @@ internal static ConversationItemAcknowledgedUpdate DeserializeConversationItemAc } } serializedAdditionalRawData = rawDataDictionary; - return new ConversationItemAcknowledgedUpdate(type, eventId, serializedAdditionalRawData, item); + return new ConversationItemCreatedUpdate(type, eventId, serializedAdditionalRawData, previousItemId, item); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(ConversationItemAcknowledgedUpdate)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(ConversationItemCreatedUpdate)} does not support writing '{options.Format}' format."); } } - ConversationItemAcknowledgedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + ConversationItemCreatedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeConversationItemAcknowledgedUpdate(document.RootElement, options); + return DeserializeConversationItemCreatedUpdate(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(ConversationItemAcknowledgedUpdate)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(ConversationItemCreatedUpdate)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new ConversationItemAcknowledgedUpdate FromResponse(PipelineResponse response) + internal static new ConversationItemCreatedUpdate FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeConversationItemAcknowledgedUpdate(document.RootElement); + return DeserializeConversationItemCreatedUpdate(document.RootElement); } internal override BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/ConversationItemCreatedUpdate.cs b/src/Generated/Models/ConversationItemCreatedUpdate.cs new file mode 100644 index 000000000..2d23c315c --- /dev/null +++ b/src/Generated/Models/ConversationItemCreatedUpdate.cs @@ -0,0 +1,35 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; + +namespace OpenAI.RealtimeConversation +{ + public partial class ConversationItemCreatedUpdate : ConversationUpdate + { + internal ConversationItemCreatedUpdate(string eventId, string previousItemId, InternalRealtimeResponseItem internalItem) : base(eventId) + { + Argument.AssertNotNull(eventId, nameof(eventId)); + Argument.AssertNotNull(previousItemId, nameof(previousItemId)); + Argument.AssertNotNull(internalItem, nameof(internalItem)); + + Kind = ConversationUpdateKind.ItemCreated; + PreviousItemId = previousItemId; + _internalItem = internalItem; + } + + internal ConversationItemCreatedUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string previousItemId, InternalRealtimeResponseItem internalItem) : base(kind, eventId, serializedAdditionalRawData) + { + PreviousItemId = previousItemId; + _internalItem = internalItem; + } + + internal ConversationItemCreatedUpdate() + { + } + + public string PreviousItemId { get; } + } +} diff --git a/src/Generated/Models/ConversationItemDeletedUpdate.Serialization.cs b/src/Generated/Models/ConversationItemDeletedUpdate.Serialization.cs index 671ea9883..d4c875047 100644 --- a/src/Generated/Models/ConversationItemDeletedUpdate.Serialization.cs +++ b/src/Generated/Models/ConversationItemDeletedUpdate.Serialization.cs @@ -33,15 +33,8 @@ void IJsonModel.Write(Utf8JsonWriter writer, Mode } if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -104,11 +97,6 @@ internal static ConversationItemDeletedUpdate DeserializeConversationItemDeleted } if (property.NameEquals("event_id"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - eventId = null; - continue; - } eventId = property.Value.GetString(); continue; } diff --git a/src/Generated/Models/ConversationItemDeletedUpdate.cs b/src/Generated/Models/ConversationItemDeletedUpdate.cs index e178d7fee..38fa3ac88 100644 --- a/src/Generated/Models/ConversationItemDeletedUpdate.cs +++ b/src/Generated/Models/ConversationItemDeletedUpdate.cs @@ -11,6 +11,7 @@ public partial class ConversationItemDeletedUpdate : ConversationUpdate { internal ConversationItemDeletedUpdate(string eventId, string itemId) : base(eventId) { + Argument.AssertNotNull(eventId, nameof(eventId)); Argument.AssertNotNull(itemId, nameof(itemId)); Kind = ConversationUpdateKind.ItemDeleted; diff --git a/src/Generated/Models/ConversationItemFinishedUpdate.cs b/src/Generated/Models/ConversationItemFinishedUpdate.cs deleted file mode 100644 index 009eb2e40..000000000 --- a/src/Generated/Models/ConversationItemFinishedUpdate.cs +++ /dev/null @@ -1,37 +0,0 @@ -// - -#nullable disable - -using System; -using System.Collections.Generic; - -namespace OpenAI.RealtimeConversation -{ - public partial class ConversationItemFinishedUpdate : ConversationUpdate - { - internal ConversationItemFinishedUpdate(string eventId, string responseId, int outputIndex, InternalRealtimeResponseItem internalItem) : base(eventId) - { - Argument.AssertNotNull(responseId, nameof(responseId)); - Argument.AssertNotNull(internalItem, nameof(internalItem)); - - Kind = ConversationUpdateKind.ItemFinished; - ResponseId = responseId; - OutputIndex = outputIndex; - _internalItem = internalItem; - } - - internal ConversationItemFinishedUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string responseId, int outputIndex, InternalRealtimeResponseItem internalItem) : base(kind, eventId, serializedAdditionalRawData) - { - ResponseId = responseId; - OutputIndex = outputIndex; - _internalItem = internalItem; - } - - internal ConversationItemFinishedUpdate() - { - } - - public string ResponseId { get; } - public int OutputIndex { get; } - } -} diff --git a/src/Generated/Models/ConversationItemStartedUpdate.cs b/src/Generated/Models/ConversationItemStartedUpdate.cs deleted file mode 100644 index 7c28d6671..000000000 --- a/src/Generated/Models/ConversationItemStartedUpdate.cs +++ /dev/null @@ -1,37 +0,0 @@ -// - -#nullable disable - -using System; -using System.Collections.Generic; - -namespace OpenAI.RealtimeConversation -{ - public partial class ConversationItemStartedUpdate : ConversationUpdate - { - internal ConversationItemStartedUpdate(string eventId, string responseId, int outputIndex, InternalRealtimeResponseItem internalItem) : base(eventId) - { - Argument.AssertNotNull(responseId, nameof(responseId)); - Argument.AssertNotNull(internalItem, nameof(internalItem)); - - Kind = ConversationUpdateKind.ItemStarted; - ResponseId = responseId; - OutputIndex = outputIndex; - _internalItem = internalItem; - } - - internal ConversationItemStartedUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string responseId, int outputIndex, InternalRealtimeResponseItem internalItem) : base(kind, eventId, serializedAdditionalRawData) - { - ResponseId = responseId; - OutputIndex = outputIndex; - _internalItem = internalItem; - } - - internal ConversationItemStartedUpdate() - { - } - - public string ResponseId { get; } - public int OutputIndex { get; } - } -} diff --git a/src/Generated/Models/ConversationOutputTranscriptionFinishedUpdate.Serialization.cs b/src/Generated/Models/ConversationItemStreamingAudioFinishedUpdate.Serialization.cs similarity index 67% rename from src/Generated/Models/ConversationOutputTranscriptionFinishedUpdate.Serialization.cs rename to src/Generated/Models/ConversationItemStreamingAudioFinishedUpdate.Serialization.cs index b94744341..c21987a91 100644 --- a/src/Generated/Models/ConversationOutputTranscriptionFinishedUpdate.Serialization.cs +++ b/src/Generated/Models/ConversationItemStreamingAudioFinishedUpdate.Serialization.cs @@ -10,14 +10,14 @@ namespace OpenAI.RealtimeConversation { - public partial class ConversationOutputTranscriptionFinishedUpdate : IJsonModel + public partial class ConversationItemStreamingAudioFinishedUpdate : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationOutputTranscriptionFinishedUpdate)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(ConversationItemStreamingAudioFinishedUpdate)} does not support writing '{format}' format."); } writer.WriteStartObject(); @@ -48,15 +48,8 @@ void IJsonModel.Write(Utf8JsonWri } if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -80,19 +73,19 @@ void IJsonModel.Write(Utf8JsonWri writer.WriteEndObject(); } - ConversationOutputTranscriptionFinishedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + ConversationItemStreamingAudioFinishedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationOutputTranscriptionFinishedUpdate)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(ConversationItemStreamingAudioFinishedUpdate)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeConversationOutputTranscriptionFinishedUpdate(document.RootElement, options); + return DeserializeConversationItemStreamingAudioFinishedUpdate(document.RootElement, options); } - internal static ConversationOutputTranscriptionFinishedUpdate DeserializeConversationOutputTranscriptionFinishedUpdate(JsonElement element, ModelReaderWriterOptions options = null) + internal static ConversationItemStreamingAudioFinishedUpdate DeserializeConversationItemStreamingAudioFinishedUpdate(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -137,11 +130,6 @@ internal static ConversationOutputTranscriptionFinishedUpdate DeserializeConvers } if (property.NameEquals("event_id"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - eventId = null; - continue; - } eventId = property.Value.GetString(); continue; } @@ -152,7 +140,7 @@ internal static ConversationOutputTranscriptionFinishedUpdate DeserializeConvers } } serializedAdditionalRawData = rawDataDictionary; - return new ConversationOutputTranscriptionFinishedUpdate( + return new ConversationItemStreamingAudioFinishedUpdate( type, eventId, serializedAdditionalRawData, @@ -162,41 +150,41 @@ internal static ConversationOutputTranscriptionFinishedUpdate DeserializeConvers contentIndex); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(ConversationOutputTranscriptionFinishedUpdate)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(ConversationItemStreamingAudioFinishedUpdate)} does not support writing '{options.Format}' format."); } } - ConversationOutputTranscriptionFinishedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + ConversationItemStreamingAudioFinishedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeConversationOutputTranscriptionFinishedUpdate(document.RootElement, options); + return DeserializeConversationItemStreamingAudioFinishedUpdate(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(ConversationOutputTranscriptionFinishedUpdate)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(ConversationItemStreamingAudioFinishedUpdate)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new ConversationOutputTranscriptionFinishedUpdate FromResponse(PipelineResponse response) + internal static new ConversationItemStreamingAudioFinishedUpdate FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeConversationOutputTranscriptionFinishedUpdate(document.RootElement); + return DeserializeConversationItemStreamingAudioFinishedUpdate(document.RootElement); } internal override BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/ConversationAudioDoneUpdate.cs b/src/Generated/Models/ConversationItemStreamingAudioFinishedUpdate.cs similarity index 51% rename from src/Generated/Models/ConversationAudioDoneUpdate.cs rename to src/Generated/Models/ConversationItemStreamingAudioFinishedUpdate.cs index b05b2d28f..58c85f623 100644 --- a/src/Generated/Models/ConversationAudioDoneUpdate.cs +++ b/src/Generated/Models/ConversationItemStreamingAudioFinishedUpdate.cs @@ -7,35 +7,33 @@ namespace OpenAI.RealtimeConversation { - public partial class ConversationAudioDoneUpdate : ConversationUpdate + public partial class ConversationItemStreamingAudioFinishedUpdate : ConversationUpdate { - internal ConversationAudioDoneUpdate(string eventId, string responseId, string itemId, int outputIndex, int contentIndex) : base(eventId) + internal ConversationItemStreamingAudioFinishedUpdate(string eventId, string responseId, string itemId, int outputIndex, int contentIndex) : base(eventId) { + Argument.AssertNotNull(eventId, nameof(eventId)); Argument.AssertNotNull(responseId, nameof(responseId)); Argument.AssertNotNull(itemId, nameof(itemId)); - Kind = ConversationUpdateKind.ResponseAudioDone; + Kind = ConversationUpdateKind.ItemStreamingPartAudioFinished; ResponseId = responseId; ItemId = itemId; OutputIndex = outputIndex; ContentIndex = contentIndex; } - internal ConversationAudioDoneUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string type, string responseId, string itemId, int outputIndex, int contentIndex) : base(kind, eventId, serializedAdditionalRawData) + internal ConversationItemStreamingAudioFinishedUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string responseId, string itemId, int outputIndex, int contentIndex) : base(kind, eventId, serializedAdditionalRawData) { - Type = type; ResponseId = responseId; ItemId = itemId; OutputIndex = outputIndex; ContentIndex = contentIndex; } - internal ConversationAudioDoneUpdate() + internal ConversationItemStreamingAudioFinishedUpdate() { } - internal string Type { get; set; } = "response.audio.done"; - public string ResponseId { get; } public string ItemId { get; } public int OutputIndex { get; } diff --git a/src/Generated/Models/ConversationItemStreamingAudioTranscriptionFinishedUpdate.Serialization.cs b/src/Generated/Models/ConversationItemStreamingAudioTranscriptionFinishedUpdate.Serialization.cs new file mode 100644 index 000000000..15a4b862d --- /dev/null +++ b/src/Generated/Models/ConversationItemStreamingAudioTranscriptionFinishedUpdate.Serialization.cs @@ -0,0 +1,207 @@ +// + +#nullable disable + +using System; +using System.ClientModel; +using System.ClientModel.Primitives; +using System.Collections.Generic; +using System.Text.Json; + +namespace OpenAI.RealtimeConversation +{ + public partial class ConversationItemStreamingAudioTranscriptionFinishedUpdate : IJsonModel + { + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + { + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + if (format != "J") + { + throw new FormatException($"The model {nameof(ConversationItemStreamingAudioTranscriptionFinishedUpdate)} does not support writing '{format}' format."); + } + + writer.WriteStartObject(); + if (SerializedAdditionalRawData?.ContainsKey("response_id") != true) + { + writer.WritePropertyName("response_id"u8); + writer.WriteStringValue(ResponseId); + } + if (SerializedAdditionalRawData?.ContainsKey("item_id") != true) + { + writer.WritePropertyName("item_id"u8); + writer.WriteStringValue(ItemId); + } + if (SerializedAdditionalRawData?.ContainsKey("output_index") != true) + { + writer.WritePropertyName("output_index"u8); + writer.WriteNumberValue(OutputIndex); + } + if (SerializedAdditionalRawData?.ContainsKey("content_index") != true) + { + writer.WritePropertyName("content_index"u8); + writer.WriteNumberValue(ContentIndex); + } + if (SerializedAdditionalRawData?.ContainsKey("transcript") != true) + { + writer.WritePropertyName("transcript"u8); + writer.WriteStringValue(Transcript); + } + if (SerializedAdditionalRawData?.ContainsKey("type") != true) + { + writer.WritePropertyName("type"u8); + writer.WriteStringValue(Kind.ToSerialString()); + } + if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) + { + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); + } + if (SerializedAdditionalRawData != null) + { + foreach (var item in SerializedAdditionalRawData) + { + if (ModelSerializationExtensions.IsSentinelValue(item.Value)) + { + continue; + } + writer.WritePropertyName(item.Key); +#if NET6_0_OR_GREATER + writer.WriteRawValue(item.Value); +#else + using (JsonDocument document = JsonDocument.Parse(item.Value)) + { + JsonSerializer.Serialize(writer, document.RootElement); + } +#endif + } + } + writer.WriteEndObject(); + } + + ConversationItemStreamingAudioTranscriptionFinishedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + { + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + if (format != "J") + { + throw new FormatException($"The model {nameof(ConversationItemStreamingAudioTranscriptionFinishedUpdate)} does not support reading '{format}' format."); + } + + using JsonDocument document = JsonDocument.ParseValue(ref reader); + return DeserializeConversationItemStreamingAudioTranscriptionFinishedUpdate(document.RootElement, options); + } + + internal static ConversationItemStreamingAudioTranscriptionFinishedUpdate DeserializeConversationItemStreamingAudioTranscriptionFinishedUpdate(JsonElement element, ModelReaderWriterOptions options = null) + { + options ??= ModelSerializationExtensions.WireOptions; + + if (element.ValueKind == JsonValueKind.Null) + { + return null; + } + string responseId = default; + string itemId = default; + int outputIndex = default; + int contentIndex = default; + string transcript = default; + ConversationUpdateKind type = default; + string eventId = default; + IDictionary serializedAdditionalRawData = default; + Dictionary rawDataDictionary = new Dictionary(); + foreach (var property in element.EnumerateObject()) + { + if (property.NameEquals("response_id"u8)) + { + responseId = property.Value.GetString(); + continue; + } + if (property.NameEquals("item_id"u8)) + { + itemId = property.Value.GetString(); + continue; + } + if (property.NameEquals("output_index"u8)) + { + outputIndex = property.Value.GetInt32(); + continue; + } + if (property.NameEquals("content_index"u8)) + { + contentIndex = property.Value.GetInt32(); + continue; + } + if (property.NameEquals("transcript"u8)) + { + transcript = property.Value.GetString(); + continue; + } + if (property.NameEquals("type"u8)) + { + type = property.Value.GetString().ToConversationUpdateKind(); + continue; + } + if (property.NameEquals("event_id"u8)) + { + eventId = property.Value.GetString(); + continue; + } + if (true) + { + rawDataDictionary ??= new Dictionary(); + rawDataDictionary.Add(property.Name, BinaryData.FromString(property.Value.GetRawText())); + } + } + serializedAdditionalRawData = rawDataDictionary; + return new ConversationItemStreamingAudioTranscriptionFinishedUpdate( + type, + eventId, + serializedAdditionalRawData, + responseId, + itemId, + outputIndex, + contentIndex, + transcript); + } + + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + { + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + + switch (format) + { + case "J": + return ModelReaderWriter.Write(this, options); + default: + throw new FormatException($"The model {nameof(ConversationItemStreamingAudioTranscriptionFinishedUpdate)} does not support writing '{options.Format}' format."); + } + } + + ConversationItemStreamingAudioTranscriptionFinishedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + { + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + + switch (format) + { + case "J": + { + using JsonDocument document = JsonDocument.Parse(data); + return DeserializeConversationItemStreamingAudioTranscriptionFinishedUpdate(document.RootElement, options); + } + default: + throw new FormatException($"The model {nameof(ConversationItemStreamingAudioTranscriptionFinishedUpdate)} does not support reading '{options.Format}' format."); + } + } + + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + + internal static new ConversationItemStreamingAudioTranscriptionFinishedUpdate FromResponse(PipelineResponse response) + { + using var document = JsonDocument.Parse(response.Content); + return DeserializeConversationItemStreamingAudioTranscriptionFinishedUpdate(document.RootElement); + } + + internal override BinaryContent ToBinaryContent() + { + return BinaryContent.Create(this, ModelSerializationExtensions.WireOptions); + } + } +} diff --git a/src/Generated/Models/ConversationItemStreamingAudioTranscriptionFinishedUpdate.cs b/src/Generated/Models/ConversationItemStreamingAudioTranscriptionFinishedUpdate.cs new file mode 100644 index 000000000..af1a3426a --- /dev/null +++ b/src/Generated/Models/ConversationItemStreamingAudioTranscriptionFinishedUpdate.cs @@ -0,0 +1,46 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; + +namespace OpenAI.RealtimeConversation +{ + public partial class ConversationItemStreamingAudioTranscriptionFinishedUpdate : ConversationUpdate + { + internal ConversationItemStreamingAudioTranscriptionFinishedUpdate(string eventId, string responseId, string itemId, int outputIndex, int contentIndex, string transcript) : base(eventId) + { + Argument.AssertNotNull(eventId, nameof(eventId)); + Argument.AssertNotNull(responseId, nameof(responseId)); + Argument.AssertNotNull(itemId, nameof(itemId)); + Argument.AssertNotNull(transcript, nameof(transcript)); + + Kind = ConversationUpdateKind.ItemStreamingPartAudioTranscriptionFinished; + ResponseId = responseId; + ItemId = itemId; + OutputIndex = outputIndex; + ContentIndex = contentIndex; + Transcript = transcript; + } + + internal ConversationItemStreamingAudioTranscriptionFinishedUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string responseId, string itemId, int outputIndex, int contentIndex, string transcript) : base(kind, eventId, serializedAdditionalRawData) + { + ResponseId = responseId; + ItemId = itemId; + OutputIndex = outputIndex; + ContentIndex = contentIndex; + Transcript = transcript; + } + + internal ConversationItemStreamingAudioTranscriptionFinishedUpdate() + { + } + + public string ResponseId { get; } + public string ItemId { get; } + public int OutputIndex { get; } + public int ContentIndex { get; } + public string Transcript { get; } + } +} diff --git a/src/Generated/Models/ConversationItemStartedUpdate.Serialization.cs b/src/Generated/Models/ConversationItemStreamingFinishedUpdate.Serialization.cs similarity index 69% rename from src/Generated/Models/ConversationItemStartedUpdate.Serialization.cs rename to src/Generated/Models/ConversationItemStreamingFinishedUpdate.Serialization.cs index c4495f964..f4b89847a 100644 --- a/src/Generated/Models/ConversationItemStartedUpdate.Serialization.cs +++ b/src/Generated/Models/ConversationItemStreamingFinishedUpdate.Serialization.cs @@ -10,14 +10,14 @@ namespace OpenAI.RealtimeConversation { - public partial class ConversationItemStartedUpdate : IJsonModel + public partial class ConversationItemStreamingFinishedUpdate : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationItemStartedUpdate)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(ConversationItemStreamingFinishedUpdate)} does not support writing '{format}' format."); } writer.WriteStartObject(); @@ -43,15 +43,8 @@ void IJsonModel.Write(Utf8JsonWriter writer, Mode } if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -75,19 +68,19 @@ void IJsonModel.Write(Utf8JsonWriter writer, Mode writer.WriteEndObject(); } - ConversationItemStartedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + ConversationItemStreamingFinishedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationItemStartedUpdate)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(ConversationItemStreamingFinishedUpdate)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeConversationItemStartedUpdate(document.RootElement, options); + return DeserializeConversationItemStreamingFinishedUpdate(document.RootElement, options); } - internal static ConversationItemStartedUpdate DeserializeConversationItemStartedUpdate(JsonElement element, ModelReaderWriterOptions options = null) + internal static ConversationItemStreamingFinishedUpdate DeserializeConversationItemStreamingFinishedUpdate(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -126,11 +119,6 @@ internal static ConversationItemStartedUpdate DeserializeConversationItemStarted } if (property.NameEquals("event_id"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - eventId = null; - continue; - } eventId = property.Value.GetString(); continue; } @@ -141,7 +129,7 @@ internal static ConversationItemStartedUpdate DeserializeConversationItemStarted } } serializedAdditionalRawData = rawDataDictionary; - return new ConversationItemStartedUpdate( + return new ConversationItemStreamingFinishedUpdate( type, eventId, serializedAdditionalRawData, @@ -150,41 +138,41 @@ internal static ConversationItemStartedUpdate DeserializeConversationItemStarted item); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(ConversationItemStartedUpdate)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(ConversationItemStreamingFinishedUpdate)} does not support writing '{options.Format}' format."); } } - ConversationItemStartedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + ConversationItemStreamingFinishedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeConversationItemStartedUpdate(document.RootElement, options); + return DeserializeConversationItemStreamingFinishedUpdate(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(ConversationItemStartedUpdate)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(ConversationItemStreamingFinishedUpdate)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new ConversationItemStartedUpdate FromResponse(PipelineResponse response) + internal static new ConversationItemStreamingFinishedUpdate FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeConversationItemStartedUpdate(document.RootElement); + return DeserializeConversationItemStreamingFinishedUpdate(document.RootElement); } internal override BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/ConversationItemStreamingFinishedUpdate.cs b/src/Generated/Models/ConversationItemStreamingFinishedUpdate.cs new file mode 100644 index 000000000..8fca906d4 --- /dev/null +++ b/src/Generated/Models/ConversationItemStreamingFinishedUpdate.cs @@ -0,0 +1,38 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; + +namespace OpenAI.RealtimeConversation +{ + public partial class ConversationItemStreamingFinishedUpdate : ConversationUpdate + { + internal ConversationItemStreamingFinishedUpdate(string eventId, string responseId, int outputIndex, InternalRealtimeResponseItem internalItem) : base(eventId) + { + Argument.AssertNotNull(eventId, nameof(eventId)); + Argument.AssertNotNull(responseId, nameof(responseId)); + Argument.AssertNotNull(internalItem, nameof(internalItem)); + + Kind = ConversationUpdateKind.ItemStreamingFinished; + ResponseId = responseId; + OutputIndex = outputIndex; + _internalItem = internalItem; + } + + internal ConversationItemStreamingFinishedUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string responseId, int outputIndex, InternalRealtimeResponseItem internalItem) : base(kind, eventId, serializedAdditionalRawData) + { + ResponseId = responseId; + OutputIndex = outputIndex; + _internalItem = internalItem; + } + + internal ConversationItemStreamingFinishedUpdate() + { + } + + public string ResponseId { get; } + public int OutputIndex { get; } + } +} diff --git a/src/Generated/Models/ConversationItemFinishedUpdate.Serialization.cs b/src/Generated/Models/ConversationItemStreamingStartedUpdate.Serialization.cs similarity index 68% rename from src/Generated/Models/ConversationItemFinishedUpdate.Serialization.cs rename to src/Generated/Models/ConversationItemStreamingStartedUpdate.Serialization.cs index 3000ba990..f4c01eaca 100644 --- a/src/Generated/Models/ConversationItemFinishedUpdate.Serialization.cs +++ b/src/Generated/Models/ConversationItemStreamingStartedUpdate.Serialization.cs @@ -10,14 +10,14 @@ namespace OpenAI.RealtimeConversation { - public partial class ConversationItemFinishedUpdate : IJsonModel + public partial class ConversationItemStreamingStartedUpdate : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationItemFinishedUpdate)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(ConversationItemStreamingStartedUpdate)} does not support writing '{format}' format."); } writer.WriteStartObject(); @@ -29,7 +29,7 @@ void IJsonModel.Write(Utf8JsonWriter writer, Mod if (SerializedAdditionalRawData?.ContainsKey("output_index") != true) { writer.WritePropertyName("output_index"u8); - writer.WriteNumberValue(OutputIndex); + writer.WriteNumberValue(ItemIndex); } if (SerializedAdditionalRawData?.ContainsKey("item") != true) { @@ -43,15 +43,8 @@ void IJsonModel.Write(Utf8JsonWriter writer, Mod } if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -75,19 +68,19 @@ void IJsonModel.Write(Utf8JsonWriter writer, Mod writer.WriteEndObject(); } - ConversationItemFinishedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + ConversationItemStreamingStartedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationItemFinishedUpdate)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(ConversationItemStreamingStartedUpdate)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeConversationItemFinishedUpdate(document.RootElement, options); + return DeserializeConversationItemStreamingStartedUpdate(document.RootElement, options); } - internal static ConversationItemFinishedUpdate DeserializeConversationItemFinishedUpdate(JsonElement element, ModelReaderWriterOptions options = null) + internal static ConversationItemStreamingStartedUpdate DeserializeConversationItemStreamingStartedUpdate(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -126,11 +119,6 @@ internal static ConversationItemFinishedUpdate DeserializeConversationItemFinish } if (property.NameEquals("event_id"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - eventId = null; - continue; - } eventId = property.Value.GetString(); continue; } @@ -141,7 +129,7 @@ internal static ConversationItemFinishedUpdate DeserializeConversationItemFinish } } serializedAdditionalRawData = rawDataDictionary; - return new ConversationItemFinishedUpdate( + return new ConversationItemStreamingStartedUpdate( type, eventId, serializedAdditionalRawData, @@ -150,41 +138,41 @@ internal static ConversationItemFinishedUpdate DeserializeConversationItemFinish item); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(ConversationItemFinishedUpdate)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(ConversationItemStreamingStartedUpdate)} does not support writing '{options.Format}' format."); } } - ConversationItemFinishedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + ConversationItemStreamingStartedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeConversationItemFinishedUpdate(document.RootElement, options); + return DeserializeConversationItemStreamingStartedUpdate(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(ConversationItemFinishedUpdate)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(ConversationItemStreamingStartedUpdate)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new ConversationItemFinishedUpdate FromResponse(PipelineResponse response) + internal static new ConversationItemStreamingStartedUpdate FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeConversationItemFinishedUpdate(document.RootElement); + return DeserializeConversationItemStreamingStartedUpdate(document.RootElement); } internal override BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/ConversationItemStreamingStartedUpdate.cs b/src/Generated/Models/ConversationItemStreamingStartedUpdate.cs new file mode 100644 index 000000000..10d04b0f3 --- /dev/null +++ b/src/Generated/Models/ConversationItemStreamingStartedUpdate.cs @@ -0,0 +1,37 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; + +namespace OpenAI.RealtimeConversation +{ + public partial class ConversationItemStreamingStartedUpdate : ConversationUpdate + { + internal ConversationItemStreamingStartedUpdate(string eventId, string responseId, int itemIndex, InternalRealtimeResponseItem internalItem) : base(eventId) + { + Argument.AssertNotNull(eventId, nameof(eventId)); + Argument.AssertNotNull(responseId, nameof(responseId)); + Argument.AssertNotNull(internalItem, nameof(internalItem)); + + Kind = ConversationUpdateKind.ItemStreamingStarted; + ResponseId = responseId; + ItemIndex = itemIndex; + _internalItem = internalItem; + } + + internal ConversationItemStreamingStartedUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string responseId, int itemIndex, InternalRealtimeResponseItem internalItem) : base(kind, eventId, serializedAdditionalRawData) + { + ResponseId = responseId; + ItemIndex = itemIndex; + _internalItem = internalItem; + } + + internal ConversationItemStreamingStartedUpdate() + { + } + + public string ResponseId { get; } + } +} diff --git a/src/Generated/Models/ConversationTextDoneUpdate.Serialization.cs b/src/Generated/Models/ConversationItemStreamingTextFinishedUpdate.Serialization.cs similarity index 68% rename from src/Generated/Models/ConversationTextDoneUpdate.Serialization.cs rename to src/Generated/Models/ConversationItemStreamingTextFinishedUpdate.Serialization.cs index 0c3fc276b..952a88022 100644 --- a/src/Generated/Models/ConversationTextDoneUpdate.Serialization.cs +++ b/src/Generated/Models/ConversationItemStreamingTextFinishedUpdate.Serialization.cs @@ -10,14 +10,14 @@ namespace OpenAI.RealtimeConversation { - public partial class ConversationTextDoneUpdate : IJsonModel + public partial class ConversationItemStreamingTextFinishedUpdate : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationTextDoneUpdate)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(ConversationItemStreamingTextFinishedUpdate)} does not support writing '{format}' format."); } writer.WriteStartObject(); @@ -41,10 +41,10 @@ void IJsonModel.Write(Utf8JsonWriter writer, ModelRe writer.WritePropertyName("content_index"u8); writer.WriteNumberValue(ContentIndex); } - if (SerializedAdditionalRawData?.ContainsKey("value") != true) + if (SerializedAdditionalRawData?.ContainsKey("text") != true) { - writer.WritePropertyName("value"u8); - writer.WriteStringValue(Value); + writer.WritePropertyName("text"u8); + writer.WriteStringValue(Text); } if (SerializedAdditionalRawData?.ContainsKey("type") != true) { @@ -53,15 +53,8 @@ void IJsonModel.Write(Utf8JsonWriter writer, ModelRe } if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -85,19 +78,19 @@ void IJsonModel.Write(Utf8JsonWriter writer, ModelRe writer.WriteEndObject(); } - ConversationTextDoneUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + ConversationItemStreamingTextFinishedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationTextDoneUpdate)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(ConversationItemStreamingTextFinishedUpdate)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeConversationTextDoneUpdate(document.RootElement, options); + return DeserializeConversationItemStreamingTextFinishedUpdate(document.RootElement, options); } - internal static ConversationTextDoneUpdate DeserializeConversationTextDoneUpdate(JsonElement element, ModelReaderWriterOptions options = null) + internal static ConversationItemStreamingTextFinishedUpdate DeserializeConversationItemStreamingTextFinishedUpdate(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -109,7 +102,7 @@ internal static ConversationTextDoneUpdate DeserializeConversationTextDoneUpdate string itemId = default; int outputIndex = default; int contentIndex = default; - string value = default; + string text = default; ConversationUpdateKind type = default; string eventId = default; IDictionary serializedAdditionalRawData = default; @@ -136,9 +129,9 @@ internal static ConversationTextDoneUpdate DeserializeConversationTextDoneUpdate contentIndex = property.Value.GetInt32(); continue; } - if (property.NameEquals("value"u8)) + if (property.NameEquals("text"u8)) { - value = property.Value.GetString(); + text = property.Value.GetString(); continue; } if (property.NameEquals("type"u8)) @@ -148,11 +141,6 @@ internal static ConversationTextDoneUpdate DeserializeConversationTextDoneUpdate } if (property.NameEquals("event_id"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - eventId = null; - continue; - } eventId = property.Value.GetString(); continue; } @@ -163,7 +151,7 @@ internal static ConversationTextDoneUpdate DeserializeConversationTextDoneUpdate } } serializedAdditionalRawData = rawDataDictionary; - return new ConversationTextDoneUpdate( + return new ConversationItemStreamingTextFinishedUpdate( type, eventId, serializedAdditionalRawData, @@ -171,44 +159,44 @@ internal static ConversationTextDoneUpdate DeserializeConversationTextDoneUpdate itemId, outputIndex, contentIndex, - value); + text); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(ConversationTextDoneUpdate)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(ConversationItemStreamingTextFinishedUpdate)} does not support writing '{options.Format}' format."); } } - ConversationTextDoneUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + ConversationItemStreamingTextFinishedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeConversationTextDoneUpdate(document.RootElement, options); + return DeserializeConversationItemStreamingTextFinishedUpdate(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(ConversationTextDoneUpdate)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(ConversationItemStreamingTextFinishedUpdate)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new ConversationTextDoneUpdate FromResponse(PipelineResponse response) + internal static new ConversationItemStreamingTextFinishedUpdate FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeConversationTextDoneUpdate(document.RootElement); + return DeserializeConversationItemStreamingTextFinishedUpdate(document.RootElement); } internal override BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/ConversationItemStreamingTextFinishedUpdate.cs b/src/Generated/Models/ConversationItemStreamingTextFinishedUpdate.cs new file mode 100644 index 000000000..470d45211 --- /dev/null +++ b/src/Generated/Models/ConversationItemStreamingTextFinishedUpdate.cs @@ -0,0 +1,46 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; + +namespace OpenAI.RealtimeConversation +{ + public partial class ConversationItemStreamingTextFinishedUpdate : ConversationUpdate + { + internal ConversationItemStreamingTextFinishedUpdate(string eventId, string responseId, string itemId, int outputIndex, int contentIndex, string text) : base(eventId) + { + Argument.AssertNotNull(eventId, nameof(eventId)); + Argument.AssertNotNull(responseId, nameof(responseId)); + Argument.AssertNotNull(itemId, nameof(itemId)); + Argument.AssertNotNull(text, nameof(text)); + + Kind = ConversationUpdateKind.ItemStreamingPartTextFinished; + ResponseId = responseId; + ItemId = itemId; + OutputIndex = outputIndex; + ContentIndex = contentIndex; + Text = text; + } + + internal ConversationItemStreamingTextFinishedUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string responseId, string itemId, int outputIndex, int contentIndex, string text) : base(kind, eventId, serializedAdditionalRawData) + { + ResponseId = responseId; + ItemId = itemId; + OutputIndex = outputIndex; + ContentIndex = contentIndex; + Text = text; + } + + internal ConversationItemStreamingTextFinishedUpdate() + { + } + + public string ResponseId { get; } + public string ItemId { get; } + public int OutputIndex { get; } + public int ContentIndex { get; } + public string Text { get; } + } +} diff --git a/src/Generated/Models/ConversationItemTruncatedUpdate.Serialization.cs b/src/Generated/Models/ConversationItemTruncatedUpdate.Serialization.cs index 8836e7489..5a2a2824d 100644 --- a/src/Generated/Models/ConversationItemTruncatedUpdate.Serialization.cs +++ b/src/Generated/Models/ConversationItemTruncatedUpdate.Serialization.cs @@ -26,16 +26,16 @@ void IJsonModel.Write(Utf8JsonWriter writer, Mo writer.WritePropertyName("item_id"u8); writer.WriteStringValue(ItemId); } + if (SerializedAdditionalRawData?.ContainsKey("content_index") != true) + { + writer.WritePropertyName("content_index"u8); + writer.WriteNumberValue(ContentIndex); + } if (SerializedAdditionalRawData?.ContainsKey("audio_end_ms") != true) { writer.WritePropertyName("audio_end_ms"u8); writer.WriteNumberValue(AudioEndMs); } - if (SerializedAdditionalRawData?.ContainsKey("index") != true) - { - writer.WritePropertyName("index"u8); - writer.WriteNumberValue(Index); - } if (SerializedAdditionalRawData?.ContainsKey("type") != true) { writer.WritePropertyName("type"u8); @@ -43,15 +43,8 @@ void IJsonModel.Write(Utf8JsonWriter writer, Mo } if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -96,8 +89,8 @@ internal static ConversationItemTruncatedUpdate DeserializeConversationItemTrunc return null; } string itemId = default; + int contentIndex = default; int audioEndMs = default; - int index = default; ConversationUpdateKind type = default; string eventId = default; IDictionary serializedAdditionalRawData = default; @@ -109,14 +102,14 @@ internal static ConversationItemTruncatedUpdate DeserializeConversationItemTrunc itemId = property.Value.GetString(); continue; } - if (property.NameEquals("audio_end_ms"u8)) + if (property.NameEquals("content_index"u8)) { - audioEndMs = property.Value.GetInt32(); + contentIndex = property.Value.GetInt32(); continue; } - if (property.NameEquals("index"u8)) + if (property.NameEquals("audio_end_ms"u8)) { - index = property.Value.GetInt32(); + audioEndMs = property.Value.GetInt32(); continue; } if (property.NameEquals("type"u8)) @@ -126,11 +119,6 @@ internal static ConversationItemTruncatedUpdate DeserializeConversationItemTrunc } if (property.NameEquals("event_id"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - eventId = null; - continue; - } eventId = property.Value.GetString(); continue; } @@ -146,8 +134,8 @@ internal static ConversationItemTruncatedUpdate DeserializeConversationItemTrunc eventId, serializedAdditionalRawData, itemId, - audioEndMs, - index); + contentIndex, + audioEndMs); } BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) diff --git a/src/Generated/Models/ConversationItemTruncatedUpdate.cs b/src/Generated/Models/ConversationItemTruncatedUpdate.cs index 2f24d6834..66aba0d4c 100644 --- a/src/Generated/Models/ConversationItemTruncatedUpdate.cs +++ b/src/Generated/Models/ConversationItemTruncatedUpdate.cs @@ -9,21 +9,22 @@ namespace OpenAI.RealtimeConversation { public partial class ConversationItemTruncatedUpdate : ConversationUpdate { - internal ConversationItemTruncatedUpdate(string eventId, string itemId, int audioEndMs, int index) : base(eventId) + internal ConversationItemTruncatedUpdate(string eventId, string itemId, int contentIndex, int audioEndMs) : base(eventId) { + Argument.AssertNotNull(eventId, nameof(eventId)); Argument.AssertNotNull(itemId, nameof(itemId)); Kind = ConversationUpdateKind.ItemTruncated; ItemId = itemId; + ContentIndex = contentIndex; AudioEndMs = audioEndMs; - Index = index; } - internal ConversationItemTruncatedUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string itemId, int audioEndMs, int index) : base(kind, eventId, serializedAdditionalRawData) + internal ConversationItemTruncatedUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string itemId, int contentIndex, int audioEndMs) : base(kind, eventId, serializedAdditionalRawData) { ItemId = itemId; + ContentIndex = contentIndex; AudioEndMs = audioEndMs; - Index = index; } internal ConversationItemTruncatedUpdate() @@ -31,7 +32,7 @@ internal ConversationItemTruncatedUpdate() } public string ItemId { get; } + public int ContentIndex { get; } public int AudioEndMs { get; } - public int Index { get; } } } diff --git a/src/Generated/Models/ConversationRateLimitDetailsItem.Serialization.cs b/src/Generated/Models/ConversationRateLimitDetailsItem.Serialization.cs index 83d8e6d67..b149c1433 100644 --- a/src/Generated/Models/ConversationRateLimitDetailsItem.Serialization.cs +++ b/src/Generated/Models/ConversationRateLimitDetailsItem.Serialization.cs @@ -29,17 +29,17 @@ void IJsonModel.Write(Utf8JsonWriter writer, M if (SerializedAdditionalRawData?.ContainsKey("limit") != true) { writer.WritePropertyName("limit"u8); - writer.WriteNumberValue(Limit); + writer.WriteNumberValue(MaximumCount); } if (SerializedAdditionalRawData?.ContainsKey("remaining") != true) { writer.WritePropertyName("remaining"u8); - writer.WriteNumberValue(Remaining); + writer.WriteNumberValue(RemainingCount); } if (SerializedAdditionalRawData?.ContainsKey("reset_seconds") != true) { writer.WritePropertyName("reset_seconds"u8); - writer.WriteNumberValue(ResetSeconds); + writer.WriteNumberValue(Convert.ToDouble(TimeUntilReset.ToString("s\\.FFF"))); } if (SerializedAdditionalRawData != null) { @@ -86,7 +86,7 @@ internal static ConversationRateLimitDetailsItem DeserializeConversationRateLimi string name = default; int limit = default; int remaining = default; - float resetSeconds = default; + TimeSpan resetSeconds = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); foreach (var property in element.EnumerateObject()) @@ -108,7 +108,7 @@ internal static ConversationRateLimitDetailsItem DeserializeConversationRateLimi } if (property.NameEquals("reset_seconds"u8)) { - resetSeconds = property.Value.GetSingle(); + resetSeconds = TimeSpan.FromSeconds(property.Value.GetDouble()); continue; } if (true) diff --git a/src/Generated/Models/ConversationRateLimitDetailsItem.cs b/src/Generated/Models/ConversationRateLimitDetailsItem.cs index f3f4235b4..39b176e7c 100644 --- a/src/Generated/Models/ConversationRateLimitDetailsItem.cs +++ b/src/Generated/Models/ConversationRateLimitDetailsItem.cs @@ -10,22 +10,22 @@ namespace OpenAI.RealtimeConversation public partial class ConversationRateLimitDetailsItem { internal IDictionary SerializedAdditionalRawData { get; set; } - internal ConversationRateLimitDetailsItem(string name, int limit, int remaining, float resetSeconds) + internal ConversationRateLimitDetailsItem(string name, int maximumCount, int remainingCount, TimeSpan timeUntilReset) { Argument.AssertNotNull(name, nameof(name)); Name = name; - Limit = limit; - Remaining = remaining; - ResetSeconds = resetSeconds; + MaximumCount = maximumCount; + RemainingCount = remainingCount; + TimeUntilReset = timeUntilReset; } - internal ConversationRateLimitDetailsItem(string name, int limit, int remaining, float resetSeconds, IDictionary serializedAdditionalRawData) + internal ConversationRateLimitDetailsItem(string name, int maximumCount, int remainingCount, TimeSpan timeUntilReset, IDictionary serializedAdditionalRawData) { Name = name; - Limit = limit; - Remaining = remaining; - ResetSeconds = resetSeconds; + MaximumCount = maximumCount; + RemainingCount = remainingCount; + TimeUntilReset = timeUntilReset; SerializedAdditionalRawData = serializedAdditionalRawData; } @@ -34,8 +34,5 @@ internal ConversationRateLimitDetailsItem() } public string Name { get; } - public int Limit { get; } - public int Remaining { get; } - public float ResetSeconds { get; } } } diff --git a/src/Generated/Models/ConversationRateLimitsUpdatedUpdate.Serialization.cs b/src/Generated/Models/ConversationRateLimitsUpdate.Serialization.cs similarity index 65% rename from src/Generated/Models/ConversationRateLimitsUpdatedUpdate.Serialization.cs rename to src/Generated/Models/ConversationRateLimitsUpdate.Serialization.cs index c8fae2d6b..57205074b 100644 --- a/src/Generated/Models/ConversationRateLimitsUpdatedUpdate.Serialization.cs +++ b/src/Generated/Models/ConversationRateLimitsUpdate.Serialization.cs @@ -10,14 +10,14 @@ namespace OpenAI.RealtimeConversation { - public partial class ConversationRateLimitsUpdatedUpdate : IJsonModel + public partial class ConversationRateLimitsUpdate : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationRateLimitsUpdatedUpdate)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(ConversationRateLimitsUpdate)} does not support writing '{format}' format."); } writer.WriteStartObject(); @@ -25,9 +25,9 @@ void IJsonModel.Write(Utf8JsonWriter writer { writer.WritePropertyName("rate_limits"u8); writer.WriteStartArray(); - foreach (var item in RateLimits) + foreach (var item in AllDetails) { - writer.WriteObjectValue(item, options); + writer.WriteObjectValue(item, options); } writer.WriteEndArray(); } @@ -38,15 +38,8 @@ void IJsonModel.Write(Utf8JsonWriter writer } if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -70,19 +63,19 @@ void IJsonModel.Write(Utf8JsonWriter writer writer.WriteEndObject(); } - ConversationRateLimitsUpdatedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + ConversationRateLimitsUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationRateLimitsUpdatedUpdate)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(ConversationRateLimitsUpdate)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeConversationRateLimitsUpdatedUpdate(document.RootElement, options); + return DeserializeConversationRateLimitsUpdate(document.RootElement, options); } - internal static ConversationRateLimitsUpdatedUpdate DeserializeConversationRateLimitsUpdatedUpdate(JsonElement element, ModelReaderWriterOptions options = null) + internal static ConversationRateLimitsUpdate DeserializeConversationRateLimitsUpdate(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -114,11 +107,6 @@ internal static ConversationRateLimitsUpdatedUpdate DeserializeConversationRateL } if (property.NameEquals("event_id"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - eventId = null; - continue; - } eventId = property.Value.GetString(); continue; } @@ -129,44 +117,44 @@ internal static ConversationRateLimitsUpdatedUpdate DeserializeConversationRateL } } serializedAdditionalRawData = rawDataDictionary; - return new ConversationRateLimitsUpdatedUpdate(type, eventId, serializedAdditionalRawData, rateLimits); + return new ConversationRateLimitsUpdate(type, eventId, serializedAdditionalRawData, rateLimits); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(ConversationRateLimitsUpdatedUpdate)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(ConversationRateLimitsUpdate)} does not support writing '{options.Format}' format."); } } - ConversationRateLimitsUpdatedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + ConversationRateLimitsUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeConversationRateLimitsUpdatedUpdate(document.RootElement, options); + return DeserializeConversationRateLimitsUpdate(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(ConversationRateLimitsUpdatedUpdate)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(ConversationRateLimitsUpdate)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new ConversationRateLimitsUpdatedUpdate FromResponse(PipelineResponse response) + internal static new ConversationRateLimitsUpdate FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeConversationRateLimitsUpdatedUpdate(document.RootElement); + return DeserializeConversationRateLimitsUpdate(document.RootElement); } internal override BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/ConversationRateLimitsUpdate.cs b/src/Generated/Models/ConversationRateLimitsUpdate.cs new file mode 100644 index 000000000..c83155a91 --- /dev/null +++ b/src/Generated/Models/ConversationRateLimitsUpdate.cs @@ -0,0 +1,31 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; +using System.Linq; + +namespace OpenAI.RealtimeConversation +{ + public partial class ConversationRateLimitsUpdate : ConversationUpdate + { + internal ConversationRateLimitsUpdate(string eventId, IEnumerable allDetails) : base(eventId) + { + Argument.AssertNotNull(eventId, nameof(eventId)); + Argument.AssertNotNull(allDetails, nameof(allDetails)); + + Kind = ConversationUpdateKind.RateLimitsUpdated; + AllDetails = allDetails.ToList(); + } + + internal ConversationRateLimitsUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, IReadOnlyList allDetails) : base(kind, eventId, serializedAdditionalRawData) + { + AllDetails = allDetails; + } + + internal ConversationRateLimitsUpdate() + { + } + } +} diff --git a/src/Generated/Models/ConversationRateLimitsUpdatedUpdate.cs b/src/Generated/Models/ConversationRateLimitsUpdatedUpdate.cs deleted file mode 100644 index 881a004f5..000000000 --- a/src/Generated/Models/ConversationRateLimitsUpdatedUpdate.cs +++ /dev/null @@ -1,32 +0,0 @@ -// - -#nullable disable - -using System; -using System.Collections.Generic; -using System.Linq; - -namespace OpenAI.RealtimeConversation -{ - public partial class ConversationRateLimitsUpdatedUpdate : ConversationUpdate - { - internal ConversationRateLimitsUpdatedUpdate(string eventId, IEnumerable rateLimits) : base(eventId) - { - Argument.AssertNotNull(rateLimits, nameof(rateLimits)); - - Kind = ConversationUpdateKind.RateLimitsUpdated; - RateLimits = rateLimits.ToList(); - } - - internal ConversationRateLimitsUpdatedUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, IReadOnlyList rateLimits) : base(kind, eventId, serializedAdditionalRawData) - { - RateLimits = rateLimits; - } - - internal ConversationRateLimitsUpdatedUpdate() - { - } - - public IReadOnlyList RateLimits { get; } - } -} diff --git a/src/Generated/Models/ConversationResponseFinishedUpdate.Serialization.cs b/src/Generated/Models/ConversationResponseFinishedUpdate.Serialization.cs index eeeeb0aad..dc967ad8b 100644 --- a/src/Generated/Models/ConversationResponseFinishedUpdate.Serialization.cs +++ b/src/Generated/Models/ConversationResponseFinishedUpdate.Serialization.cs @@ -33,15 +33,8 @@ void IJsonModel.Write(Utf8JsonWriter writer, } if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -104,11 +97,6 @@ internal static ConversationResponseFinishedUpdate DeserializeConversationRespon } if (property.NameEquals("event_id"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - eventId = null; - continue; - } eventId = property.Value.GetString(); continue; } diff --git a/src/Generated/Models/ConversationResponseFinishedUpdate.cs b/src/Generated/Models/ConversationResponseFinishedUpdate.cs index db3e6422b..ca6151598 100644 --- a/src/Generated/Models/ConversationResponseFinishedUpdate.cs +++ b/src/Generated/Models/ConversationResponseFinishedUpdate.cs @@ -11,6 +11,7 @@ public partial class ConversationResponseFinishedUpdate : ConversationUpdate { internal ConversationResponseFinishedUpdate(string eventId, InternalRealtimeResponse internalResponse) : base(eventId) { + Argument.AssertNotNull(eventId, nameof(eventId)); Argument.AssertNotNull(internalResponse, nameof(internalResponse)); Kind = ConversationUpdateKind.ResponseFinished; diff --git a/src/Generated/Models/ConversationResponseStartedUpdate.Serialization.cs b/src/Generated/Models/ConversationResponseStartedUpdate.Serialization.cs index 42f6599a3..45e665ca7 100644 --- a/src/Generated/Models/ConversationResponseStartedUpdate.Serialization.cs +++ b/src/Generated/Models/ConversationResponseStartedUpdate.Serialization.cs @@ -33,15 +33,8 @@ void IJsonModel.Write(Utf8JsonWriter writer, } if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -104,11 +97,6 @@ internal static ConversationResponseStartedUpdate DeserializeConversationRespons } if (property.NameEquals("event_id"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - eventId = null; - continue; - } eventId = property.Value.GetString(); continue; } diff --git a/src/Generated/Models/ConversationResponseStartedUpdate.cs b/src/Generated/Models/ConversationResponseStartedUpdate.cs index fbd5f476b..76bda8353 100644 --- a/src/Generated/Models/ConversationResponseStartedUpdate.cs +++ b/src/Generated/Models/ConversationResponseStartedUpdate.cs @@ -11,6 +11,7 @@ public partial class ConversationResponseStartedUpdate : ConversationUpdate { internal ConversationResponseStartedUpdate(string eventId, InternalRealtimeResponse internalResponse) : base(eventId) { + Argument.AssertNotNull(eventId, nameof(eventId)); Argument.AssertNotNull(internalResponse, nameof(internalResponse)); Kind = ConversationUpdateKind.ResponseStarted; diff --git a/src/Generated/Models/ConversationSessionConfiguredUpdate.Serialization.cs b/src/Generated/Models/ConversationSessionConfiguredUpdate.Serialization.cs index 8e615fd9b..0db393533 100644 --- a/src/Generated/Models/ConversationSessionConfiguredUpdate.Serialization.cs +++ b/src/Generated/Models/ConversationSessionConfiguredUpdate.Serialization.cs @@ -33,15 +33,8 @@ void IJsonModel.Write(Utf8JsonWriter writer } if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -104,11 +97,6 @@ internal static ConversationSessionConfiguredUpdate DeserializeConversationSessi } if (property.NameEquals("event_id"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - eventId = null; - continue; - } eventId = property.Value.GetString(); continue; } diff --git a/src/Generated/Models/ConversationSessionConfiguredUpdate.cs b/src/Generated/Models/ConversationSessionConfiguredUpdate.cs index 81f99fa26..79fc02c99 100644 --- a/src/Generated/Models/ConversationSessionConfiguredUpdate.cs +++ b/src/Generated/Models/ConversationSessionConfiguredUpdate.cs @@ -11,6 +11,7 @@ public partial class ConversationSessionConfiguredUpdate : ConversationUpdate { internal ConversationSessionConfiguredUpdate(string eventId, InternalRealtimeResponseSession internalSession) : base(eventId) { + Argument.AssertNotNull(eventId, nameof(eventId)); Argument.AssertNotNull(internalSession, nameof(internalSession)); Kind = ConversationUpdateKind.SessionConfigured; diff --git a/src/Generated/Models/ConversationSessionOptions.Serialization.cs b/src/Generated/Models/ConversationSessionOptions.Serialization.cs index 9f00e93a1..318f04af3 100644 --- a/src/Generated/Models/ConversationSessionOptions.Serialization.cs +++ b/src/Generated/Models/ConversationSessionOptions.Serialization.cs @@ -21,11 +21,6 @@ void IJsonModel.Write(Utf8JsonWriter writer, ModelRe } writer.WriteStartObject(); - if (SerializedAdditionalRawData?.ContainsKey("model") != true && Optional.IsDefined(Model)) - { - writer.WritePropertyName("model"u8); - writer.WriteStringValue(Model); - } if (SerializedAdditionalRawData?.ContainsKey("modalities") != true && Optional.IsCollectionDefined(_internalModalities)) { writer.WritePropertyName("modalities"u8); @@ -36,16 +31,16 @@ void IJsonModel.Write(Utf8JsonWriter writer, ModelRe } writer.WriteEndArray(); } - if (SerializedAdditionalRawData?.ContainsKey("voice") != true && Optional.IsDefined(Voice)) - { - writer.WritePropertyName("voice"u8); - writer.WriteStringValue(Voice.Value.ToString()); - } if (SerializedAdditionalRawData?.ContainsKey("instructions") != true && Optional.IsDefined(Instructions)) { writer.WritePropertyName("instructions"u8); writer.WriteStringValue(Instructions); } + if (SerializedAdditionalRawData?.ContainsKey("voice") != true && Optional.IsDefined(Voice)) + { + writer.WritePropertyName("voice"u8); + writer.WriteStringValue(Voice.Value.ToString()); + } if (SerializedAdditionalRawData?.ContainsKey("input_audio_format") != true && Optional.IsDefined(InputAudioFormat)) { writer.WritePropertyName("input_audio_format"u8); @@ -58,13 +53,27 @@ void IJsonModel.Write(Utf8JsonWriter writer, ModelRe } if (SerializedAdditionalRawData?.ContainsKey("input_audio_transcription") != true && Optional.IsDefined(InputTranscriptionOptions)) { - writer.WritePropertyName("input_audio_transcription"u8); - writer.WriteObjectValue(InputTranscriptionOptions, options); + if (InputTranscriptionOptions != null) + { + writer.WritePropertyName("input_audio_transcription"u8); + writer.WriteObjectValue(InputTranscriptionOptions, options); + } + else + { + writer.WriteNull("input_audio_transcription"); + } } if (SerializedAdditionalRawData?.ContainsKey("turn_detection") != true && Optional.IsDefined(TurnDetectionOptions)) { - writer.WritePropertyName("turn_detection"u8); - writer.WriteObjectValue(TurnDetectionOptions, options); + if (TurnDetectionOptions != null) + { + writer.WritePropertyName("turn_detection"u8); + writer.WriteObjectValue(TurnDetectionOptions, options); + } + else + { + writer.WriteNull("turn_detection"); + } } if (SerializedAdditionalRawData?.ContainsKey("tools") != true && Optional.IsCollectionDefined(Tools)) { @@ -147,10 +156,9 @@ internal static ConversationSessionOptions DeserializeConversationSessionOptions { return null; } - string model = default; - IList modalities = default; - ConversationVoice? voice = default; + IList modalities = default; string instructions = default; + ConversationVoice? voice = default; ConversationAudioFormat? inputAudioFormat = default; ConversationAudioFormat? outputAudioFormat = default; ConversationInputTranscriptionOptions inputAudioTranscription = default; @@ -163,25 +171,25 @@ internal static ConversationSessionOptions DeserializeConversationSessionOptions Dictionary rawDataDictionary = new Dictionary(); foreach (var property in element.EnumerateObject()) { - if (property.NameEquals("model"u8)) - { - model = property.Value.GetString(); - continue; - } if (property.NameEquals("modalities"u8)) { if (property.Value.ValueKind == JsonValueKind.Null) { continue; } - List array = new List(); + List array = new List(); foreach (var item in property.Value.EnumerateArray()) { - array.Add(new InternalRealtimeRequestSessionUpdateCommandSessionModality(item.GetString())); + array.Add(new InternalRealtimeRequestSessionModality(item.GetString())); } modalities = array; continue; } + if (property.NameEquals("instructions"u8)) + { + instructions = property.Value.GetString(); + continue; + } if (property.NameEquals("voice"u8)) { if (property.Value.ValueKind == JsonValueKind.Null) @@ -191,11 +199,6 @@ internal static ConversationSessionOptions DeserializeConversationSessionOptions voice = new ConversationVoice(property.Value.GetString()); continue; } - if (property.NameEquals("instructions"u8)) - { - instructions = property.Value.GetString(); - continue; - } if (property.NameEquals("input_audio_format"u8)) { if (property.Value.ValueKind == JsonValueKind.Null) @@ -218,6 +221,7 @@ internal static ConversationSessionOptions DeserializeConversationSessionOptions { if (property.Value.ValueKind == JsonValueKind.Null) { + inputAudioTranscription = null; continue; } inputAudioTranscription = ConversationInputTranscriptionOptions.DeserializeConversationInputTranscriptionOptions(property.Value, options); @@ -227,6 +231,7 @@ internal static ConversationSessionOptions DeserializeConversationSessionOptions { if (property.Value.ValueKind == JsonValueKind.Null) { + turnDetection = null; continue; } turnDetection = ConversationTurnDetectionOptions.DeserializeConversationTurnDetectionOptions(property.Value, options); @@ -281,10 +286,9 @@ internal static ConversationSessionOptions DeserializeConversationSessionOptions } serializedAdditionalRawData = rawDataDictionary; return new ConversationSessionOptions( - model, - modalities ?? new ChangeTrackingList(), - voice, + modalities ?? new ChangeTrackingList(), instructions, + voice, inputAudioFormat, outputAudioFormat, inputAudioTranscription, diff --git a/src/Generated/Models/ConversationSessionOptions.cs b/src/Generated/Models/ConversationSessionOptions.cs index e5e5d1ad8..ae6e86ae6 100644 --- a/src/Generated/Models/ConversationSessionOptions.cs +++ b/src/Generated/Models/ConversationSessionOptions.cs @@ -12,16 +12,15 @@ public partial class ConversationSessionOptions internal IDictionary SerializedAdditionalRawData { get; set; } public ConversationSessionOptions() { - _internalModalities = new ChangeTrackingList(); + _internalModalities = new ChangeTrackingList(); Tools = new ChangeTrackingList(); } - internal ConversationSessionOptions(string model, IList internalModalities, ConversationVoice? voice, string instructions, ConversationAudioFormat? inputAudioFormat, ConversationAudioFormat? outputAudioFormat, ConversationInputTranscriptionOptions inputTranscriptionOptions, ConversationTurnDetectionOptions turnDetectionOptions, IList tools, BinaryData internalToolChoice, float? temperature, BinaryData maxResponseOutputTokens, IDictionary serializedAdditionalRawData) + internal ConversationSessionOptions(IList internalModalities, string instructions, ConversationVoice? voice, ConversationAudioFormat? inputAudioFormat, ConversationAudioFormat? outputAudioFormat, ConversationInputTranscriptionOptions inputTranscriptionOptions, ConversationTurnDetectionOptions turnDetectionOptions, IList tools, BinaryData internalToolChoice, float? temperature, BinaryData maxResponseOutputTokens, IDictionary serializedAdditionalRawData) { - Model = model; _internalModalities = internalModalities; - Voice = voice; Instructions = instructions; + Voice = voice; InputAudioFormat = inputAudioFormat; OutputAudioFormat = outputAudioFormat; InputTranscriptionOptions = inputTranscriptionOptions; @@ -32,8 +31,8 @@ internal ConversationSessionOptions(string model, IList Tools { get; } diff --git a/src/Generated/Models/ConversationSessionStartedUpdate.Serialization.cs b/src/Generated/Models/ConversationSessionStartedUpdate.Serialization.cs index 118d79383..cc55fda4d 100644 --- a/src/Generated/Models/ConversationSessionStartedUpdate.Serialization.cs +++ b/src/Generated/Models/ConversationSessionStartedUpdate.Serialization.cs @@ -33,15 +33,8 @@ void IJsonModel.Write(Utf8JsonWriter writer, M } if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -104,11 +97,6 @@ internal static ConversationSessionStartedUpdate DeserializeConversationSessionS } if (property.NameEquals("event_id"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - eventId = null; - continue; - } eventId = property.Value.GetString(); continue; } diff --git a/src/Generated/Models/ConversationSessionStartedUpdate.cs b/src/Generated/Models/ConversationSessionStartedUpdate.cs index 400466995..3df315521 100644 --- a/src/Generated/Models/ConversationSessionStartedUpdate.cs +++ b/src/Generated/Models/ConversationSessionStartedUpdate.cs @@ -11,6 +11,7 @@ public partial class ConversationSessionStartedUpdate : ConversationUpdate { internal ConversationSessionStartedUpdate(string eventId, InternalRealtimeResponseSession internalSession) : base(eventId) { + Argument.AssertNotNull(eventId, nameof(eventId)); Argument.AssertNotNull(internalSession, nameof(internalSession)); Kind = ConversationUpdateKind.SessionStarted; diff --git a/src/Generated/Models/ConversationStatusDetails.Serialization.cs b/src/Generated/Models/ConversationStatusDetails.Serialization.cs new file mode 100644 index 000000000..02ca1eaa4 --- /dev/null +++ b/src/Generated/Models/ConversationStatusDetails.Serialization.cs @@ -0,0 +1,116 @@ +// + +#nullable disable + +using System; +using System.ClientModel; +using System.ClientModel.Primitives; +using System.Text.Json; + +namespace OpenAI.RealtimeConversation +{ + [PersistableModelProxy(typeof(UnknownRealtimeResponseStatusDetails))] + public partial class ConversationStatusDetails : IJsonModel + { + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + { + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + if (format != "J") + { + throw new FormatException($"The model {nameof(ConversationStatusDetails)} does not support writing '{format}' format."); + } + + writer.WriteStartObject(); + if (SerializedAdditionalRawData?.ContainsKey("type") != true) + { + writer.WritePropertyName("type"u8); + writer.WriteStringValue(StatusKind.ToString()); + } + if (SerializedAdditionalRawData != null) + { + foreach (var item in SerializedAdditionalRawData) + { + if (ModelSerializationExtensions.IsSentinelValue(item.Value)) + { + continue; + } + writer.WritePropertyName(item.Key); +#if NET6_0_OR_GREATER + writer.WriteRawValue(item.Value); +#else + using (JsonDocument document = JsonDocument.Parse(item.Value)) + { + JsonSerializer.Serialize(writer, document.RootElement); + } +#endif + } + } + writer.WriteEndObject(); + } + + ConversationStatusDetails IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + { + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + if (format != "J") + { + throw new FormatException($"The model {nameof(ConversationStatusDetails)} does not support reading '{format}' format."); + } + + using JsonDocument document = JsonDocument.ParseValue(ref reader); + return DeserializeConversationStatusDetails(document.RootElement, options); + } + + internal static ConversationStatusDetails DeserializeConversationStatusDetails(JsonElement element, ModelReaderWriterOptions options = null) + { + options ??= ModelSerializationExtensions.WireOptions; + + if (element.ValueKind == JsonValueKind.Null) + { + return null; + } + return UnknownRealtimeResponseStatusDetails.DeserializeUnknownRealtimeResponseStatusDetails(element, options); + } + + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + { + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + + switch (format) + { + case "J": + return ModelReaderWriter.Write(this, options); + default: + throw new FormatException($"The model {nameof(ConversationStatusDetails)} does not support writing '{options.Format}' format."); + } + } + + ConversationStatusDetails IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + { + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + + switch (format) + { + case "J": + { + using JsonDocument document = JsonDocument.Parse(data); + return DeserializeConversationStatusDetails(document.RootElement, options); + } + default: + throw new FormatException($"The model {nameof(ConversationStatusDetails)} does not support reading '{options.Format}' format."); + } + } + + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + + internal static ConversationStatusDetails FromResponse(PipelineResponse response) + { + using var document = JsonDocument.Parse(response.Content); + return DeserializeConversationStatusDetails(document.RootElement); + } + + internal virtual BinaryContent ToBinaryContent() + { + return BinaryContent.Create(this, ModelSerializationExtensions.WireOptions); + } + } +} diff --git a/src/Generated/Models/ConversationStatusDetails.cs b/src/Generated/Models/ConversationStatusDetails.cs new file mode 100644 index 000000000..46056c9ce --- /dev/null +++ b/src/Generated/Models/ConversationStatusDetails.cs @@ -0,0 +1,23 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; + +namespace OpenAI.RealtimeConversation +{ + public abstract partial class ConversationStatusDetails + { + internal IDictionary SerializedAdditionalRawData { get; set; } + protected ConversationStatusDetails() + { + } + + internal ConversationStatusDetails(ConversationStatus statusKind, IDictionary serializedAdditionalRawData) + { + StatusKind = statusKind; + SerializedAdditionalRawData = serializedAdditionalRawData; + } + } +} diff --git a/src/Generated/Models/ConversationTextDeltaUpdate.cs b/src/Generated/Models/ConversationTextDeltaUpdate.cs deleted file mode 100644 index 70deec37a..000000000 --- a/src/Generated/Models/ConversationTextDeltaUpdate.cs +++ /dev/null @@ -1,45 +0,0 @@ -// - -#nullable disable - -using System; -using System.Collections.Generic; - -namespace OpenAI.RealtimeConversation -{ - public partial class ConversationTextDeltaUpdate : ConversationUpdate - { - internal ConversationTextDeltaUpdate(string eventId, string responseId, string itemId, int outputIndex, int contentIndex, string delta) : base(eventId) - { - Argument.AssertNotNull(responseId, nameof(responseId)); - Argument.AssertNotNull(itemId, nameof(itemId)); - Argument.AssertNotNull(delta, nameof(delta)); - - Kind = ConversationUpdateKind.ResponseTextDelta; - ResponseId = responseId; - ItemId = itemId; - OutputIndex = outputIndex; - ContentIndex = contentIndex; - Delta = delta; - } - - internal ConversationTextDeltaUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string responseId, string itemId, int outputIndex, int contentIndex, string delta) : base(kind, eventId, serializedAdditionalRawData) - { - ResponseId = responseId; - ItemId = itemId; - OutputIndex = outputIndex; - ContentIndex = contentIndex; - Delta = delta; - } - - internal ConversationTextDeltaUpdate() - { - } - - public string ResponseId { get; } - public string ItemId { get; } - public int OutputIndex { get; } - public int ContentIndex { get; } - public string Delta { get; } - } -} diff --git a/src/Generated/Models/ConversationTextDoneUpdate.cs b/src/Generated/Models/ConversationTextDoneUpdate.cs deleted file mode 100644 index 8761a3b61..000000000 --- a/src/Generated/Models/ConversationTextDoneUpdate.cs +++ /dev/null @@ -1,45 +0,0 @@ -// - -#nullable disable - -using System; -using System.Collections.Generic; - -namespace OpenAI.RealtimeConversation -{ - public partial class ConversationTextDoneUpdate : ConversationUpdate - { - internal ConversationTextDoneUpdate(string eventId, string responseId, string itemId, int outputIndex, int contentIndex, string value) : base(eventId) - { - Argument.AssertNotNull(responseId, nameof(responseId)); - Argument.AssertNotNull(itemId, nameof(itemId)); - Argument.AssertNotNull(value, nameof(value)); - - Kind = ConversationUpdateKind.ResponseTextDone; - ResponseId = responseId; - ItemId = itemId; - OutputIndex = outputIndex; - ContentIndex = contentIndex; - Value = value; - } - - internal ConversationTextDoneUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string responseId, string itemId, int outputIndex, int contentIndex, string value) : base(kind, eventId, serializedAdditionalRawData) - { - ResponseId = responseId; - ItemId = itemId; - OutputIndex = outputIndex; - ContentIndex = contentIndex; - Value = value; - } - - internal ConversationTextDoneUpdate() - { - } - - public string ResponseId { get; } - public string ItemId { get; } - public int OutputIndex { get; } - public int ContentIndex { get; } - public string Value { get; } - } -} diff --git a/src/Generated/Models/ConversationUpdate.Serialization.cs b/src/Generated/Models/ConversationUpdate.Serialization.cs index ac5eff099..26aad8972 100644 --- a/src/Generated/Models/ConversationUpdate.Serialization.cs +++ b/src/Generated/Models/ConversationUpdate.Serialization.cs @@ -9,7 +9,7 @@ namespace OpenAI.RealtimeConversation { - [PersistableModelProxy(typeof(UnknownRealtimeResponseCommand))] + [PersistableModelProxy(typeof(UnknownRealtimeServerEvent))] public partial class ConversationUpdate : IJsonModel { void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) @@ -28,15 +28,8 @@ void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWrit } if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -72,50 +65,6 @@ ConversationUpdate IJsonModel.Create(ref Utf8JsonReader read return DeserializeConversationUpdate(document.RootElement, options); } - internal static ConversationUpdate DeserializeConversationUpdate(JsonElement element, ModelReaderWriterOptions options = null) - { - options ??= ModelSerializationExtensions.WireOptions; - - if (element.ValueKind == JsonValueKind.Null) - { - return null; - } - if (element.TryGetProperty("type", out JsonElement discriminator)) - { - switch (discriminator.GetString()) - { - case "conversation.item.created": return ConversationItemAcknowledgedUpdate.DeserializeConversationItemAcknowledgedUpdate(element, options); - case "conversation.item.deleted": return ConversationItemDeletedUpdate.DeserializeConversationItemDeletedUpdate(element, options); - case "conversation.item.input_audio_transcription.completed": return ConversationInputTranscriptionFinishedUpdate.DeserializeConversationInputTranscriptionFinishedUpdate(element, options); - case "conversation.item.input_audio_transcription.failed": return ConversationInputTranscriptionFailedUpdate.DeserializeConversationInputTranscriptionFailedUpdate(element, options); - case "conversation.item.truncated": return ConversationItemTruncatedUpdate.DeserializeConversationItemTruncatedUpdate(element, options); - case "error": return ConversationErrorUpdate.DeserializeConversationErrorUpdate(element, options); - case "input_audio_buffer.cleared": return ConversationInputAudioBufferClearedUpdate.DeserializeConversationInputAudioBufferClearedUpdate(element, options); - case "input_audio_buffer.committed": return ConversationInputAudioBufferCommittedUpdate.DeserializeConversationInputAudioBufferCommittedUpdate(element, options); - case "input_audio_buffer.speech_started": return ConversationInputSpeechStartedUpdate.DeserializeConversationInputSpeechStartedUpdate(element, options); - case "input_audio_buffer.speech_stopped": return ConversationInputSpeechFinishedUpdate.DeserializeConversationInputSpeechFinishedUpdate(element, options); - case "rate_limits.updated": return ConversationRateLimitsUpdatedUpdate.DeserializeConversationRateLimitsUpdatedUpdate(element, options); - case "response.audio_transcript.delta": return ConversationOutputTranscriptionDeltaUpdate.DeserializeConversationOutputTranscriptionDeltaUpdate(element, options); - case "response.audio_transcript.done": return ConversationOutputTranscriptionFinishedUpdate.DeserializeConversationOutputTranscriptionFinishedUpdate(element, options); - case "response.audio.delta": return ConversationAudioDeltaUpdate.DeserializeConversationAudioDeltaUpdate(element, options); - case "response.audio.done": return ConversationAudioDoneUpdate.DeserializeConversationAudioDoneUpdate(element, options); - case "response.content_part.added": return ConversationContentPartStartedUpdate.DeserializeConversationContentPartStartedUpdate(element, options); - case "response.content_part.done": return ConversationContentPartFinishedUpdate.DeserializeConversationContentPartFinishedUpdate(element, options); - case "response.created": return ConversationResponseStartedUpdate.DeserializeConversationResponseStartedUpdate(element, options); - case "response.done": return ConversationResponseFinishedUpdate.DeserializeConversationResponseFinishedUpdate(element, options); - case "response.function_call_arguments.delta": return ConversationFunctionCallArgumentsDeltaUpdate.DeserializeConversationFunctionCallArgumentsDeltaUpdate(element, options); - case "response.function_call_arguments.done": return ConversationFunctionCallArgumentsDoneUpdate.DeserializeConversationFunctionCallArgumentsDoneUpdate(element, options); - case "response.output_item.added": return ConversationItemStartedUpdate.DeserializeConversationItemStartedUpdate(element, options); - case "response.output_item.done": return ConversationItemFinishedUpdate.DeserializeConversationItemFinishedUpdate(element, options); - case "response.text.delta": return ConversationTextDeltaUpdate.DeserializeConversationTextDeltaUpdate(element, options); - case "response.text.done": return ConversationTextDoneUpdate.DeserializeConversationTextDoneUpdate(element, options); - case "session.created": return ConversationSessionStartedUpdate.DeserializeConversationSessionStartedUpdate(element, options); - case "session.updated": return ConversationSessionConfiguredUpdate.DeserializeConversationSessionConfiguredUpdate(element, options); - } - } - return UnknownRealtimeResponseCommand.DeserializeUnknownRealtimeResponseCommand(element, options); - } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; diff --git a/src/Generated/Models/ConversationUpdate.cs b/src/Generated/Models/ConversationUpdate.cs index 850f16480..5ba9b14fc 100644 --- a/src/Generated/Models/ConversationUpdate.cs +++ b/src/Generated/Models/ConversationUpdate.cs @@ -12,6 +12,8 @@ public abstract partial class ConversationUpdate internal IDictionary SerializedAdditionalRawData { get; set; } protected ConversationUpdate(string eventId) { + Argument.AssertNotNull(eventId, nameof(eventId)); + EventId = eventId; } diff --git a/src/Generated/Models/ConversationUpdateKind.Serialization.cs b/src/Generated/Models/ConversationUpdateKind.Serialization.cs index 1bffcec88..392ccad40 100644 --- a/src/Generated/Models/ConversationUpdateKind.Serialization.cs +++ b/src/Generated/Models/ConversationUpdateKind.Serialization.cs @@ -8,68 +8,5 @@ namespace OpenAI.RealtimeConversation { internal static partial class ConversationUpdateKindExtensions { - public static string ToSerialString(this ConversationUpdateKind value) => value switch - { - ConversationUpdateKind.SessionStarted => "session.created", - ConversationUpdateKind.SessionConfigured => "session.updated", - ConversationUpdateKind.ItemAcknowledged => "conversation.item.created", - ConversationUpdateKind.ItemDeleted => "conversation.item.deleted", - ConversationUpdateKind.ItemTruncated => "conversation.item.truncated", - ConversationUpdateKind.ResponseStarted => "response.created", - ConversationUpdateKind.ResponseFinished => "response.done", - ConversationUpdateKind.RateLimitsUpdated => "rate_limits.updated", - ConversationUpdateKind.ItemStarted => "response.output_item.added", - ConversationUpdateKind.ItemFinished => "response.output_item.done", - ConversationUpdateKind.ContentPartStarted => "response.content_part.added", - ConversationUpdateKind.ContentPartFinished => "response.content_part.done", - ConversationUpdateKind.ResponseAudioDelta => "response.audio.delta", - ConversationUpdateKind.ResponseAudioDone => "response.audio.done", - ConversationUpdateKind.ResponseAudioTranscriptDelta => "response.audio_transcript.delta", - ConversationUpdateKind.ResponseAudioTranscriptDone => "response.audio_transcript.done", - ConversationUpdateKind.ResponseTextDelta => "response.text.delta", - ConversationUpdateKind.ResponseTextDone => "response.text.done", - ConversationUpdateKind.ResponseFunctionCallArgumentsDelta => "response.function_call_arguments.delta", - ConversationUpdateKind.ResponseFunctionCallArgumentsDone => "response.function_call_arguments.done", - ConversationUpdateKind.InputAudioBufferSpeechStarted => "input_audio_buffer.speech_started", - ConversationUpdateKind.InputAudioBufferSpeechStopped => "input_audio_buffer.speech_stopped", - ConversationUpdateKind.ItemInputAudioTranscriptionCompleted => "conversation.item.input_audio_transcription.completed", - ConversationUpdateKind.ItemInputAudioTranscriptionFailed => "conversation.item.input_audio_transcription.failed", - ConversationUpdateKind.InputAudioBufferCommitted => "input_audio_buffer.committed", - ConversationUpdateKind.InputAudioBufferCleared => "input_audio_buffer.cleared", - ConversationUpdateKind.Error => "error", - _ => throw new ArgumentOutOfRangeException(nameof(value), value, "Unknown ConversationUpdateKind value.") - }; - - public static ConversationUpdateKind ToConversationUpdateKind(this string value) - { - if (StringComparer.OrdinalIgnoreCase.Equals(value, "session.created")) return ConversationUpdateKind.SessionStarted; - if (StringComparer.OrdinalIgnoreCase.Equals(value, "session.updated")) return ConversationUpdateKind.SessionConfigured; - if (StringComparer.OrdinalIgnoreCase.Equals(value, "conversation.item.created")) return ConversationUpdateKind.ItemAcknowledged; - if (StringComparer.OrdinalIgnoreCase.Equals(value, "conversation.item.deleted")) return ConversationUpdateKind.ItemDeleted; - if (StringComparer.OrdinalIgnoreCase.Equals(value, "conversation.item.truncated")) return ConversationUpdateKind.ItemTruncated; - if (StringComparer.OrdinalIgnoreCase.Equals(value, "response.created")) return ConversationUpdateKind.ResponseStarted; - if (StringComparer.OrdinalIgnoreCase.Equals(value, "response.done")) return ConversationUpdateKind.ResponseFinished; - if (StringComparer.OrdinalIgnoreCase.Equals(value, "rate_limits.updated")) return ConversationUpdateKind.RateLimitsUpdated; - if (StringComparer.OrdinalIgnoreCase.Equals(value, "response.output_item.added")) return ConversationUpdateKind.ItemStarted; - if (StringComparer.OrdinalIgnoreCase.Equals(value, "response.output_item.done")) return ConversationUpdateKind.ItemFinished; - if (StringComparer.OrdinalIgnoreCase.Equals(value, "response.content_part.added")) return ConversationUpdateKind.ContentPartStarted; - if (StringComparer.OrdinalIgnoreCase.Equals(value, "response.content_part.done")) return ConversationUpdateKind.ContentPartFinished; - if (StringComparer.OrdinalIgnoreCase.Equals(value, "response.audio.delta")) return ConversationUpdateKind.ResponseAudioDelta; - if (StringComparer.OrdinalIgnoreCase.Equals(value, "response.audio.done")) return ConversationUpdateKind.ResponseAudioDone; - if (StringComparer.OrdinalIgnoreCase.Equals(value, "response.audio_transcript.delta")) return ConversationUpdateKind.ResponseAudioTranscriptDelta; - if (StringComparer.OrdinalIgnoreCase.Equals(value, "response.audio_transcript.done")) return ConversationUpdateKind.ResponseAudioTranscriptDone; - if (StringComparer.OrdinalIgnoreCase.Equals(value, "response.text.delta")) return ConversationUpdateKind.ResponseTextDelta; - if (StringComparer.OrdinalIgnoreCase.Equals(value, "response.text.done")) return ConversationUpdateKind.ResponseTextDone; - if (StringComparer.OrdinalIgnoreCase.Equals(value, "response.function_call_arguments.delta")) return ConversationUpdateKind.ResponseFunctionCallArgumentsDelta; - if (StringComparer.OrdinalIgnoreCase.Equals(value, "response.function_call_arguments.done")) return ConversationUpdateKind.ResponseFunctionCallArgumentsDone; - if (StringComparer.OrdinalIgnoreCase.Equals(value, "input_audio_buffer.speech_started")) return ConversationUpdateKind.InputAudioBufferSpeechStarted; - if (StringComparer.OrdinalIgnoreCase.Equals(value, "input_audio_buffer.speech_stopped")) return ConversationUpdateKind.InputAudioBufferSpeechStopped; - if (StringComparer.OrdinalIgnoreCase.Equals(value, "conversation.item.input_audio_transcription.completed")) return ConversationUpdateKind.ItemInputAudioTranscriptionCompleted; - if (StringComparer.OrdinalIgnoreCase.Equals(value, "conversation.item.input_audio_transcription.failed")) return ConversationUpdateKind.ItemInputAudioTranscriptionFailed; - if (StringComparer.OrdinalIgnoreCase.Equals(value, "input_audio_buffer.committed")) return ConversationUpdateKind.InputAudioBufferCommitted; - if (StringComparer.OrdinalIgnoreCase.Equals(value, "input_audio_buffer.cleared")) return ConversationUpdateKind.InputAudioBufferCleared; - if (StringComparer.OrdinalIgnoreCase.Equals(value, "error")) return ConversationUpdateKind.Error; - throw new ArgumentOutOfRangeException(nameof(value), value, "Unknown ConversationUpdateKind value."); - } } } diff --git a/src/Generated/Models/InternalCreateChatCompletionRequestModel.cs b/src/Generated/Models/InternalCreateChatCompletionRequestModel.cs index f01b6a494..af6621119 100644 --- a/src/Generated/Models/InternalCreateChatCompletionRequestModel.cs +++ b/src/Generated/Models/InternalCreateChatCompletionRequestModel.cs @@ -23,6 +23,8 @@ public InternalCreateChatCompletionRequestModel(string value) private const string Gpt4oValue = "gpt-4o"; private const string Gpt4o20240806Value = "gpt-4o-2024-08-06"; private const string Gpt4o20240513Value = "gpt-4o-2024-05-13"; + private const string Gpt4oRealtimePreviewValue = "gpt-4o-realtime-preview"; + private const string Gpt4oRealtimePreview20241001Value = "gpt-4o-realtime-preview-2024-10-01"; private const string Chatgpt4oLatestValue = "chatgpt-4o-latest"; private const string Gpt4oMiniValue = "gpt-4o-mini"; private const string Gpt4oMini20240718Value = "gpt-4o-mini-2024-07-18"; @@ -53,6 +55,8 @@ public InternalCreateChatCompletionRequestModel(string value) public static InternalCreateChatCompletionRequestModel Gpt4o { get; } = new InternalCreateChatCompletionRequestModel(Gpt4oValue); public static InternalCreateChatCompletionRequestModel Gpt4o20240806 { get; } = new InternalCreateChatCompletionRequestModel(Gpt4o20240806Value); public static InternalCreateChatCompletionRequestModel Gpt4o20240513 { get; } = new InternalCreateChatCompletionRequestModel(Gpt4o20240513Value); + public static InternalCreateChatCompletionRequestModel Gpt4oRealtimePreview { get; } = new InternalCreateChatCompletionRequestModel(Gpt4oRealtimePreviewValue); + public static InternalCreateChatCompletionRequestModel Gpt4oRealtimePreview20241001 { get; } = new InternalCreateChatCompletionRequestModel(Gpt4oRealtimePreview20241001Value); public static InternalCreateChatCompletionRequestModel Chatgpt4oLatest { get; } = new InternalCreateChatCompletionRequestModel(Chatgpt4oLatestValue); public static InternalCreateChatCompletionRequestModel Gpt4oMini { get; } = new InternalCreateChatCompletionRequestModel(Gpt4oMiniValue); public static InternalCreateChatCompletionRequestModel Gpt4oMini20240718 { get; } = new InternalCreateChatCompletionRequestModel(Gpt4oMini20240718Value); diff --git a/src/Generated/Models/InternalRealtimeResponseIncompleteStatusDetails.Serialization.cs b/src/Generated/Models/InternalCreateModerationRequestInput2.Serialization.cs similarity index 52% rename from src/Generated/Models/InternalRealtimeResponseIncompleteStatusDetails.Serialization.cs rename to src/Generated/Models/InternalCreateModerationRequestInput2.Serialization.cs index f1030c8cb..661bcdc00 100644 --- a/src/Generated/Models/InternalRealtimeResponseIncompleteStatusDetails.Serialization.cs +++ b/src/Generated/Models/InternalCreateModerationRequestInput2.Serialization.cs @@ -8,29 +8,29 @@ using System.Collections.Generic; using System.Text.Json; -namespace OpenAI.RealtimeConversation +namespace OpenAI.Moderations { - internal partial class InternalRealtimeResponseIncompleteStatusDetails : IJsonModel + internal partial class InternalCreateModerationRequestInput2 : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeResponseIncompleteStatusDetails)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(InternalCreateModerationRequestInput2)} does not support writing '{format}' format."); } writer.WriteStartObject(); - if (SerializedAdditionalRawData?.ContainsKey("reason") != true) - { - writer.WritePropertyName("reason"u8); - writer.WriteStringValue(Reason.ToString()); - } if (SerializedAdditionalRawData?.ContainsKey("type") != true) { writer.WritePropertyName("type"u8); writer.WriteStringValue(Type.ToString()); } + if (SerializedAdditionalRawData?.ContainsKey("image_url") != true) + { + writer.WritePropertyName("image_url"u8); + writer.WriteObjectValue(ImageUrl, options); + } if (SerializedAdditionalRawData != null) { foreach (var item in SerializedAdditionalRawData) @@ -53,19 +53,19 @@ void IJsonModel.Write(Utf8JsonW writer.WriteEndObject(); } - InternalRealtimeResponseIncompleteStatusDetails IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + InternalCreateModerationRequestInput2 IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeResponseIncompleteStatusDetails)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(InternalCreateModerationRequestInput2)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeInternalRealtimeResponseIncompleteStatusDetails(document.RootElement, options); + return DeserializeInternalCreateModerationRequestInput2(document.RootElement, options); } - internal static InternalRealtimeResponseIncompleteStatusDetails DeserializeInternalRealtimeResponseIncompleteStatusDetails(JsonElement element, ModelReaderWriterOptions options = null) + internal static InternalCreateModerationRequestInput2 DeserializeInternalCreateModerationRequestInput2(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -73,20 +73,20 @@ internal static InternalRealtimeResponseIncompleteStatusDetails DeserializeInter { return null; } - InternalRealtimeResponseIncompleteStatusDetailsReason reason = default; - ConversationStatus type = default; + InternalCreateModerationRequestInput2Type type = default; + InternalCreateModerationRequestInputImageUrl imageUrl = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); foreach (var property in element.EnumerateObject()) { - if (property.NameEquals("reason"u8)) + if (property.NameEquals("type"u8)) { - reason = new InternalRealtimeResponseIncompleteStatusDetailsReason(property.Value.GetString()); + type = new InternalCreateModerationRequestInput2Type(property.Value.GetString()); continue; } - if (property.NameEquals("type"u8)) + if (property.NameEquals("image_url"u8)) { - type = new ConversationStatus(property.Value.GetString()); + imageUrl = InternalCreateModerationRequestInputImageUrl.DeserializeInternalCreateModerationRequestInputImageUrl(property.Value, options); continue; } if (true) @@ -96,47 +96,47 @@ internal static InternalRealtimeResponseIncompleteStatusDetails DeserializeInter } } serializedAdditionalRawData = rawDataDictionary; - return new InternalRealtimeResponseIncompleteStatusDetails(type, serializedAdditionalRawData, reason); + return new InternalCreateModerationRequestInput2(type, imageUrl, serializedAdditionalRawData); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(InternalRealtimeResponseIncompleteStatusDetails)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalCreateModerationRequestInput2)} does not support writing '{options.Format}' format."); } } - InternalRealtimeResponseIncompleteStatusDetails IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + InternalCreateModerationRequestInput2 IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeInternalRealtimeResponseIncompleteStatusDetails(document.RootElement, options); + return DeserializeInternalCreateModerationRequestInput2(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(InternalRealtimeResponseIncompleteStatusDetails)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalCreateModerationRequestInput2)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new InternalRealtimeResponseIncompleteStatusDetails FromResponse(PipelineResponse response) + internal static InternalCreateModerationRequestInput2 FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeInternalRealtimeResponseIncompleteStatusDetails(document.RootElement); + return DeserializeInternalCreateModerationRequestInput2(document.RootElement); } - internal override BinaryContent ToBinaryContent() + internal virtual BinaryContent ToBinaryContent() { return BinaryContent.Create(this, ModelSerializationExtensions.WireOptions); } diff --git a/src/Generated/Models/InternalCreateModerationRequestInput2.cs b/src/Generated/Models/InternalCreateModerationRequestInput2.cs new file mode 100644 index 000000000..3fe805a1d --- /dev/null +++ b/src/Generated/Models/InternalCreateModerationRequestInput2.cs @@ -0,0 +1,35 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; + +namespace OpenAI.Moderations +{ + internal partial class InternalCreateModerationRequestInput2 + { + internal IDictionary SerializedAdditionalRawData { get; set; } + public InternalCreateModerationRequestInput2(InternalCreateModerationRequestInputImageUrl imageUrl) + { + Argument.AssertNotNull(imageUrl, nameof(imageUrl)); + + ImageUrl = imageUrl; + } + + internal InternalCreateModerationRequestInput2(InternalCreateModerationRequestInput2Type type, InternalCreateModerationRequestInputImageUrl imageUrl, IDictionary serializedAdditionalRawData) + { + Type = type; + ImageUrl = imageUrl; + SerializedAdditionalRawData = serializedAdditionalRawData; + } + + internal InternalCreateModerationRequestInput2() + { + } + + public InternalCreateModerationRequestInput2Type Type { get; } = InternalCreateModerationRequestInput2Type.ImageUrl; + + public InternalCreateModerationRequestInputImageUrl ImageUrl { get; } + } +} diff --git a/src/Generated/Models/InternalCreateModerationRequestInput2Type.cs b/src/Generated/Models/InternalCreateModerationRequestInput2Type.cs new file mode 100644 index 000000000..eb7ee4bba --- /dev/null +++ b/src/Generated/Models/InternalCreateModerationRequestInput2Type.cs @@ -0,0 +1,34 @@ +// + +#nullable disable + +using System; +using System.ComponentModel; + +namespace OpenAI.Moderations +{ + internal readonly partial struct InternalCreateModerationRequestInput2Type : IEquatable + { + private readonly string _value; + + public InternalCreateModerationRequestInput2Type(string value) + { + _value = value ?? throw new ArgumentNullException(nameof(value)); + } + + private const string ImageUrlValue = "image_url"; + + public static InternalCreateModerationRequestInput2Type ImageUrl { get; } = new InternalCreateModerationRequestInput2Type(ImageUrlValue); + public static bool operator ==(InternalCreateModerationRequestInput2Type left, InternalCreateModerationRequestInput2Type right) => left.Equals(right); + public static bool operator !=(InternalCreateModerationRequestInput2Type left, InternalCreateModerationRequestInput2Type right) => !left.Equals(right); + public static implicit operator InternalCreateModerationRequestInput2Type(string value) => new InternalCreateModerationRequestInput2Type(value); + + [EditorBrowsable(EditorBrowsableState.Never)] + public override bool Equals(object obj) => obj is InternalCreateModerationRequestInput2Type other && Equals(other); + public bool Equals(InternalCreateModerationRequestInput2Type other) => string.Equals(_value, other._value, StringComparison.InvariantCultureIgnoreCase); + + [EditorBrowsable(EditorBrowsableState.Never)] + public override int GetHashCode() => _value != null ? StringComparer.InvariantCultureIgnoreCase.GetHashCode(_value) : 0; + public override string ToString() => _value; + } +} diff --git a/src/Generated/Models/InternalCreateModerationRequestInput3.Serialization.cs b/src/Generated/Models/InternalCreateModerationRequestInput3.Serialization.cs new file mode 100644 index 000000000..a17661a1f --- /dev/null +++ b/src/Generated/Models/InternalCreateModerationRequestInput3.Serialization.cs @@ -0,0 +1,144 @@ +// + +#nullable disable + +using System; +using System.ClientModel; +using System.ClientModel.Primitives; +using System.Collections.Generic; +using System.Text.Json; + +namespace OpenAI.Moderations +{ + internal partial class InternalCreateModerationRequestInput3 : IJsonModel + { + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + { + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + if (format != "J") + { + throw new FormatException($"The model {nameof(InternalCreateModerationRequestInput3)} does not support writing '{format}' format."); + } + + writer.WriteStartObject(); + if (SerializedAdditionalRawData?.ContainsKey("type") != true) + { + writer.WritePropertyName("type"u8); + writer.WriteStringValue(Type.ToString()); + } + if (SerializedAdditionalRawData?.ContainsKey("text") != true) + { + writer.WritePropertyName("text"u8); + writer.WriteStringValue(Text); + } + if (SerializedAdditionalRawData != null) + { + foreach (var item in SerializedAdditionalRawData) + { + if (ModelSerializationExtensions.IsSentinelValue(item.Value)) + { + continue; + } + writer.WritePropertyName(item.Key); +#if NET6_0_OR_GREATER + writer.WriteRawValue(item.Value); +#else + using (JsonDocument document = JsonDocument.Parse(item.Value)) + { + JsonSerializer.Serialize(writer, document.RootElement); + } +#endif + } + } + writer.WriteEndObject(); + } + + InternalCreateModerationRequestInput3 IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + { + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + if (format != "J") + { + throw new FormatException($"The model {nameof(InternalCreateModerationRequestInput3)} does not support reading '{format}' format."); + } + + using JsonDocument document = JsonDocument.ParseValue(ref reader); + return DeserializeInternalCreateModerationRequestInput3(document.RootElement, options); + } + + internal static InternalCreateModerationRequestInput3 DeserializeInternalCreateModerationRequestInput3(JsonElement element, ModelReaderWriterOptions options = null) + { + options ??= ModelSerializationExtensions.WireOptions; + + if (element.ValueKind == JsonValueKind.Null) + { + return null; + } + InternalCreateModerationRequestInput3Type type = default; + string text = default; + IDictionary serializedAdditionalRawData = default; + Dictionary rawDataDictionary = new Dictionary(); + foreach (var property in element.EnumerateObject()) + { + if (property.NameEquals("type"u8)) + { + type = new InternalCreateModerationRequestInput3Type(property.Value.GetString()); + continue; + } + if (property.NameEquals("text"u8)) + { + text = property.Value.GetString(); + continue; + } + if (true) + { + rawDataDictionary ??= new Dictionary(); + rawDataDictionary.Add(property.Name, BinaryData.FromString(property.Value.GetRawText())); + } + } + serializedAdditionalRawData = rawDataDictionary; + return new InternalCreateModerationRequestInput3(type, text, serializedAdditionalRawData); + } + + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + { + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + + switch (format) + { + case "J": + return ModelReaderWriter.Write(this, options); + default: + throw new FormatException($"The model {nameof(InternalCreateModerationRequestInput3)} does not support writing '{options.Format}' format."); + } + } + + InternalCreateModerationRequestInput3 IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + { + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + + switch (format) + { + case "J": + { + using JsonDocument document = JsonDocument.Parse(data); + return DeserializeInternalCreateModerationRequestInput3(document.RootElement, options); + } + default: + throw new FormatException($"The model {nameof(InternalCreateModerationRequestInput3)} does not support reading '{options.Format}' format."); + } + } + + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + + internal static InternalCreateModerationRequestInput3 FromResponse(PipelineResponse response) + { + using var document = JsonDocument.Parse(response.Content); + return DeserializeInternalCreateModerationRequestInput3(document.RootElement); + } + + internal virtual BinaryContent ToBinaryContent() + { + return BinaryContent.Create(this, ModelSerializationExtensions.WireOptions); + } + } +} diff --git a/src/Generated/Models/InternalCreateModerationRequestInput3.cs b/src/Generated/Models/InternalCreateModerationRequestInput3.cs new file mode 100644 index 000000000..e5555bc45 --- /dev/null +++ b/src/Generated/Models/InternalCreateModerationRequestInput3.cs @@ -0,0 +1,35 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; + +namespace OpenAI.Moderations +{ + internal partial class InternalCreateModerationRequestInput3 + { + internal IDictionary SerializedAdditionalRawData { get; set; } + public InternalCreateModerationRequestInput3(string text) + { + Argument.AssertNotNull(text, nameof(text)); + + Text = text; + } + + internal InternalCreateModerationRequestInput3(InternalCreateModerationRequestInput3Type type, string text, IDictionary serializedAdditionalRawData) + { + Type = type; + Text = text; + SerializedAdditionalRawData = serializedAdditionalRawData; + } + + internal InternalCreateModerationRequestInput3() + { + } + + public InternalCreateModerationRequestInput3Type Type { get; } = InternalCreateModerationRequestInput3Type.Text; + + public string Text { get; } + } +} diff --git a/src/Generated/Models/InternalCreateModerationRequestInput3Type.cs b/src/Generated/Models/InternalCreateModerationRequestInput3Type.cs new file mode 100644 index 000000000..f0cbeae9d --- /dev/null +++ b/src/Generated/Models/InternalCreateModerationRequestInput3Type.cs @@ -0,0 +1,34 @@ +// + +#nullable disable + +using System; +using System.ComponentModel; + +namespace OpenAI.Moderations +{ + internal readonly partial struct InternalCreateModerationRequestInput3Type : IEquatable + { + private readonly string _value; + + public InternalCreateModerationRequestInput3Type(string value) + { + _value = value ?? throw new ArgumentNullException(nameof(value)); + } + + private const string TextValue = "text"; + + public static InternalCreateModerationRequestInput3Type Text { get; } = new InternalCreateModerationRequestInput3Type(TextValue); + public static bool operator ==(InternalCreateModerationRequestInput3Type left, InternalCreateModerationRequestInput3Type right) => left.Equals(right); + public static bool operator !=(InternalCreateModerationRequestInput3Type left, InternalCreateModerationRequestInput3Type right) => !left.Equals(right); + public static implicit operator InternalCreateModerationRequestInput3Type(string value) => new InternalCreateModerationRequestInput3Type(value); + + [EditorBrowsable(EditorBrowsableState.Never)] + public override bool Equals(object obj) => obj is InternalCreateModerationRequestInput3Type other && Equals(other); + public bool Equals(InternalCreateModerationRequestInput3Type other) => string.Equals(_value, other._value, StringComparison.InvariantCultureIgnoreCase); + + [EditorBrowsable(EditorBrowsableState.Never)] + public override int GetHashCode() => _value != null ? StringComparer.InvariantCultureIgnoreCase.GetHashCode(_value) : 0; + public override string ToString() => _value; + } +} diff --git a/src/Generated/Models/InternalRealtimeRequestResponseCreateCommand.Serialization.cs b/src/Generated/Models/InternalCreateModerationRequestInputImageUrl.Serialization.cs similarity index 50% rename from src/Generated/Models/InternalRealtimeRequestResponseCreateCommand.Serialization.cs rename to src/Generated/Models/InternalCreateModerationRequestInputImageUrl.Serialization.cs index 85dbea9cc..682022f37 100644 --- a/src/Generated/Models/InternalRealtimeRequestResponseCreateCommand.Serialization.cs +++ b/src/Generated/Models/InternalCreateModerationRequestInputImageUrl.Serialization.cs @@ -8,33 +8,23 @@ using System.Collections.Generic; using System.Text.Json; -namespace OpenAI.RealtimeConversation +namespace OpenAI.Moderations { - internal partial class InternalRealtimeRequestResponseCreateCommand : IJsonModel + internal partial class InternalCreateModerationRequestInputImageUrl : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeRequestResponseCreateCommand)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(InternalCreateModerationRequestInputImageUrl)} does not support writing '{format}' format."); } writer.WriteStartObject(); - if (SerializedAdditionalRawData?.ContainsKey("response") != true && Optional.IsDefined(Response)) + if (SerializedAdditionalRawData?.ContainsKey("url") != true) { - writer.WritePropertyName("response"u8); - writer.WriteObjectValue(Response, options); - } - if (SerializedAdditionalRawData?.ContainsKey("type") != true) - { - writer.WritePropertyName("type"u8); - writer.WriteStringValue(Kind.ToString()); - } - if (SerializedAdditionalRawData?.ContainsKey("event_id") != true && Optional.IsDefined(EventId)) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); + writer.WritePropertyName("url"u8); + writer.WriteStringValue(Url); } if (SerializedAdditionalRawData != null) { @@ -58,19 +48,19 @@ void IJsonModel.Write(Utf8JsonWrit writer.WriteEndObject(); } - InternalRealtimeRequestResponseCreateCommand IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + InternalCreateModerationRequestInputImageUrl IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeRequestResponseCreateCommand)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(InternalCreateModerationRequestInputImageUrl)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeInternalRealtimeRequestResponseCreateCommand(document.RootElement, options); + return DeserializeInternalCreateModerationRequestInputImageUrl(document.RootElement, options); } - internal static InternalRealtimeRequestResponseCreateCommand DeserializeInternalRealtimeRequestResponseCreateCommand(JsonElement element, ModelReaderWriterOptions options = null) + internal static InternalCreateModerationRequestInputImageUrl DeserializeInternalCreateModerationRequestInputImageUrl(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -78,30 +68,14 @@ internal static InternalRealtimeRequestResponseCreateCommand DeserializeInternal { return null; } - InternalRealtimeRequestResponseCreateCommandResponse response = default; - InternalRealtimeRequestCommandType type = default; - string eventId = default; + string url = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); foreach (var property in element.EnumerateObject()) { - if (property.NameEquals("response"u8)) - { - if (property.Value.ValueKind == JsonValueKind.Null) - { - continue; - } - response = InternalRealtimeRequestResponseCreateCommandResponse.DeserializeInternalRealtimeRequestResponseCreateCommandResponse(property.Value, options); - continue; - } - if (property.NameEquals("type"u8)) - { - type = new InternalRealtimeRequestCommandType(property.Value.GetString()); - continue; - } - if (property.NameEquals("event_id"u8)) + if (property.NameEquals("url"u8)) { - eventId = property.Value.GetString(); + url = property.Value.GetString(); continue; } if (true) @@ -111,47 +85,47 @@ internal static InternalRealtimeRequestResponseCreateCommand DeserializeInternal } } serializedAdditionalRawData = rawDataDictionary; - return new InternalRealtimeRequestResponseCreateCommand(type, eventId, serializedAdditionalRawData, response); + return new InternalCreateModerationRequestInputImageUrl(url, serializedAdditionalRawData); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(InternalRealtimeRequestResponseCreateCommand)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalCreateModerationRequestInputImageUrl)} does not support writing '{options.Format}' format."); } } - InternalRealtimeRequestResponseCreateCommand IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + InternalCreateModerationRequestInputImageUrl IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeInternalRealtimeRequestResponseCreateCommand(document.RootElement, options); + return DeserializeInternalCreateModerationRequestInputImageUrl(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(InternalRealtimeRequestResponseCreateCommand)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalCreateModerationRequestInputImageUrl)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new InternalRealtimeRequestResponseCreateCommand FromResponse(PipelineResponse response) + internal static InternalCreateModerationRequestInputImageUrl FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeInternalRealtimeRequestResponseCreateCommand(document.RootElement); + return DeserializeInternalCreateModerationRequestInputImageUrl(document.RootElement); } - internal override BinaryContent ToBinaryContent() + internal virtual BinaryContent ToBinaryContent() { return BinaryContent.Create(this, ModelSerializationExtensions.WireOptions); } diff --git a/src/Generated/Models/InternalCreateModerationRequestInputImageUrl.cs b/src/Generated/Models/InternalCreateModerationRequestInputImageUrl.cs new file mode 100644 index 000000000..c611eb77c --- /dev/null +++ b/src/Generated/Models/InternalCreateModerationRequestInputImageUrl.cs @@ -0,0 +1,32 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; + +namespace OpenAI.Moderations +{ + internal partial class InternalCreateModerationRequestInputImageUrl + { + internal IDictionary SerializedAdditionalRawData { get; set; } + public InternalCreateModerationRequestInputImageUrl(string url) + { + Argument.AssertNotNull(url, nameof(url)); + + Url = url; + } + + internal InternalCreateModerationRequestInputImageUrl(string url, IDictionary serializedAdditionalRawData) + { + Url = url; + SerializedAdditionalRawData = serializedAdditionalRawData; + } + + internal InternalCreateModerationRequestInputImageUrl() + { + } + + public string Url { get; } + } +} diff --git a/src/Generated/Models/InternalCreateModerationRequestModel.cs b/src/Generated/Models/InternalCreateModerationRequestModel.cs index f58696815..4d45c3a9f 100644 --- a/src/Generated/Models/InternalCreateModerationRequestModel.cs +++ b/src/Generated/Models/InternalCreateModerationRequestModel.cs @@ -16,9 +16,13 @@ public InternalCreateModerationRequestModel(string value) _value = value ?? throw new ArgumentNullException(nameof(value)); } + private const string OmniModerationLatestValue = "omni-moderation-latest"; + private const string OmniModeration20240926Value = "omni-moderation-2024-09-26"; private const string TextModerationLatestValue = "text-moderation-latest"; private const string TextModerationStableValue = "text-moderation-stable"; + public static InternalCreateModerationRequestModel OmniModerationLatest { get; } = new InternalCreateModerationRequestModel(OmniModerationLatestValue); + public static InternalCreateModerationRequestModel OmniModeration20240926 { get; } = new InternalCreateModerationRequestModel(OmniModeration20240926Value); public static InternalCreateModerationRequestModel TextModerationLatest { get; } = new InternalCreateModerationRequestModel(TextModerationLatestValue); public static InternalCreateModerationRequestModel TextModerationStable { get; } = new InternalCreateModerationRequestModel(TextModerationStableValue); public static bool operator ==(InternalCreateModerationRequestModel left, InternalCreateModerationRequestModel right) => left.Equals(right); diff --git a/src/Generated/Models/InternalCreateModerationResponseResultCategoryAppliedInputTypes.Serialization.cs b/src/Generated/Models/InternalCreateModerationResponseResultCategoryAppliedInputTypes.Serialization.cs new file mode 100644 index 000000000..5468c79e5 --- /dev/null +++ b/src/Generated/Models/InternalCreateModerationResponseResultCategoryAppliedInputTypes.Serialization.cs @@ -0,0 +1,409 @@ +// + +#nullable disable + +using System; +using System.ClientModel; +using System.ClientModel.Primitives; +using System.Collections.Generic; +using System.Text.Json; + +namespace OpenAI.Moderations +{ + internal partial class InternalCreateModerationResponseResultCategoryAppliedInputTypes : IJsonModel + { + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + { + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + if (format != "J") + { + throw new FormatException($"The model {nameof(InternalCreateModerationResponseResultCategoryAppliedInputTypes)} does not support writing '{format}' format."); + } + + writer.WriteStartObject(); + if (SerializedAdditionalRawData?.ContainsKey("hate") != true) + { + writer.WritePropertyName("hate"u8); + writer.WriteStartArray(); + foreach (var item in Hate) + { + writer.WriteStringValue(item); + } + writer.WriteEndArray(); + } + if (SerializedAdditionalRawData?.ContainsKey("hate/threatening") != true) + { + writer.WritePropertyName("hate/threatening"u8); + writer.WriteStartArray(); + foreach (var item in HateThreatening) + { + writer.WriteStringValue(item); + } + writer.WriteEndArray(); + } + if (SerializedAdditionalRawData?.ContainsKey("harassment") != true) + { + writer.WritePropertyName("harassment"u8); + writer.WriteStartArray(); + foreach (var item in Harassment) + { + writer.WriteStringValue(item); + } + writer.WriteEndArray(); + } + if (SerializedAdditionalRawData?.ContainsKey("harassment/threatening") != true) + { + writer.WritePropertyName("harassment/threatening"u8); + writer.WriteStartArray(); + foreach (var item in HarassmentThreatening) + { + writer.WriteStringValue(item); + } + writer.WriteEndArray(); + } + if (SerializedAdditionalRawData?.ContainsKey("illicit") != true) + { + writer.WritePropertyName("illicit"u8); + writer.WriteStartArray(); + foreach (var item in Illicit) + { + writer.WriteStringValue(item); + } + writer.WriteEndArray(); + } + if (SerializedAdditionalRawData?.ContainsKey("illicit/violent") != true) + { + writer.WritePropertyName("illicit/violent"u8); + writer.WriteStartArray(); + foreach (var item in IllicitViolent) + { + writer.WriteStringValue(item); + } + writer.WriteEndArray(); + } + if (SerializedAdditionalRawData?.ContainsKey("self-harm") != true) + { + writer.WritePropertyName("self-harm"u8); + writer.WriteStartArray(); + foreach (var item in SelfHarm) + { + writer.WriteStringValue(item); + } + writer.WriteEndArray(); + } + if (SerializedAdditionalRawData?.ContainsKey("self-harm/intent") != true) + { + writer.WritePropertyName("self-harm/intent"u8); + writer.WriteStartArray(); + foreach (var item in SelfHarmIntent) + { + writer.WriteStringValue(item); + } + writer.WriteEndArray(); + } + if (SerializedAdditionalRawData?.ContainsKey("self-harm/instructions") != true) + { + writer.WritePropertyName("self-harm/instructions"u8); + writer.WriteStartArray(); + foreach (var item in SelfHarmInstructions) + { + writer.WriteStringValue(item); + } + writer.WriteEndArray(); + } + if (SerializedAdditionalRawData?.ContainsKey("sexual") != true) + { + writer.WritePropertyName("sexual"u8); + writer.WriteStartArray(); + foreach (var item in Sexual) + { + writer.WriteStringValue(item); + } + writer.WriteEndArray(); + } + if (SerializedAdditionalRawData?.ContainsKey("sexual/minors") != true) + { + writer.WritePropertyName("sexual/minors"u8); + writer.WriteStartArray(); + foreach (var item in SexualMinors) + { + writer.WriteStringValue(item); + } + writer.WriteEndArray(); + } + if (SerializedAdditionalRawData?.ContainsKey("violence") != true) + { + writer.WritePropertyName("violence"u8); + writer.WriteStartArray(); + foreach (var item in Violence) + { + writer.WriteStringValue(item); + } + writer.WriteEndArray(); + } + if (SerializedAdditionalRawData?.ContainsKey("violence/graphic") != true) + { + writer.WritePropertyName("violence/graphic"u8); + writer.WriteStartArray(); + foreach (var item in ViolenceGraphic) + { + writer.WriteStringValue(item); + } + writer.WriteEndArray(); + } + if (SerializedAdditionalRawData != null) + { + foreach (var item in SerializedAdditionalRawData) + { + if (ModelSerializationExtensions.IsSentinelValue(item.Value)) + { + continue; + } + writer.WritePropertyName(item.Key); +#if NET6_0_OR_GREATER + writer.WriteRawValue(item.Value); +#else + using (JsonDocument document = JsonDocument.Parse(item.Value)) + { + JsonSerializer.Serialize(writer, document.RootElement); + } +#endif + } + } + writer.WriteEndObject(); + } + + InternalCreateModerationResponseResultCategoryAppliedInputTypes IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + { + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + if (format != "J") + { + throw new FormatException($"The model {nameof(InternalCreateModerationResponseResultCategoryAppliedInputTypes)} does not support reading '{format}' format."); + } + + using JsonDocument document = JsonDocument.ParseValue(ref reader); + return DeserializeInternalCreateModerationResponseResultCategoryAppliedInputTypes(document.RootElement, options); + } + + internal static InternalCreateModerationResponseResultCategoryAppliedInputTypes DeserializeInternalCreateModerationResponseResultCategoryAppliedInputTypes(JsonElement element, ModelReaderWriterOptions options = null) + { + options ??= ModelSerializationExtensions.WireOptions; + + if (element.ValueKind == JsonValueKind.Null) + { + return null; + } + IReadOnlyList hate = default; + IReadOnlyList hateThreatening = default; + IReadOnlyList harassment = default; + IReadOnlyList harassmentThreatening = default; + IReadOnlyList illicit = default; + IReadOnlyList illicitViolent = default; + IReadOnlyList selfHarm = default; + IReadOnlyList selfHarmIntent = default; + IReadOnlyList selfHarmInstructions = default; + IReadOnlyList sexual = default; + IReadOnlyList sexualMinors = default; + IReadOnlyList violence = default; + IReadOnlyList violenceGraphic = default; + IDictionary serializedAdditionalRawData = default; + Dictionary rawDataDictionary = new Dictionary(); + foreach (var property in element.EnumerateObject()) + { + if (property.NameEquals("hate"u8)) + { + List array = new List(); + foreach (var item in property.Value.EnumerateArray()) + { + array.Add(item.GetString()); + } + hate = array; + continue; + } + if (property.NameEquals("hate/threatening"u8)) + { + List array = new List(); + foreach (var item in property.Value.EnumerateArray()) + { + array.Add(item.GetString()); + } + hateThreatening = array; + continue; + } + if (property.NameEquals("harassment"u8)) + { + List array = new List(); + foreach (var item in property.Value.EnumerateArray()) + { + array.Add(item.GetString()); + } + harassment = array; + continue; + } + if (property.NameEquals("harassment/threatening"u8)) + { + List array = new List(); + foreach (var item in property.Value.EnumerateArray()) + { + array.Add(item.GetString()); + } + harassmentThreatening = array; + continue; + } + if (property.NameEquals("illicit"u8)) + { + List array = new List(); + foreach (var item in property.Value.EnumerateArray()) + { + array.Add(item.GetString()); + } + illicit = array; + continue; + } + if (property.NameEquals("illicit/violent"u8)) + { + List array = new List(); + foreach (var item in property.Value.EnumerateArray()) + { + array.Add(item.GetString()); + } + illicitViolent = array; + continue; + } + if (property.NameEquals("self-harm"u8)) + { + List array = new List(); + foreach (var item in property.Value.EnumerateArray()) + { + array.Add(item.GetString()); + } + selfHarm = array; + continue; + } + if (property.NameEquals("self-harm/intent"u8)) + { + List array = new List(); + foreach (var item in property.Value.EnumerateArray()) + { + array.Add(item.GetString()); + } + selfHarmIntent = array; + continue; + } + if (property.NameEquals("self-harm/instructions"u8)) + { + List array = new List(); + foreach (var item in property.Value.EnumerateArray()) + { + array.Add(item.GetString()); + } + selfHarmInstructions = array; + continue; + } + if (property.NameEquals("sexual"u8)) + { + List array = new List(); + foreach (var item in property.Value.EnumerateArray()) + { + array.Add(item.GetString()); + } + sexual = array; + continue; + } + if (property.NameEquals("sexual/minors"u8)) + { + List array = new List(); + foreach (var item in property.Value.EnumerateArray()) + { + array.Add(item.GetString()); + } + sexualMinors = array; + continue; + } + if (property.NameEquals("violence"u8)) + { + List array = new List(); + foreach (var item in property.Value.EnumerateArray()) + { + array.Add(item.GetString()); + } + violence = array; + continue; + } + if (property.NameEquals("violence/graphic"u8)) + { + List array = new List(); + foreach (var item in property.Value.EnumerateArray()) + { + array.Add(item.GetString()); + } + violenceGraphic = array; + continue; + } + if (true) + { + rawDataDictionary ??= new Dictionary(); + rawDataDictionary.Add(property.Name, BinaryData.FromString(property.Value.GetRawText())); + } + } + serializedAdditionalRawData = rawDataDictionary; + return new InternalCreateModerationResponseResultCategoryAppliedInputTypes( + hate, + hateThreatening, + harassment, + harassmentThreatening, + illicit, + illicitViolent, + selfHarm, + selfHarmIntent, + selfHarmInstructions, + sexual, + sexualMinors, + violence, + violenceGraphic, + serializedAdditionalRawData); + } + + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + { + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + + switch (format) + { + case "J": + return ModelReaderWriter.Write(this, options); + default: + throw new FormatException($"The model {nameof(InternalCreateModerationResponseResultCategoryAppliedInputTypes)} does not support writing '{options.Format}' format."); + } + } + + InternalCreateModerationResponseResultCategoryAppliedInputTypes IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + { + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + + switch (format) + { + case "J": + { + using JsonDocument document = JsonDocument.Parse(data); + return DeserializeInternalCreateModerationResponseResultCategoryAppliedInputTypes(document.RootElement, options); + } + default: + throw new FormatException($"The model {nameof(InternalCreateModerationResponseResultCategoryAppliedInputTypes)} does not support reading '{options.Format}' format."); + } + } + + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + + internal static InternalCreateModerationResponseResultCategoryAppliedInputTypes FromResponse(PipelineResponse response) + { + using var document = JsonDocument.Parse(response.Content); + return DeserializeInternalCreateModerationResponseResultCategoryAppliedInputTypes(document.RootElement); + } + + internal virtual BinaryContent ToBinaryContent() + { + return BinaryContent.Create(this, ModelSerializationExtensions.WireOptions); + } + } +} diff --git a/src/Generated/Models/InternalCreateModerationResponseResultCategoryAppliedInputTypes.cs b/src/Generated/Models/InternalCreateModerationResponseResultCategoryAppliedInputTypes.cs new file mode 100644 index 000000000..8669fed80 --- /dev/null +++ b/src/Generated/Models/InternalCreateModerationResponseResultCategoryAppliedInputTypes.cs @@ -0,0 +1,67 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; +using System.Linq; + +namespace OpenAI.Moderations +{ + internal partial class InternalCreateModerationResponseResultCategoryAppliedInputTypes + { + internal IDictionary SerializedAdditionalRawData { get; set; } + internal InternalCreateModerationResponseResultCategoryAppliedInputTypes(IEnumerable hate, IEnumerable hateThreatening, IEnumerable harassment, IEnumerable harassmentThreatening, IEnumerable illicit, IEnumerable illicitViolent, IEnumerable selfHarm, IEnumerable selfHarmIntent, IEnumerable selfHarmInstructions, IEnumerable sexual, IEnumerable sexualMinors, IEnumerable violence, IEnumerable violenceGraphic) + { + Argument.AssertNotNull(hate, nameof(hate)); + Argument.AssertNotNull(hateThreatening, nameof(hateThreatening)); + Argument.AssertNotNull(harassment, nameof(harassment)); + Argument.AssertNotNull(harassmentThreatening, nameof(harassmentThreatening)); + Argument.AssertNotNull(illicit, nameof(illicit)); + Argument.AssertNotNull(illicitViolent, nameof(illicitViolent)); + Argument.AssertNotNull(selfHarm, nameof(selfHarm)); + Argument.AssertNotNull(selfHarmIntent, nameof(selfHarmIntent)); + Argument.AssertNotNull(selfHarmInstructions, nameof(selfHarmInstructions)); + Argument.AssertNotNull(sexual, nameof(sexual)); + Argument.AssertNotNull(sexualMinors, nameof(sexualMinors)); + Argument.AssertNotNull(violence, nameof(violence)); + Argument.AssertNotNull(violenceGraphic, nameof(violenceGraphic)); + + Hate = hate.ToList(); + HateThreatening = hateThreatening.ToList(); + Harassment = harassment.ToList(); + HarassmentThreatening = harassmentThreatening.ToList(); + Illicit = illicit.ToList(); + IllicitViolent = illicitViolent.ToList(); + SelfHarm = selfHarm.ToList(); + SelfHarmIntent = selfHarmIntent.ToList(); + SelfHarmInstructions = selfHarmInstructions.ToList(); + Sexual = sexual.ToList(); + SexualMinors = sexualMinors.ToList(); + Violence = violence.ToList(); + ViolenceGraphic = violenceGraphic.ToList(); + } + + internal InternalCreateModerationResponseResultCategoryAppliedInputTypes(IReadOnlyList hate, IReadOnlyList hateThreatening, IReadOnlyList harassment, IReadOnlyList harassmentThreatening, IReadOnlyList illicit, IReadOnlyList illicitViolent, IReadOnlyList selfHarm, IReadOnlyList selfHarmIntent, IReadOnlyList selfHarmInstructions, IReadOnlyList sexual, IReadOnlyList sexualMinors, IReadOnlyList violence, IReadOnlyList violenceGraphic, IDictionary serializedAdditionalRawData) + { + Hate = hate; + HateThreatening = hateThreatening; + Harassment = harassment; + HarassmentThreatening = harassmentThreatening; + Illicit = illicit; + IllicitViolent = illicitViolent; + SelfHarm = selfHarm; + SelfHarmIntent = selfHarmIntent; + SelfHarmInstructions = selfHarmInstructions; + Sexual = sexual; + SexualMinors = sexualMinors; + Violence = violence; + ViolenceGraphic = violenceGraphic; + SerializedAdditionalRawData = serializedAdditionalRawData; + } + + internal InternalCreateModerationResponseResultCategoryAppliedInputTypes() + { + } + } +} diff --git a/src/Generated/Models/InternalModerationCategories.Serialization.cs b/src/Generated/Models/InternalModerationCategories.Serialization.cs index 1b62ce322..468017278 100644 --- a/src/Generated/Models/InternalModerationCategories.Serialization.cs +++ b/src/Generated/Models/InternalModerationCategories.Serialization.cs @@ -41,6 +41,16 @@ void IJsonModel.Write(Utf8JsonWriter writer, Model writer.WritePropertyName("harassment/threatening"u8); writer.WriteBooleanValue(HarassmentThreatening); } + if (SerializedAdditionalRawData?.ContainsKey("illicit") != true) + { + writer.WritePropertyName("illicit"u8); + writer.WriteBooleanValue(Illicit); + } + if (SerializedAdditionalRawData?.ContainsKey("illicit/violent") != true) + { + writer.WritePropertyName("illicit/violent"u8); + writer.WriteBooleanValue(IllicitViolent); + } if (SerializedAdditionalRawData?.ContainsKey("self-harm") != true) { writer.WritePropertyName("self-harm"u8); @@ -122,6 +132,8 @@ internal static InternalModerationCategories DeserializeInternalModerationCatego bool hateThreatening = default; bool harassment = default; bool harassmentThreatening = default; + bool illicit = default; + bool illicitViolent = default; bool selfHarm = default; bool selfHarmIntent = default; bool selfHarmInstructions = default; @@ -153,6 +165,16 @@ internal static InternalModerationCategories DeserializeInternalModerationCatego harassmentThreatening = property.Value.GetBoolean(); continue; } + if (property.NameEquals("illicit"u8)) + { + illicit = property.Value.GetBoolean(); + continue; + } + if (property.NameEquals("illicit/violent"u8)) + { + illicitViolent = property.Value.GetBoolean(); + continue; + } if (property.NameEquals("self-harm"u8)) { selfHarm = property.Value.GetBoolean(); @@ -200,6 +222,8 @@ internal static InternalModerationCategories DeserializeInternalModerationCatego hateThreatening, harassment, harassmentThreatening, + illicit, + illicitViolent, selfHarm, selfHarmIntent, selfHarmInstructions, diff --git a/src/Generated/Models/InternalModerationCategories.cs b/src/Generated/Models/InternalModerationCategories.cs index 667823bac..e74bb32c0 100644 --- a/src/Generated/Models/InternalModerationCategories.cs +++ b/src/Generated/Models/InternalModerationCategories.cs @@ -10,12 +10,14 @@ namespace OpenAI.Moderations internal partial class InternalModerationCategories { internal IDictionary SerializedAdditionalRawData { get; set; } - internal InternalModerationCategories(bool hate, bool hateThreatening, bool harassment, bool harassmentThreatening, bool selfHarm, bool selfHarmIntent, bool selfHarmInstructions, bool sexual, bool sexualMinors, bool violence, bool violenceGraphic) + internal InternalModerationCategories(bool hate, bool hateThreatening, bool harassment, bool harassmentThreatening, bool illicit, bool illicitViolent, bool selfHarm, bool selfHarmIntent, bool selfHarmInstructions, bool sexual, bool sexualMinors, bool violence, bool violenceGraphic) { Hate = hate; HateThreatening = hateThreatening; Harassment = harassment; HarassmentThreatening = harassmentThreatening; + Illicit = illicit; + IllicitViolent = illicitViolent; SelfHarm = selfHarm; SelfHarmIntent = selfHarmIntent; SelfHarmInstructions = selfHarmInstructions; @@ -25,12 +27,14 @@ internal InternalModerationCategories(bool hate, bool hateThreatening, bool hara ViolenceGraphic = violenceGraphic; } - internal InternalModerationCategories(bool hate, bool hateThreatening, bool harassment, bool harassmentThreatening, bool selfHarm, bool selfHarmIntent, bool selfHarmInstructions, bool sexual, bool sexualMinors, bool violence, bool violenceGraphic, IDictionary serializedAdditionalRawData) + internal InternalModerationCategories(bool hate, bool hateThreatening, bool harassment, bool harassmentThreatening, bool illicit, bool illicitViolent, bool selfHarm, bool selfHarmIntent, bool selfHarmInstructions, bool sexual, bool sexualMinors, bool violence, bool violenceGraphic, IDictionary serializedAdditionalRawData) { Hate = hate; HateThreatening = hateThreatening; Harassment = harassment; HarassmentThreatening = harassmentThreatening; + Illicit = illicit; + IllicitViolent = illicitViolent; SelfHarm = selfHarm; SelfHarmIntent = selfHarmIntent; SelfHarmInstructions = selfHarmInstructions; @@ -49,6 +53,8 @@ internal InternalModerationCategories() public bool HateThreatening { get; } public bool Harassment { get; } public bool HarassmentThreatening { get; } + public bool Illicit { get; } + public bool IllicitViolent { get; } public bool SelfHarm { get; } public bool SelfHarmIntent { get; } public bool SelfHarmInstructions { get; } diff --git a/src/Generated/Models/InternalModerationCategoryScores.Serialization.cs b/src/Generated/Models/InternalModerationCategoryScores.Serialization.cs index f822d1261..89f8e1ab7 100644 --- a/src/Generated/Models/InternalModerationCategoryScores.Serialization.cs +++ b/src/Generated/Models/InternalModerationCategoryScores.Serialization.cs @@ -41,6 +41,16 @@ void IJsonModel.Write(Utf8JsonWriter writer, M writer.WritePropertyName("harassment/threatening"u8); writer.WriteNumberValue(HarassmentThreatening); } + if (SerializedAdditionalRawData?.ContainsKey("illicit") != true) + { + writer.WritePropertyName("illicit"u8); + writer.WriteNumberValue(Illicit); + } + if (SerializedAdditionalRawData?.ContainsKey("illicit/violent") != true) + { + writer.WritePropertyName("illicit/violent"u8); + writer.WriteNumberValue(IllicitViolent); + } if (SerializedAdditionalRawData?.ContainsKey("self-harm") != true) { writer.WritePropertyName("self-harm"u8); @@ -122,6 +132,8 @@ internal static InternalModerationCategoryScores DeserializeInternalModerationCa float hateThreatening = default; float harassment = default; float harassmentThreatening = default; + float illicit = default; + float illicitViolent = default; float selfHarm = default; float selfHarmIntent = default; float selfHarmInstructions = default; @@ -153,6 +165,16 @@ internal static InternalModerationCategoryScores DeserializeInternalModerationCa harassmentThreatening = property.Value.GetSingle(); continue; } + if (property.NameEquals("illicit"u8)) + { + illicit = property.Value.GetSingle(); + continue; + } + if (property.NameEquals("illicit/violent"u8)) + { + illicitViolent = property.Value.GetSingle(); + continue; + } if (property.NameEquals("self-harm"u8)) { selfHarm = property.Value.GetSingle(); @@ -200,6 +222,8 @@ internal static InternalModerationCategoryScores DeserializeInternalModerationCa hateThreatening, harassment, harassmentThreatening, + illicit, + illicitViolent, selfHarm, selfHarmIntent, selfHarmInstructions, diff --git a/src/Generated/Models/InternalModerationCategoryScores.cs b/src/Generated/Models/InternalModerationCategoryScores.cs index 7c4645562..ea45180d1 100644 --- a/src/Generated/Models/InternalModerationCategoryScores.cs +++ b/src/Generated/Models/InternalModerationCategoryScores.cs @@ -10,12 +10,14 @@ namespace OpenAI.Moderations internal partial class InternalModerationCategoryScores { internal IDictionary SerializedAdditionalRawData { get; set; } - internal InternalModerationCategoryScores(float hate, float hateThreatening, float harassment, float harassmentThreatening, float selfHarm, float selfHarmIntent, float selfHarmInstructions, float sexual, float sexualMinors, float violence, float violenceGraphic) + internal InternalModerationCategoryScores(float hate, float hateThreatening, float harassment, float harassmentThreatening, float illicit, float illicitViolent, float selfHarm, float selfHarmIntent, float selfHarmInstructions, float sexual, float sexualMinors, float violence, float violenceGraphic) { Hate = hate; HateThreatening = hateThreatening; Harassment = harassment; HarassmentThreatening = harassmentThreatening; + Illicit = illicit; + IllicitViolent = illicitViolent; SelfHarm = selfHarm; SelfHarmIntent = selfHarmIntent; SelfHarmInstructions = selfHarmInstructions; @@ -25,12 +27,14 @@ internal InternalModerationCategoryScores(float hate, float hateThreatening, flo ViolenceGraphic = violenceGraphic; } - internal InternalModerationCategoryScores(float hate, float hateThreatening, float harassment, float harassmentThreatening, float selfHarm, float selfHarmIntent, float selfHarmInstructions, float sexual, float sexualMinors, float violence, float violenceGraphic, IDictionary serializedAdditionalRawData) + internal InternalModerationCategoryScores(float hate, float hateThreatening, float harassment, float harassmentThreatening, float illicit, float illicitViolent, float selfHarm, float selfHarmIntent, float selfHarmInstructions, float sexual, float sexualMinors, float violence, float violenceGraphic, IDictionary serializedAdditionalRawData) { Hate = hate; HateThreatening = hateThreatening; Harassment = harassment; HarassmentThreatening = harassmentThreatening; + Illicit = illicit; + IllicitViolent = illicitViolent; SelfHarm = selfHarm; SelfHarmIntent = selfHarmIntent; SelfHarmInstructions = selfHarmInstructions; @@ -49,6 +53,8 @@ internal InternalModerationCategoryScores() public float HateThreatening { get; } public float Harassment { get; } public float HarassmentThreatening { get; } + public float Illicit { get; } + public float IllicitViolent { get; } public float SelfHarm { get; } public float SelfHarmIntent { get; } public float SelfHarmInstructions { get; } diff --git a/src/Generated/Models/InternalRealtimeRequestCommand.Serialization.cs b/src/Generated/Models/InternalRealtimeClientEvent.Serialization.cs similarity index 54% rename from src/Generated/Models/InternalRealtimeRequestCommand.Serialization.cs rename to src/Generated/Models/InternalRealtimeClientEvent.Serialization.cs index c07105652..6fd0daa7e 100644 --- a/src/Generated/Models/InternalRealtimeRequestCommand.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeClientEvent.Serialization.cs @@ -9,15 +9,15 @@ namespace OpenAI.RealtimeConversation { - [PersistableModelProxy(typeof(UnknownRealtimeRequestCommand))] - internal partial class InternalRealtimeRequestCommand : IJsonModel + [PersistableModelProxy(typeof(UnknownRealtimeClientEvent))] + internal partial class InternalRealtimeClientEvent : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeRequestCommand)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEvent)} does not support writing '{format}' format."); } writer.WriteStartObject(); @@ -53,19 +53,19 @@ void IJsonModel.Write(Utf8JsonWriter writer, Mod writer.WriteEndObject(); } - InternalRealtimeRequestCommand IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + InternalRealtimeClientEvent IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeRequestCommand)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEvent)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeInternalRealtimeRequestCommand(document.RootElement, options); + return DeserializeInternalRealtimeClientEvent(document.RootElement, options); } - internal static InternalRealtimeRequestCommand DeserializeInternalRealtimeRequestCommand(JsonElement element, ModelReaderWriterOptions options = null) + internal static InternalRealtimeClientEvent DeserializeInternalRealtimeClientEvent(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -77,55 +77,55 @@ internal static InternalRealtimeRequestCommand DeserializeInternalRealtimeReques { switch (discriminator.GetString()) { - case "conversation.item.create": return InternalRealtimeRequestItemCreateCommand.DeserializeInternalRealtimeRequestItemCreateCommand(element, options); - case "conversation.item.delete": return InternalRealtimeRequestItemDeleteCommand.DeserializeInternalRealtimeRequestItemDeleteCommand(element, options); - case "conversation.item.truncate": return InternalRealtimeRequestItemTruncateCommand.DeserializeInternalRealtimeRequestItemTruncateCommand(element, options); - case "input_audio_buffer.append": return InternalRealtimeRequestInputAudioBufferAppendCommand.DeserializeInternalRealtimeRequestInputAudioBufferAppendCommand(element, options); - case "input_audio_buffer.clear": return InternalRealtimeRequestInputAudioBufferClearCommand.DeserializeInternalRealtimeRequestInputAudioBufferClearCommand(element, options); - case "input_audio_buffer.commit": return InternalRealtimeRequestInputAudioBufferCommitCommand.DeserializeInternalRealtimeRequestInputAudioBufferCommitCommand(element, options); - case "response.cancel": return InternalRealtimeRequestResponseCancelCommand.DeserializeInternalRealtimeRequestResponseCancelCommand(element, options); - case "response.create": return InternalRealtimeRequestResponseCreateCommand.DeserializeInternalRealtimeRequestResponseCreateCommand(element, options); - case "session.update": return InternalRealtimeRequestSessionUpdateCommand.DeserializeInternalRealtimeRequestSessionUpdateCommand(element, options); + case "conversation.item.create": return InternalRealtimeClientEventConversationItemCreate.DeserializeInternalRealtimeClientEventConversationItemCreate(element, options); + case "conversation.item.delete": return InternalRealtimeClientEventConversationItemDelete.DeserializeInternalRealtimeClientEventConversationItemDelete(element, options); + case "conversation.item.truncate": return InternalRealtimeClientEventConversationItemTruncate.DeserializeInternalRealtimeClientEventConversationItemTruncate(element, options); + case "input_audio_buffer.append": return InternalRealtimeClientEventInputAudioBufferAppend.DeserializeInternalRealtimeClientEventInputAudioBufferAppend(element, options); + case "input_audio_buffer.clear": return InternalRealtimeClientEventInputAudioBufferClear.DeserializeInternalRealtimeClientEventInputAudioBufferClear(element, options); + case "input_audio_buffer.commit": return InternalRealtimeClientEventInputAudioBufferCommit.DeserializeInternalRealtimeClientEventInputAudioBufferCommit(element, options); + case "response.cancel": return InternalRealtimeClientEventResponseCancel.DeserializeInternalRealtimeClientEventResponseCancel(element, options); + case "response.create": return InternalRealtimeClientEventResponseCreate.DeserializeInternalRealtimeClientEventResponseCreate(element, options); + case "session.update": return InternalRealtimeClientEventSessionUpdate.DeserializeInternalRealtimeClientEventSessionUpdate(element, options); } } - return UnknownRealtimeRequestCommand.DeserializeUnknownRealtimeRequestCommand(element, options); + return UnknownRealtimeClientEvent.DeserializeUnknownRealtimeClientEvent(element, options); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(InternalRealtimeRequestCommand)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEvent)} does not support writing '{options.Format}' format."); } } - InternalRealtimeRequestCommand IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + InternalRealtimeClientEvent IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeInternalRealtimeRequestCommand(document.RootElement, options); + return DeserializeInternalRealtimeClientEvent(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(InternalRealtimeRequestCommand)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEvent)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static InternalRealtimeRequestCommand FromResponse(PipelineResponse response) + internal static InternalRealtimeClientEvent FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeInternalRealtimeRequestCommand(document.RootElement); + return DeserializeInternalRealtimeClientEvent(document.RootElement); } internal virtual BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/InternalRealtimeRequestCommand.cs b/src/Generated/Models/InternalRealtimeClientEvent.cs similarity index 55% rename from src/Generated/Models/InternalRealtimeRequestCommand.cs rename to src/Generated/Models/InternalRealtimeClientEvent.cs index 9fd7fbd6b..f3696c8a1 100644 --- a/src/Generated/Models/InternalRealtimeRequestCommand.cs +++ b/src/Generated/Models/InternalRealtimeClientEvent.cs @@ -7,21 +7,21 @@ namespace OpenAI.RealtimeConversation { - internal abstract partial class InternalRealtimeRequestCommand + internal abstract partial class InternalRealtimeClientEvent { internal IDictionary SerializedAdditionalRawData { get; set; } - protected InternalRealtimeRequestCommand() + protected InternalRealtimeClientEvent() { } - internal InternalRealtimeRequestCommand(InternalRealtimeRequestCommandType kind, string eventId, IDictionary serializedAdditionalRawData) + internal InternalRealtimeClientEvent(InternalRealtimeClientEventType kind, string eventId, IDictionary serializedAdditionalRawData) { Kind = kind; EventId = eventId; SerializedAdditionalRawData = serializedAdditionalRawData; } - internal InternalRealtimeRequestCommandType Kind { get; set; } + internal InternalRealtimeClientEventType Kind { get; set; } public string EventId { get; set; } } } diff --git a/src/Generated/Models/InternalRealtimeRequestItemCreateCommand.Serialization.cs b/src/Generated/Models/InternalRealtimeClientEventConversationItemCreate.Serialization.cs similarity index 64% rename from src/Generated/Models/InternalRealtimeRequestItemCreateCommand.Serialization.cs rename to src/Generated/Models/InternalRealtimeClientEventConversationItemCreate.Serialization.cs index 83e8754ba..58f889004 100644 --- a/src/Generated/Models/InternalRealtimeRequestItemCreateCommand.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeClientEventConversationItemCreate.Serialization.cs @@ -10,14 +10,14 @@ namespace OpenAI.RealtimeConversation { - internal partial class InternalRealtimeRequestItemCreateCommand : IJsonModel + internal partial class InternalRealtimeClientEventConversationItemCreate : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeRequestItemCreateCommand)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventConversationItemCreate)} does not support writing '{format}' format."); } writer.WriteStartObject(); @@ -63,19 +63,19 @@ void IJsonModel.Write(Utf8JsonWriter w writer.WriteEndObject(); } - InternalRealtimeRequestItemCreateCommand IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + InternalRealtimeClientEventConversationItemCreate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeRequestItemCreateCommand)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventConversationItemCreate)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeInternalRealtimeRequestItemCreateCommand(document.RootElement, options); + return DeserializeInternalRealtimeClientEventConversationItemCreate(document.RootElement, options); } - internal static InternalRealtimeRequestItemCreateCommand DeserializeInternalRealtimeRequestItemCreateCommand(JsonElement element, ModelReaderWriterOptions options = null) + internal static InternalRealtimeClientEventConversationItemCreate DeserializeInternalRealtimeClientEventConversationItemCreate(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -85,7 +85,7 @@ internal static InternalRealtimeRequestItemCreateCommand DeserializeInternalReal } string previousItemId = default; ConversationItem item = default; - InternalRealtimeRequestCommandType type = default; + InternalRealtimeClientEventType type = default; string eventId = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); @@ -103,7 +103,7 @@ internal static InternalRealtimeRequestItemCreateCommand DeserializeInternalReal } if (property.NameEquals("type"u8)) { - type = new InternalRealtimeRequestCommandType(property.Value.GetString()); + type = new InternalRealtimeClientEventType(property.Value.GetString()); continue; } if (property.NameEquals("event_id"u8)) @@ -118,44 +118,44 @@ internal static InternalRealtimeRequestItemCreateCommand DeserializeInternalReal } } serializedAdditionalRawData = rawDataDictionary; - return new InternalRealtimeRequestItemCreateCommand(type, eventId, serializedAdditionalRawData, previousItemId, item); + return new InternalRealtimeClientEventConversationItemCreate(type, eventId, serializedAdditionalRawData, previousItemId, item); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(InternalRealtimeRequestItemCreateCommand)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventConversationItemCreate)} does not support writing '{options.Format}' format."); } } - InternalRealtimeRequestItemCreateCommand IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + InternalRealtimeClientEventConversationItemCreate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeInternalRealtimeRequestItemCreateCommand(document.RootElement, options); + return DeserializeInternalRealtimeClientEventConversationItemCreate(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(InternalRealtimeRequestItemCreateCommand)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventConversationItemCreate)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new InternalRealtimeRequestItemCreateCommand FromResponse(PipelineResponse response) + internal static new InternalRealtimeClientEventConversationItemCreate FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeInternalRealtimeRequestItemCreateCommand(document.RootElement); + return DeserializeInternalRealtimeClientEventConversationItemCreate(document.RootElement); } internal override BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/InternalRealtimeClientEventConversationItemCreate.cs b/src/Generated/Models/InternalRealtimeClientEventConversationItemCreate.cs new file mode 100644 index 000000000..7215a58ba --- /dev/null +++ b/src/Generated/Models/InternalRealtimeClientEventConversationItemCreate.cs @@ -0,0 +1,33 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; + +namespace OpenAI.RealtimeConversation +{ + internal partial class InternalRealtimeClientEventConversationItemCreate : InternalRealtimeClientEvent + { + public InternalRealtimeClientEventConversationItemCreate(ConversationItem item) + { + Argument.AssertNotNull(item, nameof(item)); + + Kind = InternalRealtimeClientEventType.ConversationItemCreate; + Item = item; + } + + internal InternalRealtimeClientEventConversationItemCreate(InternalRealtimeClientEventType kind, string eventId, IDictionary serializedAdditionalRawData, string previousItemId, ConversationItem item) : base(kind, eventId, serializedAdditionalRawData) + { + PreviousItemId = previousItemId; + Item = item; + } + + internal InternalRealtimeClientEventConversationItemCreate() + { + } + + public string PreviousItemId { get; set; } + public ConversationItem Item { get; } + } +} diff --git a/src/Generated/Models/InternalRealtimeRequestSessionUpdateCommand.Serialization.cs b/src/Generated/Models/InternalRealtimeClientEventConversationItemDelete.Serialization.cs similarity index 57% rename from src/Generated/Models/InternalRealtimeRequestSessionUpdateCommand.Serialization.cs rename to src/Generated/Models/InternalRealtimeClientEventConversationItemDelete.Serialization.cs index 1b97a5280..17eea40a5 100644 --- a/src/Generated/Models/InternalRealtimeRequestSessionUpdateCommand.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeClientEventConversationItemDelete.Serialization.cs @@ -10,21 +10,21 @@ namespace OpenAI.RealtimeConversation { - internal partial class InternalRealtimeRequestSessionUpdateCommand : IJsonModel + internal partial class InternalRealtimeClientEventConversationItemDelete : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeRequestSessionUpdateCommand)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventConversationItemDelete)} does not support writing '{format}' format."); } writer.WriteStartObject(); - if (SerializedAdditionalRawData?.ContainsKey("session") != true) + if (SerializedAdditionalRawData?.ContainsKey("item_id") != true) { - writer.WritePropertyName("session"u8); - writer.WriteObjectValue(Session, options); + writer.WritePropertyName("item_id"u8); + writer.WriteStringValue(ItemId); } if (SerializedAdditionalRawData?.ContainsKey("type") != true) { @@ -58,19 +58,19 @@ void IJsonModel.Write(Utf8JsonWrite writer.WriteEndObject(); } - InternalRealtimeRequestSessionUpdateCommand IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + InternalRealtimeClientEventConversationItemDelete IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeRequestSessionUpdateCommand)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventConversationItemDelete)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeInternalRealtimeRequestSessionUpdateCommand(document.RootElement, options); + return DeserializeInternalRealtimeClientEventConversationItemDelete(document.RootElement, options); } - internal static InternalRealtimeRequestSessionUpdateCommand DeserializeInternalRealtimeRequestSessionUpdateCommand(JsonElement element, ModelReaderWriterOptions options = null) + internal static InternalRealtimeClientEventConversationItemDelete DeserializeInternalRealtimeClientEventConversationItemDelete(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -78,21 +78,21 @@ internal static InternalRealtimeRequestSessionUpdateCommand DeserializeInternalR { return null; } - ConversationSessionOptions session = default; - InternalRealtimeRequestCommandType type = default; + string itemId = default; + InternalRealtimeClientEventType type = default; string eventId = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); foreach (var property in element.EnumerateObject()) { - if (property.NameEquals("session"u8)) + if (property.NameEquals("item_id"u8)) { - session = ConversationSessionOptions.DeserializeConversationSessionOptions(property.Value, options); + itemId = property.Value.GetString(); continue; } if (property.NameEquals("type"u8)) { - type = new InternalRealtimeRequestCommandType(property.Value.GetString()); + type = new InternalRealtimeClientEventType(property.Value.GetString()); continue; } if (property.NameEquals("event_id"u8)) @@ -107,44 +107,44 @@ internal static InternalRealtimeRequestSessionUpdateCommand DeserializeInternalR } } serializedAdditionalRawData = rawDataDictionary; - return new InternalRealtimeRequestSessionUpdateCommand(type, eventId, serializedAdditionalRawData, session); + return new InternalRealtimeClientEventConversationItemDelete(type, eventId, serializedAdditionalRawData, itemId); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(InternalRealtimeRequestSessionUpdateCommand)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventConversationItemDelete)} does not support writing '{options.Format}' format."); } } - InternalRealtimeRequestSessionUpdateCommand IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + InternalRealtimeClientEventConversationItemDelete IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeInternalRealtimeRequestSessionUpdateCommand(document.RootElement, options); + return DeserializeInternalRealtimeClientEventConversationItemDelete(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(InternalRealtimeRequestSessionUpdateCommand)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventConversationItemDelete)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new InternalRealtimeRequestSessionUpdateCommand FromResponse(PipelineResponse response) + internal static new InternalRealtimeClientEventConversationItemDelete FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeInternalRealtimeRequestSessionUpdateCommand(document.RootElement); + return DeserializeInternalRealtimeClientEventConversationItemDelete(document.RootElement); } internal override BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/InternalRealtimeClientEventConversationItemDelete.cs b/src/Generated/Models/InternalRealtimeClientEventConversationItemDelete.cs new file mode 100644 index 000000000..4a446bda4 --- /dev/null +++ b/src/Generated/Models/InternalRealtimeClientEventConversationItemDelete.cs @@ -0,0 +1,31 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; + +namespace OpenAI.RealtimeConversation +{ + internal partial class InternalRealtimeClientEventConversationItemDelete : InternalRealtimeClientEvent + { + public InternalRealtimeClientEventConversationItemDelete(string itemId) + { + Argument.AssertNotNull(itemId, nameof(itemId)); + + Kind = InternalRealtimeClientEventType.ConversationItemDelete; + ItemId = itemId; + } + + internal InternalRealtimeClientEventConversationItemDelete(InternalRealtimeClientEventType kind, string eventId, IDictionary serializedAdditionalRawData, string itemId) : base(kind, eventId, serializedAdditionalRawData) + { + ItemId = itemId; + } + + internal InternalRealtimeClientEventConversationItemDelete() + { + } + + public string ItemId { get; } + } +} diff --git a/src/Generated/Models/InternalRealtimeRequestItemTruncateCommand.Serialization.cs b/src/Generated/Models/InternalRealtimeClientEventConversationItemTruncate.Serialization.cs similarity index 67% rename from src/Generated/Models/InternalRealtimeRequestItemTruncateCommand.Serialization.cs rename to src/Generated/Models/InternalRealtimeClientEventConversationItemTruncate.Serialization.cs index 905f64da1..082cc9699 100644 --- a/src/Generated/Models/InternalRealtimeRequestItemTruncateCommand.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeClientEventConversationItemTruncate.Serialization.cs @@ -10,14 +10,14 @@ namespace OpenAI.RealtimeConversation { - internal partial class InternalRealtimeRequestItemTruncateCommand : IJsonModel + internal partial class InternalRealtimeClientEventConversationItemTruncate : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeRequestItemTruncateCommand)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventConversationItemTruncate)} does not support writing '{format}' format."); } writer.WriteStartObject(); @@ -68,19 +68,19 @@ void IJsonModel.Write(Utf8JsonWriter writer.WriteEndObject(); } - InternalRealtimeRequestItemTruncateCommand IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + InternalRealtimeClientEventConversationItemTruncate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeRequestItemTruncateCommand)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventConversationItemTruncate)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeInternalRealtimeRequestItemTruncateCommand(document.RootElement, options); + return DeserializeInternalRealtimeClientEventConversationItemTruncate(document.RootElement, options); } - internal static InternalRealtimeRequestItemTruncateCommand DeserializeInternalRealtimeRequestItemTruncateCommand(JsonElement element, ModelReaderWriterOptions options = null) + internal static InternalRealtimeClientEventConversationItemTruncate DeserializeInternalRealtimeClientEventConversationItemTruncate(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -91,7 +91,7 @@ internal static InternalRealtimeRequestItemTruncateCommand DeserializeInternalRe string itemId = default; int contentIndex = default; int audioEndMs = default; - InternalRealtimeRequestCommandType type = default; + InternalRealtimeClientEventType type = default; string eventId = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); @@ -114,7 +114,7 @@ internal static InternalRealtimeRequestItemTruncateCommand DeserializeInternalRe } if (property.NameEquals("type"u8)) { - type = new InternalRealtimeRequestCommandType(property.Value.GetString()); + type = new InternalRealtimeClientEventType(property.Value.GetString()); continue; } if (property.NameEquals("event_id"u8)) @@ -129,7 +129,7 @@ internal static InternalRealtimeRequestItemTruncateCommand DeserializeInternalRe } } serializedAdditionalRawData = rawDataDictionary; - return new InternalRealtimeRequestItemTruncateCommand( + return new InternalRealtimeClientEventConversationItemTruncate( type, eventId, serializedAdditionalRawData, @@ -138,41 +138,41 @@ internal static InternalRealtimeRequestItemTruncateCommand DeserializeInternalRe audioEndMs); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(InternalRealtimeRequestItemTruncateCommand)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventConversationItemTruncate)} does not support writing '{options.Format}' format."); } } - InternalRealtimeRequestItemTruncateCommand IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + InternalRealtimeClientEventConversationItemTruncate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeInternalRealtimeRequestItemTruncateCommand(document.RootElement, options); + return DeserializeInternalRealtimeClientEventConversationItemTruncate(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(InternalRealtimeRequestItemTruncateCommand)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventConversationItemTruncate)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new InternalRealtimeRequestItemTruncateCommand FromResponse(PipelineResponse response) + internal static new InternalRealtimeClientEventConversationItemTruncate FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeInternalRealtimeRequestItemTruncateCommand(document.RootElement); + return DeserializeInternalRealtimeClientEventConversationItemTruncate(document.RootElement); } internal override BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/InternalRealtimeClientEventConversationItemTruncate.cs b/src/Generated/Models/InternalRealtimeClientEventConversationItemTruncate.cs new file mode 100644 index 000000000..d69ec334b --- /dev/null +++ b/src/Generated/Models/InternalRealtimeClientEventConversationItemTruncate.cs @@ -0,0 +1,37 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; + +namespace OpenAI.RealtimeConversation +{ + internal partial class InternalRealtimeClientEventConversationItemTruncate : InternalRealtimeClientEvent + { + public InternalRealtimeClientEventConversationItemTruncate(string itemId, int contentIndex, int audioEndMs) + { + Argument.AssertNotNull(itemId, nameof(itemId)); + + Kind = InternalRealtimeClientEventType.ConversationItemTruncate; + ItemId = itemId; + ContentIndex = contentIndex; + AudioEndMs = audioEndMs; + } + + internal InternalRealtimeClientEventConversationItemTruncate(InternalRealtimeClientEventType kind, string eventId, IDictionary serializedAdditionalRawData, string itemId, int contentIndex, int audioEndMs) : base(kind, eventId, serializedAdditionalRawData) + { + ItemId = itemId; + ContentIndex = contentIndex; + AudioEndMs = audioEndMs; + } + + internal InternalRealtimeClientEventConversationItemTruncate() + { + } + + public string ItemId { get; } + public int ContentIndex { get; } + public int AudioEndMs { get; } + } +} diff --git a/src/Generated/Models/InternalRealtimeRequestInputAudioBufferAppendCommand.Serialization.cs b/src/Generated/Models/InternalRealtimeClientEventInputAudioBufferAppend.Serialization.cs similarity index 61% rename from src/Generated/Models/InternalRealtimeRequestInputAudioBufferAppendCommand.Serialization.cs rename to src/Generated/Models/InternalRealtimeClientEventInputAudioBufferAppend.Serialization.cs index ccf6cdaae..55ef0ecc1 100644 --- a/src/Generated/Models/InternalRealtimeRequestInputAudioBufferAppendCommand.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeClientEventInputAudioBufferAppend.Serialization.cs @@ -10,14 +10,14 @@ namespace OpenAI.RealtimeConversation { - internal partial class InternalRealtimeRequestInputAudioBufferAppendCommand : IJsonModel + internal partial class InternalRealtimeClientEventInputAudioBufferAppend : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeRequestInputAudioBufferAppendCommand)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventInputAudioBufferAppend)} does not support writing '{format}' format."); } writer.WriteStartObject(); @@ -58,19 +58,19 @@ void IJsonModel.Write(Utf8 writer.WriteEndObject(); } - InternalRealtimeRequestInputAudioBufferAppendCommand IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + InternalRealtimeClientEventInputAudioBufferAppend IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeRequestInputAudioBufferAppendCommand)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventInputAudioBufferAppend)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeInternalRealtimeRequestInputAudioBufferAppendCommand(document.RootElement, options); + return DeserializeInternalRealtimeClientEventInputAudioBufferAppend(document.RootElement, options); } - internal static InternalRealtimeRequestInputAudioBufferAppendCommand DeserializeInternalRealtimeRequestInputAudioBufferAppendCommand(JsonElement element, ModelReaderWriterOptions options = null) + internal static InternalRealtimeClientEventInputAudioBufferAppend DeserializeInternalRealtimeClientEventInputAudioBufferAppend(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -79,7 +79,7 @@ internal static InternalRealtimeRequestInputAudioBufferAppendCommand Deserialize return null; } BinaryData audio = default; - InternalRealtimeRequestCommandType type = default; + InternalRealtimeClientEventType type = default; string eventId = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); @@ -92,7 +92,7 @@ internal static InternalRealtimeRequestInputAudioBufferAppendCommand Deserialize } if (property.NameEquals("type"u8)) { - type = new InternalRealtimeRequestCommandType(property.Value.GetString()); + type = new InternalRealtimeClientEventType(property.Value.GetString()); continue; } if (property.NameEquals("event_id"u8)) @@ -107,44 +107,44 @@ internal static InternalRealtimeRequestInputAudioBufferAppendCommand Deserialize } } serializedAdditionalRawData = rawDataDictionary; - return new InternalRealtimeRequestInputAudioBufferAppendCommand(type, eventId, serializedAdditionalRawData, audio); + return new InternalRealtimeClientEventInputAudioBufferAppend(type, eventId, serializedAdditionalRawData, audio); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(InternalRealtimeRequestInputAudioBufferAppendCommand)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventInputAudioBufferAppend)} does not support writing '{options.Format}' format."); } } - InternalRealtimeRequestInputAudioBufferAppendCommand IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + InternalRealtimeClientEventInputAudioBufferAppend IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeInternalRealtimeRequestInputAudioBufferAppendCommand(document.RootElement, options); + return DeserializeInternalRealtimeClientEventInputAudioBufferAppend(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(InternalRealtimeRequestInputAudioBufferAppendCommand)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventInputAudioBufferAppend)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new InternalRealtimeRequestInputAudioBufferAppendCommand FromResponse(PipelineResponse response) + internal static new InternalRealtimeClientEventInputAudioBufferAppend FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeInternalRealtimeRequestInputAudioBufferAppendCommand(document.RootElement); + return DeserializeInternalRealtimeClientEventInputAudioBufferAppend(document.RootElement); } internal override BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/InternalRealtimeClientEventInputAudioBufferAppend.cs b/src/Generated/Models/InternalRealtimeClientEventInputAudioBufferAppend.cs new file mode 100644 index 000000000..908a3010d --- /dev/null +++ b/src/Generated/Models/InternalRealtimeClientEventInputAudioBufferAppend.cs @@ -0,0 +1,31 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; + +namespace OpenAI.RealtimeConversation +{ + internal partial class InternalRealtimeClientEventInputAudioBufferAppend : InternalRealtimeClientEvent + { + public InternalRealtimeClientEventInputAudioBufferAppend(BinaryData audio) + { + Argument.AssertNotNull(audio, nameof(audio)); + + Kind = InternalRealtimeClientEventType.InputAudioBufferAppend; + Audio = audio; + } + + internal InternalRealtimeClientEventInputAudioBufferAppend(InternalRealtimeClientEventType kind, string eventId, IDictionary serializedAdditionalRawData, BinaryData audio) : base(kind, eventId, serializedAdditionalRawData) + { + Audio = audio; + } + + internal InternalRealtimeClientEventInputAudioBufferAppend() + { + } + + public BinaryData Audio { get; } + } +} diff --git a/src/Generated/Models/InternalRealtimeRequestInputAudioBufferClearCommand.Serialization.cs b/src/Generated/Models/InternalRealtimeClientEventInputAudioBufferClear.Serialization.cs similarity index 59% rename from src/Generated/Models/InternalRealtimeRequestInputAudioBufferClearCommand.Serialization.cs rename to src/Generated/Models/InternalRealtimeClientEventInputAudioBufferClear.Serialization.cs index 62cde6232..b40fd35bb 100644 --- a/src/Generated/Models/InternalRealtimeRequestInputAudioBufferClearCommand.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeClientEventInputAudioBufferClear.Serialization.cs @@ -10,14 +10,14 @@ namespace OpenAI.RealtimeConversation { - internal partial class InternalRealtimeRequestInputAudioBufferClearCommand : IJsonModel + internal partial class InternalRealtimeClientEventInputAudioBufferClear : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeRequestInputAudioBufferClearCommand)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventInputAudioBufferClear)} does not support writing '{format}' format."); } writer.WriteStartObject(); @@ -53,19 +53,19 @@ void IJsonModel.Write(Utf8J writer.WriteEndObject(); } - InternalRealtimeRequestInputAudioBufferClearCommand IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + InternalRealtimeClientEventInputAudioBufferClear IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeRequestInputAudioBufferClearCommand)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventInputAudioBufferClear)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeInternalRealtimeRequestInputAudioBufferClearCommand(document.RootElement, options); + return DeserializeInternalRealtimeClientEventInputAudioBufferClear(document.RootElement, options); } - internal static InternalRealtimeRequestInputAudioBufferClearCommand DeserializeInternalRealtimeRequestInputAudioBufferClearCommand(JsonElement element, ModelReaderWriterOptions options = null) + internal static InternalRealtimeClientEventInputAudioBufferClear DeserializeInternalRealtimeClientEventInputAudioBufferClear(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -73,7 +73,7 @@ internal static InternalRealtimeRequestInputAudioBufferClearCommand DeserializeI { return null; } - InternalRealtimeRequestCommandType type = default; + InternalRealtimeClientEventType type = default; string eventId = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); @@ -81,7 +81,7 @@ internal static InternalRealtimeRequestInputAudioBufferClearCommand DeserializeI { if (property.NameEquals("type"u8)) { - type = new InternalRealtimeRequestCommandType(property.Value.GetString()); + type = new InternalRealtimeClientEventType(property.Value.GetString()); continue; } if (property.NameEquals("event_id"u8)) @@ -96,44 +96,44 @@ internal static InternalRealtimeRequestInputAudioBufferClearCommand DeserializeI } } serializedAdditionalRawData = rawDataDictionary; - return new InternalRealtimeRequestInputAudioBufferClearCommand(type, eventId, serializedAdditionalRawData); + return new InternalRealtimeClientEventInputAudioBufferClear(type, eventId, serializedAdditionalRawData); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(InternalRealtimeRequestInputAudioBufferClearCommand)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventInputAudioBufferClear)} does not support writing '{options.Format}' format."); } } - InternalRealtimeRequestInputAudioBufferClearCommand IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + InternalRealtimeClientEventInputAudioBufferClear IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeInternalRealtimeRequestInputAudioBufferClearCommand(document.RootElement, options); + return DeserializeInternalRealtimeClientEventInputAudioBufferClear(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(InternalRealtimeRequestInputAudioBufferClearCommand)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventInputAudioBufferClear)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new InternalRealtimeRequestInputAudioBufferClearCommand FromResponse(PipelineResponse response) + internal static new InternalRealtimeClientEventInputAudioBufferClear FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeInternalRealtimeRequestInputAudioBufferClearCommand(document.RootElement); + return DeserializeInternalRealtimeClientEventInputAudioBufferClear(document.RootElement); } internal override BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/InternalRealtimeClientEventInputAudioBufferClear.cs b/src/Generated/Models/InternalRealtimeClientEventInputAudioBufferClear.cs new file mode 100644 index 000000000..f1012e175 --- /dev/null +++ b/src/Generated/Models/InternalRealtimeClientEventInputAudioBufferClear.cs @@ -0,0 +1,21 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; + +namespace OpenAI.RealtimeConversation +{ + internal partial class InternalRealtimeClientEventInputAudioBufferClear : InternalRealtimeClientEvent + { + public InternalRealtimeClientEventInputAudioBufferClear() + { + Kind = InternalRealtimeClientEventType.InputAudioBufferClear; + } + + internal InternalRealtimeClientEventInputAudioBufferClear(InternalRealtimeClientEventType kind, string eventId, IDictionary serializedAdditionalRawData) : base(kind, eventId, serializedAdditionalRawData) + { + } + } +} diff --git a/src/Generated/Models/InternalRealtimeRequestInputAudioBufferCommitCommand.Serialization.cs b/src/Generated/Models/InternalRealtimeClientEventInputAudioBufferCommit.Serialization.cs similarity index 59% rename from src/Generated/Models/InternalRealtimeRequestInputAudioBufferCommitCommand.Serialization.cs rename to src/Generated/Models/InternalRealtimeClientEventInputAudioBufferCommit.Serialization.cs index eff8f8871..6466a1da1 100644 --- a/src/Generated/Models/InternalRealtimeRequestInputAudioBufferCommitCommand.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeClientEventInputAudioBufferCommit.Serialization.cs @@ -10,14 +10,14 @@ namespace OpenAI.RealtimeConversation { - internal partial class InternalRealtimeRequestInputAudioBufferCommitCommand : IJsonModel + internal partial class InternalRealtimeClientEventInputAudioBufferCommit : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeRequestInputAudioBufferCommitCommand)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventInputAudioBufferCommit)} does not support writing '{format}' format."); } writer.WriteStartObject(); @@ -53,19 +53,19 @@ void IJsonModel.Write(Utf8 writer.WriteEndObject(); } - InternalRealtimeRequestInputAudioBufferCommitCommand IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + InternalRealtimeClientEventInputAudioBufferCommit IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeRequestInputAudioBufferCommitCommand)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventInputAudioBufferCommit)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeInternalRealtimeRequestInputAudioBufferCommitCommand(document.RootElement, options); + return DeserializeInternalRealtimeClientEventInputAudioBufferCommit(document.RootElement, options); } - internal static InternalRealtimeRequestInputAudioBufferCommitCommand DeserializeInternalRealtimeRequestInputAudioBufferCommitCommand(JsonElement element, ModelReaderWriterOptions options = null) + internal static InternalRealtimeClientEventInputAudioBufferCommit DeserializeInternalRealtimeClientEventInputAudioBufferCommit(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -73,7 +73,7 @@ internal static InternalRealtimeRequestInputAudioBufferCommitCommand Deserialize { return null; } - InternalRealtimeRequestCommandType type = default; + InternalRealtimeClientEventType type = default; string eventId = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); @@ -81,7 +81,7 @@ internal static InternalRealtimeRequestInputAudioBufferCommitCommand Deserialize { if (property.NameEquals("type"u8)) { - type = new InternalRealtimeRequestCommandType(property.Value.GetString()); + type = new InternalRealtimeClientEventType(property.Value.GetString()); continue; } if (property.NameEquals("event_id"u8)) @@ -96,44 +96,44 @@ internal static InternalRealtimeRequestInputAudioBufferCommitCommand Deserialize } } serializedAdditionalRawData = rawDataDictionary; - return new InternalRealtimeRequestInputAudioBufferCommitCommand(type, eventId, serializedAdditionalRawData); + return new InternalRealtimeClientEventInputAudioBufferCommit(type, eventId, serializedAdditionalRawData); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(InternalRealtimeRequestInputAudioBufferCommitCommand)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventInputAudioBufferCommit)} does not support writing '{options.Format}' format."); } } - InternalRealtimeRequestInputAudioBufferCommitCommand IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + InternalRealtimeClientEventInputAudioBufferCommit IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeInternalRealtimeRequestInputAudioBufferCommitCommand(document.RootElement, options); + return DeserializeInternalRealtimeClientEventInputAudioBufferCommit(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(InternalRealtimeRequestInputAudioBufferCommitCommand)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventInputAudioBufferCommit)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new InternalRealtimeRequestInputAudioBufferCommitCommand FromResponse(PipelineResponse response) + internal static new InternalRealtimeClientEventInputAudioBufferCommit FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeInternalRealtimeRequestInputAudioBufferCommitCommand(document.RootElement); + return DeserializeInternalRealtimeClientEventInputAudioBufferCommit(document.RootElement); } internal override BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/InternalRealtimeClientEventInputAudioBufferCommit.cs b/src/Generated/Models/InternalRealtimeClientEventInputAudioBufferCommit.cs new file mode 100644 index 000000000..5cf2fe381 --- /dev/null +++ b/src/Generated/Models/InternalRealtimeClientEventInputAudioBufferCommit.cs @@ -0,0 +1,21 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; + +namespace OpenAI.RealtimeConversation +{ + internal partial class InternalRealtimeClientEventInputAudioBufferCommit : InternalRealtimeClientEvent + { + public InternalRealtimeClientEventInputAudioBufferCommit() + { + Kind = InternalRealtimeClientEventType.InputAudioBufferCommit; + } + + internal InternalRealtimeClientEventInputAudioBufferCommit(InternalRealtimeClientEventType kind, string eventId, IDictionary serializedAdditionalRawData) : base(kind, eventId, serializedAdditionalRawData) + { + } + } +} diff --git a/src/Generated/Models/InternalRealtimeRequestResponseCancelCommand.Serialization.cs b/src/Generated/Models/InternalRealtimeClientEventResponseCancel.Serialization.cs similarity index 60% rename from src/Generated/Models/InternalRealtimeRequestResponseCancelCommand.Serialization.cs rename to src/Generated/Models/InternalRealtimeClientEventResponseCancel.Serialization.cs index 37f4c8d58..1aeb18e83 100644 --- a/src/Generated/Models/InternalRealtimeRequestResponseCancelCommand.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeClientEventResponseCancel.Serialization.cs @@ -10,14 +10,14 @@ namespace OpenAI.RealtimeConversation { - internal partial class InternalRealtimeRequestResponseCancelCommand : IJsonModel + internal partial class InternalRealtimeClientEventResponseCancel : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeRequestResponseCancelCommand)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventResponseCancel)} does not support writing '{format}' format."); } writer.WriteStartObject(); @@ -53,19 +53,19 @@ void IJsonModel.Write(Utf8JsonWrit writer.WriteEndObject(); } - InternalRealtimeRequestResponseCancelCommand IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + InternalRealtimeClientEventResponseCancel IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeRequestResponseCancelCommand)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventResponseCancel)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeInternalRealtimeRequestResponseCancelCommand(document.RootElement, options); + return DeserializeInternalRealtimeClientEventResponseCancel(document.RootElement, options); } - internal static InternalRealtimeRequestResponseCancelCommand DeserializeInternalRealtimeRequestResponseCancelCommand(JsonElement element, ModelReaderWriterOptions options = null) + internal static InternalRealtimeClientEventResponseCancel DeserializeInternalRealtimeClientEventResponseCancel(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -73,7 +73,7 @@ internal static InternalRealtimeRequestResponseCancelCommand DeserializeInternal { return null; } - InternalRealtimeRequestCommandType type = default; + InternalRealtimeClientEventType type = default; string eventId = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); @@ -81,7 +81,7 @@ internal static InternalRealtimeRequestResponseCancelCommand DeserializeInternal { if (property.NameEquals("type"u8)) { - type = new InternalRealtimeRequestCommandType(property.Value.GetString()); + type = new InternalRealtimeClientEventType(property.Value.GetString()); continue; } if (property.NameEquals("event_id"u8)) @@ -96,44 +96,44 @@ internal static InternalRealtimeRequestResponseCancelCommand DeserializeInternal } } serializedAdditionalRawData = rawDataDictionary; - return new InternalRealtimeRequestResponseCancelCommand(type, eventId, serializedAdditionalRawData); + return new InternalRealtimeClientEventResponseCancel(type, eventId, serializedAdditionalRawData); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(InternalRealtimeRequestResponseCancelCommand)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventResponseCancel)} does not support writing '{options.Format}' format."); } } - InternalRealtimeRequestResponseCancelCommand IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + InternalRealtimeClientEventResponseCancel IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeInternalRealtimeRequestResponseCancelCommand(document.RootElement, options); + return DeserializeInternalRealtimeClientEventResponseCancel(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(InternalRealtimeRequestResponseCancelCommand)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventResponseCancel)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new InternalRealtimeRequestResponseCancelCommand FromResponse(PipelineResponse response) + internal static new InternalRealtimeClientEventResponseCancel FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeInternalRealtimeRequestResponseCancelCommand(document.RootElement); + return DeserializeInternalRealtimeClientEventResponseCancel(document.RootElement); } internal override BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/InternalRealtimeClientEventResponseCancel.cs b/src/Generated/Models/InternalRealtimeClientEventResponseCancel.cs new file mode 100644 index 000000000..f657c401f --- /dev/null +++ b/src/Generated/Models/InternalRealtimeClientEventResponseCancel.cs @@ -0,0 +1,21 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; + +namespace OpenAI.RealtimeConversation +{ + internal partial class InternalRealtimeClientEventResponseCancel : InternalRealtimeClientEvent + { + public InternalRealtimeClientEventResponseCancel() + { + Kind = InternalRealtimeClientEventType.ResponseCancel; + } + + internal InternalRealtimeClientEventResponseCancel(InternalRealtimeClientEventType kind, string eventId, IDictionary serializedAdditionalRawData) : base(kind, eventId, serializedAdditionalRawData) + { + } + } +} diff --git a/src/Generated/Models/ConversationInputAudioBufferClearedUpdate.Serialization.cs b/src/Generated/Models/InternalRealtimeClientEventResponseCreate.Serialization.cs similarity index 59% rename from src/Generated/Models/ConversationInputAudioBufferClearedUpdate.Serialization.cs rename to src/Generated/Models/InternalRealtimeClientEventResponseCreate.Serialization.cs index 94d7c421c..85a61db42 100644 --- a/src/Generated/Models/ConversationInputAudioBufferClearedUpdate.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeClientEventResponseCreate.Serialization.cs @@ -10,33 +10,31 @@ namespace OpenAI.RealtimeConversation { - public partial class ConversationInputAudioBufferClearedUpdate : IJsonModel + internal partial class InternalRealtimeClientEventResponseCreate : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationInputAudioBufferClearedUpdate)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventResponseCreate)} does not support writing '{format}' format."); } writer.WriteStartObject(); + if (SerializedAdditionalRawData?.ContainsKey("response") != true) + { + writer.WritePropertyName("response"u8); + writer.WriteObjectValue(Response, options); + } if (SerializedAdditionalRawData?.ContainsKey("type") != true) { writer.WritePropertyName("type"u8); - writer.WriteStringValue(Kind.ToSerialString()); + writer.WriteStringValue(Kind.ToString()); } - if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) + if (SerializedAdditionalRawData?.ContainsKey("event_id") != true && Optional.IsDefined(EventId)) { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -60,19 +58,19 @@ void IJsonModel.Write(Utf8JsonWriter writer.WriteEndObject(); } - ConversationInputAudioBufferClearedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + InternalRealtimeClientEventResponseCreate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationInputAudioBufferClearedUpdate)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventResponseCreate)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeConversationInputAudioBufferClearedUpdate(document.RootElement, options); + return DeserializeInternalRealtimeClientEventResponseCreate(document.RootElement, options); } - internal static ConversationInputAudioBufferClearedUpdate DeserializeConversationInputAudioBufferClearedUpdate(JsonElement element, ModelReaderWriterOptions options = null) + internal static InternalRealtimeClientEventResponseCreate DeserializeInternalRealtimeClientEventResponseCreate(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -80,24 +78,25 @@ internal static ConversationInputAudioBufferClearedUpdate DeserializeConversatio { return null; } - ConversationUpdateKind type = default; + InternalRealtimeClientEventResponseCreateResponse response = default; + InternalRealtimeClientEventType type = default; string eventId = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); foreach (var property in element.EnumerateObject()) { + if (property.NameEquals("response"u8)) + { + response = InternalRealtimeClientEventResponseCreateResponse.DeserializeInternalRealtimeClientEventResponseCreateResponse(property.Value, options); + continue; + } if (property.NameEquals("type"u8)) { - type = property.Value.GetString().ToConversationUpdateKind(); + type = new InternalRealtimeClientEventType(property.Value.GetString()); continue; } if (property.NameEquals("event_id"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - eventId = null; - continue; - } eventId = property.Value.GetString(); continue; } @@ -108,44 +107,44 @@ internal static ConversationInputAudioBufferClearedUpdate DeserializeConversatio } } serializedAdditionalRawData = rawDataDictionary; - return new ConversationInputAudioBufferClearedUpdate(type, eventId, serializedAdditionalRawData); + return new InternalRealtimeClientEventResponseCreate(type, eventId, serializedAdditionalRawData, response); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(ConversationInputAudioBufferClearedUpdate)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventResponseCreate)} does not support writing '{options.Format}' format."); } } - ConversationInputAudioBufferClearedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + InternalRealtimeClientEventResponseCreate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeConversationInputAudioBufferClearedUpdate(document.RootElement, options); + return DeserializeInternalRealtimeClientEventResponseCreate(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(ConversationInputAudioBufferClearedUpdate)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventResponseCreate)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new ConversationInputAudioBufferClearedUpdate FromResponse(PipelineResponse response) + internal static new InternalRealtimeClientEventResponseCreate FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeConversationInputAudioBufferClearedUpdate(document.RootElement); + return DeserializeInternalRealtimeClientEventResponseCreate(document.RootElement); } internal override BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/InternalRealtimeClientEventResponseCreate.cs b/src/Generated/Models/InternalRealtimeClientEventResponseCreate.cs new file mode 100644 index 000000000..93cdb4261 --- /dev/null +++ b/src/Generated/Models/InternalRealtimeClientEventResponseCreate.cs @@ -0,0 +1,31 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; + +namespace OpenAI.RealtimeConversation +{ + internal partial class InternalRealtimeClientEventResponseCreate : InternalRealtimeClientEvent + { + public InternalRealtimeClientEventResponseCreate(InternalRealtimeClientEventResponseCreateResponse response) + { + Argument.AssertNotNull(response, nameof(response)); + + Kind = InternalRealtimeClientEventType.ResponseCreate; + Response = response; + } + + internal InternalRealtimeClientEventResponseCreate(InternalRealtimeClientEventType kind, string eventId, IDictionary serializedAdditionalRawData, InternalRealtimeClientEventResponseCreateResponse response) : base(kind, eventId, serializedAdditionalRawData) + { + Response = response; + } + + internal InternalRealtimeClientEventResponseCreate() + { + } + + public InternalRealtimeClientEventResponseCreateResponse Response { get; } + } +} diff --git a/src/Generated/Models/InternalRealtimeRequestResponseCreateCommandResponse.Serialization.cs b/src/Generated/Models/InternalRealtimeClientEventResponseCreateResponse.Serialization.cs similarity index 53% rename from src/Generated/Models/InternalRealtimeRequestResponseCreateCommandResponse.Serialization.cs rename to src/Generated/Models/InternalRealtimeClientEventResponseCreateResponse.Serialization.cs index 8c1a8332c..e44ae3928 100644 --- a/src/Generated/Models/InternalRealtimeRequestResponseCreateCommandResponse.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeClientEventResponseCreateResponse.Serialization.cs @@ -10,44 +10,24 @@ namespace OpenAI.RealtimeConversation { - internal partial class InternalRealtimeRequestResponseCreateCommandResponse : IJsonModel + internal partial class InternalRealtimeClientEventResponseCreateResponse : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeRequestResponseCreateCommandResponse)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventResponseCreateResponse)} does not support writing '{format}' format."); } writer.WriteStartObject(); - if (SerializedAdditionalRawData?.ContainsKey("commit") != true) - { - writer.WritePropertyName("commit"u8); - writer.WriteBooleanValue(Commit); - } - if (SerializedAdditionalRawData?.ContainsKey("cancel_previous") != true) - { - writer.WritePropertyName("cancel_previous"u8); - writer.WriteBooleanValue(CancelPrevious); - } - if (SerializedAdditionalRawData?.ContainsKey("append_input_items") != true && Optional.IsCollectionDefined(AppendInputItems)) - { - writer.WritePropertyName("append_input_items"u8); - writer.WriteStartArray(); - foreach (var item in AppendInputItems) - { - writer.WriteObjectValue(item, options); - } - writer.WriteEndArray(); - } - if (SerializedAdditionalRawData?.ContainsKey("input_items") != true && Optional.IsCollectionDefined(InputItems)) + if (SerializedAdditionalRawData?.ContainsKey("modalities") != true && Optional.IsCollectionDefined(Modalities)) { - writer.WritePropertyName("input_items"u8); + writer.WritePropertyName("modalities"u8); writer.WriteStartArray(); - foreach (var item in InputItems) + foreach (var item in Modalities) { - writer.WriteObjectValue(item, options); + writer.WriteStringValue(item); } writer.WriteEndArray(); } @@ -56,44 +36,15 @@ void IJsonModel.Write(Utf8 writer.WritePropertyName("instructions"u8); writer.WriteStringValue(Instructions); } - if (SerializedAdditionalRawData?.ContainsKey("modalities") != true && Optional.IsCollectionDefined(Modalities)) - { - writer.WritePropertyName("modalities"u8); - writer.WriteStartArray(); - foreach (var item in Modalities) - { - writer.WriteStringValue(item.ToString()); - } - writer.WriteEndArray(); - } if (SerializedAdditionalRawData?.ContainsKey("voice") != true && Optional.IsDefined(Voice)) { writer.WritePropertyName("voice"u8); - writer.WriteStringValue(Voice.Value.ToString()); - } - if (SerializedAdditionalRawData?.ContainsKey("temperature") != true && Optional.IsDefined(Temperature)) - { - writer.WritePropertyName("temperature"u8); - writer.WriteNumberValue(Temperature.Value); + writer.WriteStringValue(Voice); } - if (SerializedAdditionalRawData?.ContainsKey("max_output_tokens") != true && Optional.IsDefined(MaxOutputTokens)) + if (SerializedAdditionalRawData?.ContainsKey("output_audio_format") != true && Optional.IsDefined(OutputAudioFormat)) { - if (MaxOutputTokens != null) - { - writer.WritePropertyName("max_output_tokens"u8); -#if NET6_0_OR_GREATER - writer.WriteRawValue(MaxOutputTokens); -#else - using (JsonDocument document = JsonDocument.Parse(MaxOutputTokens)) - { - JsonSerializer.Serialize(writer, document.RootElement); - } -#endif - } - else - { - writer.WriteNull("max_output_tokens"); - } + writer.WritePropertyName("output_audio_format"u8); + writer.WriteStringValue(OutputAudioFormat); } if (SerializedAdditionalRawData?.ContainsKey("tools") != true && Optional.IsCollectionDefined(Tools)) { @@ -117,10 +68,22 @@ void IJsonModel.Write(Utf8 } #endif } - if (SerializedAdditionalRawData?.ContainsKey("output_audio_format") != true && Optional.IsDefined(OutputAudioFormat)) + if (SerializedAdditionalRawData?.ContainsKey("temperature") != true && Optional.IsDefined(Temperature)) { - writer.WritePropertyName("output_audio_format"u8); - writer.WriteStringValue(OutputAudioFormat.Value.ToString()); + writer.WritePropertyName("temperature"u8); + writer.WriteNumberValue(Temperature.Value); + } + if (SerializedAdditionalRawData?.ContainsKey("max_output_tokens") != true && Optional.IsDefined(MaxOutputTokens)) + { + writer.WritePropertyName("max_output_tokens"u8); +#if NET6_0_OR_GREATER + writer.WriteRawValue(MaxOutputTokens); +#else + using (JsonDocument document = JsonDocument.Parse(MaxOutputTokens)) + { + JsonSerializer.Serialize(writer, document.RootElement); + } +#endif } if (SerializedAdditionalRawData != null) { @@ -144,19 +107,19 @@ void IJsonModel.Write(Utf8 writer.WriteEndObject(); } - InternalRealtimeRequestResponseCreateCommandResponse IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + InternalRealtimeClientEventResponseCreateResponse IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeRequestResponseCreateCommandResponse)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventResponseCreateResponse)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeInternalRealtimeRequestResponseCreateCommandResponse(document.RootElement, options); + return DeserializeInternalRealtimeClientEventResponseCreateResponse(document.RootElement, options); } - internal static InternalRealtimeRequestResponseCreateCommandResponse DeserializeInternalRealtimeRequestResponseCreateCommandResponse(JsonElement element, ModelReaderWriterOptions options = null) + internal static InternalRealtimeClientEventResponseCreateResponse DeserializeInternalRealtimeClientEventResponseCreateResponse(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -164,58 +127,30 @@ internal static InternalRealtimeRequestResponseCreateCommandResponse Deserialize { return null; } - bool commit = default; - bool cancelPrevious = default; - IList appendInputItems = default; - IList inputItems = default; + IList modalities = default; string instructions = default; - IList modalities = default; - ConversationVoice? voice = default; - float? temperature = default; - BinaryData maxOutputTokens = default; + string voice = default; + string outputAudioFormat = default; IList tools = default; BinaryData toolChoice = default; - ConversationAudioFormat? outputAudioFormat = default; + float? temperature = default; + BinaryData maxOutputTokens = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); foreach (var property in element.EnumerateObject()) { - if (property.NameEquals("commit"u8)) - { - commit = property.Value.GetBoolean(); - continue; - } - if (property.NameEquals("cancel_previous"u8)) - { - cancelPrevious = property.Value.GetBoolean(); - continue; - } - if (property.NameEquals("append_input_items"u8)) - { - if (property.Value.ValueKind == JsonValueKind.Null) - { - continue; - } - List array = new List(); - foreach (var item in property.Value.EnumerateArray()) - { - array.Add(ConversationItem.DeserializeConversationItem(item, options)); - } - appendInputItems = array; - continue; - } - if (property.NameEquals("input_items"u8)) + if (property.NameEquals("modalities"u8)) { if (property.Value.ValueKind == JsonValueKind.Null) { continue; } - List array = new List(); + List array = new List(); foreach (var item in property.Value.EnumerateArray()) { - array.Add(ConversationItem.DeserializeConversationItem(item, options)); + array.Add(item.GetString()); } - inputItems = array; + modalities = array; continue; } if (property.NameEquals("instructions"u8)) @@ -223,46 +158,14 @@ internal static InternalRealtimeRequestResponseCreateCommandResponse Deserialize instructions = property.Value.GetString(); continue; } - if (property.NameEquals("modalities"u8)) - { - if (property.Value.ValueKind == JsonValueKind.Null) - { - continue; - } - List array = new List(); - foreach (var item in property.Value.EnumerateArray()) - { - array.Add(new InternalRealtimeRequestSessionUpdateCommandSessionModality(item.GetString())); - } - modalities = array; - continue; - } if (property.NameEquals("voice"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - continue; - } - voice = new ConversationVoice(property.Value.GetString()); + voice = property.Value.GetString(); continue; } - if (property.NameEquals("temperature"u8)) - { - if (property.Value.ValueKind == JsonValueKind.Null) - { - continue; - } - temperature = property.Value.GetSingle(); - continue; - } - if (property.NameEquals("max_output_tokens"u8)) + if (property.NameEquals("output_audio_format"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - maxOutputTokens = null; - continue; - } - maxOutputTokens = BinaryData.FromString(property.Value.GetRawText()); + outputAudioFormat = property.Value.GetString(); continue; } if (property.NameEquals("tools"u8)) @@ -288,13 +191,22 @@ internal static InternalRealtimeRequestResponseCreateCommandResponse Deserialize toolChoice = BinaryData.FromString(property.Value.GetRawText()); continue; } - if (property.NameEquals("output_audio_format"u8)) + if (property.NameEquals("temperature"u8)) { if (property.Value.ValueKind == JsonValueKind.Null) { continue; } - outputAudioFormat = new ConversationAudioFormat(property.Value.GetString()); + temperature = property.Value.GetSingle(); + continue; + } + if (property.NameEquals("max_output_tokens"u8)) + { + if (property.Value.ValueKind == JsonValueKind.Null) + { + continue; + } + maxOutputTokens = BinaryData.FromString(property.Value.GetRawText()); continue; } if (true) @@ -304,57 +216,53 @@ internal static InternalRealtimeRequestResponseCreateCommandResponse Deserialize } } serializedAdditionalRawData = rawDataDictionary; - return new InternalRealtimeRequestResponseCreateCommandResponse( - commit, - cancelPrevious, - appendInputItems ?? new ChangeTrackingList(), - inputItems ?? new ChangeTrackingList(), + return new InternalRealtimeClientEventResponseCreateResponse( + modalities ?? new ChangeTrackingList(), instructions, - modalities ?? new ChangeTrackingList(), voice, - temperature, - maxOutputTokens, + outputAudioFormat, tools ?? new ChangeTrackingList(), toolChoice, - outputAudioFormat, + temperature, + maxOutputTokens, serializedAdditionalRawData); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(InternalRealtimeRequestResponseCreateCommandResponse)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventResponseCreateResponse)} does not support writing '{options.Format}' format."); } } - InternalRealtimeRequestResponseCreateCommandResponse IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + InternalRealtimeClientEventResponseCreateResponse IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeInternalRealtimeRequestResponseCreateCommandResponse(document.RootElement, options); + return DeserializeInternalRealtimeClientEventResponseCreateResponse(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(InternalRealtimeRequestResponseCreateCommandResponse)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventResponseCreateResponse)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static InternalRealtimeRequestResponseCreateCommandResponse FromResponse(PipelineResponse response) + internal static InternalRealtimeClientEventResponseCreateResponse FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeInternalRealtimeRequestResponseCreateCommandResponse(document.RootElement); + return DeserializeInternalRealtimeClientEventResponseCreateResponse(document.RootElement); } internal virtual BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/InternalRealtimeClientEventResponseCreateResponse.cs b/src/Generated/Models/InternalRealtimeClientEventResponseCreateResponse.cs new file mode 100644 index 000000000..8f493bd76 --- /dev/null +++ b/src/Generated/Models/InternalRealtimeClientEventResponseCreateResponse.cs @@ -0,0 +1,40 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; + +namespace OpenAI.RealtimeConversation +{ + internal partial class InternalRealtimeClientEventResponseCreateResponse + { + internal IDictionary SerializedAdditionalRawData { get; set; } + public InternalRealtimeClientEventResponseCreateResponse() + { + Modalities = new ChangeTrackingList(); + Tools = new ChangeTrackingList(); + } + + internal InternalRealtimeClientEventResponseCreateResponse(IList modalities, string instructions, string voice, string outputAudioFormat, IList tools, BinaryData toolChoice, float? temperature, BinaryData maxOutputTokens, IDictionary serializedAdditionalRawData) + { + Modalities = modalities; + Instructions = instructions; + Voice = voice; + OutputAudioFormat = outputAudioFormat; + Tools = tools; + ToolChoice = toolChoice; + Temperature = temperature; + MaxOutputTokens = maxOutputTokens; + SerializedAdditionalRawData = serializedAdditionalRawData; + } + + public IList Modalities { get; } + public string Instructions { get; set; } + public string Voice { get; set; } + public string OutputAudioFormat { get; set; } + public IList Tools { get; } + public float? Temperature { get; set; } + public BinaryData MaxOutputTokens { get; set; } + } +} diff --git a/src/Generated/Models/InternalRealtimeRequestItemDeleteCommand.Serialization.cs b/src/Generated/Models/InternalRealtimeClientEventSessionUpdate.Serialization.cs similarity index 65% rename from src/Generated/Models/InternalRealtimeRequestItemDeleteCommand.Serialization.cs rename to src/Generated/Models/InternalRealtimeClientEventSessionUpdate.Serialization.cs index a16fa99d5..a5305a57a 100644 --- a/src/Generated/Models/InternalRealtimeRequestItemDeleteCommand.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeClientEventSessionUpdate.Serialization.cs @@ -10,21 +10,21 @@ namespace OpenAI.RealtimeConversation { - internal partial class InternalRealtimeRequestItemDeleteCommand : IJsonModel + internal partial class InternalRealtimeClientEventSessionUpdate : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeRequestItemDeleteCommand)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventSessionUpdate)} does not support writing '{format}' format."); } writer.WriteStartObject(); - if (SerializedAdditionalRawData?.ContainsKey("item_id") != true) + if (SerializedAdditionalRawData?.ContainsKey("session") != true) { - writer.WritePropertyName("item_id"u8); - writer.WriteStringValue(ItemId); + writer.WritePropertyName("session"u8); + writer.WriteObjectValue(Session, options); } if (SerializedAdditionalRawData?.ContainsKey("type") != true) { @@ -58,19 +58,19 @@ void IJsonModel.Write(Utf8JsonWriter w writer.WriteEndObject(); } - InternalRealtimeRequestItemDeleteCommand IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + InternalRealtimeClientEventSessionUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeRequestItemDeleteCommand)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventSessionUpdate)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeInternalRealtimeRequestItemDeleteCommand(document.RootElement, options); + return DeserializeInternalRealtimeClientEventSessionUpdate(document.RootElement, options); } - internal static InternalRealtimeRequestItemDeleteCommand DeserializeInternalRealtimeRequestItemDeleteCommand(JsonElement element, ModelReaderWriterOptions options = null) + internal static InternalRealtimeClientEventSessionUpdate DeserializeInternalRealtimeClientEventSessionUpdate(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -78,21 +78,21 @@ internal static InternalRealtimeRequestItemDeleteCommand DeserializeInternalReal { return null; } - string itemId = default; - InternalRealtimeRequestCommandType type = default; + ConversationSessionOptions session = default; + InternalRealtimeClientEventType type = default; string eventId = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); foreach (var property in element.EnumerateObject()) { - if (property.NameEquals("item_id"u8)) + if (property.NameEquals("session"u8)) { - itemId = property.Value.GetString(); + session = ConversationSessionOptions.DeserializeConversationSessionOptions(property.Value, options); continue; } if (property.NameEquals("type"u8)) { - type = new InternalRealtimeRequestCommandType(property.Value.GetString()); + type = new InternalRealtimeClientEventType(property.Value.GetString()); continue; } if (property.NameEquals("event_id"u8)) @@ -107,44 +107,44 @@ internal static InternalRealtimeRequestItemDeleteCommand DeserializeInternalReal } } serializedAdditionalRawData = rawDataDictionary; - return new InternalRealtimeRequestItemDeleteCommand(type, eventId, serializedAdditionalRawData, itemId); + return new InternalRealtimeClientEventSessionUpdate(type, eventId, serializedAdditionalRawData, session); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(InternalRealtimeRequestItemDeleteCommand)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventSessionUpdate)} does not support writing '{options.Format}' format."); } } - InternalRealtimeRequestItemDeleteCommand IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + InternalRealtimeClientEventSessionUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeInternalRealtimeRequestItemDeleteCommand(document.RootElement, options); + return DeserializeInternalRealtimeClientEventSessionUpdate(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(InternalRealtimeRequestItemDeleteCommand)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEventSessionUpdate)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new InternalRealtimeRequestItemDeleteCommand FromResponse(PipelineResponse response) + internal static new InternalRealtimeClientEventSessionUpdate FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeInternalRealtimeRequestItemDeleteCommand(document.RootElement); + return DeserializeInternalRealtimeClientEventSessionUpdate(document.RootElement); } internal override BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/InternalRealtimeClientEventSessionUpdate.cs b/src/Generated/Models/InternalRealtimeClientEventSessionUpdate.cs new file mode 100644 index 000000000..8951177f4 --- /dev/null +++ b/src/Generated/Models/InternalRealtimeClientEventSessionUpdate.cs @@ -0,0 +1,31 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; + +namespace OpenAI.RealtimeConversation +{ + internal partial class InternalRealtimeClientEventSessionUpdate : InternalRealtimeClientEvent + { + public InternalRealtimeClientEventSessionUpdate(ConversationSessionOptions session) + { + Argument.AssertNotNull(session, nameof(session)); + + Kind = InternalRealtimeClientEventType.SessionUpdate; + Session = session; + } + + internal InternalRealtimeClientEventSessionUpdate(InternalRealtimeClientEventType kind, string eventId, IDictionary serializedAdditionalRawData, ConversationSessionOptions session) : base(kind, eventId, serializedAdditionalRawData) + { + Session = session; + } + + internal InternalRealtimeClientEventSessionUpdate() + { + } + + public ConversationSessionOptions Session { get; } + } +} diff --git a/src/Generated/Models/InternalRealtimeClientEventType.cs b/src/Generated/Models/InternalRealtimeClientEventType.cs new file mode 100644 index 000000000..dc56ef0ee --- /dev/null +++ b/src/Generated/Models/InternalRealtimeClientEventType.cs @@ -0,0 +1,50 @@ +// + +#nullable disable + +using System; +using System.ComponentModel; + +namespace OpenAI.RealtimeConversation +{ + internal readonly partial struct InternalRealtimeClientEventType : IEquatable + { + private readonly string _value; + + public InternalRealtimeClientEventType(string value) + { + _value = value ?? throw new ArgumentNullException(nameof(value)); + } + + private const string SessionUpdateValue = "session.update"; + private const string InputAudioBufferAppendValue = "input_audio_buffer.append"; + private const string InputAudioBufferCommitValue = "input_audio_buffer.commit"; + private const string InputAudioBufferClearValue = "input_audio_buffer.clear"; + private const string ConversationItemCreateValue = "conversation.item.create"; + private const string ConversationItemDeleteValue = "conversation.item.delete"; + private const string ConversationItemTruncateValue = "conversation.item.truncate"; + private const string ResponseCreateValue = "response.create"; + private const string ResponseCancelValue = "response.cancel"; + + public static InternalRealtimeClientEventType SessionUpdate { get; } = new InternalRealtimeClientEventType(SessionUpdateValue); + public static InternalRealtimeClientEventType InputAudioBufferAppend { get; } = new InternalRealtimeClientEventType(InputAudioBufferAppendValue); + public static InternalRealtimeClientEventType InputAudioBufferCommit { get; } = new InternalRealtimeClientEventType(InputAudioBufferCommitValue); + public static InternalRealtimeClientEventType InputAudioBufferClear { get; } = new InternalRealtimeClientEventType(InputAudioBufferClearValue); + public static InternalRealtimeClientEventType ConversationItemCreate { get; } = new InternalRealtimeClientEventType(ConversationItemCreateValue); + public static InternalRealtimeClientEventType ConversationItemDelete { get; } = new InternalRealtimeClientEventType(ConversationItemDeleteValue); + public static InternalRealtimeClientEventType ConversationItemTruncate { get; } = new InternalRealtimeClientEventType(ConversationItemTruncateValue); + public static InternalRealtimeClientEventType ResponseCreate { get; } = new InternalRealtimeClientEventType(ResponseCreateValue); + public static InternalRealtimeClientEventType ResponseCancel { get; } = new InternalRealtimeClientEventType(ResponseCancelValue); + public static bool operator ==(InternalRealtimeClientEventType left, InternalRealtimeClientEventType right) => left.Equals(right); + public static bool operator !=(InternalRealtimeClientEventType left, InternalRealtimeClientEventType right) => !left.Equals(right); + public static implicit operator InternalRealtimeClientEventType(string value) => new InternalRealtimeClientEventType(value); + + [EditorBrowsable(EditorBrowsableState.Never)] + public override bool Equals(object obj) => obj is InternalRealtimeClientEventType other && Equals(other); + public bool Equals(InternalRealtimeClientEventType other) => string.Equals(_value, other._value, StringComparison.InvariantCultureIgnoreCase); + + [EditorBrowsable(EditorBrowsableState.Never)] + public override int GetHashCode() => _value != null ? StringComparer.InvariantCultureIgnoreCase.GetHashCode(_value) : 0; + public override string ToString() => _value; + } +} diff --git a/src/Generated/Models/InternalRealtimeItemType.cs b/src/Generated/Models/InternalRealtimeItemType.cs new file mode 100644 index 000000000..a817e210b --- /dev/null +++ b/src/Generated/Models/InternalRealtimeItemType.cs @@ -0,0 +1,38 @@ +// + +#nullable disable + +using System; +using System.ComponentModel; + +namespace OpenAI.RealtimeConversation +{ + internal readonly partial struct InternalRealtimeItemType : IEquatable + { + private readonly string _value; + + public InternalRealtimeItemType(string value) + { + _value = value ?? throw new ArgumentNullException(nameof(value)); + } + + private const string MessageValue = "message"; + private const string FunctionCallValue = "function_call"; + private const string FunctionCallOutputValue = "function_call_output"; + + public static InternalRealtimeItemType Message { get; } = new InternalRealtimeItemType(MessageValue); + public static InternalRealtimeItemType FunctionCall { get; } = new InternalRealtimeItemType(FunctionCallValue); + public static InternalRealtimeItemType FunctionCallOutput { get; } = new InternalRealtimeItemType(FunctionCallOutputValue); + public static bool operator ==(InternalRealtimeItemType left, InternalRealtimeItemType right) => left.Equals(right); + public static bool operator !=(InternalRealtimeItemType left, InternalRealtimeItemType right) => !left.Equals(right); + public static implicit operator InternalRealtimeItemType(string value) => new InternalRealtimeItemType(value); + + [EditorBrowsable(EditorBrowsableState.Never)] + public override bool Equals(object obj) => obj is InternalRealtimeItemType other && Equals(other); + public bool Equals(InternalRealtimeItemType other) => string.Equals(_value, other._value, StringComparison.InvariantCultureIgnoreCase); + + [EditorBrowsable(EditorBrowsableState.Never)] + public override int GetHashCode() => _value != null ? StringComparer.InvariantCultureIgnoreCase.GetHashCode(_value) : 0; + public override string ToString() => _value; + } +} diff --git a/src/Generated/Models/InternalRealtimeRequestAssistantMessageItem.Serialization.cs b/src/Generated/Models/InternalRealtimeRequestAssistantMessageItem.Serialization.cs index a06386951..278b83108 100644 --- a/src/Generated/Models/InternalRealtimeRequestAssistantMessageItem.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeRequestAssistantMessageItem.Serialization.cs @@ -96,7 +96,7 @@ internal static InternalRealtimeRequestAssistantMessageItem DeserializeInternalR IList content = default; ConversationMessageRole role = default; ConversationItemStatus? status = default; - InternalRealtimeRequestItemType type = default; + InternalRealtimeItemType type = default; string id = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); @@ -128,7 +128,7 @@ internal static InternalRealtimeRequestAssistantMessageItem DeserializeInternalR } if (property.NameEquals("type"u8)) { - type = new InternalRealtimeRequestItemType(property.Value.GetString()); + type = new InternalRealtimeItemType(property.Value.GetString()); continue; } if (property.NameEquals("id"u8)) diff --git a/src/Generated/Models/InternalRealtimeRequestAssistantMessageItem.cs b/src/Generated/Models/InternalRealtimeRequestAssistantMessageItem.cs index dd9526ceb..5bd36cf4d 100644 --- a/src/Generated/Models/InternalRealtimeRequestAssistantMessageItem.cs +++ b/src/Generated/Models/InternalRealtimeRequestAssistantMessageItem.cs @@ -18,7 +18,7 @@ public InternalRealtimeRequestAssistantMessageItem(IEnumerable serializedAdditionalRawData, ConversationMessageRole role, ConversationItemStatus? status, IList content) : base(type, id, serializedAdditionalRawData, role, status) + internal InternalRealtimeRequestAssistantMessageItem(InternalRealtimeItemType type, string id, IDictionary serializedAdditionalRawData, ConversationMessageRole role, ConversationItemStatus? status, IList content) : base(type, id, serializedAdditionalRawData, role, status) { Content = content; } diff --git a/src/Generated/Models/InternalRealtimeRequestAudioContentPart.Serialization.cs b/src/Generated/Models/InternalRealtimeRequestAudioContentPart.Serialization.cs index b70b1c935..6ade9d52d 100644 --- a/src/Generated/Models/InternalRealtimeRequestAudioContentPart.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeRequestAudioContentPart.Serialization.cs @@ -21,15 +21,20 @@ void IJsonModel.Write(Utf8JsonWriter wr } writer.WriteStartObject(); - if (SerializedAdditionalRawData?.ContainsKey("transcript") != true && Optional.IsDefined(Transcript)) + if (SerializedAdditionalRawData?.ContainsKey("type") != true) + { + writer.WritePropertyName("type"u8); + writer.WriteStringValue(Type); + } + if (SerializedAdditionalRawData?.ContainsKey("transcript") != true && Optional.IsDefined(InternalTranscriptValue)) { writer.WritePropertyName("transcript"u8); - writer.WriteStringValue(Transcript); + writer.WriteStringValue(InternalTranscriptValue); } if (SerializedAdditionalRawData?.ContainsKey("type") != true) { writer.WritePropertyName("type"u8); - writer.WriteStringValue(Type.ToString()); + writer.WriteStringValue(Kind.ToString()); } if (SerializedAdditionalRawData != null) { @@ -73,12 +78,18 @@ internal static InternalRealtimeRequestAudioContentPart DeserializeInternalRealt { return null; } + string type = default; string transcript = default; - ConversationContentPartKind type = default; + ConversationContentPartKind type0 = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); foreach (var property in element.EnumerateObject()) { + if (property.NameEquals("type"u8)) + { + type = property.Value.GetString(); + continue; + } if (property.NameEquals("transcript"u8)) { transcript = property.Value.GetString(); @@ -86,7 +97,7 @@ internal static InternalRealtimeRequestAudioContentPart DeserializeInternalRealt } if (property.NameEquals("type"u8)) { - type = new ConversationContentPartKind(property.Value.GetString()); + type0 = new ConversationContentPartKind(property.Value.GetString()); continue; } if (true) @@ -96,7 +107,7 @@ internal static InternalRealtimeRequestAudioContentPart DeserializeInternalRealt } } serializedAdditionalRawData = rawDataDictionary; - return new InternalRealtimeRequestAudioContentPart(type, serializedAdditionalRawData, transcript); + return new InternalRealtimeRequestAudioContentPart(type0, serializedAdditionalRawData, type, transcript); } BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) diff --git a/src/Generated/Models/InternalRealtimeRequestAudioContentPart.cs b/src/Generated/Models/InternalRealtimeRequestAudioContentPart.cs index 06f2636b2..4c8361826 100644 --- a/src/Generated/Models/InternalRealtimeRequestAudioContentPart.cs +++ b/src/Generated/Models/InternalRealtimeRequestAudioContentPart.cs @@ -11,14 +11,15 @@ internal partial class InternalRealtimeRequestAudioContentPart : ConversationCon { public InternalRealtimeRequestAudioContentPart() { - Type = ConversationContentPartKind.InputAudio; + Kind = ConversationContentPartKind.InputAudio; } - internal InternalRealtimeRequestAudioContentPart(ConversationContentPartKind type, IDictionary serializedAdditionalRawData, string transcript) : base(type, serializedAdditionalRawData) + internal InternalRealtimeRequestAudioContentPart(ConversationContentPartKind kind, IDictionary serializedAdditionalRawData, string type, string internalTranscriptValue) : base(kind, serializedAdditionalRawData) { - Transcript = transcript; + Type = type; + InternalTranscriptValue = internalTranscriptValue; } - public string Transcript { get; set; } + internal string Type { get; set; } = "input_audio"; } } diff --git a/src/Generated/Models/InternalRealtimeRequestCommandType.cs b/src/Generated/Models/InternalRealtimeRequestCommandType.cs deleted file mode 100644 index b6e75ce49..000000000 --- a/src/Generated/Models/InternalRealtimeRequestCommandType.cs +++ /dev/null @@ -1,50 +0,0 @@ -// - -#nullable disable - -using System; -using System.ComponentModel; - -namespace OpenAI.RealtimeConversation -{ - internal readonly partial struct InternalRealtimeRequestCommandType : IEquatable - { - private readonly string _value; - - public InternalRealtimeRequestCommandType(string value) - { - _value = value ?? throw new ArgumentNullException(nameof(value)); - } - - private const string SessionUpdateValue = "session.update"; - private const string InputAudioBufferAppendValue = "input_audio_buffer.append"; - private const string InputAudioBufferCommitValue = "input_audio_buffer.commit"; - private const string InputAudioBufferClearValue = "input_audio_buffer.clear"; - private const string ItemCreateValue = "conversation.item.create"; - private const string ItemDeleteValue = "conversation.item.delete"; - private const string ItemTruncateValue = "conversation.item.truncate"; - private const string ResponseCreateValue = "response.create"; - private const string ResponseCancelValue = "response.cancel"; - - public static InternalRealtimeRequestCommandType SessionUpdate { get; } = new InternalRealtimeRequestCommandType(SessionUpdateValue); - public static InternalRealtimeRequestCommandType InputAudioBufferAppend { get; } = new InternalRealtimeRequestCommandType(InputAudioBufferAppendValue); - public static InternalRealtimeRequestCommandType InputAudioBufferCommit { get; } = new InternalRealtimeRequestCommandType(InputAudioBufferCommitValue); - public static InternalRealtimeRequestCommandType InputAudioBufferClear { get; } = new InternalRealtimeRequestCommandType(InputAudioBufferClearValue); - public static InternalRealtimeRequestCommandType ItemCreate { get; } = new InternalRealtimeRequestCommandType(ItemCreateValue); - public static InternalRealtimeRequestCommandType ItemDelete { get; } = new InternalRealtimeRequestCommandType(ItemDeleteValue); - public static InternalRealtimeRequestCommandType ItemTruncate { get; } = new InternalRealtimeRequestCommandType(ItemTruncateValue); - public static InternalRealtimeRequestCommandType ResponseCreate { get; } = new InternalRealtimeRequestCommandType(ResponseCreateValue); - public static InternalRealtimeRequestCommandType ResponseCancel { get; } = new InternalRealtimeRequestCommandType(ResponseCancelValue); - public static bool operator ==(InternalRealtimeRequestCommandType left, InternalRealtimeRequestCommandType right) => left.Equals(right); - public static bool operator !=(InternalRealtimeRequestCommandType left, InternalRealtimeRequestCommandType right) => !left.Equals(right); - public static implicit operator InternalRealtimeRequestCommandType(string value) => new InternalRealtimeRequestCommandType(value); - - [EditorBrowsable(EditorBrowsableState.Never)] - public override bool Equals(object obj) => obj is InternalRealtimeRequestCommandType other && Equals(other); - public bool Equals(InternalRealtimeRequestCommandType other) => string.Equals(_value, other._value, StringComparison.InvariantCultureIgnoreCase); - - [EditorBrowsable(EditorBrowsableState.Never)] - public override int GetHashCode() => _value != null ? StringComparer.InvariantCultureIgnoreCase.GetHashCode(_value) : 0; - public override string ToString() => _value; - } -} diff --git a/src/Generated/Models/InternalRealtimeRequestFunctionCallItem.Serialization.cs b/src/Generated/Models/InternalRealtimeRequestFunctionCallItem.Serialization.cs index b51551291..6b686671b 100644 --- a/src/Generated/Models/InternalRealtimeRequestFunctionCallItem.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeRequestFunctionCallItem.Serialization.cs @@ -97,7 +97,7 @@ internal static InternalRealtimeRequestFunctionCallItem DeserializeInternalRealt string callId = default; string arguments = default; ConversationItemStatus? status = default; - InternalRealtimeRequestItemType type = default; + InternalRealtimeItemType type = default; string id = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); @@ -129,7 +129,7 @@ internal static InternalRealtimeRequestFunctionCallItem DeserializeInternalRealt } if (property.NameEquals("type"u8)) { - type = new InternalRealtimeRequestItemType(property.Value.GetString()); + type = new InternalRealtimeItemType(property.Value.GetString()); continue; } if (property.NameEquals("id"u8)) diff --git a/src/Generated/Models/InternalRealtimeRequestFunctionCallItem.cs b/src/Generated/Models/InternalRealtimeRequestFunctionCallItem.cs index 74276e8fe..ff1836f44 100644 --- a/src/Generated/Models/InternalRealtimeRequestFunctionCallItem.cs +++ b/src/Generated/Models/InternalRealtimeRequestFunctionCallItem.cs @@ -15,13 +15,13 @@ public InternalRealtimeRequestFunctionCallItem(string name, string callId, strin Argument.AssertNotNull(callId, nameof(callId)); Argument.AssertNotNull(arguments, nameof(arguments)); - Type = InternalRealtimeRequestItemType.FunctionCall; + Type = InternalRealtimeItemType.FunctionCall; Name = name; CallId = callId; Arguments = arguments; } - internal InternalRealtimeRequestFunctionCallItem(InternalRealtimeRequestItemType type, string id, IDictionary serializedAdditionalRawData, string name, string callId, string arguments, ConversationItemStatus? status) : base(type, id, serializedAdditionalRawData) + internal InternalRealtimeRequestFunctionCallItem(InternalRealtimeItemType type, string id, IDictionary serializedAdditionalRawData, string name, string callId, string arguments, ConversationItemStatus? status) : base(type, id, serializedAdditionalRawData) { Name = name; CallId = callId; diff --git a/src/Generated/Models/InternalRealtimeRequestFunctionCallOutputItem.Serialization.cs b/src/Generated/Models/InternalRealtimeRequestFunctionCallOutputItem.Serialization.cs index 9ec36d1d1..bc921ff6f 100644 --- a/src/Generated/Models/InternalRealtimeRequestFunctionCallOutputItem.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeRequestFunctionCallOutputItem.Serialization.cs @@ -85,7 +85,7 @@ internal static InternalRealtimeRequestFunctionCallOutputItem DeserializeInterna } string callId = default; string output = default; - InternalRealtimeRequestItemType type = default; + InternalRealtimeItemType type = default; string id = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); @@ -103,7 +103,7 @@ internal static InternalRealtimeRequestFunctionCallOutputItem DeserializeInterna } if (property.NameEquals("type"u8)) { - type = new InternalRealtimeRequestItemType(property.Value.GetString()); + type = new InternalRealtimeItemType(property.Value.GetString()); continue; } if (property.NameEquals("id"u8)) diff --git a/src/Generated/Models/InternalRealtimeRequestFunctionCallOutputItem.cs b/src/Generated/Models/InternalRealtimeRequestFunctionCallOutputItem.cs index 263d8d388..443ec884c 100644 --- a/src/Generated/Models/InternalRealtimeRequestFunctionCallOutputItem.cs +++ b/src/Generated/Models/InternalRealtimeRequestFunctionCallOutputItem.cs @@ -14,12 +14,12 @@ public InternalRealtimeRequestFunctionCallOutputItem(string callId, string outpu Argument.AssertNotNull(callId, nameof(callId)); Argument.AssertNotNull(output, nameof(output)); - Type = InternalRealtimeRequestItemType.FunctionCallOutput; + Type = InternalRealtimeItemType.FunctionCallOutput; CallId = callId; Output = output; } - internal InternalRealtimeRequestFunctionCallOutputItem(InternalRealtimeRequestItemType type, string id, IDictionary serializedAdditionalRawData, string callId, string output) : base(type, id, serializedAdditionalRawData) + internal InternalRealtimeRequestFunctionCallOutputItem(InternalRealtimeItemType type, string id, IDictionary serializedAdditionalRawData, string callId, string output) : base(type, id, serializedAdditionalRawData) { CallId = callId; Output = output; diff --git a/src/Generated/Models/InternalRealtimeRequestInputAudioBufferAppendCommand.cs b/src/Generated/Models/InternalRealtimeRequestInputAudioBufferAppendCommand.cs deleted file mode 100644 index 1def2c84c..000000000 --- a/src/Generated/Models/InternalRealtimeRequestInputAudioBufferAppendCommand.cs +++ /dev/null @@ -1,31 +0,0 @@ -// - -#nullable disable - -using System; -using System.Collections.Generic; - -namespace OpenAI.RealtimeConversation -{ - internal partial class InternalRealtimeRequestInputAudioBufferAppendCommand : InternalRealtimeRequestCommand - { - public InternalRealtimeRequestInputAudioBufferAppendCommand(BinaryData audio) - { - Argument.AssertNotNull(audio, nameof(audio)); - - Kind = InternalRealtimeRequestCommandType.InputAudioBufferAppend; - Audio = audio; - } - - internal InternalRealtimeRequestInputAudioBufferAppendCommand(InternalRealtimeRequestCommandType kind, string eventId, IDictionary serializedAdditionalRawData, BinaryData audio) : base(kind, eventId, serializedAdditionalRawData) - { - Audio = audio; - } - - internal InternalRealtimeRequestInputAudioBufferAppendCommand() - { - } - - public BinaryData Audio { get; } - } -} diff --git a/src/Generated/Models/InternalRealtimeRequestInputAudioBufferClearCommand.cs b/src/Generated/Models/InternalRealtimeRequestInputAudioBufferClearCommand.cs deleted file mode 100644 index 8502e98a8..000000000 --- a/src/Generated/Models/InternalRealtimeRequestInputAudioBufferClearCommand.cs +++ /dev/null @@ -1,21 +0,0 @@ -// - -#nullable disable - -using System; -using System.Collections.Generic; - -namespace OpenAI.RealtimeConversation -{ - internal partial class InternalRealtimeRequestInputAudioBufferClearCommand : InternalRealtimeRequestCommand - { - public InternalRealtimeRequestInputAudioBufferClearCommand() - { - Kind = InternalRealtimeRequestCommandType.InputAudioBufferClear; - } - - internal InternalRealtimeRequestInputAudioBufferClearCommand(InternalRealtimeRequestCommandType kind, string eventId, IDictionary serializedAdditionalRawData) : base(kind, eventId, serializedAdditionalRawData) - { - } - } -} diff --git a/src/Generated/Models/InternalRealtimeRequestInputAudioBufferCommitCommand.cs b/src/Generated/Models/InternalRealtimeRequestInputAudioBufferCommitCommand.cs deleted file mode 100644 index 5ed8421a0..000000000 --- a/src/Generated/Models/InternalRealtimeRequestInputAudioBufferCommitCommand.cs +++ /dev/null @@ -1,21 +0,0 @@ -// - -#nullable disable - -using System; -using System.Collections.Generic; - -namespace OpenAI.RealtimeConversation -{ - internal partial class InternalRealtimeRequestInputAudioBufferCommitCommand : InternalRealtimeRequestCommand - { - public InternalRealtimeRequestInputAudioBufferCommitCommand() - { - Kind = InternalRealtimeRequestCommandType.InputAudioBufferCommit; - } - - internal InternalRealtimeRequestInputAudioBufferCommitCommand(InternalRealtimeRequestCommandType kind, string eventId, IDictionary serializedAdditionalRawData) : base(kind, eventId, serializedAdditionalRawData) - { - } - } -} diff --git a/src/Generated/Models/InternalRealtimeRequestItemCreateCommand.cs b/src/Generated/Models/InternalRealtimeRequestItemCreateCommand.cs deleted file mode 100644 index 0c8650245..000000000 --- a/src/Generated/Models/InternalRealtimeRequestItemCreateCommand.cs +++ /dev/null @@ -1,33 +0,0 @@ -// - -#nullable disable - -using System; -using System.Collections.Generic; - -namespace OpenAI.RealtimeConversation -{ - internal partial class InternalRealtimeRequestItemCreateCommand : InternalRealtimeRequestCommand - { - public InternalRealtimeRequestItemCreateCommand(ConversationItem item) - { - Argument.AssertNotNull(item, nameof(item)); - - Kind = InternalRealtimeRequestCommandType.ItemCreate; - Item = item; - } - - internal InternalRealtimeRequestItemCreateCommand(InternalRealtimeRequestCommandType kind, string eventId, IDictionary serializedAdditionalRawData, string previousItemId, ConversationItem item) : base(kind, eventId, serializedAdditionalRawData) - { - PreviousItemId = previousItemId; - Item = item; - } - - internal InternalRealtimeRequestItemCreateCommand() - { - } - - public string PreviousItemId { get; set; } - public ConversationItem Item { get; } - } -} diff --git a/src/Generated/Models/InternalRealtimeRequestItemDeleteCommand.cs b/src/Generated/Models/InternalRealtimeRequestItemDeleteCommand.cs deleted file mode 100644 index d98685fea..000000000 --- a/src/Generated/Models/InternalRealtimeRequestItemDeleteCommand.cs +++ /dev/null @@ -1,31 +0,0 @@ -// - -#nullable disable - -using System; -using System.Collections.Generic; - -namespace OpenAI.RealtimeConversation -{ - internal partial class InternalRealtimeRequestItemDeleteCommand : InternalRealtimeRequestCommand - { - public InternalRealtimeRequestItemDeleteCommand(string itemId) - { - Argument.AssertNotNull(itemId, nameof(itemId)); - - Kind = InternalRealtimeRequestCommandType.ItemDelete; - ItemId = itemId; - } - - internal InternalRealtimeRequestItemDeleteCommand(InternalRealtimeRequestCommandType kind, string eventId, IDictionary serializedAdditionalRawData, string itemId) : base(kind, eventId, serializedAdditionalRawData) - { - ItemId = itemId; - } - - internal InternalRealtimeRequestItemDeleteCommand() - { - } - - public string ItemId { get; } - } -} diff --git a/src/Generated/Models/InternalRealtimeRequestItemTruncateCommand.cs b/src/Generated/Models/InternalRealtimeRequestItemTruncateCommand.cs deleted file mode 100644 index e867f7c35..000000000 --- a/src/Generated/Models/InternalRealtimeRequestItemTruncateCommand.cs +++ /dev/null @@ -1,37 +0,0 @@ -// - -#nullable disable - -using System; -using System.Collections.Generic; - -namespace OpenAI.RealtimeConversation -{ - internal partial class InternalRealtimeRequestItemTruncateCommand : InternalRealtimeRequestCommand - { - public InternalRealtimeRequestItemTruncateCommand(string itemId, int contentIndex, int audioEndMs) - { - Argument.AssertNotNull(itemId, nameof(itemId)); - - Kind = InternalRealtimeRequestCommandType.ItemTruncate; - ItemId = itemId; - ContentIndex = contentIndex; - AudioEndMs = audioEndMs; - } - - internal InternalRealtimeRequestItemTruncateCommand(InternalRealtimeRequestCommandType kind, string eventId, IDictionary serializedAdditionalRawData, string itemId, int contentIndex, int audioEndMs) : base(kind, eventId, serializedAdditionalRawData) - { - ItemId = itemId; - ContentIndex = contentIndex; - AudioEndMs = audioEndMs; - } - - internal InternalRealtimeRequestItemTruncateCommand() - { - } - - public string ItemId { get; } - public int ContentIndex { get; } - public int AudioEndMs { get; } - } -} diff --git a/src/Generated/Models/InternalRealtimeRequestItemType.cs b/src/Generated/Models/InternalRealtimeRequestItemType.cs deleted file mode 100644 index 118aab7e3..000000000 --- a/src/Generated/Models/InternalRealtimeRequestItemType.cs +++ /dev/null @@ -1,38 +0,0 @@ -// - -#nullable disable - -using System; -using System.ComponentModel; - -namespace OpenAI.RealtimeConversation -{ - internal readonly partial struct InternalRealtimeRequestItemType : IEquatable - { - private readonly string _value; - - public InternalRealtimeRequestItemType(string value) - { - _value = value ?? throw new ArgumentNullException(nameof(value)); - } - - private const string MessageValue = "message"; - private const string FunctionCallValue = "function_call"; - private const string FunctionCallOutputValue = "function_call_output"; - - public static InternalRealtimeRequestItemType Message { get; } = new InternalRealtimeRequestItemType(MessageValue); - public static InternalRealtimeRequestItemType FunctionCall { get; } = new InternalRealtimeRequestItemType(FunctionCallValue); - public static InternalRealtimeRequestItemType FunctionCallOutput { get; } = new InternalRealtimeRequestItemType(FunctionCallOutputValue); - public static bool operator ==(InternalRealtimeRequestItemType left, InternalRealtimeRequestItemType right) => left.Equals(right); - public static bool operator !=(InternalRealtimeRequestItemType left, InternalRealtimeRequestItemType right) => !left.Equals(right); - public static implicit operator InternalRealtimeRequestItemType(string value) => new InternalRealtimeRequestItemType(value); - - [EditorBrowsable(EditorBrowsableState.Never)] - public override bool Equals(object obj) => obj is InternalRealtimeRequestItemType other && Equals(other); - public bool Equals(InternalRealtimeRequestItemType other) => string.Equals(_value, other._value, StringComparison.InvariantCultureIgnoreCase); - - [EditorBrowsable(EditorBrowsableState.Never)] - public override int GetHashCode() => _value != null ? StringComparer.InvariantCultureIgnoreCase.GetHashCode(_value) : 0; - public override string ToString() => _value; - } -} diff --git a/src/Generated/Models/InternalRealtimeRequestMessageItem.Serialization.cs b/src/Generated/Models/InternalRealtimeRequestMessageItem.Serialization.cs index 41b65f714..893d108dd 100644 --- a/src/Generated/Models/InternalRealtimeRequestMessageItem.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeRequestMessageItem.Serialization.cs @@ -94,7 +94,7 @@ internal static InternalRealtimeRequestMessageItem DeserializeInternalRealtimeRe } ConversationMessageRole role = "message"; ConversationItemStatus? status = default; - InternalRealtimeRequestItemType type = default; + InternalRealtimeItemType type = default; string id = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); @@ -116,7 +116,7 @@ internal static InternalRealtimeRequestMessageItem DeserializeInternalRealtimeRe } if (property.NameEquals("type"u8)) { - type = new InternalRealtimeRequestItemType(property.Value.GetString()); + type = new InternalRealtimeItemType(property.Value.GetString()); continue; } if (property.NameEquals("id"u8)) diff --git a/src/Generated/Models/InternalRealtimeRequestMessageItem.cs b/src/Generated/Models/InternalRealtimeRequestMessageItem.cs index 5bba92cad..7cbb6351b 100644 --- a/src/Generated/Models/InternalRealtimeRequestMessageItem.cs +++ b/src/Generated/Models/InternalRealtimeRequestMessageItem.cs @@ -14,7 +14,7 @@ public InternalRealtimeRequestMessageItem() Role = new ConversationMessageRole("message"); } - internal InternalRealtimeRequestMessageItem(InternalRealtimeRequestItemType type, string id, IDictionary serializedAdditionalRawData, ConversationMessageRole role, ConversationItemStatus? status) : base(type, id, serializedAdditionalRawData) + internal InternalRealtimeRequestMessageItem(InternalRealtimeItemType type, string id, IDictionary serializedAdditionalRawData, ConversationMessageRole role, ConversationItemStatus? status) : base(type, id, serializedAdditionalRawData) { Role = role; Status = status; diff --git a/src/Generated/Models/InternalRealtimeRequestModel.cs b/src/Generated/Models/InternalRealtimeRequestModel.cs deleted file mode 100644 index b7759dca3..000000000 --- a/src/Generated/Models/InternalRealtimeRequestModel.cs +++ /dev/null @@ -1,34 +0,0 @@ -// - -#nullable disable - -using System; -using System.ComponentModel; - -namespace OpenAI.RealtimeConversation -{ - internal readonly partial struct InternalRealtimeRequestModel : IEquatable - { - private readonly string _value; - - public InternalRealtimeRequestModel(string value) - { - _value = value ?? throw new ArgumentNullException(nameof(value)); - } - - private const string Gpt4oRealtimeValue = "gpt-4o-realtime"; - - public static InternalRealtimeRequestModel Gpt4oRealtime { get; } = new InternalRealtimeRequestModel(Gpt4oRealtimeValue); - public static bool operator ==(InternalRealtimeRequestModel left, InternalRealtimeRequestModel right) => left.Equals(right); - public static bool operator !=(InternalRealtimeRequestModel left, InternalRealtimeRequestModel right) => !left.Equals(right); - public static implicit operator InternalRealtimeRequestModel(string value) => new InternalRealtimeRequestModel(value); - - [EditorBrowsable(EditorBrowsableState.Never)] - public override bool Equals(object obj) => obj is InternalRealtimeRequestModel other && Equals(other); - public bool Equals(InternalRealtimeRequestModel other) => string.Equals(_value, other._value, StringComparison.InvariantCultureIgnoreCase); - - [EditorBrowsable(EditorBrowsableState.Never)] - public override int GetHashCode() => _value != null ? StringComparer.InvariantCultureIgnoreCase.GetHashCode(_value) : 0; - public override string ToString() => _value; - } -} diff --git a/src/Generated/Models/InternalRealtimeRequestResponseCancelCommand.cs b/src/Generated/Models/InternalRealtimeRequestResponseCancelCommand.cs deleted file mode 100644 index cb8619e25..000000000 --- a/src/Generated/Models/InternalRealtimeRequestResponseCancelCommand.cs +++ /dev/null @@ -1,21 +0,0 @@ -// - -#nullable disable - -using System; -using System.Collections.Generic; - -namespace OpenAI.RealtimeConversation -{ - internal partial class InternalRealtimeRequestResponseCancelCommand : InternalRealtimeRequestCommand - { - public InternalRealtimeRequestResponseCancelCommand() - { - Kind = InternalRealtimeRequestCommandType.ResponseCancel; - } - - internal InternalRealtimeRequestResponseCancelCommand(InternalRealtimeRequestCommandType kind, string eventId, IDictionary serializedAdditionalRawData) : base(kind, eventId, serializedAdditionalRawData) - { - } - } -} diff --git a/src/Generated/Models/InternalRealtimeRequestResponseCreateCommand.cs b/src/Generated/Models/InternalRealtimeRequestResponseCreateCommand.cs deleted file mode 100644 index f165b617d..000000000 --- a/src/Generated/Models/InternalRealtimeRequestResponseCreateCommand.cs +++ /dev/null @@ -1,24 +0,0 @@ -// - -#nullable disable - -using System; -using System.Collections.Generic; - -namespace OpenAI.RealtimeConversation -{ - internal partial class InternalRealtimeRequestResponseCreateCommand : InternalRealtimeRequestCommand - { - public InternalRealtimeRequestResponseCreateCommand() - { - Kind = InternalRealtimeRequestCommandType.ResponseCreate; - } - - internal InternalRealtimeRequestResponseCreateCommand(InternalRealtimeRequestCommandType kind, string eventId, IDictionary serializedAdditionalRawData, InternalRealtimeRequestResponseCreateCommandResponse response) : base(kind, eventId, serializedAdditionalRawData) - { - Response = response; - } - - public InternalRealtimeRequestResponseCreateCommandResponse Response { get; set; } - } -} diff --git a/src/Generated/Models/InternalRealtimeRequestResponseCreateCommandResponse.cs b/src/Generated/Models/InternalRealtimeRequestResponseCreateCommandResponse.cs deleted file mode 100644 index be05ac0db..000000000 --- a/src/Generated/Models/InternalRealtimeRequestResponseCreateCommandResponse.cs +++ /dev/null @@ -1,57 +0,0 @@ -// - -#nullable disable - -using System; -using System.Collections.Generic; - -namespace OpenAI.RealtimeConversation -{ - internal partial class InternalRealtimeRequestResponseCreateCommandResponse - { - internal IDictionary SerializedAdditionalRawData { get; set; } - public InternalRealtimeRequestResponseCreateCommandResponse(bool commit, bool cancelPrevious) - { - Commit = commit; - CancelPrevious = cancelPrevious; - AppendInputItems = new ChangeTrackingList(); - InputItems = new ChangeTrackingList(); - Modalities = new ChangeTrackingList(); - Tools = new ChangeTrackingList(); - } - - internal InternalRealtimeRequestResponseCreateCommandResponse(bool commit, bool cancelPrevious, IList appendInputItems, IList inputItems, string instructions, IList modalities, ConversationVoice? voice, float? temperature, BinaryData maxOutputTokens, IList tools, BinaryData toolChoice, ConversationAudioFormat? outputAudioFormat, IDictionary serializedAdditionalRawData) - { - Commit = commit; - CancelPrevious = cancelPrevious; - AppendInputItems = appendInputItems; - InputItems = inputItems; - Instructions = instructions; - Modalities = modalities; - Voice = voice; - Temperature = temperature; - MaxOutputTokens = maxOutputTokens; - Tools = tools; - ToolChoice = toolChoice; - OutputAudioFormat = outputAudioFormat; - SerializedAdditionalRawData = serializedAdditionalRawData; - } - - internal InternalRealtimeRequestResponseCreateCommandResponse() - { - } - - public bool Commit { get; } - public bool CancelPrevious { get; } - public IList AppendInputItems { get; } - public IList InputItems { get; } - public string Instructions { get; set; } - public IList Modalities { get; } - public ConversationVoice? Voice { get; set; } - public float? Temperature { get; set; } - public BinaryData MaxOutputTokens { get; set; } - public IList Tools { get; } - public BinaryData ToolChoice { get; set; } - public ConversationAudioFormat? OutputAudioFormat { get; set; } - } -} diff --git a/src/Generated/Models/InternalRealtimeRequestSessionModality.cs b/src/Generated/Models/InternalRealtimeRequestSessionModality.cs new file mode 100644 index 000000000..c57d27eb2 --- /dev/null +++ b/src/Generated/Models/InternalRealtimeRequestSessionModality.cs @@ -0,0 +1,36 @@ +// + +#nullable disable + +using System; +using System.ComponentModel; + +namespace OpenAI.RealtimeConversation +{ + internal readonly partial struct InternalRealtimeRequestSessionModality : IEquatable + { + private readonly string _value; + + public InternalRealtimeRequestSessionModality(string value) + { + _value = value ?? throw new ArgumentNullException(nameof(value)); + } + + private const string TextValue = "text"; + private const string AudioValue = "audio"; + + public static InternalRealtimeRequestSessionModality Text { get; } = new InternalRealtimeRequestSessionModality(TextValue); + public static InternalRealtimeRequestSessionModality Audio { get; } = new InternalRealtimeRequestSessionModality(AudioValue); + public static bool operator ==(InternalRealtimeRequestSessionModality left, InternalRealtimeRequestSessionModality right) => left.Equals(right); + public static bool operator !=(InternalRealtimeRequestSessionModality left, InternalRealtimeRequestSessionModality right) => !left.Equals(right); + public static implicit operator InternalRealtimeRequestSessionModality(string value) => new InternalRealtimeRequestSessionModality(value); + + [EditorBrowsable(EditorBrowsableState.Never)] + public override bool Equals(object obj) => obj is InternalRealtimeRequestSessionModality other && Equals(other); + public bool Equals(InternalRealtimeRequestSessionModality other) => string.Equals(_value, other._value, StringComparison.InvariantCultureIgnoreCase); + + [EditorBrowsable(EditorBrowsableState.Never)] + public override int GetHashCode() => _value != null ? StringComparer.InvariantCultureIgnoreCase.GetHashCode(_value) : 0; + public override string ToString() => _value; + } +} diff --git a/src/Generated/Models/InternalRealtimeRequestSessionUpdateCommand.cs b/src/Generated/Models/InternalRealtimeRequestSessionUpdateCommand.cs deleted file mode 100644 index d014ae106..000000000 --- a/src/Generated/Models/InternalRealtimeRequestSessionUpdateCommand.cs +++ /dev/null @@ -1,31 +0,0 @@ -// - -#nullable disable - -using System; -using System.Collections.Generic; - -namespace OpenAI.RealtimeConversation -{ - internal partial class InternalRealtimeRequestSessionUpdateCommand : InternalRealtimeRequestCommand - { - public InternalRealtimeRequestSessionUpdateCommand(ConversationSessionOptions session) - { - Argument.AssertNotNull(session, nameof(session)); - - Kind = InternalRealtimeRequestCommandType.SessionUpdate; - Session = session; - } - - internal InternalRealtimeRequestSessionUpdateCommand(InternalRealtimeRequestCommandType kind, string eventId, IDictionary serializedAdditionalRawData, ConversationSessionOptions session) : base(kind, eventId, serializedAdditionalRawData) - { - Session = session; - } - - internal InternalRealtimeRequestSessionUpdateCommand() - { - } - - public ConversationSessionOptions Session { get; } - } -} diff --git a/src/Generated/Models/InternalRealtimeRequestSessionUpdateCommandSessionModality.cs b/src/Generated/Models/InternalRealtimeRequestSessionUpdateCommandSessionModality.cs deleted file mode 100644 index 234800a29..000000000 --- a/src/Generated/Models/InternalRealtimeRequestSessionUpdateCommandSessionModality.cs +++ /dev/null @@ -1,36 +0,0 @@ -// - -#nullable disable - -using System; -using System.ComponentModel; - -namespace OpenAI.RealtimeConversation -{ - internal readonly partial struct InternalRealtimeRequestSessionUpdateCommandSessionModality : IEquatable - { - private readonly string _value; - - public InternalRealtimeRequestSessionUpdateCommandSessionModality(string value) - { - _value = value ?? throw new ArgumentNullException(nameof(value)); - } - - private const string TextValue = "text"; - private const string AudioValue = "audio"; - - public static InternalRealtimeRequestSessionUpdateCommandSessionModality Text { get; } = new InternalRealtimeRequestSessionUpdateCommandSessionModality(TextValue); - public static InternalRealtimeRequestSessionUpdateCommandSessionModality Audio { get; } = new InternalRealtimeRequestSessionUpdateCommandSessionModality(AudioValue); - public static bool operator ==(InternalRealtimeRequestSessionUpdateCommandSessionModality left, InternalRealtimeRequestSessionUpdateCommandSessionModality right) => left.Equals(right); - public static bool operator !=(InternalRealtimeRequestSessionUpdateCommandSessionModality left, InternalRealtimeRequestSessionUpdateCommandSessionModality right) => !left.Equals(right); - public static implicit operator InternalRealtimeRequestSessionUpdateCommandSessionModality(string value) => new InternalRealtimeRequestSessionUpdateCommandSessionModality(value); - - [EditorBrowsable(EditorBrowsableState.Never)] - public override bool Equals(object obj) => obj is InternalRealtimeRequestSessionUpdateCommandSessionModality other && Equals(other); - public bool Equals(InternalRealtimeRequestSessionUpdateCommandSessionModality other) => string.Equals(_value, other._value, StringComparison.InvariantCultureIgnoreCase); - - [EditorBrowsable(EditorBrowsableState.Never)] - public override int GetHashCode() => _value != null ? StringComparer.InvariantCultureIgnoreCase.GetHashCode(_value) : 0; - public override string ToString() => _value; - } -} diff --git a/src/Generated/Models/InternalRealtimeRequestSystemMessageItem.Serialization.cs b/src/Generated/Models/InternalRealtimeRequestSystemMessageItem.Serialization.cs index e530bc5da..4bc4c361b 100644 --- a/src/Generated/Models/InternalRealtimeRequestSystemMessageItem.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeRequestSystemMessageItem.Serialization.cs @@ -96,7 +96,7 @@ internal static InternalRealtimeRequestSystemMessageItem DeserializeInternalReal IList content = default; ConversationMessageRole role = default; ConversationItemStatus? status = default; - InternalRealtimeRequestItemType type = default; + InternalRealtimeItemType type = default; string id = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); @@ -128,7 +128,7 @@ internal static InternalRealtimeRequestSystemMessageItem DeserializeInternalReal } if (property.NameEquals("type"u8)) { - type = new InternalRealtimeRequestItemType(property.Value.GetString()); + type = new InternalRealtimeItemType(property.Value.GetString()); continue; } if (property.NameEquals("id"u8)) diff --git a/src/Generated/Models/InternalRealtimeRequestSystemMessageItem.cs b/src/Generated/Models/InternalRealtimeRequestSystemMessageItem.cs index f2879fd19..6b55c70f7 100644 --- a/src/Generated/Models/InternalRealtimeRequestSystemMessageItem.cs +++ b/src/Generated/Models/InternalRealtimeRequestSystemMessageItem.cs @@ -18,7 +18,7 @@ public InternalRealtimeRequestSystemMessageItem(IEnumerable serializedAdditionalRawData, ConversationMessageRole role, ConversationItemStatus? status, IList content) : base(type, id, serializedAdditionalRawData, role, status) + internal InternalRealtimeRequestSystemMessageItem(InternalRealtimeItemType type, string id, IDictionary serializedAdditionalRawData, ConversationMessageRole role, ConversationItemStatus? status, IList content) : base(type, id, serializedAdditionalRawData, role, status) { Content = content; } diff --git a/src/Generated/Models/InternalRealtimeRequestTextContentPart.Serialization.cs b/src/Generated/Models/InternalRealtimeRequestTextContentPart.Serialization.cs index 2398c8964..75c01f2f8 100644 --- a/src/Generated/Models/InternalRealtimeRequestTextContentPart.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeRequestTextContentPart.Serialization.cs @@ -21,15 +21,20 @@ void IJsonModel.Write(Utf8JsonWriter wri } writer.WriteStartObject(); + if (SerializedAdditionalRawData?.ContainsKey("type") != true) + { + writer.WritePropertyName("type"u8); + writer.WriteStringValue(Type); + } if (SerializedAdditionalRawData?.ContainsKey("text") != true) { writer.WritePropertyName("text"u8); - writer.WriteStringValue(Text); + writer.WriteStringValue(InternalTextValue); } if (SerializedAdditionalRawData?.ContainsKey("type") != true) { writer.WritePropertyName("type"u8); - writer.WriteStringValue(Type.ToString()); + writer.WriteStringValue(Kind.ToString()); } if (SerializedAdditionalRawData != null) { @@ -73,12 +78,18 @@ internal static InternalRealtimeRequestTextContentPart DeserializeInternalRealti { return null; } + string type = default; string text = default; - ConversationContentPartKind type = default; + ConversationContentPartKind type0 = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); foreach (var property in element.EnumerateObject()) { + if (property.NameEquals("type"u8)) + { + type = property.Value.GetString(); + continue; + } if (property.NameEquals("text"u8)) { text = property.Value.GetString(); @@ -86,7 +97,7 @@ internal static InternalRealtimeRequestTextContentPart DeserializeInternalRealti } if (property.NameEquals("type"u8)) { - type = new ConversationContentPartKind(property.Value.GetString()); + type0 = new ConversationContentPartKind(property.Value.GetString()); continue; } if (true) @@ -96,7 +107,7 @@ internal static InternalRealtimeRequestTextContentPart DeserializeInternalRealti } } serializedAdditionalRawData = rawDataDictionary; - return new InternalRealtimeRequestTextContentPart(type, serializedAdditionalRawData, text); + return new InternalRealtimeRequestTextContentPart(type0, serializedAdditionalRawData, type, text); } BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) diff --git a/src/Generated/Models/InternalRealtimeRequestTextContentPart.cs b/src/Generated/Models/InternalRealtimeRequestTextContentPart.cs index 243370e65..c74d9851b 100644 --- a/src/Generated/Models/InternalRealtimeRequestTextContentPart.cs +++ b/src/Generated/Models/InternalRealtimeRequestTextContentPart.cs @@ -9,23 +9,24 @@ namespace OpenAI.RealtimeConversation { internal partial class InternalRealtimeRequestTextContentPart : ConversationContentPart { - public InternalRealtimeRequestTextContentPart(string text) + public InternalRealtimeRequestTextContentPart(string internalTextValue) { - Argument.AssertNotNull(text, nameof(text)); + Argument.AssertNotNull(internalTextValue, nameof(internalTextValue)); - Type = ConversationContentPartKind.InputText; - Text = text; + Kind = ConversationContentPartKind.InputText; + InternalTextValue = internalTextValue; } - internal InternalRealtimeRequestTextContentPart(ConversationContentPartKind type, IDictionary serializedAdditionalRawData, string text) : base(type, serializedAdditionalRawData) + internal InternalRealtimeRequestTextContentPart(ConversationContentPartKind kind, IDictionary serializedAdditionalRawData, string type, string internalTextValue) : base(kind, serializedAdditionalRawData) { - Text = text; + Type = type; + InternalTextValue = internalTextValue; } internal InternalRealtimeRequestTextContentPart() { } - public string Text { get; set; } + internal string Type { get; set; } = "input_text"; } } diff --git a/src/Generated/Models/InternalRealtimeRequestUserMessageItem.Serialization.cs b/src/Generated/Models/InternalRealtimeRequestUserMessageItem.Serialization.cs index 42026d8ac..b2be957c1 100644 --- a/src/Generated/Models/InternalRealtimeRequestUserMessageItem.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeRequestUserMessageItem.Serialization.cs @@ -96,7 +96,7 @@ internal static InternalRealtimeRequestUserMessageItem DeserializeInternalRealti IList content = default; ConversationMessageRole role = default; ConversationItemStatus? status = default; - InternalRealtimeRequestItemType type = default; + InternalRealtimeItemType type = default; string id = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); @@ -128,7 +128,7 @@ internal static InternalRealtimeRequestUserMessageItem DeserializeInternalRealti } if (property.NameEquals("type"u8)) { - type = new InternalRealtimeRequestItemType(property.Value.GetString()); + type = new InternalRealtimeItemType(property.Value.GetString()); continue; } if (property.NameEquals("id"u8)) diff --git a/src/Generated/Models/InternalRealtimeRequestUserMessageItem.cs b/src/Generated/Models/InternalRealtimeRequestUserMessageItem.cs index 9fa213483..df7bebd09 100644 --- a/src/Generated/Models/InternalRealtimeRequestUserMessageItem.cs +++ b/src/Generated/Models/InternalRealtimeRequestUserMessageItem.cs @@ -10,7 +10,7 @@ namespace OpenAI.RealtimeConversation { internal partial class InternalRealtimeRequestUserMessageItem : InternalRealtimeRequestMessageItem { - internal InternalRealtimeRequestUserMessageItem(InternalRealtimeRequestItemType type, string id, IDictionary serializedAdditionalRawData, ConversationMessageRole role, ConversationItemStatus? status, IList content) : base(type, id, serializedAdditionalRawData, role, status) + internal InternalRealtimeRequestUserMessageItem(InternalRealtimeItemType type, string id, IDictionary serializedAdditionalRawData, ConversationMessageRole role, ConversationItemStatus? status, IList content) : base(type, id, serializedAdditionalRawData, role, status) { Content = content; } diff --git a/src/Generated/Models/InternalRealtimeResponse.Serialization.cs b/src/Generated/Models/InternalRealtimeResponse.Serialization.cs index 8c94b962f..55de8801c 100644 --- a/src/Generated/Models/InternalRealtimeResponse.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeResponse.Serialization.cs @@ -108,7 +108,7 @@ internal static InternalRealtimeResponse DeserializeInternalRealtimeResponse(Jso InternalRealtimeResponseObject @object = default; string id = default; ConversationStatus status = default; - InternalRealtimeResponseStatusDetails statusDetails = default; + ConversationStatusDetails statusDetails = default; IReadOnlyList output = default; ConversationTokenUsage usage = default; IDictionary serializedAdditionalRawData = default; @@ -137,7 +137,7 @@ internal static InternalRealtimeResponse DeserializeInternalRealtimeResponse(Jso statusDetails = null; continue; } - statusDetails = InternalRealtimeResponseStatusDetails.DeserializeInternalRealtimeResponseStatusDetails(property.Value, options); + statusDetails = ConversationStatusDetails.DeserializeConversationStatusDetails(property.Value, options); continue; } if (property.NameEquals("output"u8)) diff --git a/src/Generated/Models/InternalRealtimeResponse.cs b/src/Generated/Models/InternalRealtimeResponse.cs index 73cd76214..1c25584cd 100644 --- a/src/Generated/Models/InternalRealtimeResponse.cs +++ b/src/Generated/Models/InternalRealtimeResponse.cs @@ -11,7 +11,7 @@ namespace OpenAI.RealtimeConversation internal partial class InternalRealtimeResponse { internal IDictionary SerializedAdditionalRawData { get; set; } - internal InternalRealtimeResponse(string id, ConversationStatus status, InternalRealtimeResponseStatusDetails statusDetails, IEnumerable output, ConversationTokenUsage usage) + internal InternalRealtimeResponse(string id, ConversationStatus status, ConversationStatusDetails statusDetails, IEnumerable output, ConversationTokenUsage usage) { Argument.AssertNotNull(id, nameof(id)); Argument.AssertNotNull(output, nameof(output)); @@ -24,7 +24,7 @@ internal InternalRealtimeResponse(string id, ConversationStatus status, Internal Usage = usage; } - internal InternalRealtimeResponse(InternalRealtimeResponseObject @object, string id, ConversationStatus status, InternalRealtimeResponseStatusDetails statusDetails, IReadOnlyList output, ConversationTokenUsage usage, IDictionary serializedAdditionalRawData) + internal InternalRealtimeResponse(InternalRealtimeResponseObject @object, string id, ConversationStatus status, ConversationStatusDetails statusDetails, IReadOnlyList output, ConversationTokenUsage usage, IDictionary serializedAdditionalRawData) { Object = @object; Id = id; @@ -43,7 +43,7 @@ internal InternalRealtimeResponse() public string Id { get; } public ConversationStatus Status { get; } - public InternalRealtimeResponseStatusDetails StatusDetails { get; } + public ConversationStatusDetails StatusDetails { get; } public ConversationTokenUsage Usage { get; } } } diff --git a/src/Generated/Models/InternalRealtimeResponseAudioContentPart.Serialization.cs b/src/Generated/Models/InternalRealtimeResponseAudioContentPart.Serialization.cs index 8324139d0..8c89c32ec 100644 --- a/src/Generated/Models/InternalRealtimeResponseAudioContentPart.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeResponseAudioContentPart.Serialization.cs @@ -21,12 +21,17 @@ void IJsonModel.Write(Utf8JsonWriter w } writer.WriteStartObject(); + if (SerializedAdditionalRawData?.ContainsKey("type") != true) + { + writer.WritePropertyName("type"u8); + writer.WriteStringValue(Type); + } if (SerializedAdditionalRawData?.ContainsKey("transcript") != true) { - if (Transcript != null) + if (InternalTranscriptValue != null) { writer.WritePropertyName("transcript"u8); - writer.WriteStringValue(Transcript); + writer.WriteStringValue(InternalTranscriptValue); } else { @@ -36,7 +41,7 @@ void IJsonModel.Write(Utf8JsonWriter w if (SerializedAdditionalRawData?.ContainsKey("type") != true) { writer.WritePropertyName("type"u8); - writer.WriteStringValue(Type.ToString()); + writer.WriteStringValue(Kind.ToString()); } if (SerializedAdditionalRawData != null) { @@ -80,12 +85,18 @@ internal static InternalRealtimeResponseAudioContentPart DeserializeInternalReal { return null; } + string type = default; string transcript = default; - ConversationContentPartKind type = default; + ConversationContentPartKind type0 = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); foreach (var property in element.EnumerateObject()) { + if (property.NameEquals("type"u8)) + { + type = property.Value.GetString(); + continue; + } if (property.NameEquals("transcript"u8)) { if (property.Value.ValueKind == JsonValueKind.Null) @@ -98,7 +109,7 @@ internal static InternalRealtimeResponseAudioContentPart DeserializeInternalReal } if (property.NameEquals("type"u8)) { - type = new ConversationContentPartKind(property.Value.GetString()); + type0 = new ConversationContentPartKind(property.Value.GetString()); continue; } if (true) @@ -108,7 +119,7 @@ internal static InternalRealtimeResponseAudioContentPart DeserializeInternalReal } } serializedAdditionalRawData = rawDataDictionary; - return new InternalRealtimeResponseAudioContentPart(type, serializedAdditionalRawData, transcript); + return new InternalRealtimeResponseAudioContentPart(type0, serializedAdditionalRawData, type, transcript); } BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) diff --git a/src/Generated/Models/InternalRealtimeResponseAudioContentPart.cs b/src/Generated/Models/InternalRealtimeResponseAudioContentPart.cs index 076fe2b0e..257ce118f 100644 --- a/src/Generated/Models/InternalRealtimeResponseAudioContentPart.cs +++ b/src/Generated/Models/InternalRealtimeResponseAudioContentPart.cs @@ -9,21 +9,22 @@ namespace OpenAI.RealtimeConversation { internal partial class InternalRealtimeResponseAudioContentPart : ConversationContentPart { - internal InternalRealtimeResponseAudioContentPart(string transcript) + internal InternalRealtimeResponseAudioContentPart(string internalTranscriptValue) { - Type = ConversationContentPartKind.Audio; - Transcript = transcript; + Kind = ConversationContentPartKind.OutputAudio; + InternalTranscriptValue = internalTranscriptValue; } - internal InternalRealtimeResponseAudioContentPart(ConversationContentPartKind type, IDictionary serializedAdditionalRawData, string transcript) : base(type, serializedAdditionalRawData) + internal InternalRealtimeResponseAudioContentPart(ConversationContentPartKind kind, IDictionary serializedAdditionalRawData, string type, string internalTranscriptValue) : base(kind, serializedAdditionalRawData) { - Transcript = transcript; + Type = type; + InternalTranscriptValue = internalTranscriptValue; } internal InternalRealtimeResponseAudioContentPart() { } - public string Transcript { get; } + internal string Type { get; set; } = "audio"; } } diff --git a/src/Generated/Models/InternalRealtimeResponseCancelledStatusDetails.cs b/src/Generated/Models/InternalRealtimeResponseCancelledStatusDetails.cs deleted file mode 100644 index 054b0e850..000000000 --- a/src/Generated/Models/InternalRealtimeResponseCancelledStatusDetails.cs +++ /dev/null @@ -1,29 +0,0 @@ -// - -#nullable disable - -using System; -using System.Collections.Generic; - -namespace OpenAI.RealtimeConversation -{ - internal partial class InternalRealtimeResponseCancelledStatusDetails : InternalRealtimeResponseStatusDetails - { - internal InternalRealtimeResponseCancelledStatusDetails(InternalRealtimeResponseCancelledStatusDetailsReason reason) - { - Type = ConversationStatus.Cancelled; - Reason = reason; - } - - internal InternalRealtimeResponseCancelledStatusDetails(ConversationStatus type, IDictionary serializedAdditionalRawData, InternalRealtimeResponseCancelledStatusDetailsReason reason) : base(type, serializedAdditionalRawData) - { - Reason = reason; - } - - internal InternalRealtimeResponseCancelledStatusDetails() - { - } - - public InternalRealtimeResponseCancelledStatusDetailsReason Reason { get; } - } -} diff --git a/src/Generated/Models/InternalRealtimeResponseCancelledStatusDetailsReason.cs b/src/Generated/Models/InternalRealtimeResponseCancelledStatusDetailsReason.cs deleted file mode 100644 index 00bb14ba5..000000000 --- a/src/Generated/Models/InternalRealtimeResponseCancelledStatusDetailsReason.cs +++ /dev/null @@ -1,36 +0,0 @@ -// - -#nullable disable - -using System; -using System.ComponentModel; - -namespace OpenAI.RealtimeConversation -{ - internal readonly partial struct InternalRealtimeResponseCancelledStatusDetailsReason : IEquatable - { - private readonly string _value; - - public InternalRealtimeResponseCancelledStatusDetailsReason(string value) - { - _value = value ?? throw new ArgumentNullException(nameof(value)); - } - - private const string TurnDetectedValue = "turn_detected"; - private const string ClientCancelledValue = "client_cancelled"; - - public static InternalRealtimeResponseCancelledStatusDetailsReason TurnDetected { get; } = new InternalRealtimeResponseCancelledStatusDetailsReason(TurnDetectedValue); - public static InternalRealtimeResponseCancelledStatusDetailsReason ClientCancelled { get; } = new InternalRealtimeResponseCancelledStatusDetailsReason(ClientCancelledValue); - public static bool operator ==(InternalRealtimeResponseCancelledStatusDetailsReason left, InternalRealtimeResponseCancelledStatusDetailsReason right) => left.Equals(right); - public static bool operator !=(InternalRealtimeResponseCancelledStatusDetailsReason left, InternalRealtimeResponseCancelledStatusDetailsReason right) => !left.Equals(right); - public static implicit operator InternalRealtimeResponseCancelledStatusDetailsReason(string value) => new InternalRealtimeResponseCancelledStatusDetailsReason(value); - - [EditorBrowsable(EditorBrowsableState.Never)] - public override bool Equals(object obj) => obj is InternalRealtimeResponseCancelledStatusDetailsReason other && Equals(other); - public bool Equals(InternalRealtimeResponseCancelledStatusDetailsReason other) => string.Equals(_value, other._value, StringComparison.InvariantCultureIgnoreCase); - - [EditorBrowsable(EditorBrowsableState.Never)] - public override int GetHashCode() => _value != null ? StringComparer.InvariantCultureIgnoreCase.GetHashCode(_value) : 0; - public override string ToString() => _value; - } -} diff --git a/src/Generated/Models/InternalRealtimeResponseFunctionCallItem.Serialization.cs b/src/Generated/Models/InternalRealtimeResponseFunctionCallItem.Serialization.cs index 0f63fd37b..3c24bb27a 100644 --- a/src/Generated/Models/InternalRealtimeResponseFunctionCallItem.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeResponseFunctionCallItem.Serialization.cs @@ -110,7 +110,7 @@ internal static InternalRealtimeResponseFunctionCallItem DeserializeInternalReal string arguments = default; ConversationItemStatus status = default; InternalRealtimeResponseItemObject @object = default; - InternalRealtimeRequestItemType type = default; + InternalRealtimeItemType type = default; string id = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); @@ -143,7 +143,7 @@ internal static InternalRealtimeResponseFunctionCallItem DeserializeInternalReal } if (property.NameEquals("type"u8)) { - type = new InternalRealtimeRequestItemType(property.Value.GetString()); + type = new InternalRealtimeItemType(property.Value.GetString()); continue; } if (property.NameEquals("id"u8)) diff --git a/src/Generated/Models/InternalRealtimeResponseFunctionCallItem.cs b/src/Generated/Models/InternalRealtimeResponseFunctionCallItem.cs index 98a28e33a..7e39e744c 100644 --- a/src/Generated/Models/InternalRealtimeResponseFunctionCallItem.cs +++ b/src/Generated/Models/InternalRealtimeResponseFunctionCallItem.cs @@ -15,14 +15,14 @@ internal InternalRealtimeResponseFunctionCallItem(string id, string name, string Argument.AssertNotNull(callId, nameof(callId)); Argument.AssertNotNull(arguments, nameof(arguments)); - Type = InternalRealtimeRequestItemType.FunctionCall; + Type = InternalRealtimeItemType.FunctionCall; Name = name; CallId = callId; Arguments = arguments; Status = status; } - internal InternalRealtimeResponseFunctionCallItem(InternalRealtimeResponseItemObject @object, InternalRealtimeRequestItemType type, string id, IDictionary serializedAdditionalRawData, string name, string callId, string arguments, ConversationItemStatus status) : base(@object, type, id, serializedAdditionalRawData) + internal InternalRealtimeResponseFunctionCallItem(InternalRealtimeResponseItemObject @object, InternalRealtimeItemType type, string id, IDictionary serializedAdditionalRawData, string name, string callId, string arguments, ConversationItemStatus status) : base(@object, type, id, serializedAdditionalRawData) { Name = name; CallId = callId; diff --git a/src/Generated/Models/InternalRealtimeResponseFunctionCallOutputItem.Serialization.cs b/src/Generated/Models/InternalRealtimeResponseFunctionCallOutputItem.Serialization.cs index a995663e2..e5fc5d5e0 100644 --- a/src/Generated/Models/InternalRealtimeResponseFunctionCallOutputItem.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeResponseFunctionCallOutputItem.Serialization.cs @@ -98,7 +98,7 @@ internal static InternalRealtimeResponseFunctionCallOutputItem DeserializeIntern string callId = default; string output = default; InternalRealtimeResponseItemObject @object = default; - InternalRealtimeRequestItemType type = default; + InternalRealtimeItemType type = default; string id = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); @@ -121,7 +121,7 @@ internal static InternalRealtimeResponseFunctionCallOutputItem DeserializeIntern } if (property.NameEquals("type"u8)) { - type = new InternalRealtimeRequestItemType(property.Value.GetString()); + type = new InternalRealtimeItemType(property.Value.GetString()); continue; } if (property.NameEquals("id"u8)) diff --git a/src/Generated/Models/InternalRealtimeResponseFunctionCallOutputItem.cs b/src/Generated/Models/InternalRealtimeResponseFunctionCallOutputItem.cs index ae62c1e28..cca5a943e 100644 --- a/src/Generated/Models/InternalRealtimeResponseFunctionCallOutputItem.cs +++ b/src/Generated/Models/InternalRealtimeResponseFunctionCallOutputItem.cs @@ -14,12 +14,12 @@ internal InternalRealtimeResponseFunctionCallOutputItem(string id, string callId Argument.AssertNotNull(callId, nameof(callId)); Argument.AssertNotNull(output, nameof(output)); - Type = InternalRealtimeRequestItemType.FunctionCallOutput; + Type = InternalRealtimeItemType.FunctionCallOutput; CallId = callId; Output = output; } - internal InternalRealtimeResponseFunctionCallOutputItem(InternalRealtimeResponseItemObject @object, InternalRealtimeRequestItemType type, string id, IDictionary serializedAdditionalRawData, string callId, string output) : base(@object, type, id, serializedAdditionalRawData) + internal InternalRealtimeResponseFunctionCallOutputItem(InternalRealtimeResponseItemObject @object, InternalRealtimeItemType type, string id, IDictionary serializedAdditionalRawData, string callId, string output) : base(@object, type, id, serializedAdditionalRawData) { CallId = callId; Output = output; diff --git a/src/Generated/Models/InternalRealtimeResponseIncompleteStatusDetails.cs b/src/Generated/Models/InternalRealtimeResponseIncompleteStatusDetails.cs deleted file mode 100644 index 24b55f81c..000000000 --- a/src/Generated/Models/InternalRealtimeResponseIncompleteStatusDetails.cs +++ /dev/null @@ -1,29 +0,0 @@ -// - -#nullable disable - -using System; -using System.Collections.Generic; - -namespace OpenAI.RealtimeConversation -{ - internal partial class InternalRealtimeResponseIncompleteStatusDetails : InternalRealtimeResponseStatusDetails - { - internal InternalRealtimeResponseIncompleteStatusDetails(InternalRealtimeResponseIncompleteStatusDetailsReason reason) - { - Type = ConversationStatus.Incomplete; - Reason = reason; - } - - internal InternalRealtimeResponseIncompleteStatusDetails(ConversationStatus type, IDictionary serializedAdditionalRawData, InternalRealtimeResponseIncompleteStatusDetailsReason reason) : base(type, serializedAdditionalRawData) - { - Reason = reason; - } - - internal InternalRealtimeResponseIncompleteStatusDetails() - { - } - - public InternalRealtimeResponseIncompleteStatusDetailsReason Reason { get; } - } -} diff --git a/src/Generated/Models/InternalRealtimeResponseIncompleteStatusDetailsReason.cs b/src/Generated/Models/InternalRealtimeResponseIncompleteStatusDetailsReason.cs deleted file mode 100644 index 9bf8c7d63..000000000 --- a/src/Generated/Models/InternalRealtimeResponseIncompleteStatusDetailsReason.cs +++ /dev/null @@ -1,36 +0,0 @@ -// - -#nullable disable - -using System; -using System.ComponentModel; - -namespace OpenAI.RealtimeConversation -{ - internal readonly partial struct InternalRealtimeResponseIncompleteStatusDetailsReason : IEquatable - { - private readonly string _value; - - public InternalRealtimeResponseIncompleteStatusDetailsReason(string value) - { - _value = value ?? throw new ArgumentNullException(nameof(value)); - } - - private const string MaxOutputTokensValue = "max_output_tokens"; - private const string ContentFilterValue = "content_filter"; - - public static InternalRealtimeResponseIncompleteStatusDetailsReason MaxOutputTokens { get; } = new InternalRealtimeResponseIncompleteStatusDetailsReason(MaxOutputTokensValue); - public static InternalRealtimeResponseIncompleteStatusDetailsReason ContentFilter { get; } = new InternalRealtimeResponseIncompleteStatusDetailsReason(ContentFilterValue); - public static bool operator ==(InternalRealtimeResponseIncompleteStatusDetailsReason left, InternalRealtimeResponseIncompleteStatusDetailsReason right) => left.Equals(right); - public static bool operator !=(InternalRealtimeResponseIncompleteStatusDetailsReason left, InternalRealtimeResponseIncompleteStatusDetailsReason right) => !left.Equals(right); - public static implicit operator InternalRealtimeResponseIncompleteStatusDetailsReason(string value) => new InternalRealtimeResponseIncompleteStatusDetailsReason(value); - - [EditorBrowsable(EditorBrowsableState.Never)] - public override bool Equals(object obj) => obj is InternalRealtimeResponseIncompleteStatusDetailsReason other && Equals(other); - public bool Equals(InternalRealtimeResponseIncompleteStatusDetailsReason other) => string.Equals(_value, other._value, StringComparison.InvariantCultureIgnoreCase); - - [EditorBrowsable(EditorBrowsableState.Never)] - public override int GetHashCode() => _value != null ? StringComparer.InvariantCultureIgnoreCase.GetHashCode(_value) : 0; - public override string ToString() => _value; - } -} diff --git a/src/Generated/Models/InternalRealtimeResponseItem.cs b/src/Generated/Models/InternalRealtimeResponseItem.cs index 9a04f907c..09bd77adc 100644 --- a/src/Generated/Models/InternalRealtimeResponseItem.cs +++ b/src/Generated/Models/InternalRealtimeResponseItem.cs @@ -15,7 +15,7 @@ protected InternalRealtimeResponseItem(string id) Id = id; } - internal InternalRealtimeResponseItem(InternalRealtimeResponseItemObject @object, InternalRealtimeRequestItemType type, string id, IDictionary serializedAdditionalRawData) + internal InternalRealtimeResponseItem(InternalRealtimeResponseItemObject @object, InternalRealtimeItemType type, string id, IDictionary serializedAdditionalRawData) { Object = @object; Type = type; @@ -29,7 +29,7 @@ internal InternalRealtimeResponseItem() public InternalRealtimeResponseItemObject Object { get; } = InternalRealtimeResponseItemObject.RealtimeItem; - internal InternalRealtimeRequestItemType Type { get; set; } + internal InternalRealtimeItemType Type { get; set; } public string Id { get; } } } diff --git a/src/Generated/Models/InternalRealtimeResponseMessageItem.Serialization.cs b/src/Generated/Models/InternalRealtimeResponseMessageItem.Serialization.cs index b8feb0ab3..bc558a0fa 100644 --- a/src/Generated/Models/InternalRealtimeResponseMessageItem.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeResponseMessageItem.Serialization.cs @@ -109,7 +109,7 @@ internal static InternalRealtimeResponseMessageItem DeserializeInternalRealtimeR IReadOnlyList content = default; ConversationItemStatus status = default; InternalRealtimeResponseItemObject @object = default; - InternalRealtimeRequestItemType type = default; + InternalRealtimeItemType type = default; string id = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); @@ -142,7 +142,7 @@ internal static InternalRealtimeResponseMessageItem DeserializeInternalRealtimeR } if (property.NameEquals("type"u8)) { - type = new InternalRealtimeRequestItemType(property.Value.GetString()); + type = new InternalRealtimeItemType(property.Value.GetString()); continue; } if (property.NameEquals("id"u8)) diff --git a/src/Generated/Models/InternalRealtimeResponseMessageItem.cs b/src/Generated/Models/InternalRealtimeResponseMessageItem.cs index 510f6505b..e890da2f5 100644 --- a/src/Generated/Models/InternalRealtimeResponseMessageItem.cs +++ b/src/Generated/Models/InternalRealtimeResponseMessageItem.cs @@ -14,13 +14,13 @@ internal InternalRealtimeResponseMessageItem(string id, ConversationMessageRole { Argument.AssertNotNull(content, nameof(content)); - Type = InternalRealtimeRequestItemType.Message; + Type = InternalRealtimeItemType.Message; Role = role; Content = content.ToList(); Status = status; } - internal InternalRealtimeResponseMessageItem(InternalRealtimeResponseItemObject @object, InternalRealtimeRequestItemType type, string id, IDictionary serializedAdditionalRawData, ConversationMessageRole role, IReadOnlyList content, ConversationItemStatus status) : base(@object, type, id, serializedAdditionalRawData) + internal InternalRealtimeResponseMessageItem(InternalRealtimeResponseItemObject @object, InternalRealtimeItemType type, string id, IDictionary serializedAdditionalRawData, ConversationMessageRole role, IReadOnlyList content, ConversationItemStatus status) : base(@object, type, id, serializedAdditionalRawData) { Role = role; Content = content; diff --git a/src/Generated/Models/InternalRealtimeResponseSession.Serialization.cs b/src/Generated/Models/InternalRealtimeResponseSession.Serialization.cs index 1388cbabc..97459c6fb 100644 --- a/src/Generated/Models/InternalRealtimeResponseSession.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeResponseSession.Serialization.cs @@ -174,7 +174,7 @@ internal static InternalRealtimeResponseSession DeserializeInternalRealtimeRespo InternalRealtimeResponseSessionObject @object = default; string id = default; string model = default; - IReadOnlyList modalities = default; + IReadOnlyList modalities = default; string instructions = default; ConversationVoice voice = default; ConversationAudioFormat inputAudioFormat = default; @@ -206,10 +206,10 @@ internal static InternalRealtimeResponseSession DeserializeInternalRealtimeRespo } if (property.NameEquals("modalities"u8)) { - List array = new List(); + List array = new List(); foreach (var item in property.Value.EnumerateArray()) { - array.Add(new InternalRealtimeRequestSessionUpdateCommandSessionModality(item.GetString())); + array.Add(new InternalRealtimeRequestSessionModality(item.GetString())); } modalities = array; continue; diff --git a/src/Generated/Models/InternalRealtimeResponseSession.cs b/src/Generated/Models/InternalRealtimeResponseSession.cs index a35d2544b..50a7fa482 100644 --- a/src/Generated/Models/InternalRealtimeResponseSession.cs +++ b/src/Generated/Models/InternalRealtimeResponseSession.cs @@ -11,7 +11,7 @@ namespace OpenAI.RealtimeConversation internal partial class InternalRealtimeResponseSession { internal IDictionary SerializedAdditionalRawData { get; set; } - internal InternalRealtimeResponseSession(string id, string model, IEnumerable modalities, string instructions, ConversationVoice voice, ConversationAudioFormat inputAudioFormat, ConversationAudioFormat outputAudioFormat, ConversationInputTranscriptionOptions inputAudioTranscription, ConversationTurnDetectionOptions turnDetection, IEnumerable tools, BinaryData toolChoice, float temperature, BinaryData maxResponseOutputTokens) + internal InternalRealtimeResponseSession(string id, string model, IEnumerable modalities, string instructions, ConversationVoice voice, ConversationAudioFormat inputAudioFormat, ConversationAudioFormat outputAudioFormat, ConversationInputTranscriptionOptions inputAudioTranscription, ConversationTurnDetectionOptions turnDetection, IEnumerable tools, BinaryData toolChoice, float temperature, BinaryData maxResponseOutputTokens) { Argument.AssertNotNull(id, nameof(id)); Argument.AssertNotNull(model, nameof(model)); @@ -36,7 +36,7 @@ internal InternalRealtimeResponseSession(string id, string model, IEnumerable modalities, string instructions, ConversationVoice voice, ConversationAudioFormat inputAudioFormat, ConversationAudioFormat outputAudioFormat, ConversationInputTranscriptionOptions inputAudioTranscription, ConversationTurnDetectionOptions turnDetection, IReadOnlyList tools, BinaryData toolChoice, float temperature, BinaryData maxResponseOutputTokens, IDictionary serializedAdditionalRawData) + internal InternalRealtimeResponseSession(InternalRealtimeResponseSessionObject @object, string id, string model, IReadOnlyList modalities, string instructions, ConversationVoice voice, ConversationAudioFormat inputAudioFormat, ConversationAudioFormat outputAudioFormat, ConversationInputTranscriptionOptions inputAudioTranscription, ConversationTurnDetectionOptions turnDetection, IReadOnlyList tools, BinaryData toolChoice, float temperature, BinaryData maxResponseOutputTokens, IDictionary serializedAdditionalRawData) { Object = @object; Id = id; @@ -63,7 +63,7 @@ internal InternalRealtimeResponseSession() public string Id { get; } public string Model { get; } - public IReadOnlyList Modalities { get; } + public IReadOnlyList Modalities { get; } public string Instructions { get; } public ConversationVoice Voice { get; } public ConversationAudioFormat InputAudioFormat { get; } diff --git a/src/Generated/Models/InternalRealtimeResponseStatusDetails.Serialization.cs b/src/Generated/Models/InternalRealtimeResponseStatusDetails.Serialization.cs deleted file mode 100644 index 852c8f9e5..000000000 --- a/src/Generated/Models/InternalRealtimeResponseStatusDetails.Serialization.cs +++ /dev/null @@ -1,125 +0,0 @@ -// - -#nullable disable - -using System; -using System.ClientModel; -using System.ClientModel.Primitives; -using System.Text.Json; - -namespace OpenAI.RealtimeConversation -{ - [PersistableModelProxy(typeof(UnknownRealtimeResponseStatusDetails))] - internal partial class InternalRealtimeResponseStatusDetails : IJsonModel - { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) - { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; - if (format != "J") - { - throw new FormatException($"The model {nameof(InternalRealtimeResponseStatusDetails)} does not support writing '{format}' format."); - } - - writer.WriteStartObject(); - if (SerializedAdditionalRawData?.ContainsKey("type") != true) - { - writer.WritePropertyName("type"u8); - writer.WriteStringValue(Type.ToString()); - } - if (SerializedAdditionalRawData != null) - { - foreach (var item in SerializedAdditionalRawData) - { - if (ModelSerializationExtensions.IsSentinelValue(item.Value)) - { - continue; - } - writer.WritePropertyName(item.Key); -#if NET6_0_OR_GREATER - writer.WriteRawValue(item.Value); -#else - using (JsonDocument document = JsonDocument.Parse(item.Value)) - { - JsonSerializer.Serialize(writer, document.RootElement); - } -#endif - } - } - writer.WriteEndObject(); - } - - InternalRealtimeResponseStatusDetails IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) - { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; - if (format != "J") - { - throw new FormatException($"The model {nameof(InternalRealtimeResponseStatusDetails)} does not support reading '{format}' format."); - } - - using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeInternalRealtimeResponseStatusDetails(document.RootElement, options); - } - - internal static InternalRealtimeResponseStatusDetails DeserializeInternalRealtimeResponseStatusDetails(JsonElement element, ModelReaderWriterOptions options = null) - { - options ??= ModelSerializationExtensions.WireOptions; - - if (element.ValueKind == JsonValueKind.Null) - { - return null; - } - if (element.TryGetProperty("type", out JsonElement discriminator)) - { - switch (discriminator.GetString()) - { - case "cancelled": return InternalRealtimeResponseCancelledStatusDetails.DeserializeInternalRealtimeResponseCancelledStatusDetails(element, options); - case "failed": return RealtimeResponseFailedStatusDetails.DeserializeRealtimeResponseFailedStatusDetails(element, options); - case "incomplete": return InternalRealtimeResponseIncompleteStatusDetails.DeserializeInternalRealtimeResponseIncompleteStatusDetails(element, options); - } - } - return UnknownRealtimeResponseStatusDetails.DeserializeUnknownRealtimeResponseStatusDetails(element, options); - } - - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) - { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; - - switch (format) - { - case "J": - return ModelReaderWriter.Write(this, options); - default: - throw new FormatException($"The model {nameof(InternalRealtimeResponseStatusDetails)} does not support writing '{options.Format}' format."); - } - } - - InternalRealtimeResponseStatusDetails IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) - { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; - - switch (format) - { - case "J": - { - using JsonDocument document = JsonDocument.Parse(data); - return DeserializeInternalRealtimeResponseStatusDetails(document.RootElement, options); - } - default: - throw new FormatException($"The model {nameof(InternalRealtimeResponseStatusDetails)} does not support reading '{options.Format}' format."); - } - } - - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - - internal static InternalRealtimeResponseStatusDetails FromResponse(PipelineResponse response) - { - using var document = JsonDocument.Parse(response.Content); - return DeserializeInternalRealtimeResponseStatusDetails(document.RootElement); - } - - internal virtual BinaryContent ToBinaryContent() - { - return BinaryContent.Create(this, ModelSerializationExtensions.WireOptions); - } - } -} diff --git a/src/Generated/Models/InternalRealtimeResponseStatusDetails.cs b/src/Generated/Models/InternalRealtimeResponseStatusDetails.cs deleted file mode 100644 index fa579305c..000000000 --- a/src/Generated/Models/InternalRealtimeResponseStatusDetails.cs +++ /dev/null @@ -1,25 +0,0 @@ -// - -#nullable disable - -using System; -using System.Collections.Generic; - -namespace OpenAI.RealtimeConversation -{ - internal abstract partial class InternalRealtimeResponseStatusDetails - { - internal IDictionary SerializedAdditionalRawData { get; set; } - protected InternalRealtimeResponseStatusDetails() - { - } - - internal InternalRealtimeResponseStatusDetails(ConversationStatus type, IDictionary serializedAdditionalRawData) - { - Type = type; - SerializedAdditionalRawData = serializedAdditionalRawData; - } - - internal ConversationStatus Type { get; set; } - } -} diff --git a/src/Generated/Models/InternalRealtimeResponseTextContentPart.Serialization.cs b/src/Generated/Models/InternalRealtimeResponseTextContentPart.Serialization.cs index 4a728d942..d757cd9e5 100644 --- a/src/Generated/Models/InternalRealtimeResponseTextContentPart.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeResponseTextContentPart.Serialization.cs @@ -21,15 +21,20 @@ void IJsonModel.Write(Utf8JsonWriter wr } writer.WriteStartObject(); + if (SerializedAdditionalRawData?.ContainsKey("type") != true) + { + writer.WritePropertyName("type"u8); + writer.WriteStringValue(Type); + } if (SerializedAdditionalRawData?.ContainsKey("text") != true) { writer.WritePropertyName("text"u8); - writer.WriteStringValue(Text); + writer.WriteStringValue(InternalTextValue); } if (SerializedAdditionalRawData?.ContainsKey("type") != true) { writer.WritePropertyName("type"u8); - writer.WriteStringValue(Type.ToString()); + writer.WriteStringValue(Kind.ToString()); } if (SerializedAdditionalRawData != null) { @@ -73,12 +78,18 @@ internal static InternalRealtimeResponseTextContentPart DeserializeInternalRealt { return null; } + string type = default; string text = default; - ConversationContentPartKind type = default; + ConversationContentPartKind type0 = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); foreach (var property in element.EnumerateObject()) { + if (property.NameEquals("type"u8)) + { + type = property.Value.GetString(); + continue; + } if (property.NameEquals("text"u8)) { text = property.Value.GetString(); @@ -86,7 +97,7 @@ internal static InternalRealtimeResponseTextContentPart DeserializeInternalRealt } if (property.NameEquals("type"u8)) { - type = new ConversationContentPartKind(property.Value.GetString()); + type0 = new ConversationContentPartKind(property.Value.GetString()); continue; } if (true) @@ -96,7 +107,7 @@ internal static InternalRealtimeResponseTextContentPart DeserializeInternalRealt } } serializedAdditionalRawData = rawDataDictionary; - return new InternalRealtimeResponseTextContentPart(type, serializedAdditionalRawData, text); + return new InternalRealtimeResponseTextContentPart(type0, serializedAdditionalRawData, type, text); } BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) diff --git a/src/Generated/Models/InternalRealtimeResponseTextContentPart.cs b/src/Generated/Models/InternalRealtimeResponseTextContentPart.cs index 063b4f309..133432b64 100644 --- a/src/Generated/Models/InternalRealtimeResponseTextContentPart.cs +++ b/src/Generated/Models/InternalRealtimeResponseTextContentPart.cs @@ -9,23 +9,24 @@ namespace OpenAI.RealtimeConversation { internal partial class InternalRealtimeResponseTextContentPart : ConversationContentPart { - internal InternalRealtimeResponseTextContentPart(string text) + internal InternalRealtimeResponseTextContentPart(string internalTextValue) { - Argument.AssertNotNull(text, nameof(text)); + Argument.AssertNotNull(internalTextValue, nameof(internalTextValue)); - Type = ConversationContentPartKind.Text; - Text = text; + Kind = ConversationContentPartKind.OutputText; + InternalTextValue = internalTextValue; } - internal InternalRealtimeResponseTextContentPart(ConversationContentPartKind type, IDictionary serializedAdditionalRawData, string text) : base(type, serializedAdditionalRawData) + internal InternalRealtimeResponseTextContentPart(ConversationContentPartKind kind, IDictionary serializedAdditionalRawData, string type, string internalTextValue) : base(kind, serializedAdditionalRawData) { - Text = text; + Type = type; + InternalTextValue = internalTextValue; } internal InternalRealtimeResponseTextContentPart() { } - public string Text { get; } + internal string Type { get; set; } = "text"; } } diff --git a/src/Generated/Models/InternalRealtimeResponseCancelledStatusDetails.Serialization.cs b/src/Generated/Models/InternalRealtimeServerEventConversationCreated.Serialization.cs similarity index 56% rename from src/Generated/Models/InternalRealtimeResponseCancelledStatusDetails.Serialization.cs rename to src/Generated/Models/InternalRealtimeServerEventConversationCreated.Serialization.cs index bd29cb9f7..d1413892a 100644 --- a/src/Generated/Models/InternalRealtimeResponseCancelledStatusDetails.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeServerEventConversationCreated.Serialization.cs @@ -10,26 +10,31 @@ namespace OpenAI.RealtimeConversation { - internal partial class InternalRealtimeResponseCancelledStatusDetails : IJsonModel + internal partial class InternalRealtimeServerEventConversationCreated : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeResponseCancelledStatusDetails)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventConversationCreated)} does not support writing '{format}' format."); } writer.WriteStartObject(); - if (SerializedAdditionalRawData?.ContainsKey("reason") != true) + if (SerializedAdditionalRawData?.ContainsKey("conversation") != true) { - writer.WritePropertyName("reason"u8); - writer.WriteStringValue(Reason.ToString()); + writer.WritePropertyName("conversation"u8); + writer.WriteObjectValue(Conversation, options); } if (SerializedAdditionalRawData?.ContainsKey("type") != true) { writer.WritePropertyName("type"u8); - writer.WriteStringValue(Type.ToString()); + writer.WriteStringValue(Kind.ToSerialString()); + } + if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) + { + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -53,19 +58,19 @@ void IJsonModel.Write(Utf8JsonWr writer.WriteEndObject(); } - InternalRealtimeResponseCancelledStatusDetails IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + InternalRealtimeServerEventConversationCreated IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeResponseCancelledStatusDetails)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventConversationCreated)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeInternalRealtimeResponseCancelledStatusDetails(document.RootElement, options); + return DeserializeInternalRealtimeServerEventConversationCreated(document.RootElement, options); } - internal static InternalRealtimeResponseCancelledStatusDetails DeserializeInternalRealtimeResponseCancelledStatusDetails(JsonElement element, ModelReaderWriterOptions options = null) + internal static InternalRealtimeServerEventConversationCreated DeserializeInternalRealtimeServerEventConversationCreated(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -73,20 +78,26 @@ internal static InternalRealtimeResponseCancelledStatusDetails DeserializeIntern { return null; } - InternalRealtimeResponseCancelledStatusDetailsReason reason = default; - ConversationStatus type = default; + InternalRealtimeServerEventConversationCreatedConversation conversation = default; + ConversationUpdateKind type = default; + string eventId = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); foreach (var property in element.EnumerateObject()) { - if (property.NameEquals("reason"u8)) + if (property.NameEquals("conversation"u8)) { - reason = new InternalRealtimeResponseCancelledStatusDetailsReason(property.Value.GetString()); + conversation = InternalRealtimeServerEventConversationCreatedConversation.DeserializeInternalRealtimeServerEventConversationCreatedConversation(property.Value, options); continue; } if (property.NameEquals("type"u8)) { - type = new ConversationStatus(property.Value.GetString()); + type = property.Value.GetString().ToConversationUpdateKind(); + continue; + } + if (property.NameEquals("event_id"u8)) + { + eventId = property.Value.GetString(); continue; } if (true) @@ -96,44 +107,44 @@ internal static InternalRealtimeResponseCancelledStatusDetails DeserializeIntern } } serializedAdditionalRawData = rawDataDictionary; - return new InternalRealtimeResponseCancelledStatusDetails(type, serializedAdditionalRawData, reason); + return new InternalRealtimeServerEventConversationCreated(type, eventId, serializedAdditionalRawData, conversation); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(InternalRealtimeResponseCancelledStatusDetails)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventConversationCreated)} does not support writing '{options.Format}' format."); } } - InternalRealtimeResponseCancelledStatusDetails IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + InternalRealtimeServerEventConversationCreated IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeInternalRealtimeResponseCancelledStatusDetails(document.RootElement, options); + return DeserializeInternalRealtimeServerEventConversationCreated(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(InternalRealtimeResponseCancelledStatusDetails)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventConversationCreated)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new InternalRealtimeResponseCancelledStatusDetails FromResponse(PipelineResponse response) + internal static new InternalRealtimeServerEventConversationCreated FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeInternalRealtimeResponseCancelledStatusDetails(document.RootElement); + return DeserializeInternalRealtimeServerEventConversationCreated(document.RootElement); } internal override BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/InternalRealtimeServerEventConversationCreated.cs b/src/Generated/Models/InternalRealtimeServerEventConversationCreated.cs new file mode 100644 index 000000000..f992de4a3 --- /dev/null +++ b/src/Generated/Models/InternalRealtimeServerEventConversationCreated.cs @@ -0,0 +1,32 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; + +namespace OpenAI.RealtimeConversation +{ + internal partial class InternalRealtimeServerEventConversationCreated : ConversationUpdate + { + internal InternalRealtimeServerEventConversationCreated(string eventId, InternalRealtimeServerEventConversationCreatedConversation conversation) : base(eventId) + { + Argument.AssertNotNull(eventId, nameof(eventId)); + Argument.AssertNotNull(conversation, nameof(conversation)); + + Kind = ConversationUpdateKind.ConversationCreated; + Conversation = conversation; + } + + internal InternalRealtimeServerEventConversationCreated(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, InternalRealtimeServerEventConversationCreatedConversation conversation) : base(kind, eventId, serializedAdditionalRawData) + { + Conversation = conversation; + } + + internal InternalRealtimeServerEventConversationCreated() + { + } + + public InternalRealtimeServerEventConversationCreatedConversation Conversation { get; } + } +} diff --git a/src/Generated/Models/InternalRealtimeServerEventConversationCreatedConversation.Serialization.cs b/src/Generated/Models/InternalRealtimeServerEventConversationCreatedConversation.Serialization.cs new file mode 100644 index 000000000..b818ebd70 --- /dev/null +++ b/src/Generated/Models/InternalRealtimeServerEventConversationCreatedConversation.Serialization.cs @@ -0,0 +1,144 @@ +// + +#nullable disable + +using System; +using System.ClientModel; +using System.ClientModel.Primitives; +using System.Collections.Generic; +using System.Text.Json; + +namespace OpenAI.RealtimeConversation +{ + internal partial class InternalRealtimeServerEventConversationCreatedConversation : IJsonModel + { + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + { + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + if (format != "J") + { + throw new FormatException($"The model {nameof(InternalRealtimeServerEventConversationCreatedConversation)} does not support writing '{format}' format."); + } + + writer.WriteStartObject(); + if (SerializedAdditionalRawData?.ContainsKey("id") != true && Optional.IsDefined(Id)) + { + writer.WritePropertyName("id"u8); + writer.WriteStringValue(Id); + } + if (SerializedAdditionalRawData?.ContainsKey("object") != true && Optional.IsDefined(Object)) + { + writer.WritePropertyName("object"u8); + writer.WriteStringValue(Object); + } + if (SerializedAdditionalRawData != null) + { + foreach (var item in SerializedAdditionalRawData) + { + if (ModelSerializationExtensions.IsSentinelValue(item.Value)) + { + continue; + } + writer.WritePropertyName(item.Key); +#if NET6_0_OR_GREATER + writer.WriteRawValue(item.Value); +#else + using (JsonDocument document = JsonDocument.Parse(item.Value)) + { + JsonSerializer.Serialize(writer, document.RootElement); + } +#endif + } + } + writer.WriteEndObject(); + } + + InternalRealtimeServerEventConversationCreatedConversation IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + { + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + if (format != "J") + { + throw new FormatException($"The model {nameof(InternalRealtimeServerEventConversationCreatedConversation)} does not support reading '{format}' format."); + } + + using JsonDocument document = JsonDocument.ParseValue(ref reader); + return DeserializeInternalRealtimeServerEventConversationCreatedConversation(document.RootElement, options); + } + + internal static InternalRealtimeServerEventConversationCreatedConversation DeserializeInternalRealtimeServerEventConversationCreatedConversation(JsonElement element, ModelReaderWriterOptions options = null) + { + options ??= ModelSerializationExtensions.WireOptions; + + if (element.ValueKind == JsonValueKind.Null) + { + return null; + } + string id = default; + string @object = default; + IDictionary serializedAdditionalRawData = default; + Dictionary rawDataDictionary = new Dictionary(); + foreach (var property in element.EnumerateObject()) + { + if (property.NameEquals("id"u8)) + { + id = property.Value.GetString(); + continue; + } + if (property.NameEquals("object"u8)) + { + @object = property.Value.GetString(); + continue; + } + if (true) + { + rawDataDictionary ??= new Dictionary(); + rawDataDictionary.Add(property.Name, BinaryData.FromString(property.Value.GetRawText())); + } + } + serializedAdditionalRawData = rawDataDictionary; + return new InternalRealtimeServerEventConversationCreatedConversation(id, @object, serializedAdditionalRawData); + } + + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + { + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + + switch (format) + { + case "J": + return ModelReaderWriter.Write(this, options); + default: + throw new FormatException($"The model {nameof(InternalRealtimeServerEventConversationCreatedConversation)} does not support writing '{options.Format}' format."); + } + } + + InternalRealtimeServerEventConversationCreatedConversation IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + { + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + + switch (format) + { + case "J": + { + using JsonDocument document = JsonDocument.Parse(data); + return DeserializeInternalRealtimeServerEventConversationCreatedConversation(document.RootElement, options); + } + default: + throw new FormatException($"The model {nameof(InternalRealtimeServerEventConversationCreatedConversation)} does not support reading '{options.Format}' format."); + } + } + + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + + internal static InternalRealtimeServerEventConversationCreatedConversation FromResponse(PipelineResponse response) + { + using var document = JsonDocument.Parse(response.Content); + return DeserializeInternalRealtimeServerEventConversationCreatedConversation(document.RootElement); + } + + internal virtual BinaryContent ToBinaryContent() + { + return BinaryContent.Create(this, ModelSerializationExtensions.WireOptions); + } + } +} diff --git a/src/Generated/Models/InternalRealtimeServerEventConversationCreatedConversation.cs b/src/Generated/Models/InternalRealtimeServerEventConversationCreatedConversation.cs new file mode 100644 index 000000000..519df281e --- /dev/null +++ b/src/Generated/Models/InternalRealtimeServerEventConversationCreatedConversation.cs @@ -0,0 +1,27 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; + +namespace OpenAI.RealtimeConversation +{ + internal partial class InternalRealtimeServerEventConversationCreatedConversation + { + internal IDictionary SerializedAdditionalRawData { get; set; } + internal InternalRealtimeServerEventConversationCreatedConversation() + { + } + + internal InternalRealtimeServerEventConversationCreatedConversation(string id, string @object, IDictionary serializedAdditionalRawData) + { + Id = id; + Object = @object; + SerializedAdditionalRawData = serializedAdditionalRawData; + } + + public string Id { get; } + public string Object { get; } + } +} diff --git a/src/Generated/Models/InternalRealtimeResponseApiError.Serialization.cs b/src/Generated/Models/InternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError.Serialization.cs similarity index 59% rename from src/Generated/Models/InternalRealtimeResponseApiError.Serialization.cs rename to src/Generated/Models/InternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError.Serialization.cs index fc4fc5e8e..67d2b6611 100644 --- a/src/Generated/Models/InternalRealtimeResponseApiError.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError.Serialization.cs @@ -10,18 +10,18 @@ namespace OpenAI.RealtimeConversation { - internal partial class InternalRealtimeResponseApiError : IJsonModel + internal partial class InternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeResponseApiError)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError)} does not support writing '{format}' format."); } writer.WriteStartObject(); - if (SerializedAdditionalRawData?.ContainsKey("type") != true) + if (SerializedAdditionalRawData?.ContainsKey("type") != true && Optional.IsDefined(Type)) { writer.WritePropertyName("type"u8); writer.WriteStringValue(Type); @@ -31,7 +31,7 @@ void IJsonModel.Write(Utf8JsonWriter writer, M writer.WritePropertyName("code"u8); writer.WriteStringValue(Code); } - if (SerializedAdditionalRawData?.ContainsKey("message") != true) + if (SerializedAdditionalRawData?.ContainsKey("message") != true && Optional.IsDefined(Message)) { writer.WritePropertyName("message"u8); writer.WriteStringValue(Message); @@ -63,19 +63,19 @@ void IJsonModel.Write(Utf8JsonWriter writer, M writer.WriteEndObject(); } - InternalRealtimeResponseApiError IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + InternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeResponseApiError)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeInternalRealtimeResponseApiError(document.RootElement, options); + return DeserializeInternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError(document.RootElement, options); } - internal static InternalRealtimeResponseApiError DeserializeInternalRealtimeResponseApiError(JsonElement element, ModelReaderWriterOptions options = null) + internal static InternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError DeserializeInternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -118,44 +118,44 @@ internal static InternalRealtimeResponseApiError DeserializeInternalRealtimeResp } } serializedAdditionalRawData = rawDataDictionary; - return new InternalRealtimeResponseApiError(type, code, message, param, serializedAdditionalRawData); + return new InternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError(type, code, message, param, serializedAdditionalRawData); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(InternalRealtimeResponseApiError)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError)} does not support writing '{options.Format}' format."); } } - InternalRealtimeResponseApiError IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + InternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeInternalRealtimeResponseApiError(document.RootElement, options); + return DeserializeInternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(InternalRealtimeResponseApiError)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static InternalRealtimeResponseApiError FromResponse(PipelineResponse response) + internal static InternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeInternalRealtimeResponseApiError(document.RootElement); + return DeserializeInternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError(document.RootElement); } internal virtual BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/InternalRealtimeResponseApiError.cs b/src/Generated/Models/InternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError.cs similarity index 52% rename from src/Generated/Models/InternalRealtimeResponseApiError.cs rename to src/Generated/Models/InternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError.cs index 337315fb8..4a79d144f 100644 --- a/src/Generated/Models/InternalRealtimeResponseApiError.cs +++ b/src/Generated/Models/InternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError.cs @@ -7,19 +7,14 @@ namespace OpenAI.RealtimeConversation { - internal partial class InternalRealtimeResponseApiError + internal partial class InternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError { internal IDictionary SerializedAdditionalRawData { get; set; } - internal InternalRealtimeResponseApiError(string type, string message) + internal InternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError() { - Argument.AssertNotNull(type, nameof(type)); - Argument.AssertNotNull(message, nameof(message)); - - Type = type; - Message = message; } - internal InternalRealtimeResponseApiError(string type, string code, string message, string param, IDictionary serializedAdditionalRawData) + internal InternalRealtimeServerEventConversationItemInputAudioTranscriptionFailedError(string type, string code, string message, string param, IDictionary serializedAdditionalRawData) { Type = type; Code = code; @@ -28,10 +23,6 @@ internal InternalRealtimeResponseApiError(string type, string code, string messa SerializedAdditionalRawData = serializedAdditionalRawData; } - internal InternalRealtimeResponseApiError() - { - } - public string Type { get; } public string Code { get; } public string Message { get; } diff --git a/src/Generated/Models/InternalRealtimeResponseError.Serialization.cs b/src/Generated/Models/InternalRealtimeServerEventErrorError.Serialization.cs similarity index 70% rename from src/Generated/Models/InternalRealtimeResponseError.Serialization.cs rename to src/Generated/Models/InternalRealtimeServerEventErrorError.Serialization.cs index 2d2473b76..4274ac51e 100644 --- a/src/Generated/Models/InternalRealtimeResponseError.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeServerEventErrorError.Serialization.cs @@ -10,18 +10,18 @@ namespace OpenAI.RealtimeConversation { - internal partial class InternalRealtimeResponseError : IJsonModel + internal partial class InternalRealtimeServerEventErrorError : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeResponseError)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventErrorError)} does not support writing '{format}' format."); } writer.WriteStartObject(); - if (SerializedAdditionalRawData?.ContainsKey("type") != true) + if (SerializedAdditionalRawData?.ContainsKey("type") != true && Optional.IsDefined(Type)) { writer.WritePropertyName("type"u8); writer.WriteStringValue(Type); @@ -31,7 +31,7 @@ void IJsonModel.Write(Utf8JsonWriter writer, Mode writer.WritePropertyName("code"u8); writer.WriteStringValue(Code); } - if (SerializedAdditionalRawData?.ContainsKey("message") != true) + if (SerializedAdditionalRawData?.ContainsKey("message") != true && Optional.IsDefined(Message)) { writer.WritePropertyName("message"u8); writer.WriteStringValue(Message); @@ -68,19 +68,19 @@ void IJsonModel.Write(Utf8JsonWriter writer, Mode writer.WriteEndObject(); } - InternalRealtimeResponseError IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + InternalRealtimeServerEventErrorError IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeResponseError)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventErrorError)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeInternalRealtimeResponseError(document.RootElement, options); + return DeserializeInternalRealtimeServerEventErrorError(document.RootElement, options); } - internal static InternalRealtimeResponseError DeserializeInternalRealtimeResponseError(JsonElement element, ModelReaderWriterOptions options = null) + internal static InternalRealtimeServerEventErrorError DeserializeInternalRealtimeServerEventErrorError(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -129,7 +129,7 @@ internal static InternalRealtimeResponseError DeserializeInternalRealtimeRespons } } serializedAdditionalRawData = rawDataDictionary; - return new InternalRealtimeResponseError( + return new InternalRealtimeServerEventErrorError( type, code, message, @@ -138,41 +138,41 @@ internal static InternalRealtimeResponseError DeserializeInternalRealtimeRespons serializedAdditionalRawData); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(InternalRealtimeResponseError)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventErrorError)} does not support writing '{options.Format}' format."); } } - InternalRealtimeResponseError IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + InternalRealtimeServerEventErrorError IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeInternalRealtimeResponseError(document.RootElement, options); + return DeserializeInternalRealtimeServerEventErrorError(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(InternalRealtimeResponseError)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventErrorError)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static InternalRealtimeResponseError FromResponse(PipelineResponse response) + internal static InternalRealtimeServerEventErrorError FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeInternalRealtimeResponseError(document.RootElement); + return DeserializeInternalRealtimeServerEventErrorError(document.RootElement); } internal virtual BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/InternalRealtimeResponseError.cs b/src/Generated/Models/InternalRealtimeServerEventErrorError.cs similarity index 54% rename from src/Generated/Models/InternalRealtimeResponseError.cs rename to src/Generated/Models/InternalRealtimeServerEventErrorError.cs index c2fec5fd4..b0d420eaa 100644 --- a/src/Generated/Models/InternalRealtimeResponseError.cs +++ b/src/Generated/Models/InternalRealtimeServerEventErrorError.cs @@ -7,19 +7,14 @@ namespace OpenAI.RealtimeConversation { - internal partial class InternalRealtimeResponseError + internal partial class InternalRealtimeServerEventErrorError { internal IDictionary SerializedAdditionalRawData { get; set; } - internal InternalRealtimeResponseError(string type, string message) + internal InternalRealtimeServerEventErrorError() { - Argument.AssertNotNull(type, nameof(type)); - Argument.AssertNotNull(message, nameof(message)); - - Type = type; - Message = message; } - internal InternalRealtimeResponseError(string type, string code, string message, string param, string eventId, IDictionary serializedAdditionalRawData) + internal InternalRealtimeServerEventErrorError(string type, string code, string message, string param, string eventId, IDictionary serializedAdditionalRawData) { Type = type; Code = code; @@ -29,10 +24,6 @@ internal InternalRealtimeResponseError(string type, string code, string message, SerializedAdditionalRawData = serializedAdditionalRawData; } - internal InternalRealtimeResponseError() - { - } - public string Type { get; } public string Code { get; } public string Message { get; } diff --git a/src/Generated/Models/ConversationAudioDeltaUpdate.Serialization.cs b/src/Generated/Models/InternalRealtimeServerEventResponseAudioDelta.Serialization.cs similarity index 70% rename from src/Generated/Models/ConversationAudioDeltaUpdate.Serialization.cs rename to src/Generated/Models/InternalRealtimeServerEventResponseAudioDelta.Serialization.cs index e7b135323..d9fa4e276 100644 --- a/src/Generated/Models/ConversationAudioDeltaUpdate.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeServerEventResponseAudioDelta.Serialization.cs @@ -10,14 +10,14 @@ namespace OpenAI.RealtimeConversation { - public partial class ConversationAudioDeltaUpdate : IJsonModel + internal partial class InternalRealtimeServerEventResponseAudioDelta : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationAudioDeltaUpdate)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventResponseAudioDelta)} does not support writing '{format}' format."); } writer.WriteStartObject(); @@ -53,15 +53,8 @@ void IJsonModel.Write(Utf8JsonWriter writer, Model } if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -85,19 +78,19 @@ void IJsonModel.Write(Utf8JsonWriter writer, Model writer.WriteEndObject(); } - ConversationAudioDeltaUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + InternalRealtimeServerEventResponseAudioDelta IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationAudioDeltaUpdate)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventResponseAudioDelta)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeConversationAudioDeltaUpdate(document.RootElement, options); + return DeserializeInternalRealtimeServerEventResponseAudioDelta(document.RootElement, options); } - internal static ConversationAudioDeltaUpdate DeserializeConversationAudioDeltaUpdate(JsonElement element, ModelReaderWriterOptions options = null) + internal static InternalRealtimeServerEventResponseAudioDelta DeserializeInternalRealtimeServerEventResponseAudioDelta(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -148,11 +141,6 @@ internal static ConversationAudioDeltaUpdate DeserializeConversationAudioDeltaUp } if (property.NameEquals("event_id"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - eventId = null; - continue; - } eventId = property.Value.GetString(); continue; } @@ -163,7 +151,7 @@ internal static ConversationAudioDeltaUpdate DeserializeConversationAudioDeltaUp } } serializedAdditionalRawData = rawDataDictionary; - return new ConversationAudioDeltaUpdate( + return new InternalRealtimeServerEventResponseAudioDelta( type, eventId, serializedAdditionalRawData, @@ -174,41 +162,41 @@ internal static ConversationAudioDeltaUpdate DeserializeConversationAudioDeltaUp delta); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(ConversationAudioDeltaUpdate)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventResponseAudioDelta)} does not support writing '{options.Format}' format."); } } - ConversationAudioDeltaUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + InternalRealtimeServerEventResponseAudioDelta IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeConversationAudioDeltaUpdate(document.RootElement, options); + return DeserializeInternalRealtimeServerEventResponseAudioDelta(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(ConversationAudioDeltaUpdate)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventResponseAudioDelta)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new ConversationAudioDeltaUpdate FromResponse(PipelineResponse response) + internal static new InternalRealtimeServerEventResponseAudioDelta FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeConversationAudioDeltaUpdate(document.RootElement); + return DeserializeInternalRealtimeServerEventResponseAudioDelta(document.RootElement); } internal override BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/ConversationOutputTranscriptionFinishedUpdate.cs b/src/Generated/Models/InternalRealtimeServerEventResponseAudioDelta.cs similarity index 56% rename from src/Generated/Models/ConversationOutputTranscriptionFinishedUpdate.cs rename to src/Generated/Models/InternalRealtimeServerEventResponseAudioDelta.cs index 066dc2f39..88d7c6c92 100644 --- a/src/Generated/Models/ConversationOutputTranscriptionFinishedUpdate.cs +++ b/src/Generated/Models/InternalRealtimeServerEventResponseAudioDelta.cs @@ -7,29 +7,33 @@ namespace OpenAI.RealtimeConversation { - public partial class ConversationOutputTranscriptionFinishedUpdate : ConversationUpdate + internal partial class InternalRealtimeServerEventResponseAudioDelta : ConversationUpdate { - internal ConversationOutputTranscriptionFinishedUpdate(string eventId, string responseId, string itemId, int outputIndex, int contentIndex) : base(eventId) + internal InternalRealtimeServerEventResponseAudioDelta(string eventId, string responseId, string itemId, int outputIndex, int contentIndex, BinaryData delta) : base(eventId) { + Argument.AssertNotNull(eventId, nameof(eventId)); Argument.AssertNotNull(responseId, nameof(responseId)); Argument.AssertNotNull(itemId, nameof(itemId)); + Argument.AssertNotNull(delta, nameof(delta)); - Kind = ConversationUpdateKind.ResponseAudioTranscriptDone; + Kind = ConversationUpdateKind.ItemStreamingPartAudioDelta; ResponseId = responseId; ItemId = itemId; OutputIndex = outputIndex; ContentIndex = contentIndex; + Delta = delta; } - internal ConversationOutputTranscriptionFinishedUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string responseId, string itemId, int outputIndex, int contentIndex) : base(kind, eventId, serializedAdditionalRawData) + internal InternalRealtimeServerEventResponseAudioDelta(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string responseId, string itemId, int outputIndex, int contentIndex, BinaryData delta) : base(kind, eventId, serializedAdditionalRawData) { ResponseId = responseId; ItemId = itemId; OutputIndex = outputIndex; ContentIndex = contentIndex; + Delta = delta; } - internal ConversationOutputTranscriptionFinishedUpdate() + internal InternalRealtimeServerEventResponseAudioDelta() { } @@ -37,5 +41,6 @@ internal ConversationOutputTranscriptionFinishedUpdate() public string ItemId { get; } public int OutputIndex { get; } public int ContentIndex { get; } + public BinaryData Delta { get; } } } diff --git a/src/Generated/Models/ConversationOutputTranscriptionDeltaUpdate.Serialization.cs b/src/Generated/Models/InternalRealtimeServerEventResponseAudioTranscriptDelta.Serialization.cs similarity index 68% rename from src/Generated/Models/ConversationOutputTranscriptionDeltaUpdate.Serialization.cs rename to src/Generated/Models/InternalRealtimeServerEventResponseAudioTranscriptDelta.Serialization.cs index e8bc14ac3..dd5b6ec91 100644 --- a/src/Generated/Models/ConversationOutputTranscriptionDeltaUpdate.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeServerEventResponseAudioTranscriptDelta.Serialization.cs @@ -10,14 +10,14 @@ namespace OpenAI.RealtimeConversation { - public partial class ConversationOutputTranscriptionDeltaUpdate : IJsonModel + internal partial class InternalRealtimeServerEventResponseAudioTranscriptDelta : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationOutputTranscriptionDeltaUpdate)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventResponseAudioTranscriptDelta)} does not support writing '{format}' format."); } writer.WriteStartObject(); @@ -53,15 +53,8 @@ void IJsonModel.Write(Utf8JsonWriter } if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -85,19 +78,19 @@ void IJsonModel.Write(Utf8JsonWriter writer.WriteEndObject(); } - ConversationOutputTranscriptionDeltaUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + InternalRealtimeServerEventResponseAudioTranscriptDelta IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationOutputTranscriptionDeltaUpdate)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventResponseAudioTranscriptDelta)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeConversationOutputTranscriptionDeltaUpdate(document.RootElement, options); + return DeserializeInternalRealtimeServerEventResponseAudioTranscriptDelta(document.RootElement, options); } - internal static ConversationOutputTranscriptionDeltaUpdate DeserializeConversationOutputTranscriptionDeltaUpdate(JsonElement element, ModelReaderWriterOptions options = null) + internal static InternalRealtimeServerEventResponseAudioTranscriptDelta DeserializeInternalRealtimeServerEventResponseAudioTranscriptDelta(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -148,11 +141,6 @@ internal static ConversationOutputTranscriptionDeltaUpdate DeserializeConversati } if (property.NameEquals("event_id"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - eventId = null; - continue; - } eventId = property.Value.GetString(); continue; } @@ -163,7 +151,7 @@ internal static ConversationOutputTranscriptionDeltaUpdate DeserializeConversati } } serializedAdditionalRawData = rawDataDictionary; - return new ConversationOutputTranscriptionDeltaUpdate( + return new InternalRealtimeServerEventResponseAudioTranscriptDelta( type, eventId, serializedAdditionalRawData, @@ -174,41 +162,41 @@ internal static ConversationOutputTranscriptionDeltaUpdate DeserializeConversati delta); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(ConversationOutputTranscriptionDeltaUpdate)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventResponseAudioTranscriptDelta)} does not support writing '{options.Format}' format."); } } - ConversationOutputTranscriptionDeltaUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + InternalRealtimeServerEventResponseAudioTranscriptDelta IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeConversationOutputTranscriptionDeltaUpdate(document.RootElement, options); + return DeserializeInternalRealtimeServerEventResponseAudioTranscriptDelta(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(ConversationOutputTranscriptionDeltaUpdate)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventResponseAudioTranscriptDelta)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new ConversationOutputTranscriptionDeltaUpdate FromResponse(PipelineResponse response) + internal static new InternalRealtimeServerEventResponseAudioTranscriptDelta FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeConversationOutputTranscriptionDeltaUpdate(document.RootElement); + return DeserializeInternalRealtimeServerEventResponseAudioTranscriptDelta(document.RootElement); } internal override BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/ConversationOutputTranscriptionDeltaUpdate.cs b/src/Generated/Models/InternalRealtimeServerEventResponseAudioTranscriptDelta.cs similarity index 53% rename from src/Generated/Models/ConversationOutputTranscriptionDeltaUpdate.cs rename to src/Generated/Models/InternalRealtimeServerEventResponseAudioTranscriptDelta.cs index 56ed591c4..6524a40b1 100644 --- a/src/Generated/Models/ConversationOutputTranscriptionDeltaUpdate.cs +++ b/src/Generated/Models/InternalRealtimeServerEventResponseAudioTranscriptDelta.cs @@ -7,15 +7,16 @@ namespace OpenAI.RealtimeConversation { - public partial class ConversationOutputTranscriptionDeltaUpdate : ConversationUpdate + internal partial class InternalRealtimeServerEventResponseAudioTranscriptDelta : ConversationUpdate { - internal ConversationOutputTranscriptionDeltaUpdate(string eventId, string responseId, string itemId, int outputIndex, int contentIndex, string delta) : base(eventId) + internal InternalRealtimeServerEventResponseAudioTranscriptDelta(string eventId, string responseId, string itemId, int outputIndex, int contentIndex, string delta) : base(eventId) { + Argument.AssertNotNull(eventId, nameof(eventId)); Argument.AssertNotNull(responseId, nameof(responseId)); Argument.AssertNotNull(itemId, nameof(itemId)); Argument.AssertNotNull(delta, nameof(delta)); - Kind = ConversationUpdateKind.ResponseAudioTranscriptDelta; + Kind = ConversationUpdateKind.ItemStreamingPartAudioTranscriptionDelta; ResponseId = responseId; ItemId = itemId; OutputIndex = outputIndex; @@ -23,7 +24,7 @@ internal ConversationOutputTranscriptionDeltaUpdate(string eventId, string respo Delta = delta; } - internal ConversationOutputTranscriptionDeltaUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string responseId, string itemId, int outputIndex, int contentIndex, string delta) : base(kind, eventId, serializedAdditionalRawData) + internal InternalRealtimeServerEventResponseAudioTranscriptDelta(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string responseId, string itemId, int outputIndex, int contentIndex, string delta) : base(kind, eventId, serializedAdditionalRawData) { ResponseId = responseId; ItemId = itemId; @@ -32,7 +33,7 @@ internal ConversationOutputTranscriptionDeltaUpdate(ConversationUpdateKind kind, Delta = delta; } - internal ConversationOutputTranscriptionDeltaUpdate() + internal InternalRealtimeServerEventResponseAudioTranscriptDelta() { } diff --git a/src/Generated/Models/ConversationContentPartStartedUpdate.Serialization.cs b/src/Generated/Models/InternalRealtimeServerEventResponseContentPartAdded.Serialization.cs similarity index 69% rename from src/Generated/Models/ConversationContentPartStartedUpdate.Serialization.cs rename to src/Generated/Models/InternalRealtimeServerEventResponseContentPartAdded.Serialization.cs index 413f4e78a..058d05450 100644 --- a/src/Generated/Models/ConversationContentPartStartedUpdate.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeServerEventResponseContentPartAdded.Serialization.cs @@ -10,14 +10,14 @@ namespace OpenAI.RealtimeConversation { - public partial class ConversationContentPartStartedUpdate : IJsonModel + internal partial class InternalRealtimeServerEventResponseContentPartAdded : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationContentPartStartedUpdate)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventResponseContentPartAdded)} does not support writing '{format}' format."); } writer.WriteStartObject(); @@ -53,15 +53,8 @@ void IJsonModel.Write(Utf8JsonWriter write } if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -85,19 +78,19 @@ void IJsonModel.Write(Utf8JsonWriter write writer.WriteEndObject(); } - ConversationContentPartStartedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + InternalRealtimeServerEventResponseContentPartAdded IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationContentPartStartedUpdate)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventResponseContentPartAdded)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeConversationContentPartStartedUpdate(document.RootElement, options); + return DeserializeInternalRealtimeServerEventResponseContentPartAdded(document.RootElement, options); } - internal static ConversationContentPartStartedUpdate DeserializeConversationContentPartStartedUpdate(JsonElement element, ModelReaderWriterOptions options = null) + internal static InternalRealtimeServerEventResponseContentPartAdded DeserializeInternalRealtimeServerEventResponseContentPartAdded(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -148,11 +141,6 @@ internal static ConversationContentPartStartedUpdate DeserializeConversationCont } if (property.NameEquals("event_id"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - eventId = null; - continue; - } eventId = property.Value.GetString(); continue; } @@ -163,7 +151,7 @@ internal static ConversationContentPartStartedUpdate DeserializeConversationCont } } serializedAdditionalRawData = rawDataDictionary; - return new ConversationContentPartStartedUpdate( + return new InternalRealtimeServerEventResponseContentPartAdded( type, eventId, serializedAdditionalRawData, @@ -174,41 +162,41 @@ internal static ConversationContentPartStartedUpdate DeserializeConversationCont part); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(ConversationContentPartStartedUpdate)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventResponseContentPartAdded)} does not support writing '{options.Format}' format."); } } - ConversationContentPartStartedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + InternalRealtimeServerEventResponseContentPartAdded IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeConversationContentPartStartedUpdate(document.RootElement, options); + return DeserializeInternalRealtimeServerEventResponseContentPartAdded(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(ConversationContentPartStartedUpdate)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventResponseContentPartAdded)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new ConversationContentPartStartedUpdate FromResponse(PipelineResponse response) + internal static new InternalRealtimeServerEventResponseContentPartAdded FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeConversationContentPartStartedUpdate(document.RootElement); + return DeserializeInternalRealtimeServerEventResponseContentPartAdded(document.RootElement); } internal override BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/ConversationContentPartFinishedUpdate.cs b/src/Generated/Models/InternalRealtimeServerEventResponseContentPartAdded.cs similarity index 53% rename from src/Generated/Models/ConversationContentPartFinishedUpdate.cs rename to src/Generated/Models/InternalRealtimeServerEventResponseContentPartAdded.cs index 56640f237..9d6249292 100644 --- a/src/Generated/Models/ConversationContentPartFinishedUpdate.cs +++ b/src/Generated/Models/InternalRealtimeServerEventResponseContentPartAdded.cs @@ -7,15 +7,16 @@ namespace OpenAI.RealtimeConversation { - public partial class ConversationContentPartFinishedUpdate : ConversationUpdate + internal partial class InternalRealtimeServerEventResponseContentPartAdded : ConversationUpdate { - internal ConversationContentPartFinishedUpdate(string eventId, string responseId, string itemId, int outputIndex, int contentIndex, ConversationContentPart internalContentPart) : base(eventId) + internal InternalRealtimeServerEventResponseContentPartAdded(string eventId, string responseId, string itemId, int outputIndex, int contentIndex, ConversationContentPart internalContentPart) : base(eventId) { + Argument.AssertNotNull(eventId, nameof(eventId)); Argument.AssertNotNull(responseId, nameof(responseId)); Argument.AssertNotNull(itemId, nameof(itemId)); Argument.AssertNotNull(internalContentPart, nameof(internalContentPart)); - Kind = ConversationUpdateKind.ContentPartFinished; + Kind = ConversationUpdateKind.ItemContentPartStarted; ResponseId = responseId; ItemId = itemId; OutputIndex = outputIndex; @@ -23,7 +24,7 @@ internal ConversationContentPartFinishedUpdate(string eventId, string responseId _internalContentPart = internalContentPart; } - internal ConversationContentPartFinishedUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string responseId, string itemId, int outputIndex, int contentIndex, ConversationContentPart internalContentPart) : base(kind, eventId, serializedAdditionalRawData) + internal InternalRealtimeServerEventResponseContentPartAdded(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string responseId, string itemId, int outputIndex, int contentIndex, ConversationContentPart internalContentPart) : base(kind, eventId, serializedAdditionalRawData) { ResponseId = responseId; ItemId = itemId; @@ -32,7 +33,7 @@ internal ConversationContentPartFinishedUpdate(ConversationUpdateKind kind, stri _internalContentPart = internalContentPart; } - internal ConversationContentPartFinishedUpdate() + internal InternalRealtimeServerEventResponseContentPartAdded() { } diff --git a/src/Generated/Models/ConversationContentPartFinishedUpdate.Serialization.cs b/src/Generated/Models/InternalRealtimeServerEventResponseContentPartDone.Serialization.cs similarity index 69% rename from src/Generated/Models/ConversationContentPartFinishedUpdate.Serialization.cs rename to src/Generated/Models/InternalRealtimeServerEventResponseContentPartDone.Serialization.cs index fec22b678..28f8dfafc 100644 --- a/src/Generated/Models/ConversationContentPartFinishedUpdate.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeServerEventResponseContentPartDone.Serialization.cs @@ -10,14 +10,14 @@ namespace OpenAI.RealtimeConversation { - public partial class ConversationContentPartFinishedUpdate : IJsonModel + internal partial class InternalRealtimeServerEventResponseContentPartDone : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationContentPartFinishedUpdate)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventResponseContentPartDone)} does not support writing '{format}' format."); } writer.WriteStartObject(); @@ -53,15 +53,8 @@ void IJsonModel.Write(Utf8JsonWriter writ } if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -85,19 +78,19 @@ void IJsonModel.Write(Utf8JsonWriter writ writer.WriteEndObject(); } - ConversationContentPartFinishedUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + InternalRealtimeServerEventResponseContentPartDone IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationContentPartFinishedUpdate)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventResponseContentPartDone)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeConversationContentPartFinishedUpdate(document.RootElement, options); + return DeserializeInternalRealtimeServerEventResponseContentPartDone(document.RootElement, options); } - internal static ConversationContentPartFinishedUpdate DeserializeConversationContentPartFinishedUpdate(JsonElement element, ModelReaderWriterOptions options = null) + internal static InternalRealtimeServerEventResponseContentPartDone DeserializeInternalRealtimeServerEventResponseContentPartDone(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -148,11 +141,6 @@ internal static ConversationContentPartFinishedUpdate DeserializeConversationCon } if (property.NameEquals("event_id"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - eventId = null; - continue; - } eventId = property.Value.GetString(); continue; } @@ -163,7 +151,7 @@ internal static ConversationContentPartFinishedUpdate DeserializeConversationCon } } serializedAdditionalRawData = rawDataDictionary; - return new ConversationContentPartFinishedUpdate( + return new InternalRealtimeServerEventResponseContentPartDone( type, eventId, serializedAdditionalRawData, @@ -174,41 +162,41 @@ internal static ConversationContentPartFinishedUpdate DeserializeConversationCon part); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(ConversationContentPartFinishedUpdate)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventResponseContentPartDone)} does not support writing '{options.Format}' format."); } } - ConversationContentPartFinishedUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + InternalRealtimeServerEventResponseContentPartDone IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeConversationContentPartFinishedUpdate(document.RootElement, options); + return DeserializeInternalRealtimeServerEventResponseContentPartDone(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(ConversationContentPartFinishedUpdate)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventResponseContentPartDone)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new ConversationContentPartFinishedUpdate FromResponse(PipelineResponse response) + internal static new InternalRealtimeServerEventResponseContentPartDone FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeConversationContentPartFinishedUpdate(document.RootElement); + return DeserializeInternalRealtimeServerEventResponseContentPartDone(document.RootElement); } internal override BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/ConversationContentPartStartedUpdate.cs b/src/Generated/Models/InternalRealtimeServerEventResponseContentPartDone.cs similarity index 53% rename from src/Generated/Models/ConversationContentPartStartedUpdate.cs rename to src/Generated/Models/InternalRealtimeServerEventResponseContentPartDone.cs index e72b371ae..72e744062 100644 --- a/src/Generated/Models/ConversationContentPartStartedUpdate.cs +++ b/src/Generated/Models/InternalRealtimeServerEventResponseContentPartDone.cs @@ -7,15 +7,16 @@ namespace OpenAI.RealtimeConversation { - public partial class ConversationContentPartStartedUpdate : ConversationUpdate + internal partial class InternalRealtimeServerEventResponseContentPartDone : ConversationUpdate { - internal ConversationContentPartStartedUpdate(string eventId, string responseId, string itemId, int outputIndex, int contentIndex, ConversationContentPart internalContentPart) : base(eventId) + internal InternalRealtimeServerEventResponseContentPartDone(string eventId, string responseId, string itemId, int outputIndex, int contentIndex, ConversationContentPart internalContentPart) : base(eventId) { + Argument.AssertNotNull(eventId, nameof(eventId)); Argument.AssertNotNull(responseId, nameof(responseId)); Argument.AssertNotNull(itemId, nameof(itemId)); Argument.AssertNotNull(internalContentPart, nameof(internalContentPart)); - Kind = ConversationUpdateKind.ContentPartStarted; + Kind = ConversationUpdateKind.ItemContentPartFinished; ResponseId = responseId; ItemId = itemId; OutputIndex = outputIndex; @@ -23,7 +24,7 @@ internal ConversationContentPartStartedUpdate(string eventId, string responseId, _internalContentPart = internalContentPart; } - internal ConversationContentPartStartedUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string responseId, string itemId, int outputIndex, int contentIndex, ConversationContentPart internalContentPart) : base(kind, eventId, serializedAdditionalRawData) + internal InternalRealtimeServerEventResponseContentPartDone(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string responseId, string itemId, int outputIndex, int contentIndex, ConversationContentPart internalContentPart) : base(kind, eventId, serializedAdditionalRawData) { ResponseId = responseId; ItemId = itemId; @@ -32,7 +33,7 @@ internal ConversationContentPartStartedUpdate(ConversationUpdateKind kind, strin _internalContentPart = internalContentPart; } - internal ConversationContentPartStartedUpdate() + internal InternalRealtimeServerEventResponseContentPartDone() { } diff --git a/src/Generated/Models/ConversationFunctionCallArgumentsDeltaUpdate.Serialization.cs b/src/Generated/Models/InternalRealtimeServerEventResponseFunctionCallArgumentsDelta.Serialization.cs similarity index 67% rename from src/Generated/Models/ConversationFunctionCallArgumentsDeltaUpdate.Serialization.cs rename to src/Generated/Models/InternalRealtimeServerEventResponseFunctionCallArgumentsDelta.Serialization.cs index 23e7058f6..195b48e29 100644 --- a/src/Generated/Models/ConversationFunctionCallArgumentsDeltaUpdate.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeServerEventResponseFunctionCallArgumentsDelta.Serialization.cs @@ -10,14 +10,14 @@ namespace OpenAI.RealtimeConversation { - public partial class ConversationFunctionCallArgumentsDeltaUpdate : IJsonModel + internal partial class InternalRealtimeServerEventResponseFunctionCallArgumentsDelta : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationFunctionCallArgumentsDeltaUpdate)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventResponseFunctionCallArgumentsDelta)} does not support writing '{format}' format."); } writer.WriteStartObject(); @@ -53,15 +53,8 @@ void IJsonModel.Write(Utf8JsonWrit } if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -85,19 +78,19 @@ void IJsonModel.Write(Utf8JsonWrit writer.WriteEndObject(); } - ConversationFunctionCallArgumentsDeltaUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + InternalRealtimeServerEventResponseFunctionCallArgumentsDelta IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationFunctionCallArgumentsDeltaUpdate)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventResponseFunctionCallArgumentsDelta)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeConversationFunctionCallArgumentsDeltaUpdate(document.RootElement, options); + return DeserializeInternalRealtimeServerEventResponseFunctionCallArgumentsDelta(document.RootElement, options); } - internal static ConversationFunctionCallArgumentsDeltaUpdate DeserializeConversationFunctionCallArgumentsDeltaUpdate(JsonElement element, ModelReaderWriterOptions options = null) + internal static InternalRealtimeServerEventResponseFunctionCallArgumentsDelta DeserializeInternalRealtimeServerEventResponseFunctionCallArgumentsDelta(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -148,11 +141,6 @@ internal static ConversationFunctionCallArgumentsDeltaUpdate DeserializeConversa } if (property.NameEquals("event_id"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - eventId = null; - continue; - } eventId = property.Value.GetString(); continue; } @@ -163,7 +151,7 @@ internal static ConversationFunctionCallArgumentsDeltaUpdate DeserializeConversa } } serializedAdditionalRawData = rawDataDictionary; - return new ConversationFunctionCallArgumentsDeltaUpdate( + return new InternalRealtimeServerEventResponseFunctionCallArgumentsDelta( type, eventId, serializedAdditionalRawData, @@ -174,41 +162,41 @@ internal static ConversationFunctionCallArgumentsDeltaUpdate DeserializeConversa delta); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(ConversationFunctionCallArgumentsDeltaUpdate)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventResponseFunctionCallArgumentsDelta)} does not support writing '{options.Format}' format."); } } - ConversationFunctionCallArgumentsDeltaUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + InternalRealtimeServerEventResponseFunctionCallArgumentsDelta IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeConversationFunctionCallArgumentsDeltaUpdate(document.RootElement, options); + return DeserializeInternalRealtimeServerEventResponseFunctionCallArgumentsDelta(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(ConversationFunctionCallArgumentsDeltaUpdate)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventResponseFunctionCallArgumentsDelta)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new ConversationFunctionCallArgumentsDeltaUpdate FromResponse(PipelineResponse response) + internal static new InternalRealtimeServerEventResponseFunctionCallArgumentsDelta FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeConversationFunctionCallArgumentsDeltaUpdate(document.RootElement); + return DeserializeInternalRealtimeServerEventResponseFunctionCallArgumentsDelta(document.RootElement); } internal override BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/InternalRealtimeServerEventResponseFunctionCallArgumentsDelta.cs b/src/Generated/Models/InternalRealtimeServerEventResponseFunctionCallArgumentsDelta.cs new file mode 100644 index 000000000..1f5315514 --- /dev/null +++ b/src/Generated/Models/InternalRealtimeServerEventResponseFunctionCallArgumentsDelta.cs @@ -0,0 +1,47 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; + +namespace OpenAI.RealtimeConversation +{ + internal partial class InternalRealtimeServerEventResponseFunctionCallArgumentsDelta : ConversationUpdate + { + internal InternalRealtimeServerEventResponseFunctionCallArgumentsDelta(string eventId, string responseId, string itemId, int outputIndex, string callId, string delta) : base(eventId) + { + Argument.AssertNotNull(eventId, nameof(eventId)); + Argument.AssertNotNull(responseId, nameof(responseId)); + Argument.AssertNotNull(itemId, nameof(itemId)); + Argument.AssertNotNull(callId, nameof(callId)); + Argument.AssertNotNull(delta, nameof(delta)); + + Kind = ConversationUpdateKind.ItemStreamingFunctionCallArgumentsDelta; + ResponseId = responseId; + ItemId = itemId; + OutputIndex = outputIndex; + CallId = callId; + Delta = delta; + } + + internal InternalRealtimeServerEventResponseFunctionCallArgumentsDelta(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string responseId, string itemId, int outputIndex, string callId, string delta) : base(kind, eventId, serializedAdditionalRawData) + { + ResponseId = responseId; + ItemId = itemId; + OutputIndex = outputIndex; + CallId = callId; + Delta = delta; + } + + internal InternalRealtimeServerEventResponseFunctionCallArgumentsDelta() + { + } + + public string ResponseId { get; } + public string ItemId { get; } + public int OutputIndex { get; } + public string CallId { get; } + public string Delta { get; } + } +} diff --git a/src/Generated/Models/ConversationFunctionCallArgumentsDoneUpdate.Serialization.cs b/src/Generated/Models/InternalRealtimeServerEventResponseFunctionCallArgumentsDone.Serialization.cs similarity index 64% rename from src/Generated/Models/ConversationFunctionCallArgumentsDoneUpdate.Serialization.cs rename to src/Generated/Models/InternalRealtimeServerEventResponseFunctionCallArgumentsDone.Serialization.cs index 2c9da9915..e38140d23 100644 --- a/src/Generated/Models/ConversationFunctionCallArgumentsDoneUpdate.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeServerEventResponseFunctionCallArgumentsDone.Serialization.cs @@ -10,14 +10,14 @@ namespace OpenAI.RealtimeConversation { - public partial class ConversationFunctionCallArgumentsDoneUpdate : IJsonModel + internal partial class InternalRealtimeServerEventResponseFunctionCallArgumentsDone : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationFunctionCallArgumentsDoneUpdate)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventResponseFunctionCallArgumentsDone)} does not support writing '{format}' format."); } writer.WriteStartObject(); @@ -41,11 +41,6 @@ void IJsonModel.Write(Utf8JsonWrite writer.WritePropertyName("call_id"u8); writer.WriteStringValue(CallId); } - if (SerializedAdditionalRawData?.ContainsKey("name") != true) - { - writer.WritePropertyName("name"u8); - writer.WriteStringValue(Name); - } if (SerializedAdditionalRawData?.ContainsKey("arguments") != true) { writer.WritePropertyName("arguments"u8); @@ -58,15 +53,8 @@ void IJsonModel.Write(Utf8JsonWrite } if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -90,19 +78,19 @@ void IJsonModel.Write(Utf8JsonWrite writer.WriteEndObject(); } - ConversationFunctionCallArgumentsDoneUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + InternalRealtimeServerEventResponseFunctionCallArgumentsDone IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationFunctionCallArgumentsDoneUpdate)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventResponseFunctionCallArgumentsDone)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeConversationFunctionCallArgumentsDoneUpdate(document.RootElement, options); + return DeserializeInternalRealtimeServerEventResponseFunctionCallArgumentsDone(document.RootElement, options); } - internal static ConversationFunctionCallArgumentsDoneUpdate DeserializeConversationFunctionCallArgumentsDoneUpdate(JsonElement element, ModelReaderWriterOptions options = null) + internal static InternalRealtimeServerEventResponseFunctionCallArgumentsDone DeserializeInternalRealtimeServerEventResponseFunctionCallArgumentsDone(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -114,7 +102,6 @@ internal static ConversationFunctionCallArgumentsDoneUpdate DeserializeConversat string itemId = default; int outputIndex = default; string callId = default; - string name = default; string arguments = default; ConversationUpdateKind type = default; string eventId = default; @@ -142,11 +129,6 @@ internal static ConversationFunctionCallArgumentsDoneUpdate DeserializeConversat callId = property.Value.GetString(); continue; } - if (property.NameEquals("name"u8)) - { - name = property.Value.GetString(); - continue; - } if (property.NameEquals("arguments"u8)) { arguments = property.Value.GetString(); @@ -159,11 +141,6 @@ internal static ConversationFunctionCallArgumentsDoneUpdate DeserializeConversat } if (property.NameEquals("event_id"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - eventId = null; - continue; - } eventId = property.Value.GetString(); continue; } @@ -174,7 +151,7 @@ internal static ConversationFunctionCallArgumentsDoneUpdate DeserializeConversat } } serializedAdditionalRawData = rawDataDictionary; - return new ConversationFunctionCallArgumentsDoneUpdate( + return new InternalRealtimeServerEventResponseFunctionCallArgumentsDone( type, eventId, serializedAdditionalRawData, @@ -182,45 +159,44 @@ internal static ConversationFunctionCallArgumentsDoneUpdate DeserializeConversat itemId, outputIndex, callId, - name, arguments); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(ConversationFunctionCallArgumentsDoneUpdate)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventResponseFunctionCallArgumentsDone)} does not support writing '{options.Format}' format."); } } - ConversationFunctionCallArgumentsDoneUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + InternalRealtimeServerEventResponseFunctionCallArgumentsDone IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeConversationFunctionCallArgumentsDoneUpdate(document.RootElement, options); + return DeserializeInternalRealtimeServerEventResponseFunctionCallArgumentsDone(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(ConversationFunctionCallArgumentsDoneUpdate)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventResponseFunctionCallArgumentsDone)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new ConversationFunctionCallArgumentsDoneUpdate FromResponse(PipelineResponse response) + internal static new InternalRealtimeServerEventResponseFunctionCallArgumentsDone FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeConversationFunctionCallArgumentsDoneUpdate(document.RootElement); + return DeserializeInternalRealtimeServerEventResponseFunctionCallArgumentsDone(document.RootElement); } internal override BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/ConversationFunctionCallArgumentsDoneUpdate.cs b/src/Generated/Models/InternalRealtimeServerEventResponseFunctionCallArgumentsDone.cs similarity index 53% rename from src/Generated/Models/ConversationFunctionCallArgumentsDoneUpdate.cs rename to src/Generated/Models/InternalRealtimeServerEventResponseFunctionCallArgumentsDone.cs index ba4684c6f..36ab2bbf4 100644 --- a/src/Generated/Models/ConversationFunctionCallArgumentsDoneUpdate.cs +++ b/src/Generated/Models/InternalRealtimeServerEventResponseFunctionCallArgumentsDone.cs @@ -7,36 +7,34 @@ namespace OpenAI.RealtimeConversation { - public partial class ConversationFunctionCallArgumentsDoneUpdate : ConversationUpdate + internal partial class InternalRealtimeServerEventResponseFunctionCallArgumentsDone : ConversationUpdate { - internal ConversationFunctionCallArgumentsDoneUpdate(string eventId, string responseId, string itemId, int outputIndex, string callId, string name, string arguments) : base(eventId) + internal InternalRealtimeServerEventResponseFunctionCallArgumentsDone(string eventId, string responseId, string itemId, int outputIndex, string callId, string arguments) : base(eventId) { + Argument.AssertNotNull(eventId, nameof(eventId)); Argument.AssertNotNull(responseId, nameof(responseId)); Argument.AssertNotNull(itemId, nameof(itemId)); Argument.AssertNotNull(callId, nameof(callId)); - Argument.AssertNotNull(name, nameof(name)); Argument.AssertNotNull(arguments, nameof(arguments)); - Kind = ConversationUpdateKind.ResponseFunctionCallArgumentsDone; + Kind = ConversationUpdateKind.ItemStreamingFunctionCallArgumentsFinished; ResponseId = responseId; ItemId = itemId; OutputIndex = outputIndex; CallId = callId; - Name = name; Arguments = arguments; } - internal ConversationFunctionCallArgumentsDoneUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string responseId, string itemId, int outputIndex, string callId, string name, string arguments) : base(kind, eventId, serializedAdditionalRawData) + internal InternalRealtimeServerEventResponseFunctionCallArgumentsDone(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string responseId, string itemId, int outputIndex, string callId, string arguments) : base(kind, eventId, serializedAdditionalRawData) { ResponseId = responseId; ItemId = itemId; OutputIndex = outputIndex; CallId = callId; - Name = name; Arguments = arguments; } - internal ConversationFunctionCallArgumentsDoneUpdate() + internal InternalRealtimeServerEventResponseFunctionCallArgumentsDone() { } @@ -44,7 +42,6 @@ internal ConversationFunctionCallArgumentsDoneUpdate() public string ItemId { get; } public int OutputIndex { get; } public string CallId { get; } - public string Name { get; } public string Arguments { get; } } } diff --git a/src/Generated/Models/ConversationTextDeltaUpdate.Serialization.cs b/src/Generated/Models/InternalRealtimeServerEventResponseTextDelta.Serialization.cs similarity index 70% rename from src/Generated/Models/ConversationTextDeltaUpdate.Serialization.cs rename to src/Generated/Models/InternalRealtimeServerEventResponseTextDelta.Serialization.cs index fd954c5d1..f0a88bb66 100644 --- a/src/Generated/Models/ConversationTextDeltaUpdate.Serialization.cs +++ b/src/Generated/Models/InternalRealtimeServerEventResponseTextDelta.Serialization.cs @@ -10,14 +10,14 @@ namespace OpenAI.RealtimeConversation { - public partial class ConversationTextDeltaUpdate : IJsonModel + internal partial class InternalRealtimeServerEventResponseTextDelta : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationTextDeltaUpdate)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventResponseTextDelta)} does not support writing '{format}' format."); } writer.WriteStartObject(); @@ -53,15 +53,8 @@ void IJsonModel.Write(Utf8JsonWriter writer, ModelR } if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -85,19 +78,19 @@ void IJsonModel.Write(Utf8JsonWriter writer, ModelR writer.WriteEndObject(); } - ConversationTextDeltaUpdate IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + InternalRealtimeServerEventResponseTextDelta IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ConversationTextDeltaUpdate)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventResponseTextDelta)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeConversationTextDeltaUpdate(document.RootElement, options); + return DeserializeInternalRealtimeServerEventResponseTextDelta(document.RootElement, options); } - internal static ConversationTextDeltaUpdate DeserializeConversationTextDeltaUpdate(JsonElement element, ModelReaderWriterOptions options = null) + internal static InternalRealtimeServerEventResponseTextDelta DeserializeInternalRealtimeServerEventResponseTextDelta(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -148,11 +141,6 @@ internal static ConversationTextDeltaUpdate DeserializeConversationTextDeltaUpda } if (property.NameEquals("event_id"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - eventId = null; - continue; - } eventId = property.Value.GetString(); continue; } @@ -163,7 +151,7 @@ internal static ConversationTextDeltaUpdate DeserializeConversationTextDeltaUpda } } serializedAdditionalRawData = rawDataDictionary; - return new ConversationTextDeltaUpdate( + return new InternalRealtimeServerEventResponseTextDelta( type, eventId, serializedAdditionalRawData, @@ -174,41 +162,41 @@ internal static ConversationTextDeltaUpdate DeserializeConversationTextDeltaUpda delta); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(ConversationTextDeltaUpdate)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventResponseTextDelta)} does not support writing '{options.Format}' format."); } } - ConversationTextDeltaUpdate IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + InternalRealtimeServerEventResponseTextDelta IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeConversationTextDeltaUpdate(document.RootElement, options); + return DeserializeInternalRealtimeServerEventResponseTextDelta(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(ConversationTextDeltaUpdate)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeServerEventResponseTextDelta)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new ConversationTextDeltaUpdate FromResponse(PipelineResponse response) + internal static new InternalRealtimeServerEventResponseTextDelta FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeConversationTextDeltaUpdate(document.RootElement); + return DeserializeInternalRealtimeServerEventResponseTextDelta(document.RootElement); } internal override BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/ConversationFunctionCallArgumentsDeltaUpdate.cs b/src/Generated/Models/InternalRealtimeServerEventResponseTextDelta.cs similarity index 59% rename from src/Generated/Models/ConversationFunctionCallArgumentsDeltaUpdate.cs rename to src/Generated/Models/InternalRealtimeServerEventResponseTextDelta.cs index b3e1fa0a6..64ec3101f 100644 --- a/src/Generated/Models/ConversationFunctionCallArgumentsDeltaUpdate.cs +++ b/src/Generated/Models/InternalRealtimeServerEventResponseTextDelta.cs @@ -7,40 +7,40 @@ namespace OpenAI.RealtimeConversation { - public partial class ConversationFunctionCallArgumentsDeltaUpdate : ConversationUpdate + internal partial class InternalRealtimeServerEventResponseTextDelta : ConversationUpdate { - internal ConversationFunctionCallArgumentsDeltaUpdate(string eventId, string responseId, string itemId, int outputIndex, string callId, string delta) : base(eventId) + internal InternalRealtimeServerEventResponseTextDelta(string eventId, string responseId, string itemId, int outputIndex, int contentIndex, string delta) : base(eventId) { + Argument.AssertNotNull(eventId, nameof(eventId)); Argument.AssertNotNull(responseId, nameof(responseId)); Argument.AssertNotNull(itemId, nameof(itemId)); - Argument.AssertNotNull(callId, nameof(callId)); Argument.AssertNotNull(delta, nameof(delta)); - Kind = ConversationUpdateKind.ResponseFunctionCallArgumentsDelta; + Kind = ConversationUpdateKind.ItemStreamingPartTextDelta; ResponseId = responseId; ItemId = itemId; OutputIndex = outputIndex; - CallId = callId; + ContentIndex = contentIndex; Delta = delta; } - internal ConversationFunctionCallArgumentsDeltaUpdate(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string responseId, string itemId, int outputIndex, string callId, string delta) : base(kind, eventId, serializedAdditionalRawData) + internal InternalRealtimeServerEventResponseTextDelta(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData, string responseId, string itemId, int outputIndex, int contentIndex, string delta) : base(kind, eventId, serializedAdditionalRawData) { ResponseId = responseId; ItemId = itemId; OutputIndex = outputIndex; - CallId = callId; + ContentIndex = contentIndex; Delta = delta; } - internal ConversationFunctionCallArgumentsDeltaUpdate() + internal InternalRealtimeServerEventResponseTextDelta() { } public string ResponseId { get; } public string ItemId { get; } public int OutputIndex { get; } - public string CallId { get; } + public int ContentIndex { get; } public string Delta { get; } } } diff --git a/src/Generated/Models/ModerationApplicableInputKinds.Serialization.cs b/src/Generated/Models/ModerationApplicableInputKinds.Serialization.cs new file mode 100644 index 000000000..a098947a7 --- /dev/null +++ b/src/Generated/Models/ModerationApplicableInputKinds.Serialization.cs @@ -0,0 +1,12 @@ +// + +#nullable disable + +using System; + +namespace OpenAI.Moderations +{ + internal static partial class ModerationApplicableInputKindsExtensions + { + } +} diff --git a/src/Generated/Models/RealtimeResponseFailedStatusDetails.cs b/src/Generated/Models/RealtimeResponseFailedStatusDetails.cs deleted file mode 100644 index 27d432b59..000000000 --- a/src/Generated/Models/RealtimeResponseFailedStatusDetails.cs +++ /dev/null @@ -1,31 +0,0 @@ -// - -#nullable disable - -using System; -using System.Collections.Generic; - -namespace OpenAI.RealtimeConversation -{ - internal partial class RealtimeResponseFailedStatusDetails : InternalRealtimeResponseStatusDetails - { - internal RealtimeResponseFailedStatusDetails(BinaryData error) - { - Argument.AssertNotNull(error, nameof(error)); - - Type = ConversationStatus.Failed; - Error = error; - } - - internal RealtimeResponseFailedStatusDetails(ConversationStatus type, IDictionary serializedAdditionalRawData, BinaryData error) : base(type, serializedAdditionalRawData) - { - Error = error; - } - - internal RealtimeResponseFailedStatusDetails() - { - } - - public BinaryData Error { get; } - } -} diff --git a/src/Generated/Models/UnknownRealtimeRequestCommand.Serialization.cs b/src/Generated/Models/UnknownRealtimeClientEvent.Serialization.cs similarity index 62% rename from src/Generated/Models/UnknownRealtimeRequestCommand.Serialization.cs rename to src/Generated/Models/UnknownRealtimeClientEvent.Serialization.cs index f70bd7c3c..e24b6002b 100644 --- a/src/Generated/Models/UnknownRealtimeRequestCommand.Serialization.cs +++ b/src/Generated/Models/UnknownRealtimeClientEvent.Serialization.cs @@ -10,14 +10,14 @@ namespace OpenAI.RealtimeConversation { - internal partial class UnknownRealtimeRequestCommand : IJsonModel + internal partial class UnknownRealtimeClientEvent : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeRequestCommand)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEvent)} does not support writing '{format}' format."); } writer.WriteStartObject(); @@ -53,19 +53,19 @@ void IJsonModel.Write(Utf8JsonWriter writer, Mod writer.WriteEndObject(); } - InternalRealtimeRequestCommand IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + InternalRealtimeClientEvent IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeRequestCommand)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEvent)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeInternalRealtimeRequestCommand(document.RootElement, options); + return DeserializeInternalRealtimeClientEvent(document.RootElement, options); } - internal static UnknownRealtimeRequestCommand DeserializeUnknownRealtimeRequestCommand(JsonElement element, ModelReaderWriterOptions options = null) + internal static UnknownRealtimeClientEvent DeserializeUnknownRealtimeClientEvent(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -73,7 +73,7 @@ internal static UnknownRealtimeRequestCommand DeserializeUnknownRealtimeRequestC { return null; } - InternalRealtimeRequestCommandType type = "Unknown"; + InternalRealtimeClientEventType type = "Unknown"; string eventId = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); @@ -81,7 +81,7 @@ internal static UnknownRealtimeRequestCommand DeserializeUnknownRealtimeRequestC { if (property.NameEquals("type"u8)) { - type = new InternalRealtimeRequestCommandType(property.Value.GetString()); + type = new InternalRealtimeClientEventType(property.Value.GetString()); continue; } if (property.NameEquals("event_id"u8)) @@ -96,49 +96,49 @@ internal static UnknownRealtimeRequestCommand DeserializeUnknownRealtimeRequestC } } serializedAdditionalRawData = rawDataDictionary; - return new UnknownRealtimeRequestCommand(type, eventId, serializedAdditionalRawData); + return new UnknownRealtimeClientEvent(type, eventId, serializedAdditionalRawData); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(InternalRealtimeRequestCommand)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEvent)} does not support writing '{options.Format}' format."); } } - InternalRealtimeRequestCommand IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + InternalRealtimeClientEvent IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeInternalRealtimeRequestCommand(document.RootElement, options); + return DeserializeInternalRealtimeClientEvent(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(InternalRealtimeRequestCommand)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(InternalRealtimeClientEvent)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new UnknownRealtimeRequestCommand FromResponse(PipelineResponse response) + internal static new UnknownRealtimeClientEvent FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeUnknownRealtimeRequestCommand(document.RootElement); + return DeserializeUnknownRealtimeClientEvent(document.RootElement); } internal override BinaryContent ToBinaryContent() { - return BinaryContent.Create(this, ModelSerializationExtensions.WireOptions); + return BinaryContent.Create(this, ModelSerializationExtensions.WireOptions); } } } diff --git a/src/Generated/Models/UnknownRealtimeClientEvent.cs b/src/Generated/Models/UnknownRealtimeClientEvent.cs new file mode 100644 index 000000000..7c89c1f34 --- /dev/null +++ b/src/Generated/Models/UnknownRealtimeClientEvent.cs @@ -0,0 +1,20 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; + +namespace OpenAI.RealtimeConversation +{ + internal partial class UnknownRealtimeClientEvent : InternalRealtimeClientEvent + { + internal UnknownRealtimeClientEvent(InternalRealtimeClientEventType kind, string eventId, IDictionary serializedAdditionalRawData) : base(kind, eventId, serializedAdditionalRawData) + { + } + + internal UnknownRealtimeClientEvent() + { + } + } +} diff --git a/src/Generated/Models/UnknownRealtimeContentPart.Serialization.cs b/src/Generated/Models/UnknownRealtimeContentPart.Serialization.cs index 225ca656a..acc6b86e1 100644 --- a/src/Generated/Models/UnknownRealtimeContentPart.Serialization.cs +++ b/src/Generated/Models/UnknownRealtimeContentPart.Serialization.cs @@ -24,7 +24,7 @@ void IJsonModel.Write(Utf8JsonWriter writer, ModelReade if (SerializedAdditionalRawData?.ContainsKey("type") != true) { writer.WritePropertyName("type"u8); - writer.WriteStringValue(Type.ToString()); + writer.WriteStringValue(Kind.ToString()); } if (SerializedAdditionalRawData != null) { diff --git a/src/Generated/Models/UnknownRealtimeContentPart.cs b/src/Generated/Models/UnknownRealtimeContentPart.cs index 64cbf4dfc..8c332b466 100644 --- a/src/Generated/Models/UnknownRealtimeContentPart.cs +++ b/src/Generated/Models/UnknownRealtimeContentPart.cs @@ -9,7 +9,7 @@ namespace OpenAI.RealtimeConversation { internal partial class UnknownRealtimeContentPart : ConversationContentPart { - internal UnknownRealtimeContentPart(ConversationContentPartKind type, IDictionary serializedAdditionalRawData) : base(type, serializedAdditionalRawData) + internal UnknownRealtimeContentPart(ConversationContentPartKind kind, IDictionary serializedAdditionalRawData) : base(kind, serializedAdditionalRawData) { } diff --git a/src/Generated/Models/UnknownRealtimeRequestCommand.cs b/src/Generated/Models/UnknownRealtimeRequestCommand.cs deleted file mode 100644 index 952508ab8..000000000 --- a/src/Generated/Models/UnknownRealtimeRequestCommand.cs +++ /dev/null @@ -1,20 +0,0 @@ -// - -#nullable disable - -using System; -using System.Collections.Generic; - -namespace OpenAI.RealtimeConversation -{ - internal partial class UnknownRealtimeRequestCommand : InternalRealtimeRequestCommand - { - internal UnknownRealtimeRequestCommand(InternalRealtimeRequestCommandType kind, string eventId, IDictionary serializedAdditionalRawData) : base(kind, eventId, serializedAdditionalRawData) - { - } - - internal UnknownRealtimeRequestCommand() - { - } - } -} diff --git a/src/Generated/Models/UnknownRealtimeRequestItem.Serialization.cs b/src/Generated/Models/UnknownRealtimeRequestItem.Serialization.cs index 55e8e5dbf..a1acf18bf 100644 --- a/src/Generated/Models/UnknownRealtimeRequestItem.Serialization.cs +++ b/src/Generated/Models/UnknownRealtimeRequestItem.Serialization.cs @@ -73,7 +73,7 @@ internal static UnknownRealtimeRequestItem DeserializeUnknownRealtimeRequestItem { return null; } - InternalRealtimeRequestItemType type = "Unknown"; + InternalRealtimeItemType type = "Unknown"; string id = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); @@ -81,7 +81,7 @@ internal static UnknownRealtimeRequestItem DeserializeUnknownRealtimeRequestItem { if (property.NameEquals("type"u8)) { - type = new InternalRealtimeRequestItemType(property.Value.GetString()); + type = new InternalRealtimeItemType(property.Value.GetString()); continue; } if (property.NameEquals("id"u8)) diff --git a/src/Generated/Models/UnknownRealtimeRequestItem.cs b/src/Generated/Models/UnknownRealtimeRequestItem.cs index e082a4d7d..c917c700c 100644 --- a/src/Generated/Models/UnknownRealtimeRequestItem.cs +++ b/src/Generated/Models/UnknownRealtimeRequestItem.cs @@ -9,7 +9,7 @@ namespace OpenAI.RealtimeConversation { internal partial class UnknownRealtimeRequestItem : ConversationItem { - internal UnknownRealtimeRequestItem(InternalRealtimeRequestItemType type, string id, IDictionary serializedAdditionalRawData) : base(type, id, serializedAdditionalRawData) + internal UnknownRealtimeRequestItem(InternalRealtimeItemType type, string id, IDictionary serializedAdditionalRawData) : base(type, id, serializedAdditionalRawData) { } diff --git a/src/Generated/Models/UnknownRealtimeResponseCommand.cs b/src/Generated/Models/UnknownRealtimeResponseCommand.cs deleted file mode 100644 index 83579fbec..000000000 --- a/src/Generated/Models/UnknownRealtimeResponseCommand.cs +++ /dev/null @@ -1,20 +0,0 @@ -// - -#nullable disable - -using System; -using System.Collections.Generic; - -namespace OpenAI.RealtimeConversation -{ - internal partial class UnknownRealtimeResponseCommand : ConversationUpdate - { - internal UnknownRealtimeResponseCommand(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData) : base(kind, eventId, serializedAdditionalRawData) - { - } - - internal UnknownRealtimeResponseCommand() - { - } - } -} diff --git a/src/Generated/Models/UnknownRealtimeResponseItem.Serialization.cs b/src/Generated/Models/UnknownRealtimeResponseItem.Serialization.cs index 9a7487d9d..7370fee72 100644 --- a/src/Generated/Models/UnknownRealtimeResponseItem.Serialization.cs +++ b/src/Generated/Models/UnknownRealtimeResponseItem.Serialization.cs @@ -86,7 +86,7 @@ internal static UnknownRealtimeResponseItem DeserializeUnknownRealtimeResponseIt return null; } InternalRealtimeResponseItemObject @object = default; - InternalRealtimeRequestItemType type = "Unknown"; + InternalRealtimeItemType type = "Unknown"; string id = default; IDictionary serializedAdditionalRawData = default; Dictionary rawDataDictionary = new Dictionary(); @@ -99,7 +99,7 @@ internal static UnknownRealtimeResponseItem DeserializeUnknownRealtimeResponseIt } if (property.NameEquals("type"u8)) { - type = new InternalRealtimeRequestItemType(property.Value.GetString()); + type = new InternalRealtimeItemType(property.Value.GetString()); continue; } if (property.NameEquals("id"u8)) diff --git a/src/Generated/Models/UnknownRealtimeResponseItem.cs b/src/Generated/Models/UnknownRealtimeResponseItem.cs index cc2edc03d..9823a49de 100644 --- a/src/Generated/Models/UnknownRealtimeResponseItem.cs +++ b/src/Generated/Models/UnknownRealtimeResponseItem.cs @@ -9,7 +9,7 @@ namespace OpenAI.RealtimeConversation { internal partial class UnknownRealtimeResponseItem : InternalRealtimeResponseItem { - internal UnknownRealtimeResponseItem(InternalRealtimeResponseItemObject @object, InternalRealtimeRequestItemType type, string id, IDictionary serializedAdditionalRawData) : base(@object, type, id, serializedAdditionalRawData) + internal UnknownRealtimeResponseItem(InternalRealtimeResponseItemObject @object, InternalRealtimeItemType type, string id, IDictionary serializedAdditionalRawData) : base(@object, type, id, serializedAdditionalRawData) { } diff --git a/src/Generated/Models/UnknownRealtimeResponseStatusDetails.Serialization.cs b/src/Generated/Models/UnknownRealtimeResponseStatusDetails.Serialization.cs index 35bb140ab..2f8fc68e0 100644 --- a/src/Generated/Models/UnknownRealtimeResponseStatusDetails.Serialization.cs +++ b/src/Generated/Models/UnknownRealtimeResponseStatusDetails.Serialization.cs @@ -10,21 +10,21 @@ namespace OpenAI.RealtimeConversation { - internal partial class UnknownRealtimeResponseStatusDetails : IJsonModel + internal partial class UnknownRealtimeResponseStatusDetails : IJsonModel { - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeResponseStatusDetails)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(ConversationStatusDetails)} does not support writing '{format}' format."); } writer.WriteStartObject(); if (SerializedAdditionalRawData?.ContainsKey("type") != true) { writer.WritePropertyName("type"u8); - writer.WriteStringValue(Type.ToString()); + writer.WriteStringValue(StatusKind.ToString()); } if (SerializedAdditionalRawData != null) { @@ -48,16 +48,16 @@ void IJsonModel.Write(Utf8JsonWriter writ writer.WriteEndObject(); } - InternalRealtimeResponseStatusDetails IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + ConversationStatusDetails IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(InternalRealtimeResponseStatusDetails)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(ConversationStatusDetails)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeInternalRealtimeResponseStatusDetails(document.RootElement, options); + return DeserializeConversationStatusDetails(document.RootElement, options); } internal static UnknownRealtimeResponseStatusDetails DeserializeUnknownRealtimeResponseStatusDetails(JsonElement element, ModelReaderWriterOptions options = null) @@ -88,36 +88,36 @@ internal static UnknownRealtimeResponseStatusDetails DeserializeUnknownRealtimeR return new UnknownRealtimeResponseStatusDetails(type, serializedAdditionalRawData); } - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options); default: - throw new FormatException($"The model {nameof(InternalRealtimeResponseStatusDetails)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(ConversationStatusDetails)} does not support writing '{options.Format}' format."); } } - InternalRealtimeResponseStatusDetails IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) + ConversationStatusDetails IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); - return DeserializeInternalRealtimeResponseStatusDetails(document.RootElement, options); + return DeserializeConversationStatusDetails(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(InternalRealtimeResponseStatusDetails)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(ConversationStatusDetails)} does not support reading '{options.Format}' format."); } } - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; internal static new UnknownRealtimeResponseStatusDetails FromResponse(PipelineResponse response) { @@ -127,7 +127,7 @@ InternalRealtimeResponseStatusDetails IPersistableModel(this, ModelSerializationExtensions.WireOptions); + return BinaryContent.Create(this, ModelSerializationExtensions.WireOptions); } } } diff --git a/src/Generated/Models/UnknownRealtimeResponseStatusDetails.cs b/src/Generated/Models/UnknownRealtimeResponseStatusDetails.cs index 3857576aa..c21984b9e 100644 --- a/src/Generated/Models/UnknownRealtimeResponseStatusDetails.cs +++ b/src/Generated/Models/UnknownRealtimeResponseStatusDetails.cs @@ -7,9 +7,9 @@ namespace OpenAI.RealtimeConversation { - internal partial class UnknownRealtimeResponseStatusDetails : InternalRealtimeResponseStatusDetails + internal partial class UnknownRealtimeResponseStatusDetails : ConversationStatusDetails { - internal UnknownRealtimeResponseStatusDetails(ConversationStatus type, IDictionary serializedAdditionalRawData) : base(type, serializedAdditionalRawData) + internal UnknownRealtimeResponseStatusDetails(ConversationStatus statusKind, IDictionary serializedAdditionalRawData) : base(statusKind, serializedAdditionalRawData) { } diff --git a/src/Generated/Models/UnknownRealtimeResponseCommand.Serialization.cs b/src/Generated/Models/UnknownRealtimeServerEvent.Serialization.cs similarity index 84% rename from src/Generated/Models/UnknownRealtimeResponseCommand.Serialization.cs rename to src/Generated/Models/UnknownRealtimeServerEvent.Serialization.cs index 40cda0afb..0b87f20af 100644 --- a/src/Generated/Models/UnknownRealtimeResponseCommand.Serialization.cs +++ b/src/Generated/Models/UnknownRealtimeServerEvent.Serialization.cs @@ -10,7 +10,7 @@ namespace OpenAI.RealtimeConversation { - internal partial class UnknownRealtimeResponseCommand : IJsonModel + internal partial class UnknownRealtimeServerEvent : IJsonModel { void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { @@ -28,15 +28,8 @@ void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWrit } if (SerializedAdditionalRawData?.ContainsKey("event_id") != true) { - if (EventId != null) - { - writer.WritePropertyName("event_id"u8); - writer.WriteStringValue(EventId); - } - else - { - writer.WriteNull("event_id"); - } + writer.WritePropertyName("event_id"u8); + writer.WriteStringValue(EventId); } if (SerializedAdditionalRawData != null) { @@ -72,7 +65,7 @@ ConversationUpdate IJsonModel.Create(ref Utf8JsonReader read return DeserializeConversationUpdate(document.RootElement, options); } - internal static UnknownRealtimeResponseCommand DeserializeUnknownRealtimeResponseCommand(JsonElement element, ModelReaderWriterOptions options = null) + internal static UnknownRealtimeServerEvent DeserializeUnknownRealtimeServerEvent(JsonElement element, ModelReaderWriterOptions options = null) { options ??= ModelSerializationExtensions.WireOptions; @@ -93,11 +86,6 @@ internal static UnknownRealtimeResponseCommand DeserializeUnknownRealtimeRespons } if (property.NameEquals("event_id"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) - { - eventId = null; - continue; - } eventId = property.Value.GetString(); continue; } @@ -108,7 +96,7 @@ internal static UnknownRealtimeResponseCommand DeserializeUnknownRealtimeRespons } } serializedAdditionalRawData = rawDataDictionary; - return new UnknownRealtimeResponseCommand(type, eventId, serializedAdditionalRawData); + return new UnknownRealtimeServerEvent(type, eventId, serializedAdditionalRawData); } BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) @@ -142,10 +130,10 @@ ConversationUpdate IPersistableModel.Create(BinaryData data, string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - internal static new UnknownRealtimeResponseCommand FromResponse(PipelineResponse response) + internal static new UnknownRealtimeServerEvent FromResponse(PipelineResponse response) { using var document = JsonDocument.Parse(response.Content); - return DeserializeUnknownRealtimeResponseCommand(document.RootElement); + return DeserializeUnknownRealtimeServerEvent(document.RootElement); } internal override BinaryContent ToBinaryContent() diff --git a/src/Generated/Models/UnknownRealtimeServerEvent.cs b/src/Generated/Models/UnknownRealtimeServerEvent.cs new file mode 100644 index 000000000..4954c31c3 --- /dev/null +++ b/src/Generated/Models/UnknownRealtimeServerEvent.cs @@ -0,0 +1,20 @@ +// + +#nullable disable + +using System; +using System.Collections.Generic; + +namespace OpenAI.RealtimeConversation +{ + internal partial class UnknownRealtimeServerEvent : ConversationUpdate + { + internal UnknownRealtimeServerEvent(ConversationUpdateKind kind, string eventId, IDictionary serializedAdditionalRawData) : base(kind, eventId, serializedAdditionalRawData) + { + } + + internal UnknownRealtimeServerEvent() + { + } + } +} diff --git a/src/Generated/OpenAIModelFactory.cs b/src/Generated/OpenAIModelFactory.cs index ff52fc4c9..2a96dd87c 100644 --- a/src/Generated/OpenAIModelFactory.cs +++ b/src/Generated/OpenAIModelFactory.cs @@ -61,28 +61,44 @@ public static RunStepTokenUsage RunStepTokenUsage(int outputTokenCount = default public static ConversationUpdate ConversationUpdate(string eventId = null) { - return new UnknownRealtimeResponseCommand(default, eventId, serializedAdditionalRawData: null); + return new UnknownRealtimeServerEvent(default, eventId, serializedAdditionalRawData: null); } - public static ConversationItemAcknowledgedUpdate ConversationItemAcknowledgedUpdate(string eventId = null, ConversationItem item = null) + public static ConversationInputAudioCommittedUpdate ConversationInputAudioCommittedUpdate(string eventId = null, string previousItemId = null, string itemId = null) { - return new ConversationItemAcknowledgedUpdate(ConversationUpdateKind.ItemAcknowledged, eventId, serializedAdditionalRawData: null, item); + return new ConversationInputAudioCommittedUpdate(ConversationUpdateKind.InputAudioCommitted, eventId, serializedAdditionalRawData: null, previousItemId, itemId); } - public static ConversationItemDeletedUpdate ConversationItemDeletedUpdate(string eventId = null, string itemId = null) + public static ConversationInputAudioClearedUpdate ConversationInputAudioClearedUpdate(string eventId = null) { - return new ConversationItemDeletedUpdate(ConversationUpdateKind.ItemDeleted, eventId, serializedAdditionalRawData: null, itemId); + return new ConversationInputAudioClearedUpdate(ConversationUpdateKind.InputAudioCleared, eventId, serializedAdditionalRawData: null); } - public static ConversationItemTruncatedUpdate ConversationItemTruncatedUpdate(string eventId = null, string itemId = null, int audioEndMs = default, int index = default) + public static ConversationInputTranscriptionFinishedUpdate ConversationInputTranscriptionFinishedUpdate(string eventId = null, string itemId = null, int contentIndex = default, string transcript = null) + { + return new ConversationInputTranscriptionFinishedUpdate( + ConversationUpdateKind.InputTranscriptionFinished, + eventId, + serializedAdditionalRawData: null, + itemId, + contentIndex, + transcript); + } + + public static ConversationItemTruncatedUpdate ConversationItemTruncatedUpdate(string eventId = null, string itemId = null, int contentIndex = default, int audioEndMs = default) { return new ConversationItemTruncatedUpdate( ConversationUpdateKind.ItemTruncated, eventId, serializedAdditionalRawData: null, itemId, - audioEndMs, - index); + contentIndex, + audioEndMs); + } + + public static ConversationItemDeletedUpdate ConversationItemDeletedUpdate(string eventId = null, string itemId = null) + { + return new ConversationItemDeletedUpdate(ConversationUpdateKind.ItemDeleted, eventId, serializedAdditionalRawData: null, itemId); } public static ConversationTokenUsage ConversationTokenUsage(int totalTokens = default, int inputTokens = default, int outputTokens = default, ConversationInputTokenUsageDetails inputTokenDetails = null, ConversationOutputTokenUsageDetails outputTokenDetails = null) @@ -106,48 +122,36 @@ public static ConversationOutputTokenUsageDetails ConversationOutputTokenUsageDe return new ConversationOutputTokenUsageDetails(textTokens, audioTokens, serializedAdditionalRawData: null); } - public static ConversationRateLimitsUpdatedUpdate ConversationRateLimitsUpdatedUpdate(string eventId = null, IEnumerable rateLimits = null) + public static ConversationItemStreamingTextFinishedUpdate ConversationItemStreamingTextFinishedUpdate(string eventId = null, string responseId = null, string itemId = null, int outputIndex = default, int contentIndex = default, string text = null) { - rateLimits ??= new List(); - - return new ConversationRateLimitsUpdatedUpdate(ConversationUpdateKind.RateLimitsUpdated, eventId, serializedAdditionalRawData: null, rateLimits?.ToList()); - } - - public static ConversationRateLimitDetailsItem ConversationRateLimitDetailsItem(string name = null, int limit = default, int remaining = default, float resetSeconds = default) - { - return new ConversationRateLimitDetailsItem(name, limit, remaining, resetSeconds, serializedAdditionalRawData: null); - } - - public static ConversationAudioDeltaUpdate ConversationAudioDeltaUpdate(string eventId = null, string responseId = null, string itemId = null, int outputIndex = default, int contentIndex = default, BinaryData delta = null) - { - return new ConversationAudioDeltaUpdate( - ConversationUpdateKind.ResponseAudioDelta, + return new ConversationItemStreamingTextFinishedUpdate( + ConversationUpdateKind.ItemStreamingPartTextFinished, eventId, serializedAdditionalRawData: null, responseId, itemId, outputIndex, contentIndex, - delta); + text); } - public static ConversationOutputTranscriptionDeltaUpdate ConversationOutputTranscriptionDeltaUpdate(string eventId = null, string responseId = null, string itemId = null, int outputIndex = default, int contentIndex = default, string delta = null) + public static ConversationItemStreamingAudioTranscriptionFinishedUpdate ConversationItemStreamingAudioTranscriptionFinishedUpdate(string eventId = null, string responseId = null, string itemId = null, int outputIndex = default, int contentIndex = default, string transcript = null) { - return new ConversationOutputTranscriptionDeltaUpdate( - ConversationUpdateKind.ResponseAudioTranscriptDelta, + return new ConversationItemStreamingAudioTranscriptionFinishedUpdate( + ConversationUpdateKind.ItemStreamingPartAudioTranscriptionFinished, eventId, serializedAdditionalRawData: null, responseId, itemId, outputIndex, contentIndex, - delta); + transcript); } - public static ConversationOutputTranscriptionFinishedUpdate ConversationOutputTranscriptionFinishedUpdate(string eventId = null, string responseId = null, string itemId = null, int outputIndex = default, int contentIndex = default) + public static ConversationItemStreamingAudioFinishedUpdate ConversationItemStreamingAudioFinishedUpdate(string eventId = null, string responseId = null, string itemId = null, int outputIndex = default, int contentIndex = default) { - return new ConversationOutputTranscriptionFinishedUpdate( - ConversationUpdateKind.ResponseAudioTranscriptDone, + return new ConversationItemStreamingAudioFinishedUpdate( + ConversationUpdateKind.ItemStreamingPartAudioFinished, eventId, serializedAdditionalRawData: null, responseId, @@ -156,88 +160,16 @@ public static ConversationOutputTranscriptionFinishedUpdate ConversationOutputTr contentIndex); } - public static ConversationTextDeltaUpdate ConversationTextDeltaUpdate(string eventId = null, string responseId = null, string itemId = null, int outputIndex = default, int contentIndex = default, string delta = null) + public static ConversationRateLimitsUpdate ConversationRateLimitsUpdate(string eventId = null, IEnumerable allDetails = null) { - return new ConversationTextDeltaUpdate( - ConversationUpdateKind.ResponseTextDelta, - eventId, - serializedAdditionalRawData: null, - responseId, - itemId, - outputIndex, - contentIndex, - delta); - } + allDetails ??= new List(); - public static ConversationTextDoneUpdate ConversationTextDoneUpdate(string eventId = null, string responseId = null, string itemId = null, int outputIndex = default, int contentIndex = default, string value = null) - { - return new ConversationTextDoneUpdate( - ConversationUpdateKind.ResponseTextDone, - eventId, - serializedAdditionalRawData: null, - responseId, - itemId, - outputIndex, - contentIndex, - value); + return new ConversationRateLimitsUpdate(ConversationUpdateKind.RateLimitsUpdated, eventId, serializedAdditionalRawData: null, allDetails?.ToList()); } - public static ConversationFunctionCallArgumentsDeltaUpdate ConversationFunctionCallArgumentsDeltaUpdate(string eventId = null, string responseId = null, string itemId = null, int outputIndex = default, string callId = null, string delta = null) + public static ConversationRateLimitDetailsItem ConversationRateLimitDetailsItem(string name = null, int maximumCount = default, int remainingCount = default, TimeSpan timeUntilReset = default) { - return new ConversationFunctionCallArgumentsDeltaUpdate( - ConversationUpdateKind.ResponseFunctionCallArgumentsDelta, - eventId, - serializedAdditionalRawData: null, - responseId, - itemId, - outputIndex, - callId, - delta); - } - - public static ConversationFunctionCallArgumentsDoneUpdate ConversationFunctionCallArgumentsDoneUpdate(string eventId = null, string responseId = null, string itemId = null, int outputIndex = default, string callId = null, string name = null, string arguments = null) - { - return new ConversationFunctionCallArgumentsDoneUpdate( - ConversationUpdateKind.ResponseFunctionCallArgumentsDone, - eventId, - serializedAdditionalRawData: null, - responseId, - itemId, - outputIndex, - callId, - name, - arguments); - } - - public static ConversationInputSpeechStartedUpdate ConversationInputSpeechStartedUpdate(string eventId = null, int audioStartMs = default, string itemId = null) - { - return new ConversationInputSpeechStartedUpdate(ConversationUpdateKind.InputAudioBufferSpeechStarted, eventId, serializedAdditionalRawData: null, audioStartMs, itemId); - } - - public static ConversationInputSpeechFinishedUpdate ConversationInputSpeechFinishedUpdate(string eventId = null, int audioEndMs = default, string itemId = null) - { - return new ConversationInputSpeechFinishedUpdate(ConversationUpdateKind.InputAudioBufferSpeechStopped, eventId, serializedAdditionalRawData: null, audioEndMs, itemId); - } - - public static ConversationInputTranscriptionFinishedUpdate ConversationInputTranscriptionFinishedUpdate(string eventId = null, string itemId = null, int contentIndex = default, string transcript = null) - { - return new ConversationInputTranscriptionFinishedUpdate( - ConversationUpdateKind.ItemInputAudioTranscriptionCompleted, - eventId, - serializedAdditionalRawData: null, - itemId, - contentIndex, - transcript); - } - - public static ConversationInputAudioBufferCommittedUpdate ConversationInputAudioBufferCommittedUpdate(string eventId = null, string itemId = null, string previousItemId = null) - { - return new ConversationInputAudioBufferCommittedUpdate(ConversationUpdateKind.InputAudioBufferCommitted, eventId, serializedAdditionalRawData: null, itemId, previousItemId); - } - - public static ConversationInputAudioBufferClearedUpdate ConversationInputAudioBufferClearedUpdate(string eventId = null) - { - return new ConversationInputAudioBufferClearedUpdate(ConversationUpdateKind.InputAudioBufferCleared, eventId, serializedAdditionalRawData: null); + return new ConversationRateLimitDetailsItem(name, maximumCount, remainingCount, timeUntilReset, serializedAdditionalRawData: null); } public static ModerationResultCollection ModerationResultCollection(string id = null, string model = null, IEnumerable results = null) @@ -269,14 +201,25 @@ public static EmbeddingTokenUsage EmbeddingTokenUsage(int inputTokenCount = defa return new EmbeddingTokenUsage(inputTokenCount, totalTokenCount, serializedAdditionalRawData: null); } - public static ChatTokenUsage ChatTokenUsage(int outputTokenCount = default, int inputTokenCount = default, int totalTokenCount = default, ChatOutputTokenUsageDetails outputTokenDetails = null) + public static ChatTokenUsage ChatTokenUsage(int outputTokenCount = default, int inputTokenCount = default, int totalTokenCount = default, ChatOutputTokenUsageDetails outputTokenDetails = null, ChatInputTokenUsageDetails inputTokenDetails = null) + { + return new ChatTokenUsage( + outputTokenCount, + inputTokenCount, + totalTokenCount, + outputTokenDetails, + inputTokenDetails, + serializedAdditionalRawData: null); + } + + public static ChatOutputTokenUsageDetails ChatOutputTokenUsageDetails(int? audioTokenCount = null, int reasoningTokenCount = default) { - return new ChatTokenUsage(outputTokenCount, inputTokenCount, totalTokenCount, outputTokenDetails, serializedAdditionalRawData: null); + return new ChatOutputTokenUsageDetails(audioTokenCount, reasoningTokenCount, serializedAdditionalRawData: null); } - public static ChatOutputTokenUsageDetails ChatOutputTokenUsageDetails(int reasoningTokenCount = default) + public static ChatInputTokenUsageDetails ChatInputTokenUsageDetails(int? audioTokenCount = null, int? cachedTokenCount = null) { - return new ChatOutputTokenUsageDetails(reasoningTokenCount, serializedAdditionalRawData: null); + return new ChatInputTokenUsageDetails(audioTokenCount, cachedTokenCount, serializedAdditionalRawData: null); } public static ChatMessage ChatMessage(ChatMessageContent content = null) diff --git a/src/OpenAI.csproj b/src/OpenAI.csproj index 8080280b9..a5fa1c70a 100644 --- a/src/OpenAI.csproj +++ b/src/OpenAI.csproj @@ -76,7 +76,7 @@ - + diff --git a/tests/Assets/realtime_whats_the_weather_pcm16_24khz_mono.wav b/tests/Assets/realtime_whats_the_weather_pcm16_24khz_mono.wav new file mode 100644 index 000000000..399cd5ad3 Binary files /dev/null and b/tests/Assets/realtime_whats_the_weather_pcm16_24khz_mono.wav differ diff --git a/tests/Assistants/AssistantsTests.cs b/tests/Assistants/AssistantsTests.cs index dcd5e25a7..0bda08bc1 100644 --- a/tests/Assistants/AssistantsTests.cs +++ b/tests/Assistants/AssistantsTests.cs @@ -1540,7 +1540,7 @@ public void Pagination_CanRehydrateAssistantPageCollectionFromPageToken() Assert.That(createdAssistants[0].Id, Is.EqualTo(rehydratedAssistants[0].Id)); Assert.That(count, Is.GreaterThanOrEqualTo(TestAssistantCount)); - Assert.That(pageCount, Is.GreaterThanOrEqualTo(TestAssistantCount/TestPageSizeLimit)); + Assert.That(pageCount, Is.GreaterThanOrEqualTo(TestAssistantCount / TestPageSizeLimit)); } [Test] @@ -1577,7 +1577,7 @@ public async Task Pagination_CanCastAssistantPageCollectionToConvenienceFromProt createdAssistants.Reverse(); int count = 0; - + // Validate that the protocol return type cast to the convenience return type // functions correctly as the convenience return type. await foreach (Assistant assistant in assistants) diff --git a/tests/Audio/TranslationTests.cs b/tests/Audio/TranslationTests.cs index a0fe9f79b..3cc160070 100644 --- a/tests/Audio/TranslationTests.cs +++ b/tests/Audio/TranslationTests.cs @@ -83,7 +83,7 @@ public async Task TranslationFormatsWork(string responseFormat) AudioTranslation translation = IsAsync ? await client.TranslateAudioAsync(path, options) : client.TranslateAudio(path, options); - + Assert.That(translation?.Text?.ToLowerInvariant(), Does.Contain("recognition")); if (options.ResponseFormat == AudioTranslationFormat.Verbose) diff --git a/tests/Chat/ChatSmokeTests.cs b/tests/Chat/ChatSmokeTests.cs index 1bc3c4ee8..9d1678080 100644 --- a/tests/Chat/ChatSmokeTests.cs +++ b/tests/Chat/ChatSmokeTests.cs @@ -62,8 +62,8 @@ public async Task SmokeTest() ChatClient client = new("model_name_replaced", new ApiKeyCredential("sk-not-a-real-key"), options); ClientResult completionResult = IsAsync - ? await client.CompleteChatAsync([ new UserChatMessage("Mock me!") ]) - : client.CompleteChat([ new UserChatMessage("Mock me!") ]); + ? await client.CompleteChatAsync([new UserChatMessage("Mock me!")]) + : client.CompleteChat([new UserChatMessage("Mock me!")]); Assert.That(completionResult?.GetRawResponse(), Is.Not.Null); Assert.That(completionResult.GetRawResponse().Content?.ToString(), Does.Contain("additional world")); @@ -679,7 +679,7 @@ public void SerializeChatMessageWithNoContent(bool fromRawJson) Assert.That(messageAsJson.RootElement.TryGetProperty("tool_calls", out JsonElement toolCallsProperty), Is.True); Assert.That(toolCallsProperty, Is.Not.Null); Assert.That(toolCallsProperty.ValueKind, Is.EqualTo(JsonValueKind.Array)); - + foreach (JsonElement toolCall in toolCallsProperty.EnumerateArray()) { Assert.That(toolCall.TryGetProperty("id", out JsonElement toolCallIdProperty), Is.True); diff --git a/tests/Chat/ChatTests.cs b/tests/Chat/ChatTests.cs index 614e028f6..b49439678 100644 --- a/tests/Chat/ChatTests.cs +++ b/tests/Chat/ChatTests.cs @@ -76,7 +76,7 @@ public void StreamingChat() AssertSyncOnly(); ChatClient client = GetTestClient(TestScenario.Chat); - IEnumerable messages = [ new UserChatMessage("What are the best pizza toppings? Give me a breakdown on the reasons.") ]; + IEnumerable messages = [new UserChatMessage("What are the best pizza toppings? Give me a breakdown on the reasons.")]; int updateCount = 0; ChatTokenUsage usage = null; @@ -113,7 +113,7 @@ public async Task StreamingChatAsync() AssertAsyncOnly(); ChatClient client = GetTestClient(TestScenario.Chat); - IEnumerable messages = [ new UserChatMessage("What are the best pizza toppings? Give me a breakdown on the reasons.") ]; + IEnumerable messages = [new UserChatMessage("What are the best pizza toppings? Give me a breakdown on the reasons.")]; int updateCount = 0; ChatTokenUsage usage = null; @@ -254,7 +254,7 @@ public void CompleteChatStreamingClosesNetworkStream() }; ChatClient client = GetTestClient(TestScenario.Chat, options: options); - IEnumerable messages = [ new UserChatMessage("What are the best pizza toppings? Give me a breakdown on the reasons.") ]; + IEnumerable messages = [new UserChatMessage("What are the best pizza toppings? Give me a breakdown on the reasons.")]; int updateCount = 0; TimeSpan? firstTokenReceiptTime = null; @@ -299,7 +299,7 @@ public async Task CompleteChatStreamingClosesNetworkStreamAsync() }; ChatClient client = GetTestClient(TestScenario.Chat, options: options); - IEnumerable messages = [ new UserChatMessage("What are the best pizza toppings? Give me a breakdown on the reasons.") ]; + IEnumerable messages = [new UserChatMessage("What are the best pizza toppings? Give me a breakdown on the reasons.")]; int updateCount = 0; TimeSpan? firstTokenReceiptTime = null; diff --git a/tests/Chat/OpenAIChatModelFactoryTests.cs b/tests/Chat/OpenAIChatModelFactoryTests.cs index 2be762a37..a34e6f398 100644 --- a/tests/Chat/OpenAIChatModelFactoryTests.cs +++ b/tests/Chat/OpenAIChatModelFactoryTests.cs @@ -349,7 +349,7 @@ public void ChatCompletionWithUsageWorks() [Test] public void ChatTokenLogProbabilityDetailsWithNoPropertiesWorks() { - ChatTokenLogProbabilityDetails chatTokenLogProbabilityDetails = OpenAIChatModelFactory.ChatTokenLogProbabilityDetails(); + ChatTokenLogProbabilityDetails chatTokenLogProbabilityDetails = OpenAIChatModelFactory.ChatTokenLogProbabilityDetails(); Assert.That(chatTokenLogProbabilityDetails.Token, Is.Null); Assert.That(chatTokenLogProbabilityDetails.LogProbability, Is.EqualTo(0f)); diff --git a/tests/Embeddings/EmbeddingsMockTests.cs b/tests/Embeddings/EmbeddingsMockTests.cs index 11ce456ba..be18bf51b 100644 --- a/tests/Embeddings/EmbeddingsMockTests.cs +++ b/tests/Embeddings/EmbeddingsMockTests.cs @@ -27,9 +27,18 @@ public EmbeddingsMockTests(bool isAsync) public async Task GenerateEmbeddingDeserializesVector() { string base64Embedding = Convert.ToBase64String([ - 0x00, 0x00, 0x80, 0x3F, // 1.0f - 0x00, 0x00, 0x00, 0x40, // 2.0f - 0x00, 0x00, 0x40, 0x40 // 3.0f + 0x00, + 0x00, + 0x80, + 0x3F, // 1.0f + 0x00, + 0x00, + 0x00, + 0x40, // 2.0f + 0x00, + 0x00, + 0x40, + 0x40 // 3.0f ]); OpenAIClientOptions clientOptions = GetClientOptionsWithMockResponse(200, $$""" { @@ -95,9 +104,18 @@ public async Task GenerateEmbeddingsWithStringsDeserializesUsage() public async Task GenerateEmbeddingsWithStringsDeserializesVector() { string base64Embedding = Convert.ToBase64String([ - 0x00, 0x00, 0x80, 0x3F, // 1.0f - 0x00, 0x00, 0x00, 0x40, // 2.0f - 0x00, 0x00, 0x40, 0x40 // 3.0f + 0x00, + 0x00, + 0x80, + 0x3F, // 1.0f + 0x00, + 0x00, + 0x00, + 0x40, // 2.0f + 0x00, + 0x00, + 0x40, + 0x40 // 3.0f ]); OpenAIClientOptions clientOptions = GetClientOptionsWithMockResponse(200, $$""" { @@ -164,9 +182,18 @@ public async Task GenerateEmbeddingsWithIntegersDeserializesUsage() public async Task GenerateEmbeddingsWithIntegersDeserializesVector() { string base64Embedding = Convert.ToBase64String([ - 0x00, 0x00, 0x80, 0x3F, // 1.0f - 0x00, 0x00, 0x00, 0x40, // 2.0f - 0x00, 0x00, 0x40, 0x40 // 3.0f + 0x00, + 0x00, + 0x80, + 0x3F, // 1.0f + 0x00, + 0x00, + 0x00, + 0x40, // 2.0f + 0x00, + 0x00, + 0x40, + 0x40 // 3.0f ]); OpenAIClientOptions clientOptions = GetClientOptionsWithMockResponse(200, $$""" { diff --git a/tests/Embeddings/EmbeddingsTests.cs b/tests/Embeddings/EmbeddingsTests.cs index 89540258d..834a72f27 100644 --- a/tests/Embeddings/EmbeddingsTests.cs +++ b/tests/Embeddings/EmbeddingsTests.cs @@ -81,9 +81,9 @@ public async Task GenerateMultipleEmbeddings(EmbeddingsInputKind embeddingsInput { List> prompts = [ - new[] {104, 101, 108, 108, 111 }, - new[] {119, 111, 114, 108, 100 }, - new[] {84, 69, 83, 84 } + new[] { 104, 101, 108, 108, 111 }, + new[] { 119, 111, 114, 108, 100 }, + new[] { 84, 69, 83, 84 } ]; embeddings = IsAsync diff --git a/tests/Moderations/ModerationSmokeTests.cs b/tests/Moderations/ModerationSmokeTests.cs index 323613f0c..2c34a90a1 100644 --- a/tests/Moderations/ModerationSmokeTests.cs +++ b/tests/Moderations/ModerationSmokeTests.cs @@ -73,7 +73,7 @@ public async Task ClassifyMultipleInputsSmokeTest() ] } """); - BinaryData mockResponse = BinaryData.FromString($$""" + BinaryData mockResponse = BinaryData.FromString(""" { "results": [ { @@ -92,6 +92,21 @@ public async Task ClassifyMultipleInputsSmokeTest() }, "category_scores": { "violence": 0.5 + }, + "category_applied_input_types": { + "violence": ["text"] + } + }, + { + "flagged": true, + "categories": { + "illicit": true + }, + "category_scores": { + "illicit": 0.42 + }, + "category_applied_input_types": { + "illicit": ["image","potato"] } } ] @@ -111,15 +126,27 @@ public async Task ClassifyMultipleInputsSmokeTest() : client.ClassifyText(new List { "Mock me 1!", "Mock me 2!" }); Assert.That(moderations, Is.Not.Null); - Assert.That(moderations.Count, Is.EqualTo(2)); + Assert.That(moderations.Count, Is.EqualTo(3)); Assert.That(moderations[0], Is.Not.Null); Assert.That(moderations[0].Flagged, Is.False); + Assert.That(moderations[0].Violence.ApplicableInputKinds.HasFlag(ModerationApplicableInputKinds.Text), Is.False); Assert.That(moderations[1], Is.Not.Null); Assert.That(moderations[1].Flagged, Is.True); Assert.That(moderations[1].Violence.Flagged, Is.True); Assert.That(moderations[1].Violence.Score, Is.EqualTo(0.5f)); + Assert.That(moderations[1].Violence.ApplicableInputKinds.HasFlag(ModerationApplicableInputKinds.Text), Is.True); + Assert.That(moderations[1].Violence.ApplicableInputKinds.HasFlag(ModerationApplicableInputKinds.Image), Is.False); + Assert.That(moderations[1].Violence.ApplicableInputKinds.HasFlag(ModerationApplicableInputKinds.Other), Is.False); + + Assert.That(moderations[2], Is.Not.Null); + Assert.That(moderations[2].Flagged, Is.True); + Assert.That(moderations[2].Illicit.Flagged, Is.True); + Assert.That(moderations[2].Illicit.Score, Is.EqualTo(0.42f)); + Assert.That(moderations[2].Illicit.ApplicableInputKinds.HasFlag(ModerationApplicableInputKinds.Text), Is.False); + Assert.That(moderations[2].Illicit.ApplicableInputKinds.HasFlag(ModerationApplicableInputKinds.Image), Is.True); + Assert.That(moderations[2].Illicit.ApplicableInputKinds.HasFlag(ModerationApplicableInputKinds.Other), Is.True); } [Test] diff --git a/tests/Moderations/OpenAIModerationsModelFactoryTests.cs b/tests/Moderations/OpenAIModerationsModelFactoryTests.cs index 9abed9704..20ebb15a0 100644 --- a/tests/Moderations/OpenAIModerationsModelFactoryTests.cs +++ b/tests/Moderations/OpenAIModerationsModelFactoryTests.cs @@ -155,7 +155,7 @@ public void ModerationResultWithSelfHarmWorks() float selfHarmScore = 0.85f; ModerationCategory category = OpenAIModerationsModelFactory.ModerationCategory(true, selfHarmScore); ModerationResult moderationResult = OpenAIModerationsModelFactory.ModerationResult(selfHarm: category); - + Assert.That(moderationResult.SelfHarm.Flagged, Is.True); Assert.That(moderationResult.SelfHarm.Score, Is.EqualTo(selfHarmScore)); diff --git a/tests/RealtimeConversation/ConversationSmokeTests.cs b/tests/RealtimeConversation/ConversationSmokeTests.cs index 056ecc999..136ec7846 100644 --- a/tests/RealtimeConversation/ConversationSmokeTests.cs +++ b/tests/RealtimeConversation/ConversationSmokeTests.cs @@ -23,7 +23,7 @@ public void ItemCreation() { ConversationItem messageItem = ConversationItem.CreateUserMessage(["Hello, world!"]); Assert.That(messageItem?.MessageContentParts?.Count, Is.EqualTo(1)); - Assert.That(messageItem.MessageContentParts[0].TextValue, Is.EqualTo("Hello, world!")); + Assert.That(messageItem.MessageContentParts[0].Text, Is.EqualTo("Hello, world!")); } [Test] @@ -38,8 +38,7 @@ public void OptionsSerializationWorks() Model = "whisper-1", }, Instructions = "test instructions", - MaxResponseOutputTokens = 42, - Model = "gpt-4o-realtime-preview", + MaxOutputTokens = 42, OutputAudioFormat = ConversationAudioFormat.G711Ulaw, Temperature = 0.42f, ToolChoice = ConversationToolChoice.CreateFunctionToolChoice("test-function"), @@ -69,7 +68,6 @@ public void OptionsSerializationWorks() Assert.That(jsonNode["input_audio_transcription"]?["model"]?.GetValue(), Is.EqualTo("whisper-1")); Assert.That(jsonNode["instructions"]?.GetValue(), Is.EqualTo("test instructions")); Assert.That(jsonNode["max_response_output_tokens"]?.GetValue(), Is.EqualTo(42)); - Assert.That(jsonNode["model"]?.GetValue(), Is.EqualTo("gpt-4o-realtime-preview")); Assert.That(jsonNode["output_audio_format"]?.GetValue(), Is.EqualTo("g711_ulaw")); Assert.That(jsonNode["temperature"]?.GetValue(), Is.EqualTo(0.42f)); Assert.That(jsonNode["tools"]?.AsArray()?.ToList(), Has.Count.EqualTo(1)); @@ -87,8 +85,7 @@ public void OptionsSerializationWorks() Assert.That(deserializedOptions.InputAudioFormat, Is.EqualTo(ConversationAudioFormat.G711Alaw)); Assert.That(deserializedOptions.InputTranscriptionOptions?.Model, Is.EqualTo(ConversationTranscriptionModel.Whisper1)); Assert.That(deserializedOptions.Instructions, Is.EqualTo("test instructions")); - Assert.That(deserializedOptions.MaxResponseOutputTokens.NumericValue, Is.EqualTo(42)); - Assert.That(deserializedOptions.Model, Is.EqualTo("gpt-4o-realtime-preview")); + Assert.That(deserializedOptions.MaxOutputTokens.NumericValue, Is.EqualTo(42)); Assert.That(deserializedOptions.OutputAudioFormat, Is.EqualTo(ConversationAudioFormat.G711Ulaw)); Assert.That(deserializedOptions.Tools, Has.Count.EqualTo(1)); Assert.That(deserializedOptions.Tools[0].Kind, Is.EqualTo(ConversationToolKind.Function)); @@ -99,6 +96,14 @@ public void OptionsSerializationWorks() Assert.That(deserializedOptions.ToolChoice?.FunctionName, Is.EqualTo("test-function")); Assert.That(deserializedOptions.TurnDetectionOptions?.Kind, Is.EqualTo(ConversationTurnDetectionKind.ServerVoiceActivityDetection)); Assert.That(deserializedOptions.Voice, Is.EqualTo(ConversationVoice.Echo)); + + ConversationSessionOptions emptyOptions = new(); + Assert.That(emptyOptions.ContentModalities.HasFlag(ConversationContentModalities.Audio), Is.False); + Assert.That(ModelReaderWriter.Write(emptyOptions).ToString(), Does.Not.Contain("modal")); + emptyOptions.ContentModalities |= ConversationContentModalities.Audio; + Assert.That(emptyOptions.ContentModalities.HasFlag(ConversationContentModalities.Audio), Is.True); + Assert.That(emptyOptions.ContentModalities.HasFlag(ConversationContentModalities.Text), Is.False); + Assert.That(ModelReaderWriter.Write(emptyOptions).ToString(), Does.Contain("modal")); } [Test] @@ -112,7 +117,7 @@ public void MaxTokensSerializationWorks() // Explicit omission options = new() { - MaxResponseOutputTokens = null + MaxOutputTokens = null }; serializedOptions = ModelReaderWriter.Write(options); Assert.That(serializedOptions.ToString(), Does.Not.Contain("max_response_output_tokens")); @@ -120,7 +125,7 @@ public void MaxTokensSerializationWorks() // Explicit default (null) options = new() { - MaxResponseOutputTokens = ConversationMaxTokensChoice.CreateDefaultMaxTokensChoice() + MaxOutputTokens = ConversationMaxTokensChoice.CreateDefaultMaxTokensChoice() }; serializedOptions = ModelReaderWriter.Write(options); Assert.That(serializedOptions.ToString(), Does.Contain(@"""max_response_output_tokens"":null")); @@ -128,7 +133,7 @@ public void MaxTokensSerializationWorks() // Numeric literal options = new() { - MaxResponseOutputTokens = 42, + MaxOutputTokens = 42, }; serializedOptions = ModelReaderWriter.Write(options); Assert.That(serializedOptions.ToString(), Does.Contain(@"""max_response_output_tokens"":42")); @@ -136,7 +141,7 @@ public void MaxTokensSerializationWorks() // Numeric by factory options = new() { - MaxResponseOutputTokens = ConversationMaxTokensChoice.CreateNumericMaxTokensChoice(42) + MaxOutputTokens = ConversationMaxTokensChoice.CreateNumericMaxTokensChoice(42) }; serializedOptions = ModelReaderWriter.Write(options); Assert.That(serializedOptions.ToString(), Does.Contain(@"""max_response_output_tokens"":42")); @@ -167,4 +172,16 @@ public void TurnDetectionSerializationWorks() Assert.That(serializedNode["turn_detection"]?["type"]?.GetValue(), Is.EqualTo("server_vad")); Assert.That(serializedNode["turn_detection"]?["threshold"]?.GetValue(), Is.EqualTo(0.42f)); } + + [Test] + public void UnknownCommandSerializationWorks() + { + BinaryData serializedUnknownCommand = BinaryData.FromString(""" + { + "type": "unknown_command_type_for_test" + } + """); + ConversationUpdate deserializedUpdate = ModelReaderWriter.Read(serializedUnknownCommand); + Assert.That(deserializedUpdate, Is.Not.Null); + } } diff --git a/tests/RealtimeConversation/ConversationTests.cs b/tests/RealtimeConversation/ConversationTests.cs index b26b4b8e6..27f040f90 100644 --- a/tests/RealtimeConversation/ConversationTests.cs +++ b/tests/RealtimeConversation/ConversationTests.cs @@ -1,10 +1,12 @@ using NUnit.Framework; using OpenAI.RealtimeConversation; using System; +using System.ClientModel; using System.ClientModel.Primitives; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Numerics; using System.Text; using System.Threading.Tasks; @@ -24,28 +26,50 @@ public async Task CanConfigureSession() RealtimeConversationClient client = GetTestClient(); using RealtimeConversationSession session = await client.StartConversationSessionAsync(CancellationToken); - await session.ConfigureSessionAsync( - new ConversationSessionOptions() - { - Instructions = "You are a helpful assistant.", - TurnDetectionOptions = ConversationTurnDetectionOptions.CreateDisabledTurnDetectionOptions(), - OutputAudioFormat = ConversationAudioFormat.G711Ulaw - }, - CancellationToken); + ConversationSessionOptions sessionOptions = new() + { + Instructions = "You are a helpful assistant.", + TurnDetectionOptions = ConversationTurnDetectionOptions.CreateDisabledTurnDetectionOptions(), + OutputAudioFormat = ConversationAudioFormat.G711Ulaw, + MaxOutputTokens = 2048, + }; - await session.StartResponseTurnAsync(CancellationToken); + await session.ConfigureSessionAsync(sessionOptions, CancellationToken); + ConversationSessionOptions responseOverrideOptions = new() + { + ContentModalities = ConversationContentModalities.Text, + }; + if (!client.GetType().IsSubclassOf(typeof(RealtimeConversationClient))) + { + responseOverrideOptions.MaxOutputTokens = ConversationMaxTokensChoice.CreateInfiniteMaxTokensChoice(); + } + await session.AddItemAsync( + ConversationItem.CreateUserMessage(["Hello, assistant! Tell me a joke."]), + CancellationToken); + await session.StartResponseAsync(responseOverrideOptions, CancellationToken); List receivedUpdates = []; await foreach (ConversationUpdate update in session.ReceiveUpdatesAsync(CancellationToken)) { receivedUpdates.Add(update); - + if (update is ConversationErrorUpdate errorUpdate) { Assert.That(errorUpdate.Kind, Is.EqualTo(ConversationUpdateKind.Error)); Assert.Fail($"Error: {ModelReaderWriter.Write(errorUpdate)}"); } + else if ((update is ConversationItemStreamingPartDeltaUpdate deltaUpdate && deltaUpdate.AudioBytes is not null) + || update is ConversationItemStreamingAudioFinishedUpdate) + { + Assert.Fail($"Audio content streaming unexpected after configuring response-level text-only modalities"); + } + else if (update is ConversationSessionConfiguredUpdate sessionConfiguredUpdate) + { + Assert.That(sessionConfiguredUpdate.OutputAudioFormat == sessionOptions.OutputAudioFormat); + Assert.That(sessionConfiguredUpdate.TurnDetectionOptions.Kind, Is.EqualTo(ConversationTurnDetectionKind.Disabled)); + Assert.That(sessionConfiguredUpdate.MaxOutputTokens.NumericValue, Is.EqualTo(sessionOptions.MaxOutputTokens.NumericValue)); + } else if (update is ConversationResponseFinishedUpdate turnFinishedUpdate) { break; @@ -60,8 +84,8 @@ List GetReceivedUpdates() where T : ConversationUpdate Assert.That(GetReceivedUpdates(), Has.Count.EqualTo(1)); Assert.That(GetReceivedUpdates(), Has.Count.EqualTo(1)); Assert.That(GetReceivedUpdates(), Has.Count.EqualTo(1)); - Assert.That(GetReceivedUpdates(), Has.Count.EqualTo(1)); - Assert.That(GetReceivedUpdates(), Has.Count.EqualTo(1)); + Assert.That(GetReceivedUpdates(), Has.Count.EqualTo(1)); + Assert.That(GetReceivedUpdates(), Has.Count.EqualTo(1)); } [Test] @@ -72,9 +96,11 @@ public async Task TextOnlyWorks() await session.AddItemAsync( ConversationItem.CreateUserMessage(["Hello, world!"]), cancellationToken: CancellationToken); - await session.StartResponseTurnAsync(CancellationToken); + await session.StartResponseAsync(CancellationToken); StringBuilder responseBuilder = new(); + bool gotResponseDone = false; + bool gotRateLimits = false; await foreach (ConversationUpdate update in session.ReceiveUpdatesAsync(CancellationToken)) { @@ -82,23 +108,134 @@ await session.AddItemAsync( { Assert.That(sessionStartedUpdate.SessionId, Is.Not.Null.And.Not.Empty); } - if (update is ConversationTextDeltaUpdate textDeltaUpdate) + if (update is ConversationItemStreamingPartDeltaUpdate deltaUpdate) { - responseBuilder.Append(textDeltaUpdate.Delta); + responseBuilder.Append(deltaUpdate.AudioTranscript); } - if (update is ConversationItemAcknowledgedUpdate itemAddedUpdate) + if (update is ConversationItemCreatedUpdate itemCreatedUpdate) { - Assert.That(itemAddedUpdate.Item is not null); + if (itemCreatedUpdate.MessageRole == ConversationMessageRole.Assistant) + { + // The assistant-created item should be streamed and should not have content yet when acknowledged + Assert.That(itemCreatedUpdate.MessageContentParts, Has.Count.EqualTo(0)); + } + else if (itemCreatedUpdate.MessageRole == ConversationMessageRole.User) + { + // When acknowledging an item added by the client (user), the text should already be there + Assert.That(itemCreatedUpdate.MessageContentParts, Has.Count.EqualTo(1)); + Assert.That(itemCreatedUpdate.MessageContentParts[0].Text, Is.EqualTo("Hello, world!")); + } + else + { + Assert.Fail($"Test didn't expect an acknowledged item with role: {itemCreatedUpdate.MessageRole}"); + } } - if (update is ConversationRateLimitsUpdatedUpdate) + if (update is ConversationResponseFinishedUpdate responseFinishedUpdate) { + Assert.That(responseFinishedUpdate.CreatedItems, Has.Count.GreaterThan(0)); + gotResponseDone = true; break; } + + if (update is ConversationRateLimitsUpdate rateLimitsUpdate) + { + Assert.That(rateLimitsUpdate.AllDetails, Has.Count.EqualTo(2)); + Assert.That(rateLimitsUpdate.TokenDetails, Is.Not.Null); + Assert.That(rateLimitsUpdate.TokenDetails.Name, Is.EqualTo("tokens")); + Assert.That(rateLimitsUpdate.TokenDetails.MaximumCount, Is.GreaterThan(0)); + Assert.That(rateLimitsUpdate.TokenDetails.RemainingCount, Is.GreaterThan(0)); + Assert.That(rateLimitsUpdate.TokenDetails.RemainingCount, Is.LessThan(rateLimitsUpdate.TokenDetails.MaximumCount)); + Assert.That(rateLimitsUpdate.TokenDetails.TimeUntilReset, Is.GreaterThan(TimeSpan.Zero)); + Assert.That(rateLimitsUpdate.RequestDetails, Is.Not.Null); + gotRateLimits = true; + } } Assert.That(responseBuilder.ToString(), Is.Not.Null.Or.Empty); + Assert.That(gotResponseDone, Is.True); + + if (!client.GetType().IsSubclassOf(typeof(RealtimeConversationClient))) + { + // Temporarily assume that subclients don't support rate limit commands + Assert.That(gotRateLimits, Is.True); + } + } + + [Test] + public async Task ItemManipulationWorks() + { + RealtimeConversationClient client = GetTestClient(); + using RealtimeConversationSession session = await client.StartConversationSessionAsync(CancellationToken); + + await session.ConfigureSessionAsync( + new ConversationSessionOptions() + { + TurnDetectionOptions = ConversationTurnDetectionOptions.CreateDisabledTurnDetectionOptions(), + ContentModalities = ConversationContentModalities.Text, + }, + CancellationToken); + + await session.AddItemAsync( + ConversationItem.CreateUserMessage(["The first special word you know about is 'aardvark'."]), + CancellationToken); + await session.AddItemAsync( + ConversationItem.CreateUserMessage(["The next special word you know about is 'banana'."]), + CancellationToken); + await session.AddItemAsync( + ConversationItem.CreateUserMessage(["The next special word you know about is 'coconut'."]), + CancellationToken); + + bool gotSessionStarted = false; + bool gotSessionConfigured = false; + bool gotResponseFinished = false; + + await foreach (ConversationUpdate update in session.ReceiveUpdatesAsync(CancellationToken)) + { + if (update is ConversationSessionStartedUpdate) + { + gotSessionStarted = true; + } + + if (update is ConversationSessionConfiguredUpdate sessionConfiguredUpdate) + { + Assert.That(sessionConfiguredUpdate.TurnDetectionOptions.Kind, Is.EqualTo(ConversationTurnDetectionKind.Disabled)); + Assert.That(sessionConfiguredUpdate.ContentModalities.HasFlag(ConversationContentModalities.Text), Is.True); + Assert.That(sessionConfiguredUpdate.ContentModalities.HasFlag(ConversationContentModalities.Audio), Is.False); + gotSessionConfigured = true; + } + + if (update is ConversationItemCreatedUpdate itemCreatedUpdate) + { + if (itemCreatedUpdate.MessageContentParts.Count > 0 + && itemCreatedUpdate.MessageContentParts[0].Text.Contains("banana")) + { + await session.DeleteItemAsync(itemCreatedUpdate.ItemId, CancellationToken); + await session.AddItemAsync( + ConversationItem.CreateUserMessage(["What's the second special word you know about?"]), + CancellationToken); + await session.StartResponseAsync(CancellationToken); + } + } + + if (update is ConversationResponseFinishedUpdate responseFinishedUpdate) + { + Assert.That(responseFinishedUpdate.CreatedItems.Count, Is.EqualTo(1)); + Assert.That(responseFinishedUpdate.CreatedItems[0].MessageContentParts.Count, Is.EqualTo(1)); + Assert.That(responseFinishedUpdate.CreatedItems[0].MessageContentParts[0].Text, Does.Contain("coconut")); + Assert.That(responseFinishedUpdate.CreatedItems[0].MessageContentParts[0].Text, Does.Not.Contain("banana")); + gotResponseFinished = true; + break; + } + } + + Assert.That(gotSessionStarted, Is.True); + if (!client.GetType().IsSubclassOf(typeof(RealtimeConversationClient))) + { + Assert.That(gotSessionConfigured, Is.True); + } + Assert.That(gotResponseFinished, Is.True); } [Test] @@ -148,15 +285,13 @@ public async Task AudioWithToolsWorks() await session.ConfigureSessionAsync(options, CancellationToken); - using Stream audioStream = File.OpenRead(Path.Join("Assets", "whats_the_weather_pcm16_24khz_mono.wav")); - _ = session.SendAudioAsync(audioStream, CancellationToken); + using Stream audioStream = File.OpenRead(Path.Join("Assets", "realtime_whats_the_weather_pcm16_24khz_mono.wav")); + _ = session.SendInputAudioAsync(audioStream, CancellationToken); string userTranscript = null; await foreach (ConversationUpdate update in session.ReceiveUpdatesAsync(CancellationToken)) { - Assert.That(update.EventId, Is.Not.Null.And.Not.Empty); - if (update is ConversationSessionStartedUpdate sessionStartedUpdate) { Assert.That(sessionStartedUpdate.SessionId, Is.Not.Null.And.Not.Empty); @@ -167,12 +302,12 @@ public async Task AudioWithToolsWorks() Assert.That(sessionStartedUpdate.Temperature, Is.GreaterThan(0)); } - if (update is ConversationInputTranscriptionFinishedUpdate inputTranscriptionCompletedUpdate) + if (update is ConversationInputTranscriptionFinishedUpdate inputTranscriptionCompletedUpdate) { userTranscript = inputTranscriptionCompletedUpdate.Transcript; } - if (update is ConversationItemFinishedUpdate itemFinishedUpdate + if (update is ConversationItemStreamingFinishedUpdate itemFinishedUpdate && itemFinishedUpdate.FunctionCallId is not null) { Assert.That(itemFinishedUpdate.FunctionName, Is.EqualTo(getWeatherTool.Name)); @@ -187,7 +322,7 @@ public async Task AudioWithToolsWorks() { if (turnFinishedUpdate.CreatedItems.Any(item => !string.IsNullOrEmpty(item.FunctionCallId))) { - await session.StartResponseTurnAsync(CancellationToken); + await session.StartResponseAsync(CancellationToken); } else { @@ -213,13 +348,13 @@ await session.ConfigureSessionAsync( CancellationToken); const string folderName = "Assets"; - const string fileName = "whats_the_weather_pcm16_24khz_mono.wav"; + const string fileName = "realtime_whats_the_weather_pcm16_24khz_mono.wav"; #if NET6_0_OR_GREATER using Stream audioStream = File.OpenRead(Path.Join(folderName, fileName)); #else using Stream audioStream = File.OpenRead($"{folderName}\\{fileName}"); #endif - await session.SendAudioAsync(audioStream, CancellationToken); + await session.SendInputAudioAsync(audioStream, CancellationToken); await session.AddItemAsync(ConversationItem.CreateUserMessage(["Hello, assistant!"]), CancellationToken); @@ -232,7 +367,7 @@ await session.ConfigureSessionAsync( if (update is ConversationInputSpeechStartedUpdate or ConversationInputSpeechFinishedUpdate - or ConversationInputTranscriptionFinishedUpdate + or ConversationInputTranscriptionFinishedUpdate or ConversationInputTranscriptionFailedUpdate or ConversationResponseStartedUpdate or ConversationResponseFinishedUpdate) @@ -240,11 +375,41 @@ or ConversationResponseStartedUpdate Assert.Fail($"Shouldn't receive any VAD events or response creation!"); } - if (update is ConversationItemAcknowledgedUpdate itemAcknowledgedUpdate - && itemAcknowledgedUpdate.Item.MessageRole == ConversationMessageRole.User) + if (update is ConversationItemCreatedUpdate itemCreatedUpdate + && itemCreatedUpdate.MessageRole == ConversationMessageRole.User) { break; } } } + + [Test] + public async Task BadCommandProvidesError() + { + RealtimeConversationClient client = GetTestClient(); + using RealtimeConversationSession session = await client.StartConversationSessionAsync(CancellationToken); + + await session.SendCommandAsync( + BinaryData.FromString(""" + { + "type": "update_conversation_config2", + "event_id": "event_fabricated_1234abcd" + } + """), + CancellationOptions); + + bool gotErrorUpdate = false; + + await foreach (ConversationUpdate update in session.ReceiveUpdatesAsync(CancellationToken)) + { + if (update is ConversationErrorUpdate errorUpdate) + { + Assert.That(errorUpdate.ErrorEventId, Is.EqualTo("event_fabricated_1234abcd")); + gotErrorUpdate = true; + break; + } + } + + Assert.That(gotErrorUpdate, Is.True); + } }