教你如何零成本从0到1,开发上线一个对接了openAI的机器人 您所在的位置:网站首页 网站的api怎么对接 教你如何零成本从0到1,开发上线一个对接了openAI的机器人

教你如何零成本从0到1,开发上线一个对接了openAI的机器人

2023-04-10 23:58| 来源: 网络整理| 查看: 265

在createChatCompletion的api中,我们将参数stream设置为true如:stream: true,即可以实现streaming输出。该api还提供了第二个options参数,用来配置axios,这里将第二个参数配置为{responseType: 'stream'}

其次,既然传输方式改了,我们就需要考虑下技术选型。以前我们使用的是客户端利用ajax一次性将服务端的数据”拿过来”,而现在我们需要改变成服务器向客户端推送数据。关于推送数据,常用的方式除了 WebSocket,还有Server-Sent Events,这两篇文章都出自阮一峰老师的博客,可以看下。

而我们将会采用websocket。

为什么不用sse?一:sse只支持单向传输,也就是说客户端还是要以其他方式向服务端请求数据。二:EventSource仅支持监听GET。

安装koa-websocket,服务端websocket实现:npm i -S [email protected]

添加文件lib/chat.js,内容如下

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354module.exports = () => { return async (ctx, next) => { try { ctx.websocket.on('message', async function (message) { const params = message.toString() if (!params || params.length === 0) { return } console.debug(__filename, '[createChatCompletion] Request params:', params); const streamResponse = await ctx.openai.createChatCompletion({ model: "gpt-3.5-turbo", stream: true, messages: [{ role: "user", content: params }], }, {responseType: 'stream'}); if (streamResponse.status !== 200) { console.error(streamResponse.statusText) return ctx.websocket.send(streamResponse.statusText); } streamResponse.data.on('data', chunk => { const lines = chunk .toString() .split('\n') .filter((line) => line.trim().startsWith('data: ')) for (const line of lines) { const message = line.replace(/^data: /, '') if (message === '[DONE]') { // 客户端判断输出内容是否是`[DONE]` console.debug('内容结束...') return ctx.websocket.send('[DONE]') } const json = JSON.parse(message) const token = json.choices[0].delta.content if (token) { console.debug('发送...', token) ctx.websocket.send(token) } } }) }); } catch (e) { console.error(e.message) ctx.websocket.send(e.message) } finally { await next(); } };};

修改index.js,添加以下代码,使koa和websocket共享一个端口



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有