OpenAI-Unity
OpenAI-Unity copied to clipboard
ChatCompletion Response is sometimes empty
Hello. I use ChatCompletion with Stream=true
I have an issue. Sometimes the responses of CreateChatCompletionAsync is empty.
I have created a system that wait 3sec and try again but often the response is always empty.
I tried with Insmonia/Postman with streaming mode and the responses is never empty.
What can I do ?
I also had that error, I managed to modify the source code to solve it, I changed the stop logic of the cycle that received the streams, I attach the modified code fragment of the OpenAIApi.cs that is inside Runtime so that you can add it and test it. I have already generated the pr to be added to the source code.
Script :
/// <summary>
/// Dispatches an HTTP request to the specified path with the specified method and optional payload.
/// </summary>
/// <param name="path">The path to send the request to.</param>
/// <param name="method">The HTTP method to use for the request.</param>
/// <param name="onResponse">A callback function to be called when a response is updated.</param>
/// <param name="onComplete">A callback function to be called when the request is complete.</param>
/// <param name="token">A cancellation token to cancel the request.</param>
/// <param name="payload">An optional byte array of json payload to include in the request.</param>
private async void DispatchRequest<T>(string path, string method, Action<List<T>> onResponse, Action onComplete, CancellationTokenSource token, byte[] payload = null) where T: IResponse
{
using (var request = UnityWebRequest.Put(path, payload))
{
request.method = method;
request.SetHeaders(Configuration, ContentType.ApplicationJson);
request.SendWebRequest();
bool isDone = false;
do
{
List<T> dataList = new List<T>();
string[] lines = request.downloadHandler.text.Split('\n').Where(line => line != "").ToArray();
foreach (string line in lines)
{
var value = line.Replace("data: ", "");
if (value.Contains("stop"))
{
isDone = true;
break;
}
var data = JsonConvert.DeserializeObject<T>(value, jsonSerializerSettings);
if (data?.Error != null)
{
ApiError error = data.Error;
Debug.LogError($"Error Message: {error.Message}\nError Type: {error.Type}\n");
}
else
{
dataList.Add(data);
}
}
onResponse?.Invoke(dataList);
await Task.Yield();
}
while (!isDone);
onComplete?.Invoke();
}
}