openai/openai-dotnet

Public

mirrored from https://github.com/openai/openai-dotnetAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
OpenAI_2.2.0

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

src/Custom/Assistants/Internal/Pagination/MessageCollectionPageToken.cs

164lines · modecode

1using System;
2using System.ClientModel;
3using System.ClientModel.Primitives;
4using System.Diagnostics;
5using System.IO;
6using System.Text.Json;
7
8#nullable enable
9
10namespace OpenAI.Assistants;
11
12internal class MessageCollectionPageToken : ContinuationToken
13{
14 protected MessageCollectionPageToken(string threadId, int? limit, string? order, string? after, string? before)
15 {
16 ThreadId = threadId;
17
18 Limit = limit;
19 Order = order;
20 After = after;
21 Before = before;
22 }
23
24 public string ThreadId { get; }
25
26 public int? Limit { get; }
27
28 public string? Order { get; }
29
30 public string? After { get; }
31
32 public string? Before { get; }
33
34 public override BinaryData ToBytes()
35 {
36 using MemoryStream stream = new();
37 using Utf8JsonWriter writer = new(stream);
38
39 writer.WriteStartObject();
40 writer.WriteString("threadId", ThreadId);
41
42 if (Limit.HasValue)
43 {
44 writer.WriteNumber("limit", Limit.Value);
45 }
46
47 if (Order is not null)
48 {
49 writer.WriteString("order", Order);
50 }
51
52 if (After is not null)
53 {
54 writer.WriteString("after", After);
55 }
56
57 if (Before is not null)
58 {
59 writer.WriteString("before", Before);
60 }
61
62 writer.WriteEndObject();
63
64 writer.Flush();
65 stream.Position = 0;
66
67 return BinaryData.FromStream(stream);
68 }
69
70 public static MessageCollectionPageToken FromToken(ContinuationToken pageToken)
71 {
72 if (pageToken is MessageCollectionPageToken token)
73 {
74 return token;
75 }
76
77 BinaryData data = pageToken.ToBytes();
78
79 if (data.ToMemory().Length == 0)
80 {
81 throw new ArgumentException("Failed to create MessagesPageToken from provided pageToken.", nameof(pageToken));
82 }
83
84 Utf8JsonReader reader = new(data);
85
86 string threadId = null!;
87 int? limit = null;
88 string? order = null;
89 string? after = null;
90 string? before = null;
91
92 reader.Read();
93
94 Debug.Assert(reader.TokenType == JsonTokenType.StartObject);
95
96 while (reader.Read())
97 {
98 if (reader.TokenType == JsonTokenType.EndObject)
99 {
100 break;
101 }
102
103 Debug.Assert(reader.TokenType == JsonTokenType.PropertyName);
104
105 string propertyName = reader.GetString()!;
106
107 switch (propertyName)
108 {
109 case "threadId":
110 reader.Read();
111 Debug.Assert(reader.TokenType == JsonTokenType.String);
112 threadId = reader.GetString()!;
113 break;
114 case "limit":
115 reader.Read();
116 Debug.Assert(reader.TokenType == JsonTokenType.Number);
117 limit = reader.GetInt32();
118 break;
119 case "order":
120 reader.Read();
121 Debug.Assert(reader.TokenType == JsonTokenType.String);
122 order = reader.GetString();
123 break;
124 case "after":
125 reader.Read();
126 Debug.Assert(reader.TokenType == JsonTokenType.String);
127 after = reader.GetString();
128 break;
129 case "before":
130 reader.Read();
131 Debug.Assert(reader.TokenType == JsonTokenType.String);
132 before = reader.GetString();
133 break;
134 default:
135 throw new JsonException($"Unrecognized property '{propertyName}'.");
136 }
137 }
138
139 if (threadId is null)
140 {
141 throw new ArgumentException("Failed to create MessagesPageToken from provided pageToken.", nameof(pageToken));
142 }
143
144 return new(threadId, limit, order, after, before);
145 }
146
147 public static MessageCollectionPageToken FromOptions(string threadId, int? limit, string? order, string? after, string? before)
148 => new(threadId, limit, order, after, before);
149
150 public static MessageCollectionPageToken? FromResponse(ClientResult result, string threadId, int? limit, string? order, string? before)
151 {
152 PipelineResponse response = result.GetRawResponse();
153 using JsonDocument doc = JsonDocument.Parse(response.Content);
154 string lastId = doc.RootElement.GetProperty("last_id"u8).GetString()!;
155 bool hasMore = doc.RootElement.GetProperty("has_more"u8).GetBoolean();
156
157 if (!hasMore || lastId is null)
158 {
159 return null;
160 }
161
162 return new(threadId, limit, order, lastId, before);
163 }
164}