Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 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
36 changes: 36 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);
public string Model { get; }
public ClientPipeline Pipeline { get; }
public virtual ClientResult GenerateSpeech(BinaryContent content, RequestOptions options = null);
public virtual ClientResult<BinaryData> GenerateSpeech(string text, GeneratedSpeechVoice voice, SpeechGenerationOptions options = null, CancellationToken cancellationToken = default);
Expand Down Expand Up @@ -1403,6 +1404,7 @@ public class ChatClient {
public ChatClient(string model, ApiKeyCredential credential, OpenAIClientOptions options);
public ChatClient(string model, ApiKeyCredential credential);
public ChatClient(string model, string apiKey);
public string Model { get; }
public ClientPipeline Pipeline { get; }
public virtual ClientResult<ChatCompletion> CompleteChat(params ChatMessage[] messages);
public virtual ClientResult CompleteChat(BinaryContent content, RequestOptions options = null);
Expand Down Expand Up @@ -1431,6 +1433,14 @@ public class ChatClient {
[Experimental("OPENAI001")]
public virtual Task<ClientResult<ChatCompletion>> GetChatCompletionAsync(string completionId, CancellationToken cancellationToken = default);
[Experimental("OPENAI001")]
public virtual CollectionResult<ChatCompletionMessageListDatum> GetChatCompletionMessages(string completionId, ChatCompletionCollectionOptions options = null, CancellationToken cancellationToken = default);
[Experimental("OPENAI001")]
public virtual CollectionResult GetChatCompletionMessages(string completionId, string after, int? limit, string order, RequestOptions options);
[Experimental("OPENAI001")]
public virtual AsyncCollectionResult<ChatCompletionMessageListDatum> GetChatCompletionMessagesAsync(string completionId, ChatCompletionMessageCollectionOptions options = null, CancellationToken cancellationToken = default);
[Experimental("OPENAI001")]
public virtual AsyncCollectionResult GetChatCompletionMessagesAsync(string completionId, string after, int? limit, string order, RequestOptions options);
[Experimental("OPENAI001")]
public virtual CollectionResult<ChatCompletion> GetChatCompletions(ChatCompletionCollectionOptions options = null, CancellationToken cancellationToken = default);
[Experimental("OPENAI001")]
public virtual CollectionResult GetChatCompletions(string after, int? limit, string order, IDictionary<string, string> metadata, string model, RequestOptions options);
Expand Down Expand Up @@ -1503,6 +1513,29 @@ public class ChatCompletionDeletionResult : IJsonModel<ChatCompletionDeletionRes
protected virtual ChatCompletionDeletionResult PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options);
protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options);
}
[Experimental("OPENAI001")]
public class ChatCompletionMessageCollectionOptions : IJsonModel<ChatCompletionMessageCollectionOptions>, IPersistableModel<ChatCompletionMessageCollectionOptions> {
public string AfterId { get; set; }
public ChatCompletionCollectionOrder? Order { get; set; }
public int? PageSizeLimit { get; set; }
protected virtual ChatCompletionMessageCollectionOptions JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options);
protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
protected virtual ChatCompletionMessageCollectionOptions PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options);
protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options);
}
[Experimental("OPENAI001")]
public class ChatCompletionMessageListDatum : IJsonModel<ChatCompletionMessageListDatum>, IPersistableModel<ChatCompletionMessageListDatum> {
public IList<ChatMessageAnnotation> Annotations { get; }
public ChatOutputAudio Audio { get; }
public string Content { get; }
public string Id { get; }
public string Refusal { get; }
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can be done in a separate PR: This class appears to be missing a few properties:

