Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
6 changes: 6 additions & 0 deletions api/OpenAI.net8.0.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1056,6 +1056,7 @@ public class AudioClient {
public AudioClient(string model, ApiKeyCredential credential, OpenAIClientOptions options);
public AudioClient(string model, ApiKeyCredential credential);
public AudioClient(string model, string apiKey);
[Experimental("OPENAI001")]
public string Model { get; }
public ClientPipeline Pipeline { get; }
public virtual ClientResult GenerateSpeech(BinaryContent content, RequestOptions options = null);
Expand Down Expand Up @@ -1404,6 +1405,7 @@ public class ChatClient {
public ChatClient(string model, ApiKeyCredential credential, OpenAIClientOptions options);
public ChatClient(string model, ApiKeyCredential credential);
public ChatClient(string model, string apiKey);
[Experimental("OPENAI001")]
public string Model { get; }
public ClientPipeline Pipeline { get; }
public virtual ClientResult<ChatCompletion> CompleteChat(params ChatMessage[] messages);
Expand Down Expand Up @@ -2279,6 +2281,7 @@ public class EmbeddingClient {
public EmbeddingClient(string model, ApiKeyCredential credential, OpenAIClientOptions options);
public EmbeddingClient(string model, ApiKeyCredential credential);
public EmbeddingClient(string model, string apiKey);
[Experimental("OPENAI001")]
public string Model { get; }
public ClientPipeline Pipeline { get; }
public virtual ClientResult<OpenAIEmbedding> GenerateEmbedding(string input, EmbeddingGenerationOptions options = null, CancellationToken cancellationToken = default);
Expand Down Expand Up @@ -3242,6 +3245,7 @@ public class ImageClient {
public ImageClient(string model, ApiKeyCredential credential, OpenAIClientOptions options);
public ImageClient(string model, ApiKeyCredential credential);
public ImageClient(string model, string apiKey);
[Experimental("OPENAI001")]
public string Model { get; }
public ClientPipeline Pipeline { get; }
public virtual ClientResult<GeneratedImage> GenerateImage(string prompt, ImageGenerationOptions options = null, CancellationToken cancellationToken = default);
Expand Down Expand Up @@ -3429,6 +3433,7 @@ public class ModerationClient {
public ModerationClient(string model, ApiKeyCredential credential, OpenAIClientOptions options);
public ModerationClient(string model, ApiKeyCredential credential);
public ModerationClient(string model, string apiKey);
[Experimental("OPENAI001")]
public string Model { get; }
public ClientPipeline Pipeline { get; }
public virtual ClientResult ClassifyText(BinaryContent content, RequestOptions options = null);
Expand Down Expand Up @@ -4610,6 +4615,7 @@ public class OpenAIResponseClient {
public virtual CollectionResult<StreamingResponseUpdate> GetResponseStreaming(string responseId, int? startingAfter = null, CancellationToken cancellationToken = default);
public virtual AsyncCollectionResult<StreamingResponseUpdate> GetResponseStreamingAsync(string responseId, int? startingAfter = null, CancellationToken cancellationToken = default);
}
[Experimental("OPENAI001")]
public static class OpenAIResponsesModelFactory {
public static MessageResponseItem MessageResponseItem(string id = null, MessageRole role = MessageRole.Assistant, MessageStatus? status = null);
public static OpenAIResponse OpenAIResponse(string id = null, DateTimeOffset createdAt = default, ResponseStatus? status = null, ResponseError error = null, ResponseTokenUsage usage = null, string endUserId = null, ResponseReasoningOptions reasoningOptions = null, int? maxOutputTokenCount = null, ResponseTextOptions textOptions = null, ResponseTruncationMode? truncationMode = null, ResponseIncompleteStatusDetails incompleteStatusDetails = null, IEnumerable<ResponseItem> outputItems = null, bool parallelToolCallsEnabled = false, ResponseToolChoice toolChoice = null, string model = null, IDictionary<string, string> metadata = null, float? temperature = null, float? topP = null, string previousResponseId = null, bool? background = null, string instructions = null, IEnumerable<ResponseTool> tools = null);
Expand Down
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
1 change: 1 addition & 0 deletions src/Custom/Audio/AudioClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ protected internal AudioClient(ClientPipeline pipeline, string model, OpenAIClie
/// <summary>
/// Gets the name of the model used in requests sent to the service.
/// </summary>
[Experimental("OPENAI001")]
public string Model => _model;

#region GenerateSpeech
Expand Down
1 change: 1 addition & 0 deletions src/Custom/Chat/ChatClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ protected internal ChatClient(ClientPipeline pipeline, string model, OpenAIClien
/// <summary>
/// Gets the name of the model used in requests sent to the service.
/// </summary>
[Experimental("OPENAI001")]
public string Model => _model;

/// <summary> Generates a completion for the given chat. </summary>
Expand Down
2 changes: 2 additions & 0 deletions src/Custom/Embeddings/EmbeddingClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.ClientModel;
using System.ClientModel.Primitives;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Linq;
using System.Text.Json;
Expand Down Expand Up @@ -92,6 +93,7 @@ protected internal EmbeddingClient(ClientPipeline pipeline, string model, OpenAI
/// <summary>
/// Gets the name of the model used in requests sent to the service.
/// </summary>
[Experimental("OPENAI001")]
public string Model => _model;

// CUSTOM: Added to simplify generating a single embedding from a string input.
Expand Down
4 changes: 3 additions & 1 deletion src/Custom/Images/ImageClient.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.ClientModel;
using System.ClientModel.Primitives;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Linq;
using System.Threading;
Expand Down Expand Up @@ -86,10 +87,11 @@ protected internal ImageClient(ClientPipeline pipeline, string model, OpenAIClie
Pipeline = pipeline;
_endpoint = OpenAIClient.GetEndpoint(options);
}

/// <summary>
/// Gets the name of the model used in requests sent to the service.
/// </summary>
[Experimental("OPENAI001")]
public string Model => _model;

#region GenerateImages
Expand Down
2 changes: 2 additions & 0 deletions src/Custom/Moderations/ModerationClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.ClientModel;
using System.ClientModel.Primitives;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Linq;
using System.Text.Json;
Expand Down Expand Up @@ -92,6 +93,7 @@ protected internal ModerationClient(ClientPipeline pipeline, string model, OpenA
/// <summary>
/// Gets the name of the model used in requests sent to the service.
/// </summary>
[Experimental("OPENAI001")]
public string Model => _model;

/// <summary> Classifies if the text input is potentially harmful across several categories. </summary>
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.");
}
}
}