国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

chatgpt 逐字輸出 使用fetch/eventSource/fetchEventSouce進(jìn)行sse流式處理

這篇具有很好參考價值的文章主要介紹了chatgpt 逐字輸出 使用fetch/eventSource/fetchEventSouce進(jìn)行sse流式處理。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

chatgpt 逐字輸出 使用fetch/eventSource/fetchEventSouce進(jìn)行sse流式處理
前端使用vue

1.逐字輸出 閃動css樣式

<span id="response_row" class="result-streaming">{{ item.assistantContent }}</span>
.result-streaming:after {
  -webkit-animation: blink 1s steps(5, start) infinite;
  animation: blink 1s steps(5, start) infinite;
  content: "▋";
  margin-left: 0.25rem;
  vertical-align: baseline;
}

2.使用fetch/eventSource/fetchEventSource進(jìn)行sse流式處理

先貼最后成功使用的
使用fetchEventSource方法
參考代碼:https://blog.csdn.net/cuiyuchen111/article/details/129468291
參考/下載文檔:https://www.npmjs.com/package/@microsoft/fetch-event-source?activeTab=readme

以下為后端接口要求
chatgpt 逐字輸出 使用fetch/eventSource/fetchEventSouce進(jìn)行sse流式處理
前端代碼

<p v-if="item.requestFlag" class="content robot_content"><span id="response_row" class="result-streaming">{{ item.assistantContent }}</span></p>
<p class="content robot_content"><span v-html="item.assistantContent"></span></p>
 async getResponseFromAPI() {
          const that = this;
          this.sendLoading = true;
          // 用戶提問時間
          let userTime = that.getNowTime();
          const form = JSON.parse(JSON.stringify(this.form));
          console.log(form, "請求里的form");
          //物理添加 頁面
          that.conversations.push({
            userContentId: "",
            userContent: form.prompt,
            userContentDatetime: userTime,
            assistantContentId: "",
            assistantContent: "",
            assistantContentDatetime: userTime,
            requestFlag: true,
          });
          // 對話請求
          const abortController = new AbortController();
          let formData = new FormData();
          formData.append("chatid", this.currentChatId);
          formData.append("clientid", form.clientid);
          formData.append("prompt", form.prompt);
          const url = "xxxxx";
          const headers = new Headers();
          const body = formData;
          const eventSource = fetchEventSource(url, {
            method: "POST",
            headers,
            body,
            signal: abortController.signal,
            onmessage(e) {
              that.handleScrollBottom();
              that.form.prompt = "";
              const response_row = document.getElementById("response_row");
              console.log(e.data);
              let res = JSON.parse(e.data);
              let index = that.conversations.length - 1;
              if (res.message == "[DONE]") {
                res.data = JSON.parse(res.data);
                console.log(res.data);
                let obj = {
                  userContentId: res.data.userContentId,
                  userContent: res.data.userContent,
                  userContentDatetime: userTime,
                  assistantContentId: res.data.assistantContentId,
                  assistantContent: res.data.assistantContent,
                  assistantContentDatetime: that.getNowTime(),
                  requestFlag: false,
                };
                console.log(obj);
                that.$set(that.conversations, index, obj);
                that.sendLoading = false;
                abortController.abort();
                eventSource.close();
                console.log("我是結(jié)束??!");
              } else {
                var content = res.data;
                response_row.innerText += content;
                // console.log(content)
                // if (content.includes("[ENTRY]")) {
                //   content = content.replaceAll("[ENTRY]", "\n");
                // }
              }
            },
            onclose() {
              console.log("close");
              that.sendLoading = false;
              abortController.abort();
              eventSource.close();
            },
            onerror(error) {
              let index = that.conversations.length - 1;
              that.conversations.splice(index, 1);
              that.sendLoading = false;
              console.log("error", error);
              abortController.abort();
              eventSource.close();
            },
          });
        }

遇到的問題:
1.只調(diào)用一次事件 但fetch請求發(fā)送了兩次或多次且終止失敗

//按照fetchEventSource文檔內(nèi)的寫法 請求暫停無效
const ctrl = new AbortController();
fetchEventSource('/api/sse', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({
        foo: 'bar'
    }),
    signal: ctrl.signal,
});

//而后看到一種說法,fetchEventSource是針對EventSource API的,而不是xhr或fetch API
//因此定義EventSource存儲接口所返回的數(shù)據(jù) 使用EventSource的暫停方法 =》 fetchEventSource暫停成功
const eventSource = fetchEventSource(url, {
            method: "POST",
            headers,
            body,
            signal: abortController.signal,
            onmessage(e) {
                eventSource.close();
            },
            onclose() {
              eventSource.close();
            },
            onerror(error) {
              eventSource.close();
            },
          });

以下為fetch/eventSource使用過程中遇到的問題

1.使用fetch方式進(jìn)行sse流式處理
優(yōu)點:可以使用post請求
缺點:獲取到的數(shù)據(jù)處理困難 獲取事件返回格式或有錯誤
參考代碼:https://blog.csdn.net/betterAndBetter_/article/details/129900233
?????http://681314.com/A/YaHyYpjoPF

