提问人:Alexxino 提问时间:4/30/2023 最后编辑:Alexxino 更新时间:5/31/2023 访问量:7760
使用 Node.js 和 Express.js 的 OpenAI 完成流
OpenAI Completion Stream with Node.js and Express.js
问:
我正在尝试构建一个 ChatGPT 网站克隆,现在我需要制作逐字显示结果的流完成效果。 我的服务器是使用 Express.js 框架的 TypeScript Node.js 应用程序。
路线如下:
import express, { Request, Response } from 'express';
import cors from 'cors';
import { Configuration, OpenAIAPI } from 'openai';
// ...
app.post('/api/admin/testStream', async (req: Request, res: Response) => {
const { password } = req.body;
try {
if (password !== process.env.ADMIN_PASSWORD) {
res.send({ message: 'Incorrect password' });
return;
}
const completion = await openai.createCompletion({
model: 'text-davinci-003',
prompt: 'Say this is a test',
stream: true,
}, { responseType: 'stream' });
completion.data.on('data', (chunk: any) => {
console.log(chunk.toString());
});
res.send({ message: 'Stream started' });
} catch (err) {
console.log(err);
res.send(err);
}
});
// ...
现在,它给了我一个错误说
属性“on”在类型“CreateCompletionResponse”上不存在。ts(2339)
即使我设置了 .{ responseType: 'stream' }
如何解决这个问题并将响应逐块发送到前端?(我正在使用 Socket.IO。
答:
17赞
Alexxino
5/1/2023
#1
终于在@uzluisf的帮助下解决了! 这是我所做的:
import express, { Request, Response } from 'express';
import cors from 'cors';
import { Configuration, OpenAIAPI } from 'openai';
import http, { IncomingMessage } from 'http';
// ...
app.post('/api/admin/testStream', async (req: Request, res: Response) => {
const { password } = req.body;
try {
if (password !== process.env.ADMIN_PASSWORD) {
res.send({ message: 'Incorrect password' });
return;
}
const completion = await openai.createChatCompletion({
model: 'gpt-3.5-turbo',
messages: [{ role: 'user', content: 'When was America founded?' }],
stream: true,
}, { responseType: 'stream' });
const stream = completion.data as unknown as IncomingMessage;
stream.on('data', (chunk: Buffer) => {
const payloads = chunk.toString().split("\n\n");
for (const payload of payloads) {
if (payload.includes('[DONE]')) return;
if (payload.startsWith("data:")) {
const data = JSON.parse(payload.replace("data: ", ""));
try {
const chunk: undefined | string = data.choices[0].delta?.content;
if (chunk) {
console.log(chunk);
}
} catch (error) {
console.log(`Error with JSON.parse and ${payload}.\n${error}`);
}
}
}
});
stream.on('end', () => {
setTimeout(() => {
console.log('\nStream done');
res.send({ message: 'Stream done' });
}, 10);
});
stream.on('error', (err: Error) => {
console.log(err);
res.send(err);
});
} catch (err) {
console.log(err);
res.send(err);
}
});
// ...
欲了解更多信息,请访问 https://github.com/openai/openai-node/issues/18
还设法使用 Socket.IO 事件发送消息块!
顺便说一句,如果有人需要查看此应用程序的更多内容,您可以查看以下链接:
评论
0赞
texas697
5/31/2023
您的客户端代码是什么样子的
2赞
Alexxino
5/31/2023
@texas697你可以在这里找到整个代码库:github.com/alessandrofoglia07/LeafGPT-FE 前端;github.com/alessandrofoglia07/LeafGPT-BE 后端;
0赞
Kitson
5/31/2023
谢谢你,感谢示例代码的链接!
评论
completion.data.on('data', ...);
completion.on('data', ...);