ProChat 如何接入 WebSocket

WebSocket是一種在單個TCP連接上進行全雙工通信的協議,允許客戶端和服務器之間進行雙向實時通信。與Server-Sent Events (SSE)類似,WebSocket也能實現實時數據推送,但其功能更為強大且靈活。
全雙工通信:WebSocket不僅允許服務器向客戶端發送數據,也支持客戶端向服務器發送數據,這樣就構建了一個真正的雙向通道。
持久連接:建立WebSocket連接后,該連接保持打開狀態直到任一端主動關閉,減少了傳統HTTP輪詢或長輪詢造成的資源浪費。
低延遲:由于連接一旦建立,消息可以立即通過此通道傳輸,因此延遲相對較低,適用于對實時性要求較高的應用。
輕量級協議:盡管是基于HTTP握手建立連接,但隨后的數據交換采用二進制幀格式,更高效地傳輸數據。
ProChat 支持非流式和流式數據的展示,可以非常方便接入SSE數據。最新版的ChatGPT,會話交流由原來的SSE數據,改為了WebSocket,可以多客戶端監聽ChatGPT生成的數據。有意思的是,目前wss網絡訪問在國內沒有限制。

添加圖片注釋,不超過 140 字(可選)

添加圖片注釋,不超過 140 字(可選)
那么如何在ProChat中訪問wss連接,并展示呢?
ProChat結果接收的是Response對象,需要自己組裝 Reader 然后讀取它,然后包裹他返回,組件最后接收的依然是一個只包含返回內容的 Stream 流。
例如創建ReadableStream,并返回結果:

const encoder = new TextEncoder();
const readableStream = new ReadableStream({
async start(controller) {
controller.enqueue(encoder.encode(“讀取到的數據”));
controller.close();
},
});
return new Response(readableStream);

創建WebSocket連接,并在onmessage方法中持續監聽來自服務器的消息,添加業務處理邏輯,將接受到的數據持續通過