async function send() {
    const input = document.getElementById("input").value;
    const output = document.getElementById("output");
    output.innerText = "";
    const url = "/api/stream";
    const data = { "Prompt": input };
//直接獲取 Fetch 的response, 無法使用 await的話, Promise的方式也是可以的。
    const response = await fetch(url, {
        method: "POST",
        body: JSON.stringify(data),
        headers: {
            "Content-Type": "application/json"
        }
    })
	//獲取UTF8的解碼
    const encode = new TextDecoder("utf-8");
	//獲取body的reader
	  const reader = response.body.getReader();
	// 循環(huán)讀取reponse中的內(nèi)容
    while (true) {
        const { done, value } = await reader.read();
        if (done) {
            break;
        }
	// 解碼內(nèi)容
        const text = encode.decode(value);
	// 當(dāng)獲取錯誤token時,輸出錯誤信息
        if (text === "<ERR>") {
            output.innerText = "Error";
            break;
        } else {
	// 獲取正常信息時,逐字追加輸出
            output.innerText += text;
        }
    }
}

【記得補截圖】

2.使用eventSource進(jìn)行sse流式處理
優(yōu)點:獲取到的數(shù)據(jù)格式規(guī)范 易處理
缺點:無法使用post請求
參考b站視頻:https://www.bilibili.com/video/BV1QA411C7mN/?spm_id_from=333.880.my_history.page.click&vd_source=384646ea9baa6985ceb5331bff5b87b0

var rsource = (this.rsource = new EventSource(
        `/api/chat/repeat/${this.cid}`
      ));
      rsource.addEventListener("open", function () {
        console.log("connect");
      });

      //如果服務(wù)器響應(yīng)報文中沒有指明事件,默認(rèn)觸發(fā)message事件
      rsource.addEventListener("message", function (e) {
        console.log(`resp:(${e.data})`);
        var rconv = that.conversation[that.conversation.length - 1];
        if (e.data == "[DONE]") {
          rsource.close();

          rconv["loading"] = false;
          that.convLoading = false;
          that.refrechConversation();
          that.rsource = undefined;
          return;
        }

        var content = e.data;
        if (content.includes("[ENTRY]")) {
          content = content.replaceAll("[ENTRY]", "\n");
        }

        // 滾動到最下面
        that.handleScrollBottom();

        var idx = rconv.idx;
        rconv["speeches"][idx] += content;
        that.refrechConversation();
      });

      //發(fā)生錯誤,則會觸發(fā)error事件
      rsource.addEventListener("error", function (e) {
        console.log("error:" + e.data);
        rsource.close();
        that.rsource = undefined;
      });

由于eventSource獲取到的數(shù)據(jù)比fetch流暢許多,所以研究過eventSource能否使用post請求,使用過以下代碼,但失敗了
chatgpt 逐字輸出 使用fetch/eventSource/fetchEventSouce進(jìn)行sse流式處理
3.fetch和eventSource同時使用
優(yōu)點:可以很順利的請求并且獲取到數(shù)據(jù)
缺點:fetch支持post eventSource不支持post 對接口請求方式有要求 幾乎不太能兼容文章來源地址http://www.zghlxwxcb.cn/news/detail-467166.html

// 獲取表單元素
const form = document.querySelector('#my-form');

// 監(jiān)聽表單提交事件
form.addEventListener('submit', (event) => {
  event.preventDefault(); // 阻止默認(rèn)提交行為

  const formData = new FormData(form); // 創(chuàng)建 FormData 對象

  // 發(fā)送 POST 請求并接收 SSE 流式輸出
  fetch('/api/submit-form', {
    method: 'POST',
    body: formData
  }).then((response) => {
    // 如果請求成功,則創(chuàng)建 EventSource 對象監(jiān)聽 SSE 輸出
    if (response.ok) {
      const eventSource = new EventSource('/api/stream');

      eventSource.onmessage = (event) => {
        const data = JSON.parse(event.data);
        console.log(data); // 處理接收到的數(shù)據(jù)
      };

      eventSource.onerror = (error) => { // 監(jiān)聽錯誤事件
        console.error(error);
      };
    }
  }).catch((error) => {
    console.error(error);
  });
});

