77using System . Collections . Generic ;
88using System . Threading ;
99using System . Threading . Tasks ;
10- using UnityEngine ;
1110using Utilities . WebRequestRest ;
1211using Utilities . WebRequestRest . Interfaces ;
1312
@@ -211,6 +210,20 @@ public async Task<RunResponse> CreateRunAsync(string threadId, CreateRunRequest
211210 /// <param name="cancellationToken">Optional, <see cref="CancellationToken"/>.</param>
212211 /// <returns><see cref="RunResponse"/>.</returns>
213212 public async Task < RunResponse > CreateRunAsync ( string threadId , CreateRunRequest request = null , Func < IServerSentEvent , Task > streamEventHandler = null , CancellationToken cancellationToken = default )
213+ => await CreateRunAsync ( threadId , request , streamEventHandler == null ? null : async ( _ , serverSentEvent ) =>
214+ {
215+ await streamEventHandler . Invoke ( serverSentEvent ) ;
216+ } , cancellationToken ) ;
217+
218+ /// <summary>
219+ /// Create a run.
220+ /// </summary>
221+ /// <param name="threadId">The id of the thread to run.</param>
222+ /// <param name="request"><see cref="CreateRunRequest"/>.</param>
223+ /// <param name="streamEventHandler">Optional, <see cref="Func{String, IServerSentEvent, Task}"/> stream callback handler.</param>
224+ /// <param name="cancellationToken">Optional, <see cref="CancellationToken"/>.</param>
225+ /// <returns><see cref="RunResponse"/>.</returns>
226+ public async Task < RunResponse > CreateRunAsync ( string threadId , CreateRunRequest request = null , Func < string , IServerSentEvent , Task > streamEventHandler = null , CancellationToken cancellationToken = default )
214227 {
215228 if ( request == null || string . IsNullOrWhiteSpace ( request . AssistantId ) )
216229 {
@@ -248,6 +261,19 @@ public async Task<RunResponse> CreateThreadAndRunAsync(CreateThreadAndRunRequest
248261 /// <param name="cancellationToken">Optional, <see cref="CancellationToken"/>.</param>
249262 /// <returns><see cref="RunResponse"/>.</returns>
250263 public async Task < RunResponse > CreateThreadAndRunAsync ( CreateThreadAndRunRequest request = null , Func < IServerSentEvent , Task > streamEventHandler = null , CancellationToken cancellationToken = default )
264+ => await CreateThreadAndRunAsync ( request , streamEventHandler == null ? null : async ( _ , serverSentEvent ) =>
265+ {
266+ await streamEventHandler . Invoke ( serverSentEvent ) ;
267+ } , cancellationToken ) ;
268+
269+ /// <summary>
270+ /// Create a thread and run it in one request.
271+ /// </summary>
272+ /// <param name="request"><see cref="CreateThreadAndRunRequest"/>.</param>
273+ /// <param name="streamEventHandler">Optional, <see cref="Func{String, IServerSentEvent, Task}"/> stream callback handler.</param>
274+ /// <param name="cancellationToken">Optional, <see cref="CancellationToken"/>.</param>
275+ /// <returns><see cref="RunResponse"/>.</returns>
276+ public async Task < RunResponse > CreateThreadAndRunAsync ( CreateThreadAndRunRequest request = null , Func < string , IServerSentEvent , Task > streamEventHandler = null , CancellationToken cancellationToken = default )
251277 {
252278 if ( request == null || string . IsNullOrWhiteSpace ( request . AssistantId ) )
253279 {
@@ -324,6 +350,23 @@ public async Task<RunResponse> SubmitToolOutputsAsync(string threadId, string ru
324350 /// <param name="cancellationToken">Optional, <see cref="CancellationToken"/>.</param>
325351 /// <returns><see cref="RunResponse"/>.</returns>
326352 public async Task < RunResponse > SubmitToolOutputsAsync ( string threadId , string runId , SubmitToolOutputsRequest request , Func < IServerSentEvent , Task > streamEventHandler = null , CancellationToken cancellationToken = default )
353+ => await SubmitToolOutputsAsync ( threadId , runId , request , streamEventHandler == null ? null : async ( _ , serverSentEvent ) =>
354+ {
355+ await streamEventHandler . Invoke ( serverSentEvent ) ;
356+ } , cancellationToken ) ;
357+
358+ /// <summary>
359+ /// When a run has the status: "requires_action" and required_action.type is submit_tool_outputs,
360+ /// this endpoint can be used to submit the outputs from the tool calls once they're all completed.
361+ /// All outputs must be submitted in a single request.
362+ /// </summary>
363+ /// <param name="threadId">The id of the thread to which this run belongs.</param>
364+ /// <param name="runId">The id of the run that requires the tool output submission.</param>
365+ /// <param name="request"><see cref="SubmitToolOutputsRequest"/>.</param>
366+ /// <param name="streamEventHandler">Optional, <see cref="Func{String, IServerSentEvent, Task}"/> stream callback handler.</param>
367+ /// <param name="cancellationToken">Optional, <see cref="CancellationToken"/>.</param>
368+ /// <returns><see cref="RunResponse"/>.</returns>
369+ public async Task < RunResponse > SubmitToolOutputsAsync ( string threadId , string runId , SubmitToolOutputsRequest request , Func < string , IServerSentEvent , Task > streamEventHandler = null , CancellationToken cancellationToken = default )
327370 {
328371 request . Stream = streamEventHandler != null ;
329372 var payload = JsonConvert . SerializeObject ( request , OpenAIClient . JsonSerializationOptions ) ;
@@ -435,21 +478,25 @@ public async Task<MessageFileResponse> RetrieveFileAsync(string threadId, string
435478
436479 #endregion Files (Obsolete)
437480
438- private async Task < RunResponse > StreamRunAsync ( string endpoint , string payload , Func < IServerSentEvent , Task > streamEventHandler , CancellationToken cancellationToken = default )
481+ private async Task < RunResponse > StreamRunAsync ( string endpoint , string payload , Func < string , IServerSentEvent , Task > streamEventHandler , CancellationToken cancellationToken = default )
439482 {
440483 RunResponse run = null ;
441484 RunStepResponse runStep = null ;
442485 MessageResponse message = null ;
443486
444487 var response = await Rest . PostAsync ( endpoint , payload , async ( sseResponse , ssEvent ) =>
445488 {
489+ IServerSentEvent serverSentEvent = default ;
490+ var @event = ssEvent . Value . Value < string > ( ) ;
491+
446492 try
447493 {
448494 switch ( ssEvent . Value . Value < string > ( ) )
449495 {
450496 case "thread.created" :
451- await streamEventHandler . Invoke ( sseResponse . Deserialize < ThreadResponse > ( client ) ) ;
452- return ;
497+ serverSentEvent = sseResponse . Deserialize < ThreadResponse > ( client ) ;
498+
499+ break ;
453500 case "thread.run.created" :
454501 case "thread.run.queued" :
455502 case "thread.run.in_progress" :
@@ -471,8 +518,9 @@ private async Task<RunResponse> StreamRunAsync(string endpoint, string payload,
471518 run . AppendFrom ( partialRun ) ;
472519 }
473520
474- await streamEventHandler . Invoke ( run ) ;
475- return ;
521+ serverSentEvent = run ;
522+
523+ break ;
476524 case "thread.run.step.created" :
477525 case "thread.run.step.in_progress" :
478526 case "thread.run.step.delta" :
@@ -492,8 +540,9 @@ private async Task<RunResponse> StreamRunAsync(string endpoint, string payload,
492540 runStep . AppendFrom ( partialRunStep ) ;
493541 }
494542
495- await streamEventHandler . Invoke ( runStep ) ;
496- return ;
543+ serverSentEvent = runStep ;
544+
545+ break ;
497546 case "thread.message.created" :
498547 case "thread.message.in_progress" :
499548 case "thread.message.delta" :
@@ -511,20 +560,28 @@ private async Task<RunResponse> StreamRunAsync(string endpoint, string payload,
511560 message . AppendFrom ( partialMessage ) ;
512561 }
513562
514- await streamEventHandler . Invoke ( message ) ;
515- return ;
563+ serverSentEvent = message ;
564+
565+ break ;
516566 case "error" :
517- await streamEventHandler . Invoke ( sseResponse . Deserialize < Error > ( client ) ) ;
518- return ;
567+ serverSentEvent = sseResponse . Deserialize < Error > ( client ) ;
568+
569+ break ;
519570 default :
520571 // if not properly handled raise it up to caller to deal with it themselves.
521- await streamEventHandler . Invoke ( ssEvent ) ;
522- return ;
572+ serverSentEvent = ssEvent ;
573+ break ;
523574 }
575+
524576 }
525577 catch ( Exception e )
526578 {
527- Debug . LogError ( $ "{ ssEvent } \n { e } ") ;
579+ @event = "error" ;
580+ serverSentEvent = new Error ( e ) ;
581+ }
582+ finally
583+ {
584+ await streamEventHandler . Invoke ( @event , serverSentEvent ) ;
528585 }
529586 } , new RestParameters ( client . DefaultRequestHeaders ) , cancellationToken ) ;
530587 response . Validate ( EnableDebug ) ;
0 commit comments