文心一言的流式接口数据进行处理 增加属性

需求:需要对文心一言的流式接口数据进行处理 增加属性

复制代码
return ResponseEntity.ok()
                .header("Access-Control-Allow-Origin", "*")
                .contentType(org.springframework.http.MediaType.TEXT_EVENT_STREAM)
                .cacheControl(org.springframework.http.CacheControl.noCache())
                .body(outputStream -> {
                        try (Response response = client.newCall(request).execute();
                             ResponseBody responseBody = response.body();
                             InputStream inputStream = responseBody.byteStream()) {
                            if (!response.isSuccessful()) {
                                throw new IOException("Failed to fetch streaming data, HTTP error code: " + response.code());
                            }
                            byte[] buffer = new byte[4096];
                            int bytesRead;
                            while ((bytesRead = inputStream.read(buffer)) != -1) {
                                /*outputStream.write(buffer, 0, bytesRead);
                                outputStream.flush();*/
                                String data = new String(buffer, 0, bytesRead, StandardCharsets.UTF_8);
                                String[] lines = data.split("\n");
                                for (String line : lines) {
                                    if (line.startsWith("data: ")) {
                                        // 记录流输出结果,用于后续持久化
                                        com.zbIntel.integration.wenxin.entity.ChatResponse bean =
                                                JSONUtil.parseObj(line.substring(6).getBytes(StandardCharsets.UTF_8))
                                                        .toBean(com.zbIntel.integration.wenxin.entity.ChatResponse.class);
                                        bean.setSessionId(req.getSessionId());

                                        // 序列化bean并发送
                                        String serializedBean = JSONUtil.toJsonStr(bean);
                                        outputStream.write(("data: " + serializedBean + "\n\n").getBytes(StandardCharsets.UTF_8));
                                        outputStream.flush();

                                        log.info("返回数据:{}", bean);
                                        String content = bean.getResult();
                                        if (bean.getIs_end()) {
                                            isEndflag.set(Boolean.TRUE);
                                        }
                                        // 记录流输出结果,用于后续持久化
                                        respContent.append(content);
                                    }
                                }
                            }
                        } catch (IOException e) {
                            log.error("Error during streaming data: ", e);
                            outputStream.write(("{" +
                                    "  \"error_code\": 112," +
                                    "  \"error_msg\": \"" + e.getMessage() + "\"" +
                                    "}").getBytes(StandardCharsets.UTF_8));
                            outputStream.flush();
                        }

                    if(isEndflag.get()) {
                        // 构造回复数据对象,持久化
                        String respContentStr = respContent.toString();
                        SessionChatRecordEntity replyRecord = new SessionChatRecordEntity(
                                finalAskRecord.getSessionId(), Role.ASSISTANT.name,
                                respContentStr, ChatGPTApi.getMessageTokenNum(respContentStr));
                        sessionChatRecordService.saveBatch(ImmutableList.of(finalAskRecord, replyRecord));

                        // 刷新缓存
                        chatService.refreshWindowRecordCache(finalAskRecord.getSessionId());
                    }
                }
        );

主要时这段:

// 序列化bean并发送

String serializedBean = JSONUtil.toJsonStr(bean);

outputStream.write(("data: " + serializedBean + "\n\n").getBytes(StandardCharsets.UTF_8));

outputStream.flush();

返回的结果:

增加了 sessionId的属性

相关推荐
咩咩啃树皮9 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
鱟鲥鳚10 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
大模型码小白11 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司12 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地13 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun31415913 小时前
TCP超时重传机制是为了解决什么问题?
java
莫逸风15 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
z1234567898616 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
yaoxin52112316 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python
做个文艺程序员17 小时前
Linux第24篇:Java应用监控体系搭建:Prometheus+Grafana可视化运维
java·grafana·prometheus