AI大模型流式輸出,OkHttp Log攔截打印方案

?背景:

使用okhttp框架進行網絡訪問時,一般會使用?HttpLoggingInterceptor 打印請求和響應的log。在使用okhttp訪問AI大模型時,如果選擇流式輸出,那么響應的body數據使用的SSE技術,服務異步發送大模型生成的增量token,使用HttpLoggingInterceptor攔截后,會在所有數據接收完成后一次打印完,業務邏輯處也是在log打印完后,才集中收到全部的內容,達不到流式返回的效果。

優化方案:

優化的思路是將body 流攔截打印,然后重新構建response,responsebody和inputstream。將真實的body數據重新寫入到重新構建的responsebody流里面,這樣業務端就會實時收到流式返回的內容。下面是攔截打印body部分的代碼:

@Override
public Response intercept(@NotNull Chain chain) throws IOException {Response response = chain.proceed(chain.request());PipedOutputStream pipedOutputStream = new PipedOutputStream();PipedInputStream pipedInputStream = new PipedInputStream(pipedOutputStream);BufferedSource cloneSource = Okio.buffer(Okio.source(pipedInputStream));ResponseBody cloneBody = ResponseBody.create(cloneSource, response.body().contentType() , response.body().contentLength());Response cloneResponse = response.newBuilder().body(cloneBody).build();BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(pipedOutputStream));InputStream inputStream = response.body().byteStream();BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));new Thread(() -> {String line;while (true) {try {if ((line = reader.readLine()) == null) break;} catch (IOException e) {e.printStackTrace();break;}System.out.println(">>>>>>>>>>>>> log intercept:" + line);try {writer.write(line);writer.write("\r\n");writer.flush();} catch (IOException e) {e.printStackTrace();}}try {writer.close();} catch (IOException e) {e.printStackTrace();}System.out.println("log intercept end");}).start();return cloneResponse;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/86539.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/86539.shtml
英文地址,請注明出處:http://en.pswp.cn/web/86539.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

看數據世界的歷史:全面梳理從關系庫、大數據到AI時代的數據發展及展望

序章 在數據庫不斷發展的時代里,我們看到了關系型數據庫(RDB)在一次次的數據演變過程中的占據王位,捍衛了勝利,像一個王朝更替下的“王權”的故事,精彩有趣。 本篇就來探討下數據庫的發展興衰史&#xff0…

元宇宙與人工智能的融合:從虛擬世界到智能生態的IT新革命

文章目錄 引言:前沿技術重塑數字交互體驗一、元宇宙與AI融合的本質:虛擬空間與智能交互的交匯元宇宙賦能AI:AI賦能元宇宙: 二、元宇宙與AI融合的演進:從概念到產業熱潮三、核心技術:元宇宙與AI融合的基石與…

問卷調查[mqtt dht]

任務 this code uses esp32-wroom-32 and dht11 to read the humidty and temperature, besieds, it will send the meassage to the cloud platform. All communication is conducted through MQTT. 打分標準 您應該對以下代碼進行評級,并且必須遵守如…

swift 對象轉Json

在 Swift 中將對象轉換為 JSON 可以通過以下方法實現: 使用 Codable 協議 Swift 的 Codable 協議(Encodable 和 Decodable 的組合)是處理 JSON 編碼和解碼的推薦方式。 struct Person: Codable {var name: Stringvar age: Int }let person…

Python學習Day43

學習來源:浙大疏錦行 import torch import torch.nn as nn import torch.nn.functional as F import torchvision import torchvision.transforms as transforms import numpy as np import matplotlib.pyplot as plt from PIL import Image import os # 設置隨機…

了解一下Unity AssetBundle 的幾種加載方式

Unity 的 AssetBundle 系統提供了多種加載方式,以滿足不同場景下的資源管理和性能需求。 同步加載(LoadFromFile) 同步加載使用 AssetBundle.LoadFromFile 方法從文件系統中直接加載 AssetBundle。這種方式會阻塞主線程,直到加載…

鴻蒙邊緣智能計算架構實戰:多線程圖像采集與高可靠緩沖設計

目錄 一、技術背景與挑戰二、鴻蒙邊緣計算架構的核心特性1. 分布式軟總線:打破設備孤島2. 輕量化多線程模型 三、多線程圖像采集的穩定性設計1. 分層緩沖隊列架構2. 線程優先級策略 四、邊緣側高可靠緩沖機制1. 基于分布式數據管理的容錯設計2. 動態帶寬調節 五、實…

excel中vba開發工具