  • content_parts
  • function_call
  • name

public IReadOnlyList<ChatToolCall> ToolCalls { get; }
protected virtual ChatCompletionMessageListDatum JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options);
protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
protected virtual ChatCompletionMessageListDatum PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options);
protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options);
}
public class ChatCompletionOptions : IJsonModel<ChatCompletionOptions>, IPersistableModel<ChatCompletionOptions> {
public bool? AllowParallelToolCalls { get; set; }
[Experimental("OPENAI001")]
Expand Down Expand Up @@ -2277,6 +2310,7 @@ public class EmbeddingClient {
public EmbeddingClient(string model, ApiKeyCredential credential, OpenAIClientOptions options);
public EmbeddingClient(string model, ApiKeyCredential credential);
public EmbeddingClient(string model, string apiKey);
public string Model { get; }
public ClientPipeline Pipeline { get; }
public virtual ClientResult<OpenAIEmbedding> GenerateEmbedding(string input, EmbeddingGenerationOptions options = null, CancellationToken cancellationToken = default);
public virtual Task<ClientResult<OpenAIEmbedding>> GenerateEmbeddingAsync(string input, EmbeddingGenerationOptions options = null, CancellationToken cancellationToken = default);
Expand Down Expand Up @@ -3239,6 +3273,7 @@ public class ImageClient {
public ImageClient(string model, ApiKeyCredential credential, OpenAIClientOptions options);
public ImageClient(string model, ApiKeyCredential credential);
public ImageClient(string model, string apiKey);
public string Model { get; }
public ClientPipeline Pipeline { get; }
public virtual ClientResult<GeneratedImage> GenerateImage(string prompt, ImageGenerationOptions options = null, CancellationToken cancellationToken = default);
public virtual Task<ClientResult<GeneratedImage>> GenerateImageAsync(string prompt, ImageGenerationOptions options = null, CancellationToken cancellationToken = default);
Expand Down Expand Up @@ -3425,6 +3460,7 @@ public class ModerationClient {
public ModerationClient(string model, ApiKeyCredential credential, OpenAIClientOptions options);
public ModerationClient(string model, ApiKeyCredential credential);
public ModerationClient(string model, string apiKey);
public string Model { get; }
public ClientPipeline Pipeline { get; }
public virtual ClientResult ClassifyText(BinaryContent content, RequestOptions options = null);
public virtual ClientResult<ModerationResultCollection> ClassifyText(IEnumerable<string> inputs, CancellationToken cancellationToken = default);
Expand Down
30 changes: 30 additions & 0 deletions api/OpenAI.netstandard2.0.cs
Original file line number Diff line number Diff line change
Expand Up @@ -967,6 +967,7 @@ public class AudioClient {
public AudioClient(string model, ApiKeyCredential credential, OpenAIClientOptions options);
public AudioClient(string model, ApiKeyCredential credential);
public AudioClient(string model, string apiKey);
public string Model { get; }
public ClientPipeline Pipeline { get; }
public virtual ClientResult GenerateSpeech(BinaryContent content, RequestOptions options = null);
public virtual ClientResult<BinaryData> GenerateSpeech(string text, GeneratedSpeechVoice voice, SpeechGenerationOptions options = null, CancellationToken cancellationToken = default);
Expand Down Expand Up @@ -1266,6 +1267,7 @@ public class ChatClient {
public ChatClient(string model, ApiKeyCredential credential, OpenAIClientOptions options);
public ChatClient(string model, ApiKeyCredential credential);
public ChatClient(string model, string apiKey);
public string Model { get; }
public ClientPipeline Pipeline { get; }
public virtual ClientResult<ChatCompletion> CompleteChat(params ChatMessage[] messages);
public virtual ClientResult CompleteChat(BinaryContent content, RequestOptions options = null);
Expand All @@ -1285,6 +1287,10 @@ public class ChatClient {
public virtual ClientResult<ChatCompletion> GetChatCompletion(string completionId, CancellationToken cancellationToken = default);
public virtual Task<ClientResult> GetChatCompletionAsync(string completionId, RequestOptions options);
public virtual Task<ClientResult<ChatCompletion>> GetChatCompletionAsync(string completionId, CancellationToken cancellationToken = default);
public virtual CollectionResult<ChatCompletionMessageListDatum> GetChatCompletionMessages(string completionId, ChatCompletionCollectionOptions options = null, CancellationToken cancellationToken = default);
public virtual CollectionResult GetChatCompletionMessages(string completionId, string after, int? limit, string order, RequestOptions options);
public virtual AsyncCollectionResult<ChatCompletionMessageListDatum> GetChatCompletionMessagesAsync(string completionId, ChatCompletionMessageCollectionOptions options = null, CancellationToken cancellationToken = default);
public virtual AsyncCollectionResult GetChatCompletionMessagesAsync(string completionId, string after, int? limit, string order, RequestOptions options);
public virtual CollectionResult<ChatCompletion> GetChatCompletions(ChatCompletionCollectionOptions options = null, CancellationToken cancellationToken = default);
public virtual CollectionResult GetChatCompletions(string after, int? limit, string order, IDictionary<string, string> metadata, string model, RequestOptions options);
public virtual AsyncCollectionResult<ChatCompletion> GetChatCompletionsAsync(ChatCompletionCollectionOptions options = null, CancellationToken cancellationToken = default);
Expand Down Expand Up @@ -1345,6 +1351,27 @@ public class ChatCompletionDeletionResult : IJsonModel<ChatCompletionDeletionRes
protected virtual ChatCompletionDeletionResult PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options);
protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options);
}
public class ChatCompletionMessageCollectionOptions : IJsonModel<ChatCompletionMessageCollectionOptions>, IPersistableModel<ChatCompletionMessageCollectionOptions> {
public string AfterId { get; set; }
public ChatCompletionCollectionOrder? Order { get; set; }
public int? PageSizeLimit { get; set; }
protected virtual ChatCompletionMessageCollectionOptions JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options);
protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
protected virtual ChatCompletionMessageCollectionOptions PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options);
protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options);
}
public class ChatCompletionMessageListDatum : IJsonModel<ChatCompletionMessageListDatum>, IPersistableModel<ChatCompletionMessageListDatum> {
public IList<ChatMessageAnnotation> Annotations { get; }
public ChatOutputAudio Audio { get; }
public string Content { get; }
public string Id { get; }
public string Refusal { get; }
public IReadOnlyList<ChatToolCall> ToolCalls { get; }
protected virtual ChatCompletionMessageListDatum JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options);
protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options);
protected virtual ChatCompletionMessageListDatum PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options);
protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options);
}
public class ChatCompletionOptions : IJsonModel<ChatCompletionOptions>, IPersistableModel<ChatCompletionOptions> {
public bool? AllowParallelToolCalls { get; set; }
public ChatAudioOptions AudioOptions { get; set; }
Expand Down Expand Up @@ -1980,6 +2007,7 @@ public class EmbeddingClient {
public EmbeddingClient(string model, ApiKeyCredential credential, OpenAIClientOptions options);
public EmbeddingClient(string model, ApiKeyCredential credential);
public EmbeddingClient(string model, string apiKey);
public string Model { get; }
public ClientPipeline Pipeline { get; }
public virtual ClientResult<OpenAIEmbedding> GenerateEmbedding(string input, EmbeddingGenerationOptions options = null, CancellationToken cancellationToken = default);
public virtual Task<ClientResult<OpenAIEmbedding>> GenerateEmbeddingAsync(string input, EmbeddingGenerationOptions options = null, CancellationToken cancellationToken = default);
Expand Down Expand Up @@ -2840,6 +2868,7 @@ public class ImageClient {
public ImageClient(string model, ApiKeyCredential credential, OpenAIClientOptions options);
public ImageClient(string model, ApiKeyCredential credential);
public ImageClient(string model, string apiKey);
public string Model { get; }
public ClientPipeline Pipeline { get; }
public virtual ClientResult<GeneratedImage> GenerateImage(string prompt, ImageGenerationOptions options = null, CancellationToken cancellationToken = default);
public virtual Task<ClientResult<GeneratedImage>> GenerateImageAsync(string prompt, ImageGenerationOptions options = null, CancellationToken cancellationToken = default);
Expand Down Expand Up @@ -2995,6 +3024,7 @@ public class ModerationClient {
public ModerationClient(string model, ApiKeyCredential credential, OpenAIClientOptions options);
public ModerationClient(string model, ApiKeyCredential credential);
public ModerationClient(string model, string apiKey);
public string Model { get; }
public ClientPipeline Pipeline { get; }
public virtual ClientResult ClassifyText(BinaryContent content, RequestOptions options = null);
public virtual ClientResult<ModerationResultCollection> ClassifyText(IEnumerable<string> inputs, CancellationToken cancellationToken = default);
Expand Down
29 changes: 18 additions & 11 deletions codegen/generator/src/Visitors/PaginationVisitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
namespace OpenAILibraryPlugin.Visitors;

/// <summary>
/// This visitor modifies GetRawPagesAsync methods to consider HasMore in addition to LastId when deciding whether to continue pagination.
/// This visitor modifies GetRawPagesAsync and GetRawPages methods to consider HasMore in addition to LastId when deciding whether to continue pagination.
/// It also replaces specific parameters with an options type for pagination methods.
/// </summary>
public class PaginationVisitor : ScmLibraryVisitor
Expand All @@ -37,6 +37,14 @@ public class PaginationVisitor : ScmLibraryVisitor
{
"GetChatCompletionsAsync",
("ChatCompletion", "ChatCompletionCollectionOptions", _chatParamsToReplace)
},
{
"GetChatCompletionMessages",
("ChatCompletionMessageListDatum", "ChatCompletionCollectionOptions", _chatParamsToReplace)
},
{
"GetChatCompletionMessagesAsync",
("ChatCompletionMessageListDatum", "ChatCompletionMessageCollectionOptions", _chatParamsToReplace)
}
};

Expand Down Expand Up @@ -174,10 +182,11 @@ nullConditional.Inner is VariableExpression varExpr2 &&
/// <returns>True if the method was handled, false otherwise.</returns>
private bool TryHandleGetRawPagesAsyncMethod(MethodProvider method)
{
// If the method is GetRawPagesAsync and is internal, we will modify the body statements to add a check for hasMore == false.
// If the method is GetRawPagesAsync or GetRawPages and is internal, we will modify the body statements to add a check for hasMore == false.
// This is to ensure that pagination stops when hasMore is false, in addition to checking LastId.
if (method.Signature.Name == "GetRawPagesAsync" && method.EnclosingType.DeclarationModifiers.HasFlag(TypeSignatureModifiers.Internal))
if ((method.Signature.Name == "GetRawPagesAsync" || method.Signature.Name == "GetRawPages") && method.EnclosingType.DeclarationModifiers.HasFlag(TypeSignatureModifiers.Internal))
{
VariableExpression? hasMoreVariable = null;
var statements = method.BodyStatements?.ToList() ?? new List<MethodBodyStatement>();
VisitExplodedMethodBodyStatements(
statements!,
Expand All @@ -198,14 +207,12 @@ private bool TryHandleGetRawPagesAsyncMethod(MethodProvider method)
binaryExpr.Right is KeywordExpression rightKeyword &&
rightKeyword.Keyword == "null")
{
// Create "hasMore == null" condition
var hasMoreNullCheck = new BinaryOperatorExpression(
"==",
new MemberExpression(null, "hasMore"),
Snippet.False);
// Create "!hasMore" condition. Note the hasMoreVariable gets assigned earlier in the method statements
// in the WhileStatement handler below.
var hasMoreNullCheck = Snippet.Not(hasMoreVariable);

// Return "nextToken == null || hasMore == null"
return new BinaryOperatorExpression("||", binaryExpr, hasMoreNullCheck);
// Return "nextToken == null || !hasMore"
return BoolSnippets.Or(binaryExpr.As<bool>(), hasMoreNullCheck);
}
}
return expression;
Expand All @@ -230,7 +237,7 @@ assignmentExpression.Value is MemberExpression memberExpression &&
{
// Create a new assignment for hasMore
var hasMoreAssignment = new AssignmentExpression(
new DeclarationExpression(typeof(bool), "hasMore"),
Snippet.Declare("hasMore", typeof(bool), out hasMoreVariable),
new MemberExpression(memberExpression.Inner, "HasMore"));

// Insert the new assignment before the existing one
Expand Down
22 changes: 22 additions & 0 deletions specification/client/models/chat.models.tsp
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,26 @@ model ChatCompletionCollectionOptions {
@query `model`?: string,
}

alias ChatCompletionMessageCollectionOrderQueryParameter = {
/**
* Sort order by the `created_at` timestamp of the objects. `asc` for ascending order and`desc`
* for descending order.
*/
@query order?: ChatCompletionCollectionOrder;
};

union ChatCompletionMessageCollectionOrder {
string,
Ascending: "asc",
Descending: "desc",
}

@access(Access.public)
@usage(Usage.input)
model ChatCompletionMessageCollectionOptions {
...CollectionAfterQueryParameter,
...CollectionLimitQueryParameter,
...ChatCompletionMessageCollectionOrderQueryParameter,
}


Loading