Skip to content

Commit 3939b14

Browse files
com.openai.unity 8.1.1
- Added overloads to Assistant streaming event callbacks to include event name: Func<String, IServerSentEvent, Task>
1 parent 3f9af23 commit 3939b14

File tree

2 files changed

+73
-16
lines changed

2 files changed

+73
-16
lines changed

Runtime/Threads/ThreadsEndpoint.cs

Lines changed: 72 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
using System.Collections.Generic;
88
using System.Threading;
99
using System.Threading.Tasks;
10-
using UnityEngine;
1110
using Utilities.WebRequestRest;
1211
using 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);

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"displayName": "OpenAI",
44
"description": "A OpenAI package for the Unity Game Engine to use GPT-4, GPT-3.5, GPT-3 and Dall-E though their RESTful API (currently in beta).\n\nIndependently developed, this is not an official library and I am not affiliated with OpenAI.\n\nAn OpenAI API account is required.",
55
"keywords": [],
6-
"version": "8.1.0",
6+
"version": "8.1.1",
77
"unity": "2021.3",
88
"documentationUrl": "https://github.com/RageAgainstThePixel/com.openai.unity#documentation",
99
"changelogUrl": "https://github.com/RageAgainstThePixel/com.openai.unity/releases",

0 commit comments

Comments
 (0)