由于本地ollama模型返回格式为:

Content-Type

application/x-ndjson

OkHttp实现的RealEnventSource只能解析text/event-stream,会报响应头异常;

解决方式:自主使用代码实现响应解析,并构造stream格式返回数据

client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {
                logger.info("调用接口失败{}", e);
            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                if(response.isSuccessful()){
                    try(ResponseBody responseBody = response.body()){
                        if(responseBody !=null){
                            //逐行读取响应
                            BufferedReader reader = new BufferedReader(new InputStreamReader(responseBody.byteStream(), StandardCharsets.UTF_8));
                            String line;
                            while((line = reader.readLine())!=null){

                                AiResponse aiResponse = JsonUtils.convertJson2Obj(line, AiResponse.class);
                                if(aiResponse.getDone()){
                                    break;
                                }
                                logger.info(aiResponse.getResponse());
                                pw.write("data:"+JsonUtils.convertObj2Json(new ContentDto(aiResponse.getResponse()))+"\n\n");
                                pw.flush();
                            }
                            eventLatch.countDown();
                        }
                    }
                }else {
                    logger.error("调用接口失败",response);
                }
            }

        });

由于是流式响应,此处理方式为异步SSE返回数据,需要使用CountDownLatch保护线程;

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