如何在使用密钥登录的时候请求ChatGPT的聊天接口并实现流式输出

一、ChatGPT的参考API地址

API Reference

二、官网相关API介绍

        下图是正常请求时候的请求头和body体,这样请求的话是等结果都加载出来后一起出现,并且返回的结果也是标准的json格式。
在这里插入图片描述
如果想要实现和ChatGPT一样的效果,官网的这样推荐的,如下图
在这里插入图片描述
在这里插入图片描述
从上图可以看到它用的是sse实现的,并且请求的body体加上Stream:true就可以。请求过来的格式可以看到不是标准的json格式,如下图,所以我们要处理成json格式,并拿到数据
流式输出body体
请求结果

三、具体实现代码

       我们要怎么拿到数据并实现流式输出,具体代码如下:

// 发送消息的方法
// 参数 content 是发送的消息
function sendAnswer(content) {
    // 请求的body体
    const data = JSON.stringify({
      model: 'gpt-3.5-turbo',
      messages: [{ role: 'user', content: content }],
      stream: true
    })
    fetch('https://api.openai.com/v1/chat/completions', {
      method: 'POST',
     // 这个headers包括 "Content-Type":"application/json" 和 "Authorization", `Bearer ${key}`
     // 其中这个key是你的登录密钥
      headers: headers,  
      body: JSON.stringify({
        model: 'gpt-3.5-turbo',
        messages: [{ role: 'user', content: content }],
        // 启用流式处理
        stream:true
      }),
    })
      .then( response => {
      
      // 创建一个可读取响应体数据的读取器对象
        const reader = response.body.getReader();
        let buffer = '';
        // 这一部分是创建了一个装回复聊天信息的盒子
        const layoutBox = document.createElement("div");
        layoutBox.classList.add("layout");
        // dialogue 是创建的一个大的父盒子的名称
        dialogue.appendChild(layoutBox);
        const answerBox = document.createElement("span")
        answerBox.classList.add("answerList","list")
        layoutBox.appendChild(answerBox)   

        // 因为流式输出会逐个字出来,所以定义 answers 存放回复的消息,不存放的话后续用innerHTML插入的时候会被覆盖,只显示最后一个字符
        let answers = [];   
        // 这是一个JavaScript Promise的语法,表示当读取器(reader)读取完成后,执行一个函数(processResult)来处理结果(result)
        return reader.read().then(function processResult(result){
        // 解码,并将解码后的数据存放到buffer
          buffer += new TextDecoder().decode(result.value || new Uint8Array(),
          {stream: !result.done});
          // 这是以换行符将字符串分为多个部分,并过滤掉以[DONE]结尾的部分
          const parts = buffer.split('\n').filter(part => !part.endsWith('[DONE]'));;
          buffer = parts.pop();
          for(const part of parts){
            if(part.trim()){
              try {
                const response = JSON.parse(part.slice('data:'.length));
                console.log(response.choices[0].delta.content);
                answerContent = response.choices[0].delta.content;
                // 将内容存放到数组中,这个判断是answerContent 开头和结尾存在JSON解析不成功的部分,会在聊天记录的开始和结尾显示undefined
                if (answerContent !== undefined) {
                  answers.push(answerContent)
                }
              } catch (error) {
                console.error(`Failed to parse JSON: ${error.message}`);
                continue;
              }
           
            }
          }
          // 将数组中的内容以html的形式插入到聊天回复框中,如果不加join("")数组中的每一个字符都会被逗号隔开
          // 引入第三方库 marked 进行markdown格式化   import {marked} from "marked";
          answerBox.innerHTML = marked( answers.join(""),{
            headerIds: false,
            mangle: false
         });
         // 引入第三方库 hljs ,实现代码块高亮   import hljs from 'highlight.js'
         hljs.highlightAll(); 

         if(result.done){
            return;
          }
           return reader.read().then(processResult);
        })
      })
  }

实现效果如下:
实现效果

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java实现ChatGPT流式接口可以使用OpenAI GPT-3的REST API进行通信。下面是一个简单的示例代码: ```java import okhttp3.*; import org.json.JSONObject; import java.io.IOException; public class ChatGPTClient { private static final String API_ENDPOINT = "https://api.openai.com/v1/engines/davinci/completions"; private final OkHttpClient client; private final String apiKey; public ChatGPTClient(String apiKey) { this.apiKey = apiKey; this.client = new OkHttpClient(); } public String sendMessage(String message) throws IOException { RequestBody requestBody = new FormBody.Builder() .add("model", "davinci") .add("prompt", message) .build(); Request request = new Request.Builder() .url(API_ENDPOINT) .header("Authorization", "Bearer " + apiKey) .post(requestBody) .build(); try (Response response = client.newCall(request).execute()) { JSONObject json = new JSONObject(response.body().string()); String completions = json.getJSONArray("choices").getJSONObject(0).getString("text"); return completions; } } public static void main(String[] args) { ChatGPTClient client = new ChatGPTClient("YOUR_API_KEY"); try { String message = "Hello!"; while (!message.equals("bye")) { String response = client.sendMessage(message); System.out.println("AI: " + response); // 接收用户输入 // ... } } catch (IOException e) { e.printStackTrace(); } } } ``` 上述代码使用了OkHttp库进行HTTP请求,并使用JSONObject解析响应结果。请确保你替换`YOUR_API_KEY`为你的OpenAI API密钥。 这个示例代码只是一个基本的实现,你可以根据自己的需求进行扩展和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值