1、支持單元格點擊出現彈框進行選擇 支持模多次模糊查詢 Private Sub CommandButton1_Click() Call vehicle_查詢 End SubPrivate Sub Worksheet_Activate()Call vehicle_取出車架號和公司名稱 取出不重復的車架號Sheet13.ComboBox1.Visible False 車架號顯示Sheet13.ComboB…

CatBoost:征服類別型特征的梯度提升王者

基于有序提升與對稱樹的下一代GBDT框架,重塑高維分類數據處理范式 一、CatBoost的誕生:解決類別特征的終極挑戰 2017年由俄羅斯Yandex團隊開源,CatBoost(Categorical Boosting)直指機器學習中的核心痛點:類…

使用 WSL 啟動ubuntu.tar文件

使用 WSL 啟動ubuntu.tar文件,可按以下步驟進行3: 檢查 WSL 版本:確保你的 WSL 版本為 2.4.8 或更高版本。可以在命令行中輸入wsl --update來更新 WSL 到最新版本。 設置默認 WSL 版本:如果還沒有將 WSL 2 設置為默認版本&#x…

vue-23(創建用于邏輯提取的可重用組合組件)

創建用于邏輯提取的可重用組合組件 可重用的組合式是 Vue 組合式 API 的基石,它使你能夠在多個組件中提取和重用有狀態邏輯。這有助于編寫更清晰的代碼,減少冗余,并提高可維護性。通過將特定功能封裝到組合式中,你可以輕松地共享…

數據透視表學習筆記

學習視頻:Excel數據透視表大全,3小時從小白到大神!_嗶哩嗶哩_bilibili 合并行標簽 初始數據透視表 不顯示分類匯總 以大綱形式顯示 在組的底部顯示所有分類匯總 以表格形式顯示 合并單元格-右鍵-數據透視表選項 選中-合并并劇中排列帶…

吃透 Golang 基礎:測試

文章目錄 go test測試函數隨機測試測試一個命令白盒測試外部測試包 測試覆蓋率基準測試剖析示例函數 go test go test命令是一個按照一定的約定和組織來測試代碼的程序。在包目錄內,所有以xxx_test.go為后綴名的源文件在執行go build時不會被構建為包的一部分&#…

酒店服務配置無門檻優惠券

1.查看酒店綁定的是那個倉庫; 凱里亞德酒店(深圳北站壹城中心店),綁定的是“龍華民治倉(睿嘀購” 2.“門店列表”選擇“龍華民治倉(睿嘀購””中的“綁定場所” 3.通過酒店名字查找綁定的商品模板; 凱里亞德酒店(深圳…

IoT創新應用場景,賦能海外市場拓展

在數字化浪潮席卷全球的當下,物聯網(Internet of Things, IoT)正以革命性的力量重塑產業生態。這項通過傳感器、通信技術及智能算法實現設備互聯的技術,不僅推動全球從“萬物互聯”邁向“萬物智聯”,更成為賦能企業開拓…

Idea中Docker打包流程記錄

1. maven項目,先打package 2.添加Dockerfile 3.執行打包命令 注意最后的路徑 . docker buildx build -t xxx-app:版本號 -f Dockerfile . 4.下載文件 docker save -o xxx-app-版本號.tar xxx-app:版本號 5.加載鏡像 docker load -i xxx-app-版本號.tar 6.編…

硬件工程師筆試面試高頻考點-電阻

目錄 1.1 電阻選型時一般從哪幾個方面進行考慮? 1.2上拉下拉電阻的作用 1.3 PTC熱敏電阻作為電源電路保險絲的工作原理 1.4 如果阻抗不匹配,有哪些后果 1.5 電阻、電容和電感0402、0603和0805封裝的含義 1.6 電阻、電容和電感的封裝大小與什么參數有關 1.7 …

小程序入門:小程序 API 的三大分類

在小程序開發中,API(Application Programming Interface)起著至關重要的作用,它為開發者提供了豐富的功能和能力,使我們能夠創建出功能強大、用戶體驗良好的小程序。小程序 API 大致可分為以下三大分類:事件…

算法第55天|冗余連接、冗余連接II

冗余連接 題目 思路與解法 #include <iostream> #include <vector> using namespace std; int n; // 節點數量 vector<int> father(1001, 0); // 按照節點大小范圍定義數組// 并查集初始化 void init() {for (int i 0; i < n; i) {father[i] i;} } //…

Docker單獨部署grafana

Docker單獨部署grafana 環境說明 操作前提&#xff1a; 先去搭建PC端的MySQL和虛擬機 自行找參考 Linux部署docker參考文章&#xff1a; 02-Docker安裝_docker安裝包下載-CSDN博客 本文參考文章&#xff1a; 運維小記 說明&#xff1a; 本文的操作均以搭建好的PC端的MySQL和虛…