using System.ClientModel;
using System.ClientModel.Primitives;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
using System.Threading.Tasks;
#nullable enable
namespace OpenAI.FineTuning;
internal class AsyncFineTuningJobCollectionResult : AsyncCollectionResult
{
private readonly FineTuningClient _fineTuningClient;
private readonly ClientPipeline _pipeline;
private readonly RequestOptions? _options;
// Initial values
private readonly int? _limit;
private readonly string _after;
public AsyncFineTuningJobCollectionResult(FineTuningClient fineTuningClient,
ClientPipeline pipeline, RequestOptions? options,
int? limit, string after)
{
_fineTuningClient = fineTuningClient;
_pipeline = pipeline;
_options = options;
_limit = limit;
_after = after;
}
public async override IAsyncEnumerable<ClientResult> GetRawPagesAsync()
{
ClientResult page = await GetFirstPageAsync().ConfigureAwait(false);
yield return page;
while (HasNextPage(page))
{
page = await GetNextPageAsync(page);
yield return page;
}
}
public override ContinuationToken? GetContinuationToken(ClientResult page)
{
Argument.AssertNotNull(page, nameof(page));
return FineTuningJobCollectionPageToken.FromResponse(page, _limit);
}
public async Task<ClientResult> GetFirstPageAsync()
=> await GetJobsAsync(_after, _limit, _options).ConfigureAwait(false);
public async Task<ClientResult> GetNextPageAsync(ClientResult result)
{
Argument.AssertNotNull(result, nameof(result));
PipelineResponse response = result.GetRawResponse();
using JsonDocument doc = JsonDocument.Parse(response?.Content);
JsonElement data = doc.RootElement.GetProperty("data");
JsonElement lastItem = data.EnumerateArray().LastOrDefault();
string? lastId = lastItem.TryGetProperty("id", out JsonElement idElement) ?
idElement.GetString() : null;
return await GetJobsAsync(lastId, _limit, _options).ConfigureAwait(false);
}
public static bool HasNextPage(ClientResult result)
=> FineTuningJobCollectionResult.HasNextPage(result);
internal virtual async Task<ClientResult> GetJobsAsync(string? after, int? limit, RequestOptions? options)
{
using PipelineMessage message = _fineTuningClient.CreateGetPaginatedFineTuningJobsRequest(after, limit, options);
return ClientResult.FromResponse(await _pipeline.ProcessMessageAsync(message, options).ConfigureAwait(false));
}
}openai/openai-dotnet
Publicmirrored from https://github.com/openai/openai-dotnetAvailable
src/Custom/FineTuning/Internal/Pagination/AsyncFineTuningJobCollectionResult.cs
81lines · modepreview