aallam / openai-kotlin

OpenAI API client for Kotlin with multiplatform and coroutines capabilities.
MIT License
1.42k stars 161 forks source link

OpenAIHttpException Fields [id, created, model, choices] are required #205

Open cempo opened 1 year ago

cempo commented 1 year ago

Description

The issue happened during openAI.chatCompletions(chatCompletionRequest) call. Not 100% but sometimes. Doesn't depend on requested message.

In the current implementation I use:

val chatCompletionRequest = ChatCompletionRequest(
            model = ModelId("gpt-3.5-turbo-0613"),
            messages = listOf(
                //Messages here
            )
        )
val responseMessage = openAI.chatCompletions(chatCompletionRequest)

If I make the same request one more time it works correct

Environment

Additional Info

Fields [id, created, model, choices] are required for type with serial name 'com.aallam.openai.api.chat.ChatCompletionChunk', but they were missing at path: $ com.aallam.openai.api.exception.OpenAIHttpException: Fields [id, created, model, choices] are required for type with serial name 'com.aallam.openai.api.chat.ChatCompletionChunk', but they were missing at path: $ at com.aallam.openai.client.internal.http.HttpTransport.handleException(HttpTransport.kt:52) at com.aallam.openai.client.internal.http.HttpTransport.perform(HttpTransport.kt:34) at com.aallam.openai.client.internal.http.HttpTransport$perform$2.invokeSuspend(Unknown Source:15) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106) at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:584) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:793) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:697) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:684) Caused by: kotlinx.serialization.MissingFieldException: Fields [id, created, model, choices] are required for type with serial name 'com.aallam.openai.api.chat.ChatCompletionChunk', but they were missing at path: $ at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(StreamingJsonDecoder.kt:93) at kotlinx.serialization.json.Json.decodeFromString(Json.kt:107) at com.aallam.openai.client.internal.api.ChatApi$chatCompletions$1$1.invokeSuspend(ChatApi.kt:56) at com.aallam.openai.client.internal.api.ChatApi$chatCompletions$1$1.invoke(Unknown Source:8) at com.aallam.openai.client.internal.api.ChatApi$chatCompletions$1$1.invoke(Unknown Source:4) at io.ktor.client.statement.HttpStatement.execute(HttpStatement.kt:50) at io.ktor.client.statement.HttpStatement$execute$1.invokeSuspend(Unknown Source:15) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)  at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)  at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:584)  at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:793)  at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:697)  at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:684)  Caused by: kotlinx.serialization.MissingFieldException: Fields [id, created, model, choices] are required for type with serial name 'com.aallam.openai.api.chat.ChatCompletionChunk', but they were missing at kotlinx.serialization.internal.PluginExceptionsKt.throwMissingFieldException(PluginExceptions.kt:20) at com.aallam.openai.api.chat.ChatCompletionChunk.(ChatCompletionChunk.kt:14) at com.aallam.openai.api.chat.ChatCompletionChunk.(Unknown Source:0) at com.aallam.openai.api.chat.ChatCompletionChunk$$serializer.deserialize(ChatCompletionChunk.kt:14) at com.aallam.openai.api.chat.ChatCompletionChunk$$serializer.deserialize(ChatCompletionChunk.kt:14) at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(StreamingJsonDecoder.kt:70) at kotlinx.serialization.json.Json.decodeFromString(Json.kt:107)  at com.aallam.openai.client.internal.api.ChatApi$chatCompletions$1$1.invokeSuspend(ChatApi.kt:56)  at com.aallam.openai.client.internal.api.ChatApi$chatCompletions$1$1.invoke(Unknown Source:8)  at com.aallam.openai.client.internal.api.ChatApi$chatCompletions$1$1.invoke(Unknown Source:4)  at io.ktor.client.statement.HttpStatement.execute(HttpStatement.kt:50)  at io.ktor.client.statement.HttpStatement$execute$1.invokeSuspend(Unknown Source:15)  at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)  at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)  at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:584)  at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:793)  at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:697)  at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:684) 

aallam commented 1 year ago

Seems like some required fields are not returned by the API in stream mode! I will try to reproduce this.

valbaca commented 1 year ago

The fields are marked as nullable, but don't have a default of null, so they're still required but are just able to be null.

aallam commented 1 year ago

Hey @valbaca, are you referring to the ChatCompletionChunk class? By the way, the OpenAPI specification suggests that these fields are required, but sometimes the specification isn't up-to-date with the actual API :/

paulotaylor commented 1 year ago

I'm also seeing this, I think it happens when the tokens are maxed out but I'm not completely sure about this.

lexpod commented 7 months ago

The exception happens when Open AI returns an error instead of a regular response message. Currently, the library swallows error info from OpenAI replacing it with a serialization exception as noted in the title of the issue.

Example of openAI error message: data: {"error":{"message":"The server had an error processing your request. Sorry about that! You can retry your request, or contact us through our help center at help.openai.com if you keep seeing this error. (Please include the request ID 214a587d9c29eb3136e10b9f1 in your email.)","type":"server_error","param":null,"code":null}} image

yunmanger1 commented 1 month ago

@aallam it should also support error in the stream