OpenAI-Unity icon indicating copy to clipboard operation
OpenAI-Unity copied to clipboard

ChatCompletion Response is sometimes empty

Open Morgan-6Freedom opened this issue 2 years ago • 1 comments

Hello. I use ChatCompletion with Stream=true

I have an issue. Sometimes the responses of CreateChatCompletionAsync is empty. image

image

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 ?

Morgan-6Freedom avatar May 26 '23 16:05 Morgan-6Freedom

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();
    }
}

SebastianBlandon avatar Oct 27 '23 21:10 SebastianBlandon