controller.enqueue()方法添加到ReadableStream中:const ws = new WebSocket(rpsData.wss_url);  
ws.onmessage = (event) => {const newData = JSON.parse(event.data); // 假設服務器發送的是JSON數據var raw = atob(newData.body);raw = raw.substring(5).trim();if (raw == '[DONE]') {ws?.close();} else {try {const result = JSON.parse(raw);const data = result?.message?.content?.parts[0];// 將收到的數據塊通過yield語句傳遞給ReadableStreamcontroller.enqueue(encoder.encode(data.replace(previousData,"")));previousData= dataconst status = result?.message?.status;if (status === 'finished_successfully') {previousData = "";ws?.close();}} catch (error) {console.log(error);}}};

交流+V B423651

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

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

相關文章

【TestNG】(4) 重試機制與監聽器的使用

在UI自動化測試用例執行過程中,經常會有很多不確定的因素導致用例執行失敗,比如網絡原因、環境問題等,所以我們有必要引入重試機制(失敗重跑),來提高測試用例成功率。 在不寫代碼的情況沒有提供可配置方式…

Mysql 慢查詢日志

查詢是否開啟慢SQL日志 show variables like %slow_query_log; 開啟慢查詢日志 set global slow_query_logON; 可以通過修改MySQL的配置my.cfg或者my.ini永久生效 slow_query_logON # 開啟慢查詢日志開關 slow_query_log_file/var/lib/mysql/alvin-slow.log # 慢查詢日志…

1.2 在卷積神經網絡中,如何計算各層感受野的大小

1.2 在卷積神經網絡中,如何計算各層感受野的大小 分析與解答: 在卷積神經網絡中,由于卷積的局部連接性,輸出特征圖上的每個節點的取值,是由卷積核在輸入特征圖對應位置的局部區域內進行卷積而得到的,因此這…

COM - IWbemClassObject對象屬性的遍歷

文章目錄 COM - IWbemClassObject對象屬性的遍歷概述筆記場景封裝好的函數bool CWmiBase::enumObjVaule(IWbemClassObject* obj, std::wstring& val)bool CWmiBase::appendVarToString(BSTR& strName, VARIANT& var, std::wstring& val)bool CWmiBase::get_var…

【筆試強訓錯題選擇題】Day5.習題(錯題)解析

文章目錄 前言 錯題題目 錯題解析 總結 前言 錯題題目 1. ? ? 2. 3. ? 4. ? 5. ? 錯題解析 1. 移位運算符的使用 2. 3. 4. 5. 總結

如何用TCC實現分布式事務?

TCC事務介紹 TCC(Try-Confirm-Cancel)是除可靠消息隊列以外的另一種常見的分布式事務機制,它是由數據庫專家帕特 赫蘭德(Pat Helland)在2007年撰寫的論文《Life beyond Distributed Transactions: An Apostate’s Op…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的體育賽事目標檢測系統(Python+PySide6界面+訓練代碼)

摘要:開發和研究體育賽事目標檢測系統對于增強體育分析和觀賞體驗至關重要。本篇博客詳細講述了如何運用深度學習技術構建一個體育賽事目標檢測系統,并提供了完整的實現代碼。系統基于先進的YOLOv8算法,對比了YOLOv7、YOLOv6、YOLOv5的性能&a…

【webrtc】p2p_transport_channel 中忽略Hyper-V

【win11】更改網絡適配器設置 刪掉了hype-v,這時候wsl2 打不開了,但是重啟后,還是存在hyper-v那么,讓webrtc自己不適用hyper-v的網絡Hyper-V 的全程:Hyper-V Virtual Ethernet Adapter https://github.com/SophistSolutions/Stroika/blob/2cd5e8bf4ee01cb5c423367b4df628f…

MFC 模態對話框退出機制的探究

一位讀者問了這樣一個問題: ” 如果我創建了一個可見的模態對話框,卻對用戶來說不可用。舉個例子,假設我在程序中的其他位置收到一個事件,并且我從事件中調用模態 CDialog 上的 DestroyWindow。我注意到 OnDestroy 是在 CDialog 上調用的,但在將 WM_QUIT 消息發送到模態對…

在MyBatis中自定義JsonTypeHandler

在MyBatis中使用自定義的JsonTypeHandler 在處理數據庫中的JSON字段時,我們經常需要將JSON字符串映射到Java對象,或者將Java對象序列化為JSON字符串以存儲在數據庫中。MyBatis作為一個流行的Java持久層框架,允許我們通過自定義類型處理器&am…

爬蟲入門到精通_實戰篇7(Requests+正則表達式爬取貓眼電影)_ 抓取單頁內容,正則表達式分析,保存至文件,開啟循環及多線程

1 目標 貓眼榜單TOP100:https://www.maoyan.com/board 2 流程框架 抓取單頁內容:利用requests請求目標站點,得到單個網頁HTML代碼,返回結果。正則表達式分析:根據HTML代碼分析得到電影名稱,主演,上映時間,評分,圖片…

跨域問題與解決方法

跨域問題與解決方法 同源策略 瀏覽器很容易受到XSS、CSFR等攻擊。所謂同源是指"協議域名端口"三者相同,即便兩個不同的域名指向同一個ip地址,也非同源。 同源策略限制以下幾種行為: Cookie、LocalStorage 和 IndexDB 無法讀取 DO…

C語言中的分支和循環語句:從入門到精通

分支和循環語句 1. 前言2. 預備知識2.1 getchar函數2.2 putchar函數2.3 計算數組的元素個數2.4 清屏2.5 程序的暫停2.6 字符串的比較 3. 結構化3.1 順序結構3.2 分支結構3.3 循環結構 4. 真假性5. 分支語句(選擇結構)5.1 if語句5.1.1 語法形式5.1.2 else…

Java網絡通信UDP

目錄 網絡通信基礎 UDP通信 服務器 1.想要使用UDP通信 要先打開DatagramSocket文件 端口號可以手動指定或系統隨機分配 2.阻塞等待接收客戶端數據;創建DatagramPacket接收客戶端傳來的數據 3.處理客戶端傳來的數據,并進行業務處理(這里…

MySQL 教程 2.4

MySQL UNION 操作符 本教程為大家介紹 MySQL UNION 操作符的語法和實例。 描述 MySQL UNION 操作符用于連接兩個以上的 SELECT 語句的結果組合到一個結果集合,并去除重復的行。 UNION 操作符必須由兩個或多個 SELECT 語句組成,每個 SELECT 語句的列數…

Python降維數據庫之umap使用詳解

概要 在數據科學和機器學習領域,數據通常是高維度的,而高維度數據不僅難以可視化,還會增加建模的復雜性。降維是一種處理高維數據的關鍵技術,而Python UMAP(Uniform Manifold Approximation and Projection)是一種強大的降維工具,它在保留數據結構的同時,將高維數據映…

uni-app引用外部js文件

全局引用 在App.vue文件中添加如下代碼 這樣在全局所有頁面中都可以直接使用該外部js中的函數 onLaunch: function() {var script document.createElement(script);script.src "https://www.test.com/api/testapi.js";document.body.appendChild(script); }, 單…

【IDEA+通義靈碼插件】實現屬于你的大模型編程助手

目錄 1.前言 2.下載安裝 3.解釋代碼 4.生成單元測試 5.生成注釋 6.智能補全 1.前言 大模型到底該以一種什么方式落地,從而嵌入我們的工作當中,助力我們工作效率的提升,其實最好的方式也許就是虛擬助手的方式,就像鋼鐵俠的&…

【OpenCV基礎(三)】Ubuntu系統下EasyPR環境配置

環境配置 1、資源下載2、環境配置2.1、1、將EasyPR壓縮包拷貝到Ubuntu 三種方法任選一種2.2、解壓得到EasyPR文件夾(文件夾一層進入后EasyPR資源內容)2.3、終端命令修改權限**chmod -R 777 ./ EasyPR**2.4、查找EasyPR/include/easypr/config.h,使用gedit方式打開2.…

uni-app app實現web-view H5圖片長按下載

問題和使用場景描述: uniapp app web-view中圖片無法長按保存,IOS下是正常的,但是Android下長按無反應 解決方案: 下載mui.min.js,放到項目中的static下(下載見最上面的壓縮包) 在static目錄下新建script.js mui.…