Skip to content
This repository was archived by the owner on Feb 12, 2025. It is now read-only.

Commit ecde5d1

Browse files
committed
Added methods for FileManager
1 parent 877cc64 commit ecde5d1

File tree

4 files changed

+90
-1
lines changed

4 files changed

+90
-1
lines changed

ManagedCode.OpenAI/API/Abstractions/IOpenAiWebClient.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using ManagedCode.OpenAI.API.Edit;
22
using ManagedCode.OpenAI.API.Image;
3+
using ManagedCode.OpenAI.Files.Models;
34

45
namespace ManagedCode.OpenAI.API
56
{
@@ -18,5 +19,18 @@ internal interface IOpenAiWebClient : IDisposable
1819
Task<ImageResponseDto> GenerateImageAsync(GenerateImageRequestDto request);
1920
Task<ImageResponseDto> EditImageAsync(EditImageRequestDto request);
2021
Task<ImageResponseDto> VariationImageAsync(VariationImageRequestDto request);
22+
23+
#region Files
24+
25+
Task<FilesInfoResponseDto> FilesInfoAsync();
26+
Task<FileInfoDto> CreateFileAsync(HttpContent content, string fileName, string purpose = "fine-tune");
27+
Task<FileDeleteResponseDto> DeleteFileAsync(string fileId);
28+
Task<FileInfoDto> FileInfoAsync(string fileId);
29+
30+
// TODO: This may be a stream
31+
// I don't know what response type is returned here
32+
Task<string> GetContentFromFileAsync(string fileId);
33+
34+
#endregion
2135
}
22-
}
36+
}

ManagedCode.OpenAI/API/OpenAIWebClient.cs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Text.Json;
55
using ManagedCode.OpenAI.API.Edit;
66
using ManagedCode.OpenAI.API.Image;
7+
using ManagedCode.OpenAI.Files.Models;
78

89
namespace ManagedCode.OpenAI.API;
910

@@ -21,6 +22,11 @@ internal class OpenAiWebClient : IOpenAiWebClient
2122
private const string URL_IMAGE_GENERATION = "images/generations";
2223
private const string URL_IMAGE_EDIT = "images/edits";
2324
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+
2430

2531
private readonly HttpClient _httpClient;
2632

@@ -111,6 +117,7 @@ public async Task<ImageResponseDto> VariationImageAsync(VariationImageRequestDto
111117
return await ReadAsync<ImageResponseDto>(response);
112118
}
113119

120+
114121
public void Dispose()
115122
{
116123
_httpClient.Dispose();
@@ -155,4 +162,62 @@ private Dictionary<StringContent, string> ToImageRequestParameters(BaseImageRequ
155162

156163
return result;
157164
}
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
158223
}

ManagedCode.OpenAI/Client/Abstractions/IGptClient.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using ManagedCode.OpenAI.Chat;
22
using ManagedCode.OpenAI.Completions;
33
using ManagedCode.OpenAI.Edit;
4+
using ManagedCode.OpenAI.Files.Abstractions;
45
using ManagedCode.OpenAI.Image;
56

67
namespace ManagedCode.OpenAI.Client
@@ -26,5 +27,7 @@ public interface IGptClient
2627

2728
IVariationImageBuilder VariationImage(string imageBase64);
2829

30+
IFileManager FileManager();
31+
2932
}
3033
}

ManagedCode.OpenAI/Client/GptClient.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
using ManagedCode.OpenAI.Client.Extensions;
44
using ManagedCode.OpenAI.Completions;
55
using ManagedCode.OpenAI.Edit;
6+
using ManagedCode.OpenAI.Files.Abstractions;
7+
using ManagedCode.OpenAI.Files.Builders;
68
using ManagedCode.OpenAI.Image;
79
using ManagedCode.OpenAI.Image.Builders;
810

@@ -79,5 +81,10 @@ public IVariationImageBuilder VariationImage(string imageBase64)
7981
{
8082
return new VariationImageBuilder(_webClient, imageBase64);
8183
}
84+
85+
public IFileManager FileManager()
86+
{
87+
return new FileManager(_webClient);
88+
}
8289
}
8390
}

0 commit comments

Comments
 (0)