4
4
using System . Text . Json ;
5
5
using ManagedCode . OpenAI . API . Edit ;
6
6
using ManagedCode . OpenAI . API . Image ;
7
+ using ManagedCode . OpenAI . Files . Models ;
7
8
8
9
namespace ManagedCode . OpenAI . API ;
9
10
@@ -21,6 +22,11 @@ internal class OpenAiWebClient : IOpenAiWebClient
21
22
private const string URL_IMAGE_GENERATION = "images/generations" ;
22
23
private const string URL_IMAGE_EDIT = "images/edits" ;
23
24
private const string URL_IMAGE_VARIATION = "images/variations" ;
25
+
26
+ private const string URL_FILES = "files" ;
27
+ private const string URL_FILE = "files/{0}" ;
28
+ private const string URL_FILE_CONTEXT = "files/{0}/content" ;
29
+
24
30
25
31
private readonly HttpClient _httpClient ;
26
32
@@ -111,6 +117,7 @@ public async Task<ImageResponseDto> VariationImageAsync(VariationImageRequestDto
111
117
return await ReadAsync < ImageResponseDto > ( response ) ;
112
118
}
113
119
120
+
114
121
public void Dispose ( )
115
122
{
116
123
_httpClient . Dispose ( ) ;
@@ -155,4 +162,62 @@ private Dictionary<StringContent, string> ToImageRequestParameters(BaseImageRequ
155
162
156
163
return result ;
157
164
}
165
+
166
+ #region Files
167
+
168
+
169
+ public async Task < FilesInfoResponseDto > FilesInfoAsync ( )
170
+ {
171
+ var httpResponseMessage = await _httpClient . GetAsync ( URL_FILES ) ;
172
+ OpenAIExceptions . ThrowsIfError ( httpResponseMessage . StatusCode ) ;
173
+ string responseBody = await httpResponseMessage . Content . ReadAsStringAsync ( ) ;
174
+ return JsonDeserialize < FilesInfoResponseDto > ( responseBody ) ;
175
+ }
176
+
177
+ public async Task < FileInfoDto > CreateFileAsync ( HttpContent content , string fileName , string purpose = "fine-tune" )
178
+ {
179
+ MultipartFormDataContent multipartFormDataContent = new ( ) ;
180
+ multipartFormDataContent . Add ( new StringContent ( purpose ) , "purpose" ) ;
181
+ multipartFormDataContent . Add ( content , "file" , fileName ) ;
182
+
183
+ var httpResponseMessage = await _httpClient . PostAsync ( URL_FILES , multipartFormDataContent ) ;
184
+ OpenAIExceptions . ThrowsIfError ( httpResponseMessage . StatusCode ) ;
185
+ string responseBody = await httpResponseMessage . Content . ReadAsStringAsync ( ) ;
186
+
187
+ return JsonDeserialize < FileInfoDto > ( responseBody ) ;
188
+ }
189
+
190
+ public async Task < FileDeleteResponseDto > DeleteFileAsync ( string fileId )
191
+ {
192
+ string resultUrl = string . Format ( URL_FILE , fileId ) ;
193
+ var httpResponseMessage = await _httpClient . DeleteAsync ( resultUrl ) ;
194
+
195
+ OpenAIExceptions . ThrowsIfError ( httpResponseMessage . StatusCode ) ;
196
+
197
+ string responseBody = await httpResponseMessage . Content . ReadAsStringAsync ( ) ;
198
+
199
+ return JsonDeserialize < FileDeleteResponseDto > ( responseBody ) ;
200
+ }
201
+
202
+ public async Task < FileInfoDto > FileInfoAsync ( string fileId )
203
+ {
204
+ string resultUrl = string . Format ( URL_FILE , fileId ) ;
205
+
206
+ var httpResponseMessage = await _httpClient . GetAsync ( resultUrl ) ;
207
+
208
+ OpenAIExceptions . ThrowsIfError ( httpResponseMessage . StatusCode ) ;
209
+
210
+ string responseBody = await httpResponseMessage . Content . ReadAsStringAsync ( ) ;
211
+ return JsonDeserialize < FileInfoDto > ( responseBody ) ;
212
+ }
213
+
214
+ public async Task < string > GetContentFromFileAsync ( string fileId )
215
+ {
216
+ string resultUrl = string . Format ( URL_FILE_CONTEXT , fileId ) ;
217
+ var httpResponseMessage = await _httpClient . GetAsync ( resultUrl ) ;
218
+ OpenAIExceptions . ThrowsIfError ( httpResponseMessage . StatusCode ) ;
219
+ return await httpResponseMessage . Content . ReadAsStringAsync ( ) ;
220
+ }
221
+
222
+ #endregion
158
223
}
0 commit comments