Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions codegen/generator/src/OpenAILibraryVisitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public class OpenAILibraryVisitor : ScmLibraryVisitor
["FunctionCallResponseItem"] = [_readonlyStatusReplacementInfo],
["FunctionCallOutputResponseItem"] = [_readonlyStatusReplacementInfo],
["MessageResponseItem"] = [_readonlyStatusReplacementInfo],
["ReasoningResponseItem"] = [_readonlyStatusReplacementInfo],
["WebSearchCallResponseItem"] = [_readonlyStatusReplacementInfo],
};

Expand Down
10 changes: 6 additions & 4 deletions src/Custom/Responses/Items/ReasoningResponseItem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,23 @@ public partial class ReasoningResponseItem
{
// CUSTOM: Retain optionality of OpenAPI read-only property value
[CodeGenMember("Status")]
public ReasoningStatus? Status { get; internal set; }
public ReasoningStatus? Status { get; }

// CUSTOM: Rename for collection clarity
[CodeGenMember("Summary")]
public IReadOnlyList<ReasoningSummaryPart> SummaryParts { get; }

// CUSTOM: Enable reuse as an input model
public ReasoningResponseItem(IEnumerable<ReasoningSummaryPart> summaryParts)
: this(id: null, summaryParts)
{ }
: this(id: null, status: null, summaryParts)
{
}

// CUSTOM: Facilitate typical single-item summary text input model use
public ReasoningResponseItem(string summaryText)
: this(summaryParts: [new ReasoningSummaryTextPart(summaryText)])
{ }
{
}

// CUSTOM: Provide convenience for typical single-item or text-concatenation scenario
public string GetSummaryText()
Expand Down
2 changes: 1 addition & 1 deletion src/Custom/Responses/Items/ReasoningStatus.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ namespace OpenAI.Responses;
// - Added Experimental attribute.
// - Renamed.
[Experimental("OPENAI001")]
[CodeGenType("ReasoningItemStatus")]
[CodeGenType("ReasoningItemResourceStatus")]
public enum ReasoningStatus
{
InProgress,
Expand Down
4 changes: 2 additions & 2 deletions src/Custom/Responses/OpenAIResponsesModelFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -102,9 +102,9 @@ public static ReasoningResponseItem ReasoningResponseItem(
id: id,
additionalBinaryDataProperties: null,
encryptedContent: encryptedContent,
status: status,
summaryParts: summaryParts.ToList());

item.Status = status;
return item;
}

Expand All @@ -129,9 +129,9 @@ public static ReasoningResponseItem ReasoningResponseItem(
id: id,
additionalBinaryDataProperties: null,
encryptedContent: encryptedContent,
status: status,
summaryParts: summaryParts);

item.Status = status;
return item;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ namespace OpenAI.Responses
{
public partial class ReasoningResponseItem : IJsonModel<ReasoningResponseItem>
{
internal ReasoningResponseItem() : this(InternalItemType.Reasoning, null, null, null, null)
internal ReasoningResponseItem() : this(InternalItemType.Reasoning, null, null, null, default, null)
{
}

Expand All @@ -36,6 +36,12 @@ protected override void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWri
writer.WritePropertyName("encrypted_content"u8);
writer.WriteStringValue(EncryptedContent);
}
// Plugin customization: apply Optional.Is*Defined() check based on type name dictionary lookup
if (Optional.IsDefined(Status) && _additionalBinaryDataProperties?.ContainsKey("status") != true)
{
writer.WritePropertyName("status"u8);
writer.WriteStringValue(Status.Value.ToSerialString());
}
if (_additionalBinaryDataProperties?.ContainsKey("summary") != true)
{
writer.WritePropertyName("summary"u8);
Expand Down Expand Up @@ -71,6 +77,7 @@ internal static ReasoningResponseItem DeserializeReasoningResponseItem(JsonEleme
string id = default;
IDictionary<string, BinaryData> additionalBinaryDataProperties = new ChangeTrackingDictionary<string, BinaryData>();
string encryptedContent = default;
ReasoningStatus? status = default;
IReadOnlyList<ReasoningSummaryPart> summaryParts = default;
foreach (var prop in element.EnumerateObject())
{
Expand All @@ -94,6 +101,11 @@ internal static ReasoningResponseItem DeserializeReasoningResponseItem(JsonEleme
encryptedContent = prop.Value.GetString();
continue;
}
if (prop.NameEquals("status"u8))
{
status = prop.Value.GetString().ToReasoningStatus();
continue;
}
if (prop.NameEquals("summary"u8))
{
List<ReasoningSummaryPart> array = new List<ReasoningSummaryPart>();
Expand All @@ -107,7 +119,13 @@ internal static ReasoningResponseItem DeserializeReasoningResponseItem(JsonEleme
// Plugin customization: remove options.Format != "W" check
additionalBinaryDataProperties.Add(prop.Name, BinaryData.FromString(prop.Value.GetRawText()));
}
return new ReasoningResponseItem(kind, id, additionalBinaryDataProperties, encryptedContent, summaryParts);
return new ReasoningResponseItem(
kind,
id,
additionalBinaryDataProperties,
encryptedContent,
status,
summaryParts);
}

BinaryData IPersistableModel<ReasoningResponseItem>.Write(ModelReaderWriterOptions options) => PersistableModelWriteCore(options);
Expand Down
6 changes: 4 additions & 2 deletions src/Generated/Models/Responses/ReasoningResponseItem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,17 @@ namespace OpenAI.Responses
[Experimental("OPENAI001")]
public partial class ReasoningResponseItem : ResponseItem
{
internal ReasoningResponseItem(string id, IEnumerable<ReasoningSummaryPart> summaryParts) : base(InternalItemType.Reasoning, id)
internal ReasoningResponseItem(string id, ReasoningStatus? status, IEnumerable<ReasoningSummaryPart> summaryParts) : base(InternalItemType.Reasoning, id)
{
Status = status;
SummaryParts = summaryParts.ToList();
}

internal ReasoningResponseItem(InternalItemType kind, string id, IDictionary<string, BinaryData> additionalBinaryDataProperties, string encryptedContent, IReadOnlyList<ReasoningSummaryPart> summaryParts) : base(kind, id, additionalBinaryDataProperties)
internal ReasoningResponseItem(InternalItemType kind, string id, IDictionary<string, BinaryData> additionalBinaryDataProperties, string encryptedContent, ReasoningStatus? status, IReadOnlyList<ReasoningSummaryPart> summaryParts) : base(kind, id, additionalBinaryDataProperties)
{
// Plugin customization: ensure initialization of collections
EncryptedContent = encryptedContent;
Status = status;
SummaryParts = summaryParts ?? new ChangeTrackingList<ReasoningSummaryPart>();
}

Expand Down
36 changes: 36 additions & 0 deletions src/Generated/Models/Responses/ReasoningStatus.Serialization.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// <auto-generated/>

#nullable disable

using System;

namespace OpenAI.Responses
{
internal static partial class ReasoningStatusExtensions
{
public static string ToSerialString(this ReasoningStatus value) => value switch
{
ReasoningStatus.InProgress => "in_progress",
ReasoningStatus.Completed => "completed",
ReasoningStatus.Incomplete => "incomplete",
_ => throw new ArgumentOutOfRangeException(nameof(value), value, "Unknown ReasoningStatus value.")
};

public static ReasoningStatus ToReasoningStatus(this string value)
{
if (StringComparer.OrdinalIgnoreCase.Equals(value, "in_progress"))
{
return ReasoningStatus.InProgress;
}
if (StringComparer.OrdinalIgnoreCase.Equals(value, "completed"))
{
return ReasoningStatus.Completed;
}
if (StringComparer.OrdinalIgnoreCase.Equals(value, "incomplete"))
{
return ReasoningStatus.Incomplete;
}
throw new ArgumentOutOfRangeException(nameof(value), value, "Unknown ReasoningStatus value.");
}
}
}