Bug description Calls to DeepSeekChatModel consistently fail with:
org.springframework.web.client.RestClientException: Error while extracting response for type
[org.springframework.ai.deepseek.api.DeepSeekApi$ChatCompletion] and content type [application/json]
Caused by: java.io.IOException: closed
Caused by: java.io.IOException: Received RST_STREAM: Internal error
The failure appears during response body extraction over HTTP/2 when Spring attempts to deserialize the JSON response.
This same configuration was working correctly before without any code changes. The issue started recently and now reproduces consistently when using the DEEPSEEK_REASONER model via Spring AI 1.1.0.
Environment Spring AI: 1.1.0 spring-ai-deepseek: 1.1.0 Java: JDK 25 Springboot: 3.5.7
Steps to reproduce Configure DeepSeekChatModel and ChatClient using Spring AI. Use the DEEPSEEK_REASONER model with moderate to large responses (≈4000 max tokens). Execute a chat request using ChatClient.chat().
Expected behavior The request should complete normally and return a valid ChatResponse without any transport-level failures or stream resets
Minimal Complete Reproducible example
@Bean("newsPlusAnalystChatClient")
public ChatClient newsPlusAnalystChatClient(
@Qualifier("deepSeekChatModel") ChatModel deepSeekChatModel) {
ChatOptions deepseekOptions = DeepSeekChatOptions.builder()
.model(DeepSeekApi.ChatModel.DEEPSEEK_REASONER.getValue())
.maxTokens(4000)
.temperature(0.7)
.build();
return ChatClient.builder(deepSeekChatModel)
.defaultOptions(deepseekOptions)
.build();
}
var response = chatClient
.prompt()
.system(systemPrompt)
.user(userPrompt)
.call().chatResponse();
Full Error Stack trace
org.springframework.web.client.RestClientException: Error while extracting response for type [org.springframework.ai.deepseek.api.DeepSeekApi$ChatCompletion] and content type [application/json] at org.springframework.web.client.DefaultRestClient.readWithMessageConverters(DefaultRestClient.java:262) ~[spring-web-6.2.12.jar:6.2.12] at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.readBody(DefaultRestClient.java:826) ~[spring-web-6.2.12.jar:6.2.12] at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.lambda$toEntityInternal$2(DefaultRestClient.java:782) ~[spring-web-6.2.12.jar:6.2.12] at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:586) ~[spring-web-6.2.12.jar:6.2.12] at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:540) ~[spring-web-6.2.12.jar:6.2.12] at org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:680) ~[spring-web-6.2.12.jar:6.2.12] at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:821) ~[spring-web-6.2.12.jar:6.2.12] at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.toEntityInternal(DefaultRestClient.java:781) ~[spring-web-6.2.12.jar:6.2.12] at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.toEntity(DefaultRestClient.java:770) ~[spring-web-6.2.12.jar:6.2.12] at org.springframework.ai.deepseek.api.DeepSeekApi.chatCompletionEntity(DeepSeekApi.java:125) ~[spring-ai-deepseek-1.1.0.jar:1.1.0] at org.springframework.ai.deepseek.DeepSeekChatModel.lambda$internalCall$1(DeepSeekChatModel.java:169) ~[spring-ai-deepseek-1.1.0.jar:1.1.0] at org.springframework.retry.support.RetryTemplate.doExecute(RetryTemplate.java:357) ~[spring-retry-2.0.12.jar:na] at org.springframework.retry.support.RetryTemplate.execute(RetryTemplate.java:230) ~[spring-retry-2.0.12.jar:na] at org.springframework.ai.deepseek.DeepSeekChatModel.lambda$internalCall$3(DeepSeekChatModel.java:169) ~[spring-ai-deepseek-1.1.0.jar:1.1.0] at io.micrometer.observation.Observation.observe(Observation.java:564) ~[micrometer-observation-1.15.5.jar:1.15.5] at org.springframework.ai.deepseek.DeepSeekChatModel.internalCall(DeepSeekChatModel.java:166) ~[spring-ai-deepseek-1.1.0.jar:1.1.0] at org.springframework.ai.deepseek.DeepSeekChatModel.call(DeepSeekChatModel.java:151) ~[spring-ai-deepseek-1.1.0.jar:1.1.0] at org.springframework.ai.chat.client.advisor.ChatModelCallAdvisor.adviseCall(ChatModelCallAdvisor.java:54) ~[spring-ai-client-chat-1.1.0.jar:1.1.0] at org.springframework.ai.chat.client.advisor.DefaultAroundAdvisorChain.lambda$nextCall$1(DefaultAroundAdvisorChain.java:114) ~[spring-ai-client-chat-1.1.0.jar:1.1.0] at io.micrometer.observation.Observation.observe(Observation.java:564) ~[micrometer-observation-1.15.5.jar:1.15.5] at org.springframework.ai.chat.client.advisor.DefaultAroundAdvisorChain.nextCall(DefaultAroundAdvisorChain.java:113) ~[spring-ai-client-chat-1.1.0.jar:1.1.0] at org.springframework.ai.chat.client.DefaultChatClient$DefaultCallResponseSpec.lambda$doGetObservableChatClientResponse$1(DefaultChatClient.java:521) ~[spring-ai-client-chat-1.1.0.jar:1.1.0] at io.micrometer.observation.Observation.observe(Observation.java:564) ~[micrometer-observation-1.15.5.jar:1.15.5] at org.springframework.ai.chat.client.DefaultChatClient$DefaultCallResponseSpec.doGetObservableChatClientResponse(DefaultChatClient.java:519) ~[spring-ai-client-chat-1.1.0.jar:1.1.0] at org.springframework.ai.chat.client.DefaultChatClient$DefaultCallResponseSpec.doGetObservableChatClientResponse(DefaultChatClient.java:498) ~[spring-ai-client-chat-1.1.0.jar:1.1.0] at org.springframework.ai.chat.client.DefaultChatClient$DefaultCallResponseSpec.chatResponse(DefaultChatClient.java:487) ~[spring-ai-client-chat-1.1.0.jar:1.1.0] at ai.market.analyst.chat.service.NewsPlusFinancialAnalyst.analyzeNewsPlusForStock(NewsPlusFinancialAnalyst.java:262) ~[classes/:na] at ai.market.analyst.telegram.service.TelegramBotService.handleAnalyzeCommand(TelegramBotService.java:99) ~[classes/:na] at ai.market.analyst.telegram.service.TelegramBotService.handleUpdate(TelegramBotService.java:62) ~[classes/:na] at ai.market.analyst.telegram.AdvisorBot.onUpdateReceived(AdvisorBot.java:26) ~[classes/:na] at java.base/java.util.ArrayList.forEach(ArrayList.java:1604) ~[na:na] at org.telegram.telegrambots.meta.generics.LongPollingBot.onUpdatesReceived(LongPollingBot.java:27) ~[telegrambots-meta-6.9.7.1.jar:na] at org.telegram.telegrambots.updatesreceivers.DefaultBotSession$HandlerThread.run(DefaultBotSession.java:312) ~[telegrambots-6.9.7.1.jar:na] Caused by: java.io.IOException: closed at java.net.http/jdk.internal.net.http.ResponseSubscribers$HttpResponseInputStream.current(ResponseSubscribers.java:359) ~[java.net.http:na] at java.net.http/jdk.internal.net.http.ResponseSubscribers$HttpResponseInputStream.read(ResponseSubscribers.java:434) ~[java.net.http:na] at java.base/java.io.FilterInputStream.read(FilterInputStream.java:71) ~[na:na] at java.base/java.io.PushbackInputStream.read(PushbackInputStream.java:138) ~[na:na] at org.springframework.web.client.IntrospectingClientHttpResponse.hasEmptyMessageBody(IntrospectingClientHttpResponse.java:103) ~[spring-web-6.2.12.jar:6.2.12] at org.springframework.web.client.DefaultRestClient.readWithMessageConverters(DefaultRestClient.java:219) ~[spring-web-6.2.12.jar:6.2.12] ... 32 common frames omitted Caused by: java.io.IOException: Received RST_STREAM: Internal error at java.net.http/jdk.internal.net.http.Stream.handleReset(Stream.java:778) ~[java.net.http:na] at java.net.http/jdk.internal.net.http.Stream.schedule(Stream.java:213) ~[java.net.http:na] at java.net.http/jdk.internal.net.http.common.SequentialScheduler$LockingRestartableTask.run(SequentialScheduler.java:182) ~[java.net.http:na] at java.net.http/jdk.internal.net.http.common.SequentialScheduler$CompleteRestartableTask.run(SequentialScheduler.java:149) ~[java.net.http:na] at java.net.http/jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:207) ~[java.net.http:na] at java.net.http/jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:280) ~[java.net.http:na] at java.net.http/jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:233) ~[java.net.http:na] at java.net.http/jdk.internal.net.http.Stream.receiveResetFrame(Stream.java:460) ~[java.net.http:na]