1- using System . Net . Http . Headers ;
1+ using System . Diagnostics . CodeAnalysis ;
2+ using System . Net . Http . Headers ;
23using System . Net . Http . Json ;
34using System . Runtime . CompilerServices ;
45using System . Text ;
@@ -130,32 +131,32 @@ public async Task<DashScopeTaskList> ListTasksAsync(
130131
131132 if ( startTime . HasValue )
132133 {
133- queryString . Append ( $ "start_time={ startTime : YYYYMMDDhhmmss} ") ;
134+ queryString . Append ( $ "& start_time={ startTime : YYYYMMDDhhmmss} ") ;
134135 }
135136
136137 if ( endTime . HasValue )
137138 {
138- queryString . Append ( $ "end_time={ endTime : YYYYMMDDhhmmss} ") ;
139+ queryString . Append ( $ "& end_time={ endTime : YYYYMMDDhhmmss} ") ;
139140 }
140141
141142 if ( string . IsNullOrEmpty ( modelName ) == false )
142143 {
143- queryString . Append ( $ "model_name={ modelName } ") ;
144+ queryString . Append ( $ "& model_name={ modelName } ") ;
144145 }
145146
146147 if ( status . HasValue )
147148 {
148- queryString . Append ( $ "status={ status } ") ;
149+ queryString . Append ( $ "& status={ status } ") ;
149150 }
150151
151152 if ( pageNo . HasValue )
152153 {
153- queryString . Append ( $ "page_no={ pageNo } ") ;
154+ queryString . Append ( $ "& page_no={ pageNo } ") ;
154155 }
155156
156157 if ( pageSize . HasValue )
157158 {
158- queryString . Append ( $ "page_size={ pageSize } ") ;
159+ queryString . Append ( $ "& page_size={ pageSize } ") ;
159160 }
160161
161162 var request = BuildRequest ( HttpMethod . Get , $ "{ ApiLinks . Tasks } ?{ queryString } ") ;
@@ -202,6 +203,41 @@ public async Task<ModelResponse<BackgroundGenerationOutput, BackgroundGeneration
202203 cancellationToken ) ) ! ;
203204 }
204205
206+ /// <inheritdoc />
207+ public async Task < DashScopeFile > UploadFileAsync (
208+ Stream file ,
209+ string filename ,
210+ string purpose = "file-extract" ,
211+ CancellationToken cancellationToken = default )
212+ {
213+ var form = new MultipartFormDataContent ( ) ;
214+ form . Add ( new StreamContent ( file ) , "file" , filename ) ;
215+ form . Add ( new StringContent ( purpose ) , nameof ( purpose ) ) ;
216+ var request = new HttpRequestMessage ( HttpMethod . Post , ApiLinks . Files ) { Content = form } ;
217+ return ( await SendCompatibleAsync < DashScopeFile > ( request , cancellationToken ) ) ! ;
218+ }
219+
220+ /// <inheritdoc />
221+ public async Task < DashScopeFile > GetFileAsync ( DashScopeFileId id , CancellationToken cancellationToken = default )
222+ {
223+ var request = BuildRequest ( HttpMethod . Get , ApiLinks . Files + $ "/{ id } ") ;
224+ return ( await SendCompatibleAsync < DashScopeFile > ( request , cancellationToken ) ) ! ;
225+ }
226+
227+ /// <inheritdoc />
228+ public async Task < DashScopeFileList > ListFilesAsync ( CancellationToken cancellationToken = default )
229+ {
230+ var request = BuildRequest ( HttpMethod . Get , ApiLinks . Files ) ;
231+ return ( await SendCompatibleAsync < DashScopeFileList > ( request , cancellationToken ) ) ! ;
232+ }
233+
234+ /// <inheritdoc />
235+ public async Task < DashScopeDeleteFileResult > DeleteFileAsync ( DashScopeFileId id , CancellationToken cancellationToken = default )
236+ {
237+ var request = BuildRequest ( HttpMethod . Delete , ApiLinks . Files + $ "/{ id } ") ;
238+ return ( await SendCompatibleAsync < DashScopeDeleteFileResult > ( request , cancellationToken ) ) ! ;
239+ }
240+
205241 private static HttpRequestMessage BuildSseRequest < TPayload > ( HttpMethod method , string url , TPayload payload )
206242 where TPayload : class
207243 {
@@ -239,6 +275,24 @@ private static HttpRequestMessage BuildRequest<TPayload>(
239275 return message ;
240276 }
241277
278+ private async Task < TResponse ? > SendCompatibleAsync < TResponse > (
279+ HttpRequestMessage message ,
280+ CancellationToken cancellationToken )
281+ where TResponse : class
282+ {
283+ var response = await GetSuccessResponseAsync < OpenAiErrorResponse > (
284+ message ,
285+ r => new DashScopeError ( )
286+ {
287+ Code = r . Error . Type ,
288+ Message = r . Error . Message ,
289+ RequestId = string . Empty
290+ } ,
291+ HttpCompletionOption . ResponseContentRead ,
292+ cancellationToken ) ;
293+ return await response . Content . ReadFromJsonAsync < TResponse > ( SerializationOptions , cancellationToken ) ;
294+ }
295+
242296 private async Task < TResponse ? > SendAsync < TResponse > ( HttpRequestMessage message , CancellationToken cancellationToken )
243297 where TResponse : class
244298 {
@@ -286,6 +340,15 @@ private async Task<HttpResponseMessage> GetSuccessResponseAsync(
286340 HttpRequestMessage message ,
287341 HttpCompletionOption completeOption = HttpCompletionOption . ResponseContentRead ,
288342 CancellationToken cancellationToken = default )
343+ {
344+ return await GetSuccessResponseAsync < DashScopeError > ( message , f => f , completeOption , cancellationToken ) ;
345+ }
346+
347+ private async Task < HttpResponseMessage > GetSuccessResponseAsync < TError > (
348+ HttpRequestMessage message ,
349+ Func < TError , DashScopeError > errorMapper ,
350+ HttpCompletionOption completeOption = HttpCompletionOption . ResponseContentRead ,
351+ CancellationToken cancellationToken = default )
289352 {
290353 HttpResponseMessage response ;
291354 try
@@ -305,14 +368,31 @@ private async Task<HttpResponseMessage> GetSuccessResponseAsync(
305368 DashScopeError ? error = null ;
306369 try
307370 {
308- error = await response . Content . ReadFromJsonAsync < DashScopeError > ( SerializationOptions , cancellationToken ) ;
371+ var r = await response . Content . ReadFromJsonAsync < TError > ( SerializationOptions , cancellationToken ) ;
372+ error = r == null ? null : errorMapper . Invoke ( r ) ;
309373 }
310374 catch ( Exception )
311375 {
312376 // ignore
313377 }
314378
379+ await ThrowDashScopeExceptionAsync ( error , message , response , cancellationToken ) ;
380+ // will never reach here
381+ return response ;
382+ }
383+
384+ [ DoesNotReturn ]
385+ private static async Task ThrowDashScopeExceptionAsync (
386+ DashScopeError ? error ,
387+ HttpRequestMessage message ,
388+ HttpResponseMessage response ,
389+ CancellationToken cancellationToken )
390+ {
315391 var errorMessage = error ? . Message ?? await response . Content . ReadAsStringAsync ( cancellationToken ) ;
316- throw new DashScopeException ( message . RequestUri ? . ToString ( ) , ( int ) response . StatusCode , error , errorMessage ) ;
392+ throw new DashScopeException (
393+ message . RequestUri ? . ToString ( ) ,
394+ ( int ) response . StatusCode ,
395+ error ,
396+ errorMessage ) ;
317397 }
318398}
0 commit comments