文档中并没有关于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]

附上代码和报错截图: Image

Image

Comment From: cKnight107

Image 可以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这个版本啊