openai-kotlin
openai-kotlin copied to clipboard
OpenAIHttpException Fields [id, created, model, choices] are required
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.
Seems like some required fields are not returned by the API in stream mode! I will try to reproduce this.
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.
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 :/
I'm also seeing this, I think it happens when the tokens are maxed out but I'm not completely sure about this.
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}}
@aallam it should also support error in the stream