openai-kotlin icon indicating copy to clipboard operation
openai-kotlin copied to clipboard

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

Open cempo opened this issue 2 years ago • 7 comments

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

  • com.aallam.openai:openai-client-bom version: 3.2.5, 3.3.0, 3.3.1
  • Kotlin version: 1.8.21
  • OS: Android

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) 

cempo avatar Jun 26 '23 10:06 cempo

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

aallam avatar Jun 28 '23 10:06 aallam

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.

valbaca avatar Jul 31 '23 23:07 valbaca

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 :/

aallam avatar Aug 02 '23 13:08 aallam

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

paulotaylor avatar Aug 16 '23 09:08 paulotaylor

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

lexpod avatar Jan 16 '24 05:01 lexpod

@aallam it should also support error in the stream

yunmanger1 avatar Jul 13 '24 01:07 yunmanger1