Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

submitStreamingToolOutput fails to send the body #422

Open
miguel-uvicuo opened this issue Feb 12, 2025 · 0 comments
Open

submitStreamingToolOutput fails to send the body #422

miguel-uvicuo opened this issue Feb 12, 2025 · 0 comments

Comments

@miguel-uvicuo
Copy link

Description

submitStreamingToolOutput throws an exception even before sending the message to openai API

Reason why is that submitStreamingToolOutput is setting the body as a mapOf("tool_outputs" to output, "stream" to true))

override suspend fun submitStreamingToolOutput(
threadId: ThreadId,
runId: RunId,
output: List<ToolOutput>,
requestOptions: RequestOptions?
) : Flow<AssistantStreamEvent> {
return requester
.performSse {
url(path = "${ApiPath.Threads}/${threadId.id}/runs/${runId.id}/submit_tool_outputs")
setBody(mapOf("tool_outputs" to output, "stream" to true))

Problem is that mapOf() returns a LinkedHashMap, a Java class, not a Kotlin class, so it isn not annotated with @serializable, nor is it automatically registered in Kotlinx Serialization’s standard module.

Image

As a result, when you try to submit tool outputs using streaming, you get the following exception:

Serializer for subclass 'LinkedHashMap' is not found in the polymorphic scope of 'Map'. 
Check if class with serial name 'LinkedHashMap' exists and serializer is registered in a corresponding SerializersModule.
To be registered automatically, class 'LinkedHashMap' has to be '@Serializable', and the base class 'Map' has to be sealed and '@Serializable'

Full stack trace:

Original Stack Trace:
		at com.aallam.openai.client.internal.http.HttpTransport.handleException(HttpTransport.kt:76)
		at com.aallam.openai.client.internal.http.HttpTransport.performSse(HttpTransport.kt:58)
		at com.aallam.openai.client.internal.http.HttpTransport$performSse$1.invokeSuspend(HttpTransport.kt)
		at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
		at kotlinx.coroutines.DispatchedTaskKt.resume(DispatchedTask.kt:231)
		at kotlinx.coroutines.DispatchedTaskKt.resumeUnconfined(DispatchedTask.kt:187)
		at kotlinx.coroutines.DispatchedTaskKt.dispatch(DispatchedTask.kt:159)
		at kotlinx.coroutines.CancellableContinuationImpl.dispatchResume(CancellableContinuationImpl.kt:466)
		at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl(CancellableContinuationImpl.kt:500)
		at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl$default(CancellableContinuationImpl.kt:489)
		at kotlinx.coroutines.CancellableContinuationImpl.resumeWith(CancellableContinuationImpl.kt:364)
		at kotlinx.coroutines.ResumeAwaitOnCompletion.invoke(JobSupport.kt:1409)
		at kotlinx.coroutines.JobSupport.notifyCompletion(JobSupport.kt:1502)
		at kotlinx.coroutines.JobSupport.completeStateFinalization(JobSupport.kt:322)
		at kotlinx.coroutines.JobSupport.finalizeFinishingState(JobSupport.kt:239)
		at kotlinx.coroutines.JobSupport.tryMakeCompletingSlowPath(JobSupport.kt:917)
		at kotlinx.coroutines.JobSupport.tryMakeCompleting(JobSupport.kt:874)
		at kotlinx.coroutines.JobSupport.makeCompleting$kotlinx_coroutines_core(JobSupport.kt:817)
		at kotlinx.coroutines.CompletableDeferredImpl.completeExceptionally(CompletableDeferred.kt:89)
		at io.ktor.client.plugins.sse.BuildersKt$serverSentEventsSession$2.invokeSuspend(builders.kt:58)
		at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
		at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104)
		at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:111)
		at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:99)
		at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:584)
		at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:811)
		at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:715)
		at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:702)
Caused by: io.ktor.client.plugins.sse.SSEClientException: Serializer for subclass 'LinkedHashMap' is not found in the polymorphic scope of 'Map'.
Check if class with serial name 'LinkedHashMap' exists and serializer is registered in a corresponding SerializersModule.
To be registered automatically, class 'LinkedHashMap' has to be '@Serializable', and the base class 'Map' has to be sealed and '@Serializable'.
	at io.ktor.client.plugins.sse.BuildersKt.mapToSSEException(builders.kt:251)
	at io.ktor.client.plugins.sse.BuildersKt.access$mapToSSEException(builders.kt:1)
	at io.ktor.client.plugins.sse.BuildersKt$serverSentEventsSession$2.invokeSuspend(builders.kt:58)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104)
	at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:111)
	at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:99)
	at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:584)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:811)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:715)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:702)
