仿ai会话逐字输出,接受stream流

用fetch来接受stream流实现文字逐字展示的效果,

  fetch(`url(请求地址)`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',//规定的传输的格式
      'Authorization': localStorage.token//携带的token
    },
    body: JSON.stringify(obj)//请求体中携带的参数
  })
    .then(res => {
      const reader = res.body.getReader();
      let index = null
      // 处理解析出来的元素进行页面展示
      const appendText = (text) => {
        if (text != '') {
         //滚动到最底部在,每次拼接文字的时候
          nextTick(() => {
            let dom = document.querySelector('.textAAA') as Element
            dom.scrollIntoView(false)
          })
          // 逐字展示时遇到代码
            dailogData.value[(dailogData.value.length - 1)].content += String(text)
        }
      };
      // 读取stream流,reader一次只接受一次相应的数据
      const readStream = () => {
        reader.read().then(({
          done,
          value
        }) => {
          // 是否完成,如果已完成将数据替换为根据真实id查询到的数据
          if (done) {
            let obj = {
              segment_ids: searchGroupId.value
            }
            getchatlogApi(projectId.value, obj).then((ress: any) => {
              ress.items[1] = resertFormat(ress.items[1])
              dailogData.value.splice(dailogData.value.length - 2, 2, ...ress.items)
              isStatue.value = false
              searchValue.value = ''
            })
            return;
          }
          const text = new TextDecoder('utf-8').decode(value);
            //将下图数据格式处理为想要的格式
          let _data = text?.split('\n\n') || [];
          for (const it of _data) {
            let item = it.replace(/^(data: \[DONE\])|^(data:)/, '');
            if (item) {
              let res = JSON.parse(item);
              if (res.event == 'rename') {
                mainStore.leftRoueterItem.name = res.text
              }
              if (res.event == 'cmpl') {
                appendText(res.text);
              } else {
                searchGroupId.value.push(res.id)
              }
            }
          }
          readStream();
        });
      };
      readStream();
    })

我的操作是在发出请求后先放上去假数据来创建dom元素,然后将请求到的数据逐字拼接上去,拼接完成之后,再把假数据替换为真实数据,

将此处的格式替换

滚动到底部要注意是给子级加的属性

给overLow元素的子级添加scrollIntoView方法,为true时,顶部,为false时底部

 let dom = document.querySelector('.textAAA') as Element

dom.scrollIntoView(false)

2.停止输出

 全局声明变量,

let controller = new AbortController();

let signal = controller.signal;

fetch的第二个参数多传一个signal,

当点击停止按钮时,  controller.abort();就可以暂停输出了

注意:暂停之后这个变量就不能再进行第二次请求发送了,之后的请求都会被拦截,所以要对变量进行重新赋值,一般是暂停按钮时,或者页面切换时给他暂停操作。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现调用openai api逐字输出聊天信息,您需要使用OpenAI的GPT-3模型,这是一个自然语言处理模型,可以生成具有上下文和连贯性的自然语言文本。 以下是实现此目标的步骤: 1.注册OpenAI账号,并创建一个API密钥。 2.安装OpenAI API客户端。 3.在您的代码中导入OpenAI API客户端,并使用您的API密钥进行身份验证。 4.构建一个聊天输入,向OpenAI API发送请求,并获取API返回的文本。 5.逐字输出API返回的文本,以模拟实时聊天效果。 以下是一个示例代码,演示如何使用Python实现逐字输出聊天信息: ``` import openai import time # 设置API密钥 openai.api_key = "YOUR_API_KEY_HERE" # 聊天的开始语句 prompt = "Hello, how are you today?" # 开始聊天 while True: # 向OpenAI API发送请求,并获取API返回的文本 response = openai.Completion.create( engine="davinci", prompt=prompt, max_tokens=1 ) # 从API返回的文本中获取下一个字符 next_char = response.choices[0].text # 输出下一个字符,并等待一定时间 print(next_char, end="", flush=True) time.sleep(0.5) # 如果输出的字符是换行符,则打印一个新的提示语句,准备开始下一轮聊天 if next_char == "\n": prompt = input("> ") ``` 在此示例中,我们使用OpenAI的davinci引擎来生成文本。我们设置max_tokens参数为1,以确保每次API调用只生成一个字符。我们还使用time.sleep()函数来等待一定时间,以模拟实时聊天的效果。 请注意,此示例中的代码仅适用于演示目的,您可能需要根据您的具体要求进行修改和定制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值