有没有办法直接在本机反应中逐字传输chatgpt api的响应(使用javascript)

2024-04-20

我想直接在 React Native (expo) 中使用 Chat GPT Turbo api 与逐字流这里是没有流的工作示例

  fetch(`https://api.openai.com/v1/chat/completions`, {
  body: JSON.stringify({
    model: 'gpt-3.5-turbo',
    messages: [{ role: 'user', content: 'hello' }],
    temperature: 0.3,
    max_tokens: 2000,
  }),
  method: 'POST',
  headers: {
    'content-type': 'application/json',
    Authorization: 'Bearer ' + API_KEY,
  },
}).then((response) => {
  console.log(response); //If you want to check the full response
  if (response.ok) {
    response.json().then((json) => {
      console.log(json); //If you want to check the response as JSON
      console.log(json.choices[0].message.content); //HERE'S THE CHATBOT'S RESPONSE
    });
  }
});

我可以改变什么来逐字流数据


OpenAI API 依赖于 SSE(服务器端事件 https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#event_stream_format) 将响应流式传输回给您。如果您通过了stream当您的 API 请求中包含参数时,您将收到由 OpenAI 计算的数据块。 这会产生模仿某人打字的实时响应的错觉。

最难弄清楚的部分可能是如何将前端与后端连接起来。每次后端收到一个新块时,您都希望将其显示在前端中。

我创建了一个简单的 NextJs 项目Replit https://replit.com/@picsoung/OpenAi-Streaming这恰恰证明了这一点。现场演示 https://OpenAi-Streaming.picsoung.repl.co

你需要安装更好的 sse 包 https://www.npmjs.com/package/better-sse

npm install better-sse

服务器端在 API 路由文件中

import {createSession} from "better-sse";

const session = await createSession(req, res);
      if (!session.isConnected) throw new Error('Not connected');

const { data } = await openai.createCompletion({
  model: 'text-davinci-003',
  n: 1,
  max_tokens: 2048,
  temperature: 0.3,
  stream: true,
  prompt: `CHANGE TO YOUR OWN PROMPTS`
}, {
  timeout: 1000 * 60 * 2,
  responseType: 'stream'
});

//what to do when receiving data from the API
data.on('data', text => {
  const lines = text.toString().split('\n').filter(line => line.trim() !== '');
  for (const line of lines) {
    const message = line.replace(/^data: /, '');
    if (message === '[DONE]') { //OpenAI sends [DONE] to say it's over
      session.push('DONE', 'error');
      return;
    }
    try {
      const { choices } = JSON.parse(message);
      session.push({text:choices[0].text});
    } catch (err) {
      console.log(err);
    }
  }
});

//connection is close
data.on('close', () => { 
  console.log("close")
  res.end();
});

data.on('error', (err) => {
  console.error(err);
});

现在您可以在前端调用此 API 路由

let [result, setResult] = useState("");

//create the sse connection
const sse = new EventSource(`/api/completion?prompt=${inputPrompt}`);

//listen to incoming messages
sse.addEventListener("message", ({ data }) => {
  let msgObj = JSON.parse(data)
  setResult((r) => r + msgObj.text)
});

希望这是有道理的,并帮助其他有类似问题的人。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法直接在本机反应中逐字传输chatgpt api的响应(使用javascript) 的相关文章

  • 在反应中将索引从一个函数传递到另一个函数

    我有一个项目列表 单击删除按钮后该项目将被删除 我知道执行此操作的步骤 但我不知道如何将密钥传递到 dlt item 范围 http jsfiddle net 3Ley7uac 1 http jsfiddle net 3Ley7uac 1
  • JavaScript 调用函数

    我最近一直在测试一些代码 试图更好地理解 javascript 然后我遇到了call 我无法很好地理解的功能 我有以下代码 function hi console log hi var bye function param param2 c
  • ng-focus 发射两次而 ng-blur 从不发射

    到目前为止 我对 Angular 已经有了相当的经验 但这似乎是在较低级别上发生的 DOM 事件传播方式的事情 由于某种原因 在我的申请的一部分中 我有ng focus and ng blur一样的input 但是ng focus事件触发两
  • 嵌套 forEach:未捕获类型错误:data.forEach 不是函数

    我不想使用任何 for 循环或任何常规循环 我正在尝试使用forEach但我收到错误 未捕获的类型错误 data forEach 不是函数 return falsyData map function data data forEach fu
  • 停止 jQuery 循环设置 display:none;

    我正在创建一个小游戏 用户从一组项目中进行选择 然后对所选项目进行洗牌并选择一个 我正在使用 jQuery 循环 http jquery malsup com cycle http jquery malsup com cycle 运行主动画
  • 服务器重新启动时显示等待页面

    我有一个服务器并为其创建一个 Web 界面 如果用户按下页面上的重新启动按钮 则用户将被重定向到reboot php他应该看到一个旋转 gif 直到服务器再次可访问并且服务器通过 shell 执行重新启动 如果服务器可以访问 那么我需要重定
  • 如何使用 JavaScript 或 jQuery 从 URL 下载文件?

    我使用 jQuery fileDownload 插件从 URL 下载文件 fileDownload url contentType text csv contentDisposition attachment filename url sp
  • JS Facebook登录iOS8

    我的 facebook 应用程序上的登录按钮在 iOS 8 中完全停止工作 我以为这是我所做的事情 但是当我从他们的网站获取 facebook 示例 html 并将其应用到我的页面时 它仍然不起作用 我的应用程序 ID 已被替换 与 xxx
  • Node.js npm mssql 函数返回未定义

    我使用 mssql 和 node js 连接到 sql server 数据库 我试图通过将连接代码包装在具有一个查询参数的函数中来减少代码 当我从 router get 函数中的 with 调用该函数时 它返回未定义 任何帮助将非常感激 f
  • 如何从主体上的 onClick 事件获取鼠标单击的绝对位置?

    我试图获取鼠标单击相对于浏览器 主体的绝对位置 顶部和左侧 not主体内的任何父元素 我有一个绑定到 body 的侦听器 但 e pageX 和 e pageY 为我提供了相对于 div 的位置 请注意 我可以利用 jQuery 和 YUI
  • 封装的闭包与类?

    我是 JS 来自 C etc 的新手 我突然想到闭包似乎是比类更简单 更方便的处理封装的方法 这段代码似乎给出了一种处理封装的简单方法 function addProperty o var value o get function retu
  • TSConfig JSX:React JSX 与 React

    在将 Typescript 与 React 一起使用时 我们必须指定jsx in compilerOptions in tsconfig json file It has preserve react react native react
  • Mustache javascript:如何处理布尔值

    我有一个 JavaScript 对象obj键的值可以是true or false 该值被传递给 Mustache 模板 JavaScript 对象 obj like true or false 模板 span like span 现在我希望
  • HTML5:从存储的二进制字符串播放视频

    我正在尝试使用 FileReader readAsBinaryString Blob File 将视频文件的内容作为二进制字符串读取 如示例中所示http www html5rocks com en tutorials file dndfi
  • 带条件的 Array.join()

    我该如何使用Array join 有条件的函数 例如 var name aa bb var s name join 输出是 aa bb 我想添加一个条件 仅显示不为空的单词 aa bb 您可以使用Array filter https dev
  • 反应本机文本输入焦点

    我的应用程序中有一个表单 我希望用户能够通过单击 下一步 返回按钮转到下一个 TextInput 我的输入组件 export default class Input extends Component focusNextField next
  • 添加 X 轴标题会导致 Uncaught RangeError:minimumFractionDigits value is out of range in Chart.js

    我正在尝试向 Chart js 图表的 X 轴添加标题 但是当我将标题属性放在 x 轴上时 出现错误 Uncaught RangeError minimumFractionDigits value is out of range 但它并没有
  • Javascript 仅在 Chrome 中打开开发者工具后才起作用

    我和这里有同样的问题 为什么JavaScript只有在IE中打开开发者工具一次后才能工作 https stackoverflow com questions 7742781 why javascript only works after o
  • React Native 中 SVG 中的定位图标

    背景 我正在尝试按照本教程将工具提示添加到react native svg图表中 教程链接 Link https levelup gitconnected com adding tooltip to react native charts
  • Material-UI 中 IconButton 的悬停效果

    图标按钮悬停 https i stack imgur com lsYHX png 这是我正在使用的 Material UI 中的 iconButton 正如您所看到的 当您将鼠标悬停在图标上时 图标周围有一个轻微的灰色边框 禁用此功能的属性

随机推荐