到了這里,關(guān)于chatgpt 逐字輸出 使用fetch/eventSource/fetchEventSouce進(jìn)行sse流式處理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • WPF實現(xiàn)類似ChatGPT的逐字打印效果

    WPF實現(xiàn)類似ChatGPT的逐字打印效果

    前一段時間ChatGPT類的應(yīng)用十分火爆,這類應(yīng)用在回答用戶的問題時逐字打印輸出,像極了真人打字回復(fù)消息。出于對這個效果的興趣,決定用WPF模擬這個效果。 真實的ChatGPT逐字輸出效果涉及其語言生成模型原理以及服務(wù)端與前端通信機(jī)制,本文不做過多闡述,重點是如何用

    2024年02月13日
    瀏覽(19)
  • Android okHttp-sse 實現(xiàn)chatgpt逐字逐句效果

    1. 什么是SSE Server-Send Events 服務(wù)器發(fā)送事件,簡稱SSE。服務(wù)器主動向客戶端推送消息,我們常見的有 WebSocket (SignalR) ,SSE 也是其中一種。 ? ? SSE 是HTML5規(guī)范的一部分,該規(guī)范非常簡單,主要由兩部分組成:第一部分是服務(wù)端與瀏覽器端的通訊協(xié)議(Http協(xié)議),第二部分是

    2024年02月07日
    瀏覽(21)
  • 用thinkphp+js模擬ChatGPT逐字打印的效果踩坑指南

    最近對ChatGPT里逐字輸出的效果很感興趣,起初以為是接口內(nèi)容返回之后使用css+js實現(xiàn)的純前端效果,深入一調(diào)研發(fā)現(xiàn)用的是Server-Sent Events(SSE)數(shù)據(jù)流實現(xiàn)的,看了sse的基本原理之后,就開始上手測試了,結(jié)果碰到一個小坑,卡了很久,這里分享一下: 直接問ChatGPT用thinkP

    2024年02月03日
    瀏覽(21)
  • ASP.NET Core Web API 流式返回,實現(xiàn)ChatGPT逐字顯示

    ASP.NET Core Web API 流式返回,實現(xiàn)ChatGPT逐字顯示

    ??作者:科技、互聯(lián)網(wǎng)行業(yè)優(yōu)質(zhì)創(chuàng)作者 ??專注領(lǐng)域:.Net技術(shù)、軟件架構(gòu)、人工智能、數(shù)字化轉(zhuǎn)型、DeveloperSharp、微服務(wù)、工業(yè)互聯(lián)網(wǎng)、智能制造 ??歡迎關(guān)注我(Net數(shù)字智慧化基地),里面有很多 高價值 技術(shù)文章, 是你刻苦努力也積累不到的經(jīng)驗 ,能助你快速成長。升職

    2024年02月22日
    瀏覽(26)
  • python+flask+eventSource打造流式chatGPT生成式API接口

    后端用python,前端用web,怎么打通chatGPT API連接? 如果你遇到這樣的情況: 科學(xué)上網(wǎng)登chat.openai.com開啟一個新聊天,總是出現(xiàn)網(wǎng)頁錯誤,刷新幾次就沒有對話的想法了。 獲取了chatGPT的APIkey,用網(wǎng)上一大堆PHP/JSP/CURL的代碼去試,效果很差,不是反應(yīng)慢,就是兼容性不好。 用

    2024年02月04日
    瀏覽(25)
  • ChatGPT 使用 拓展資料:吳恩達(dá)大咖 Building Systems with the ChatGPT API 輸出檢查

    ChatGPT 使用 拓展資料:吳恩達(dá)大咖 Building Systems with the ChatGPT API 輸出檢查

    ChatGPT 使用 拓展資料:吳恩達(dá)大咖 Building Systems with the ChatGPT API 輸出檢查 在本視頻中,將重點檢查系統(tǒng)生成的輸出。在向用戶展示輸出之前檢查輸出對于確保質(zhì)量非常重要,提供給他們的響應(yīng)的相關(guān)性和安全性,或者使用自動化或?qū)W習(xí)如何使用Moderation API。 但這一節(jié)課中,使

    2024年02月08日
    瀏覽(21)
  • vue2中使用EventSource(EventSourcePolyfill)實現(xiàn)持續(xù)的消息推送

    需求:要實現(xiàn)一個 管理員啟動、暫停、結(jié)束等一系列操作任務(wù)的時候,后端將消息通過EventSource傳遞給前端,前端展示出來 為什么要用EventSourcePolyfill,而不是EventSource? 答:因為在和后端建立連接的時候,需要傳遞token用來建立身份標(biāo)識,而eventSource的官網(wǎng)沒有找到相關(guān)傳參

    2024年02月01日
    瀏覽(15)
  • OpenAI ChatGPT API + FaskAPI SSE Stream 流式周轉(zhuǎn)技術(shù) 以及前端Fetch 流式請求獲取案例

    OpenAI ChatGPT API + FaskAPI SSE Stream 流式周轉(zhuǎn)技術(shù) 以及前端Fetch 流式請求獲取案例

    這篇文章當(dāng)時寫得比較匆忙,這里進(jìn)行一下更深入的補充 SSE 技術(shù)不是什么新鮮東西,就是一個 HTTP 請求和響應(yīng),關(guān)鍵就是響應(yīng)這個環(huán)節(jié),原始的響應(yīng)都是一次性的,普通的響應(yīng)是這樣的: Nginx 是一個靜態(tài)服務(wù)器,所謂靜態(tài)服務(wù)器,就是將一個靜態(tài)文件按照大小不同情況選擇

    2024年02月08日
    瀏覽(28)
  • 【Qt】使用Qt實現(xiàn)Web服務(wù)器(九):EventSource+JSON實現(xiàn)工業(yè)界面數(shù)據(jù)刷新

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包