文档中并没有关于deepseek-resoner的流式demo,自己尝试了一下报错,但是使用call()方法返回正常。报错如下: org.springframework.web.reactive.function.client.WebClientResponseException: 200 OK from POST https://api.deepseek.com/chat/completions, but response failed with cause: reactor.netty.http.client.PrematureCloseException: Connection prematurely closed DURING response at org.springframework.web.reactive.function.client.WebClientResponseException.create(WebClientResponseException.java:337) ~[spring-webflux-6.2.6.jar:6.2.6] at org.springframework.web.reactive.function.client.DefaultClientResponse.lambda$createException$1(DefaultClientResponse.java:214) ~[spring-webflux-6.2.6.jar:6.2.6] at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:106) ~[reactor-core-3.7.5.jar:3.7.5] at reactor.core.publisher.FluxOnErrorReturn$ReturnSubscriber.onError(FluxOnErrorReturn.java:199) ~[reactor-core-3.7.5.jar:3.7.5] at reactor.core.publisher.FluxDefaultIfEmpty$DefaultIfEmptySubscriber.onError(FluxDefaultIfEmpty.java:156) ~[reactor-core-3.7.5.jar:3.7.5] at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onError(FluxOnAssembly.java:544) ~[reactor-core-3.7.5.jar:3.7.5] at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onError(FluxMapFuseable.java:142) ~[reactor-core-3.7.5.jar:3.7.5] at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onError(FluxContextWrite.java:121) ~[reactor-core-3.7.5.jar:3.7.5] at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onError(FluxMapFuseable.java:340) ~[reactor-core-3.7.5.jar:3.7.5] at reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onError(FluxFilterFuseable.java:382) ~[reactor-core-3.7.5.jar:3.7.5] at reactor.core.publisher.MonoCollect$CollectSubscriber.onError(MonoCollect.java:135) ~[reactor-core-3.7.5.jar:3.7.5] at reactor.core.publisher.FluxMap$MapSubscriber.onError(FluxMap.java:134) ~[reactor-core-3.7.5.jar:3.7.5] at reactor.core.publisher.FluxPeek$PeekSubscriber.onError(FluxPeek.java:222) ~[reactor-core-3.7.5.jar:3.7.5] at reactor.core.publisher.FluxMap$MapSubscriber.onError(FluxMap.java:134) ~[reactor-core-3.7.5.jar:3.7.5] at reactor.core.publisher.Operators.error(Operators.java:198) ~[reactor-core-3.7.5.jar:3.7.5] at reactor.netty.channel.FluxReceive.startReceiver(FluxReceive.java:175) ~[reactor-netty-core-1.2.5.jar:1.2.5] at reactor.netty.channel.FluxReceive.subscribe(FluxReceive.java:145) ~[reactor-netty-core-1.2.5.jar:1.2.5] at reactor.core.publisher.InternalFluxOperator.subscribe(InternalFluxOperator.java:68) ~[reactor-core-3.7.5.jar:3.7.5]
附上代码和报错截图:
Comment From: cKnight107
可以debug到这,复制下request,到postman中调用下。确认下是不是请求参数的问题。
Comment From: zzpphh
请求参数没问题:ChatCompletionRequest[messages=[ChatCompletionMessage[rawContent=请用中文回答我的问题:如何使用深度学习?, role=USER, name=null, toolCallId=null, toolCalls=null, prefix=null, reasoningContent=null]], model=deepseek-reasoner, frequencyPenalty=null, maxTokens=null, presencePenalty=null, responseFormat=null, stop=null, stream=true, temperature=1.0, topP=null, logprobs=false, topLogprobs=null, tools=null, toolChoice=null],改为json:{ "model": "deepseek-reasoner", "stream": true, "temperature": 1.0, "messages": [ { "role": "user", "content": "请用中文回答我的问题:如何使用深度学习?" } ] },在postman正常返回,因为服务端报的是200OK,错误不在请求上,应该是在SSE流处理上
Comment From: you267
我也遇到这个问题了,有没有解决办法
Comment From: sunyuhan1998
What version of Spring AI are you currently using? The following code is what I tested with 1.1.0-SNAPSHOT, and the streaming output works correctly:
public static void main(String[] args) {
DeepSeekApi api = DeepSeekApi.builder()
.baseUrl("https://api.deepseek.com")
.apiKey("<API_KEY>")
.build();
DeepSeekChatModel model = DeepSeekChatModel.builder().deepSeekApi(api).build();
DeepSeekChatOptions deepSeekChatOptions = DeepSeekChatOptions.builder()
.model("deepseek-reasoner")
.build();
Prompt prompt = new Prompt("What are the planets in the solar system? ", deepSeekChatOptions);
ChatClient client = ChatClient.builder(model).build();
client.prompt(prompt).stream()
.chatResponse()
.doOnNext(resp -> {
DeepSeekAssistantMessage message = (DeepSeekAssistantMessage) resp.getResult().getOutput();
if (null != message.getReasoningContent()) {
System.out.print(message.getReasoningContent());
} else {
System.out.print(message.getText());
}
})
.blockLast();
}
Comment From: you267
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
<version>1.0.0-M6</version>
</dependency>
这个是我的依赖,错误信息Caused by: java.lang.IllegalStateException: No ContextAccessor for contextType: class reactor.util.context.Context1
at io.micrometer.context.ContextRegistry.getContextAccessorForRead(ContextRegistry.java:206)
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Error has been observed at the following site(s):
*__checkpoint ⇢ Body from POST http://127.0.0.1:11434/api/chat [DefaultClientResponse]
Original Stack Trace:
at io.micrometer.context.ContextRegistry.getContextAccessorForRead(ContextRegistry.java:206)
at io.micrometer.context.DefaultContextSnapshotFactory.setAllThreadLocalsFrom(DefaultContextSnapshotFactory.java:119)
at io.micrometer.context.DefaultContextSnapshotFactory.setThreadLocalsFrom(DefaultContextSnapshotFactory.java:109)
at reactor.core.publisher.ContextPropagation.lambda$contextRestoreForHandle$2(ContextPropagation.java:172)
at reactor.core.publisher.FluxHandle$HandleSubscriber.onNext(FluxHandle.java:113)
at reactor.core.publisher.FluxConcatArray$ConcatArraySubscriber.onNext(FluxConcatArray.java:201)
at reactor.core.publisher.FluxFlattenIterable$FlattenIterableSubscriber.drainAsync(FluxFlattenIterable.java:453)
at reactor.core.publisher.FluxFlattenIterable$FlattenIterableSubscriber.drain(FluxFlattenIterable.java:724)
at reactor.core.publisher.FluxFlattenIterable$FlattenIterableSubscriber.onNext(FluxFlattenIterable.java:256)
at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:122)
at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:200)
at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:122)
at reactor.netty.channel.FluxReceive.drainReceiver(FluxReceive.java:294)
at reactor.netty.channel.FluxReceive.onInboundNext(FluxReceive.java:403)
at reactor.netty.channel.ChannelOperations.onInboundNext(ChannelOperations.java:426)
at reactor.netty.http.client.HttpClientOperations.onInboundNext(HttpClientOperations.java:802)
at reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:114)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
但是这个问题只会在linux系统上出现,我在windos上面并没有出现这个错误,linux系统信息,NAME="Rocky Linux"
VERSION="9.5 (Blue Onyx)"
ID="rocky"
ID_LIKE="rhel centos fedora"
VERSION_ID="9.5"
PLATFORM_ID="platform:el9"
PRETTY_NAME="Rocky Linux 9.5 (Blue Onyx)"
ANSI_COLOR="0;32"
LOGO="fedora-logo-icon"
CPE_NAME="cpe:/o:rocky:rocky:9::baseos"
HOME_URL="https://rockylinux.org/"
VENDOR_NAME="RESF"
VENDOR_URL="https://resf.org/"
BUG_REPORT_URL="https://bugs.rockylinux.org/"
SUPPORT_END="2032-05-31"
ROCKY_SUPPORT_PRODUCT="Rocky-Linux-9"
ROCKY_SUPPORT_PRODUCT_VERSION="9.5"
REDHAT_SUPPORT_PRODUCT="Rocky Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="9.5"
Comment From: zzpphh
Thanks,switch to 1.1.0-SNAPSHOT works correctly
Comment From: you267
你们用的是哪个依赖啊
Comment From: zzpphh
你们用的是哪个依赖啊
出错的是稳定版1.0.0,改为1.1.0-SNAPSHOT 就好了
Comment From: you267
可是spring-ai-ollama-spring-boot-starter没有1.1.0-SNAPSHOT这个版本啊