3
3
using Newtonsoft . Json ;
4
4
using System . Threading . Tasks ;
5
5
using UnityEngine . Networking ;
6
+ using System . Collections . Generic ;
6
7
using Newtonsoft . Json . Serialization ;
7
8
8
- #if ! UNITY_WEBGL
9
- using System . Net . Http ;
10
- #endif
11
-
12
9
namespace OpenAI
13
10
{
14
11
public class OpenAIApi
@@ -88,24 +85,32 @@ private async Task<T> DispatchRequest<T>(string path, string method, byte[] payl
88
85
return data ;
89
86
}
90
87
91
- #if ! UNITY_WEBGL
92
88
/// <summary>
93
89
/// Dispatches an HTTP request to the specified path with a multi-part data form.
94
90
/// </summary>
95
91
/// <param name="path">The path to send the request to.</param>
96
92
/// <param name="form">A multi-part data form to upload with the request.</param>
97
93
/// <typeparam name="T">Response type of the request.</typeparam>
98
94
/// <returns>A Task containing the response from the request as the specified type.</returns>
99
- private async Task < T > DispatchRequest < T > ( string path , MultipartFormDataContent form ) where T : IResponse
95
+ private async Task < T > DispatchRequest < T > ( string path , List < IMultipartFormSection > form ) where T : IResponse
100
96
{
101
- var client = new HttpClient ( ) ;
102
- client . SetHeaders ( Configuration , ContentType . MultipartFormData ) ;
103
-
104
- var response = await client . PostAsync ( path , form ) ;
105
- var content = await response . Content . ReadAsStringAsync ( ) ;
97
+ T data ;
106
98
107
- var data = JsonConvert . DeserializeObject < T > ( content , jsonSerializerSettings ) ;
99
+ using ( var request = new UnityWebRequest ( path , "POST" ) )
100
+ {
101
+ request . SetHeaders ( Configuration ) ;
102
+ var boundary = UnityWebRequest . GenerateBoundary ( ) ;
103
+ var formSections = UnityWebRequest . SerializeFormSections ( form , boundary ) ;
104
+ var contentType = $ "{ ContentType . MultipartFormData } ; boundary={ Encoding . UTF8 . GetString ( boundary ) } ";
105
+ request . uploadHandler = new UploadHandlerRaw ( formSections ) { contentType = contentType } ;
106
+ request . downloadHandler = ( DownloadHandler ) new DownloadHandlerBuffer ( ) ;
107
+ var asyncOperation = request . SendWebRequest ( ) ;
108
108
109
+ while ( ! asyncOperation . isDone ) await Task . Yield ( ) ;
110
+
111
+ data = JsonConvert . DeserializeObject < T > ( request . downloadHandler . text , jsonSerializerSettings ) ;
112
+ }
113
+
109
114
if ( data != null && data . Error != null )
110
115
{
111
116
ApiError error = data . Error ;
@@ -114,7 +119,6 @@ private async Task<T> DispatchRequest<T>(string path, MultipartFormDataContent f
114
119
115
120
return data ;
116
121
}
117
- #endif
118
122
119
123
/// <summary>
120
124
/// Create byte array payload from the given request object that contains the parameters.
@@ -184,7 +188,6 @@ public async Task<CreateImageResponse> CreateImage(CreateImageRequest request)
184
188
return await DispatchRequest < CreateImageResponse > ( path , UnityWebRequest . kHttpVerbPOST , payload ) ;
185
189
}
186
190
187
- #if ! UNITY_WEBGL
188
191
/// <summary>
189
192
/// Creates an edited or extended image given an original image and a prompt.
190
193
/// </summary>
@@ -193,16 +196,15 @@ public async Task<CreateImageResponse> CreateImage(CreateImageRequest request)
193
196
public async Task < CreateImageResponse > CreateImageEdit ( CreateImageEditRequest request )
194
197
{
195
198
var path = $ "{ BASE_PATH } /images/edits";
196
-
197
- var form = new MultipartFormDataContent ( ) ;
199
+
200
+ var form = new List < IMultipartFormSection > ( ) ;
198
201
form . AddImage ( request . Image , "image" ) ;
199
202
form . AddImage ( request . Mask , "mask" ) ;
200
203
form . AddValue ( request . Prompt , "prompt" ) ;
201
204
form . AddValue ( request . N , "n" ) ;
202
205
form . AddValue ( request . Size , "size" ) ;
203
206
form . AddValue ( request . ResponseFormat , "response_format" ) ;
204
- form . AddValue ( request . User , "user" ) ;
205
-
207
+
206
208
return await DispatchRequest < CreateImageResponse > ( path , form ) ;
207
209
}
208
210
@@ -215,15 +217,15 @@ public async Task<CreateImageResponse> CreateImageVariation(CreateImageVariation
215
217
{
216
218
var path = $ "{ BASE_PATH } /images/variations";
217
219
218
- var form = new MultipartFormDataContent ( ) ;
220
+ var form = new List < IMultipartFormSection > ( ) ;
219
221
form . AddImage ( request . Image , "image" ) ;
220
222
form . AddValue ( request . N , "n" ) ;
221
223
form . AddValue ( request . Size , "size" ) ;
222
224
form . AddValue ( request . ResponseFormat , "response_format" ) ;
223
225
form . AddValue ( request . User , "user" ) ;
226
+
224
227
return await DispatchRequest < CreateImageResponse > ( path , form ) ;
225
228
}
226
- #endif
227
229
228
230
/// <summary>
229
231
/// Creates an embedding vector representing the input text.
@@ -247,7 +249,6 @@ public async Task<ListFilesResponse> ListFiles()
247
249
return await DispatchRequest < ListFilesResponse > ( path , UnityWebRequest . kHttpVerbGET ) ;
248
250
}
249
251
250
- #if ! UNITY_WEBGL
251
252
/// <summary>
252
253
/// Upload a file that contains document(s) to be used across various endpoints/features.
253
254
/// Currently, the size of all the files uploaded by one organization can be up to 1 GB.
@@ -259,13 +260,12 @@ public async Task<OpenAIFile> CreateFile(CreateFileRequest request)
259
260
{
260
261
var path = $ "{ BASE_PATH } /files";
261
262
262
- var form = new MultipartFormDataContent ( ) ;
263
+ var form = new List < IMultipartFormSection > ( ) ;
263
264
form . AddJsonl ( request . File , "file" ) ;
264
265
form . AddValue ( request . Purpose , "purpose" ) ;
265
266
266
267
return await DispatchRequest < OpenAIFileResponse > ( path , form ) ;
267
268
}
268
- #endif
269
269
270
270
/// <summary>
271
271
/// Delete a file.
0 commit comments