• 使用fetch工具发送请求
  • 返回的文本不是规律的需要处理提取出自己想要的文本
  • 大概率返回的是markdown格式的,自己用相关的插件将文本展示。(react可以使用react-markdown)
	// 需要用fetch
const fetchData = async () => {
    const payloadData = {  
		"query": "你是谁",  
		"knowledge_base_name": "wenzhou",// 知识库名称  
		"stream": true, // true为流式输出  
		"prompt_name": "default"  //默认传空为default  
	};
    try {
      const url = 'http://[服务地址]/api/v1/chat';
      // const searchHistoryTmp = cloneDeep(nowChat);
      // searchHistoryTmp.sessionId = '5ef0ff061c5642778f7f2d19f39b741b';
      const response = await fetch(url, {
        method: 'POST',
        body: payloadData,
        headers: {
          'Content-Type': 'application/json'
        }
      });
      const encode = new TextDecoder('utf-8');
      const reader = response.body?.getReader();
      // 定义本次对话的返回
      let accumulatedText = '';
 
      // 处理流式返回,读取流
      while (reader) {
        const { done, value } = await reader.read();
        const decodeText = encode.decode(value);
 
        if (done) {
          console.log('***********************done');
          console.log(value);
          break;
        }
        // 解析返回的数据,流式返回每次获取的decodeText都是不规律的,需要自己去用正则或者其他条件去配对取出想要的文本了
        const text = getReaderText(decodeText);
        if (text) {
        // 将每次读取的文本累加到accumulatedText中,然后每次累加都渲染页面就有打字机效果了
          accumulatedText += text;
          // 将accumulatedText存入state中
	       
        }
      }
    } catch (error) {
      message.error('接口请求失败');
      console.error('Error receiving or rendering stream response:', error);
    }
};
 
// 将每次读取流式返回的文本处理提取方法,需要根据具体的返回修改条件等
const getReaderText = (inputString: any) => {
    const regex = /"data"\s*:\s*"([^"]*)"/g;
    let result = '';
 
    // 使用正则表达式进行匹配,并将匹配结果拼接到结果字符串中
    let match;
    while ((match = regex.exec(inputString)) !== null) {
      // 匹配到的内容
      const content = match[1];
      // 将匹配到的内容拼接到结果字符串中,去掉换行。按需自己考量方法或者用更好的办法
      result += content.replace(/\\n/g, '\n');
    }
    // 返回拼接后的结果字符串
    return result;
};