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
28 changes: 24 additions & 4 deletions src/Custom/Chat/ChatClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -136,9 +136,19 @@ protected internal ChatClient(ClientPipeline pipeline, string model, OpenAIClien
/// <param name="cancellationToken"> A token that can be used to cancel this method call. </param>
/// <exception cref="ArgumentNullException"> <paramref name="messages"/> is null. </exception>
/// <exception cref="ArgumentException"> <paramref name="messages"/> is an empty collection, and was expected to be non-empty. </exception>
public virtual async Task<ClientResult<ChatCompletion>> CompleteChatAsync(IEnumerable<ChatMessage> messages, ChatCompletionOptions options = null, CancellationToken cancellationToken = default)
public virtual Task<ClientResult<ChatCompletion>> CompleteChatAsync(IEnumerable<ChatMessage> messages, ChatCompletionOptions options = null, CancellationToken cancellationToken = default)
{
return CompleteChatAsync(messages, options, cancellationToken.ToRequestOptions() ?? new RequestOptions());
}

internal async Task<ClientResult<ChatCompletion>> CompleteChatAsync(IEnumerable<ChatMessage> messages, ChatCompletionOptions options, RequestOptions requestOptions)
{
Argument.AssertNotNullOrEmpty(messages, nameof(messages));
Argument.AssertNotNull(requestOptions, nameof(requestOptions));
if (requestOptions.BufferResponse is false)
{
throw new InvalidOperationException("'requestOptions.BufferResponse' must be 'true' when calling 'CompleteChatAsync'.");
}

options ??= new();
CreateChatCompletionOptions(messages, ref options);
Expand All @@ -148,7 +158,7 @@ public virtual async Task<ClientResult<ChatCompletion>> CompleteChatAsync(IEnume
{
using BinaryContent content = options.ToBinaryContent();

ClientResult result = await CompleteChatAsync(content, cancellationToken.ToRequestOptions()).ConfigureAwait(false);
ClientResult result = await CompleteChatAsync(content, requestOptions).ConfigureAwait(false);
ChatCompletion chatCompletion = (ChatCompletion)result;
scope?.RecordChatCompletion(chatCompletion);
return ClientResult.FromValue(chatCompletion, result.GetRawResponse());
Expand Down Expand Up @@ -218,17 +228,27 @@ public virtual ClientResult<ChatCompletion> CompleteChat(params ChatMessage[] me
/// <exception cref="ArgumentNullException"> <paramref name="messages"/> is null. </exception>
/// <exception cref="ArgumentException"> <paramref name="messages"/> is an empty collection, and was expected to be non-empty. </exception>
public virtual AsyncCollectionResult<StreamingChatCompletionUpdate> CompleteChatStreamingAsync(IEnumerable<ChatMessage> messages, ChatCompletionOptions options = null, CancellationToken cancellationToken = default)
{
return CompleteChatStreamingAsync(messages, options, cancellationToken.ToRequestOptions(streaming: true));
}

internal AsyncCollectionResult<StreamingChatCompletionUpdate> CompleteChatStreamingAsync(IEnumerable<ChatMessage> messages, ChatCompletionOptions options, RequestOptions requestOptions)
{
Argument.AssertNotNull(messages, nameof(messages));
Argument.AssertNotNull(requestOptions, nameof(requestOptions));
if (requestOptions.BufferResponse is true)
{
throw new InvalidOperationException("'requestOptions.BufferResponse' must be 'false' when calling 'CompleteChatStreamingAsync'.");
}

options ??= new();
CreateChatCompletionOptions(messages, ref options, stream: true);

using BinaryContent content = options.ToBinaryContent();
return new AsyncSseUpdateCollection<StreamingChatCompletionUpdate>(
async () => await CompleteChatAsync(content, cancellationToken.ToRequestOptions(streaming: true)).ConfigureAwait(false),
async () => await CompleteChatAsync(content, requestOptions).ConfigureAwait(false),
StreamingChatCompletionUpdate.DeserializeStreamingChatCompletionUpdate,
cancellationToken);
requestOptions.CancellationToken);
}

/// <summary>
Expand Down
28 changes: 24 additions & 4 deletions src/Custom/Responses/OpenAIResponseClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -119,12 +119,22 @@ protected internal OpenAIResponseClient(ClientPipeline pipeline, string model, O
[Experimental("OPENAI001")]
public Uri Endpoint => _endpoint;

public virtual async Task<ClientResult<OpenAIResponse>> CreateResponseAsync(IEnumerable<ResponseItem> inputItems, ResponseCreationOptions options = null, CancellationToken cancellationToken = default)
public virtual Task<ClientResult<OpenAIResponse>> CreateResponseAsync(IEnumerable<ResponseItem> inputItems, ResponseCreationOptions options = null, CancellationToken cancellationToken = default)
{
return CreateResponseAsync(inputItems, options, cancellationToken.ToRequestOptions() ?? new RequestOptions());
}

internal async Task<ClientResult<OpenAIResponse>> CreateResponseAsync(IEnumerable<ResponseItem> inputItems, ResponseCreationOptions options, RequestOptions requestOptions)
{
Argument.AssertNotNullOrEmpty(inputItems, nameof(inputItems));
Argument.AssertNotNull(requestOptions, nameof(requestOptions));
if (requestOptions.BufferResponse is false)
{
throw new InvalidOperationException("'requestOptions.BufferResponse' must be 'true' when calling 'CreateResponseAsync'.");
}

using BinaryContent content = CreatePerCallOptions(options, inputItems, stream: false).ToBinaryContent();
ClientResult protocolResult = await CreateResponseAsync(content, cancellationToken.ToRequestOptions()).ConfigureAwait(false);
ClientResult protocolResult = await CreateResponseAsync(content, requestOptions).ConfigureAwait(false);
OpenAIResponse convenienceValue = (OpenAIResponse)protocolResult;
return ClientResult.FromValue(convenienceValue, protocolResult.GetRawResponse());
}
Expand Down Expand Up @@ -161,14 +171,24 @@ public virtual ClientResult<OpenAIResponse> CreateResponse(string userInputText,
}

public virtual AsyncCollectionResult<StreamingResponseUpdate> CreateResponseStreamingAsync(IEnumerable<ResponseItem> inputItems, ResponseCreationOptions options = null, CancellationToken cancellationToken = default)
{
return CreateResponseStreamingAsync(inputItems, options, cancellationToken.ToRequestOptions(streaming: true));
}

internal AsyncCollectionResult<StreamingResponseUpdate> CreateResponseStreamingAsync(IEnumerable<ResponseItem> inputItems, ResponseCreationOptions options, RequestOptions requestOptions)
{
Argument.AssertNotNullOrEmpty(inputItems, nameof(inputItems));
Argument.AssertNotNull(requestOptions, nameof(requestOptions));
if (requestOptions.BufferResponse is true)
{
throw new InvalidOperationException("'requestOptions.BufferResponse' must be 'false' when calling 'CreateResponseStreamingAsync'.");
}

using BinaryContent content = CreatePerCallOptions(options, inputItems, stream: true).ToBinaryContent();
return new AsyncSseUpdateCollection<StreamingResponseUpdate>(
async () => await CreateResponseAsync(content, cancellationToken.ToRequestOptions(streaming: true)).ConfigureAwait(false),
async () => await CreateResponseAsync(content, requestOptions).ConfigureAwait(false),
StreamingResponseUpdate.DeserializeStreamingResponseUpdate,
cancellationToken);
requestOptions.CancellationToken);
}

public virtual CollectionResult<StreamingResponseUpdate> CreateResponseStreaming(IEnumerable<ResponseItem> inputItems, ResponseCreationOptions options = null, CancellationToken cancellationToken = default)
Expand Down