Caused by: kotlinx.serialization.SerializationException: Serializer for subclass 'LinkedHashMap' is not found in the polymorphic scope of 'Map'.
Check if class with serial name 'LinkedHashMap' exists and serializer is registered in a corresponding SerializersModule.
To be registered automatically, class 'LinkedHashMap' has to be '@Serializable', and the base class 'Map' has to be sealed and '@Serializable'.
	at kotlinx.serialization.internal.AbstractPolymorphicSerializerKt.throwSubtypeNotRegistered(AbstractPolymorphicSerializer.kt:102)
	at kotlinx.serialization.internal.AbstractPolymorphicSerializerKt.throwSubtypeNotRegistered(AbstractPolymorphicSerializer.kt:114)
	at kotlinx.serialization.PolymorphicSerializerKt.findPolymorphicSerializer(PolymorphicSerializer.kt:109)
	at kotlinx.serialization.json.internal.StreamingJsonEncoder.encodeSerializableValue(StreamingJsonEncoder.kt:242)
	at kotlinx.serialization.json.internal.JsonStreamsKt.encodeByWriter(JsonStreams.kt:31)
	at kotlinx.serialization.json.Json.encodeToString(Json.kt:81)
	at io.ktor.serialization.kotlinx.KotlinxSerializationConverter.serializeContent(KotlinxSerializationConverter.kt:91)
	at io.ktor.serialization.kotlinx.KotlinxSerializationConverter.serialize(KotlinxSerializationConverter.kt:55)
	at io.ktor.client.plugins.contentnegotiation.ContentNegotiationKt.ContentNegotiation$lambda$13$convertRequest(ContentNegotiation.kt:184)
	at io.ktor.client.plugins.contentnegotiation.ContentNegotiationKt.access$ContentNegotiation$lambda$13$convertRequest(ContentNegotiation.kt:1)
	at io.ktor.client.plugins.contentnegotiation.ContentNegotiationKt$ContentNegotiation$2$1.invokeSuspend(ContentNegotiation.kt:242)
	at io.ktor.client.plugins.contentnegotiation.ContentNegotiationKt$ContentNegotiation$2$1.invoke(ContentNegotiation.kt)
	at io.ktor.client.plugins.contentnegotiation.ContentNegotiationKt$ContentNegotiation$2$1.invoke(ContentNegotiation.kt)
	at io.ktor.client.plugins.api.TransformRequestBodyHook$install$1.invokeSuspend(KtorCallContexts.kt:78)
	at io.ktor.client.plugins.api.TransformRequestBodyHook$install$1.invoke(KtorCallContexts.kt)
	at io.ktor.client.plugins.api.TransformRequestBodyHook$install$1.invoke(KtorCallContexts.kt)
	at io.ktor.util.pipeline.DebugPipelineContext.proceedLoop(DebugPipelineContext.kt:79)
	at io.ktor.util.pipeline.DebugPipelineContext.proceed(DebugPipelineContext.kt:57)
	at io.ktor.client.plugins.RequestError$install$1.invokeSuspend(HttpCallValidator.kt:134)
	at io.ktor.client.plugins.RequestError$install$1.invoke(HttpCallValidator.kt)
	at io.ktor.client.plugins.RequestError$install$1.invoke(HttpCallValidator.kt)
	at io.ktor.util.pipeline.DebugPipelineContext.proceedLoop(DebugPipelineContext.kt:79)
	at io.ktor.util.pipeline.DebugPipelineContext.proceed(DebugPipelineContext.kt:57)
	at io.ktor.client.plugins.SetupRequestContext$install$1.invokeSuspend$proceed(HttpRequestLifecycle.kt:40)
	at io.ktor.client.plugins.SetupRequestContext$install$1.access$invokeSuspend$proceed(HttpRequestLifecycle.kt)
	at io.ktor.client.plugins.SetupRequestContext$install$1$1.invoke(HttpRequestLifecycle.kt:40)
	at io.ktor.client.plugins.SetupRequestContext$install$1$1.invoke(HttpRequestLifecycle.kt:40)
	at io.ktor.client.plugins.HttpRequestLifecycleKt$HttpRequestLifecycle$1$1.invokeSuspend(HttpRequestLifecycle.kt:27)
	at io.ktor.client.plugins.HttpRequestLifecycleKt$HttpRequestLifecycle$1$1.invoke(HttpRequestLifecycle.kt)
	at io.ktor.client.plugins.HttpRequestLifecycleKt$HttpRequestLifecycle$1$1.invoke(HttpRequestLifecycle.kt)
	at io.ktor.client.plugins.SetupRequestContext$install$1.invokeSuspend(HttpRequestLifecycle.kt:40)
	at io.ktor.client.plugins.SetupRequestContext$install$1.invoke(HttpRequestLifecycle.kt)
	at io.ktor.client.plugins.SetupRequestContext$install$1.invoke(HttpRequestLifecycle.kt)
	at io.ktor.util.pipeline.DebugPipelineContext.proceedLoop(DebugPipelineContext.kt:79)
	at io.ktor.util.pipeline.DebugPipelineContext.proceed(DebugPipelineContext.kt:57)
	at io.ktor.util.pipeline.DebugPipelineContext.execute$ktor_utils(DebugPipelineContext.kt:63)
	at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:86)
	at io.ktor.client.HttpClient.execute$ktor_client_core(HttpClient.kt:1329)
	at io.ktor.client.statement.HttpStatement.fetchStreamingResponse(HttpStatement.kt:102)
	at io.ktor.client.plugins.sse.BuildersKt$serverSentEventsSession$2.invokeSuspend(builders.kt:258)
	... 8 more

Steps to Reproduce

  1. Try to submit a streaming tool output using submitStreamingToolOutput

Environment

  • openai-kotlin version: 4.0.1
  • Kotlin version: 2.1.0
  • OS: macOs
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant