我尝试了openai-streams和nextjs-openai, 它们只适用于Node 18+,但是在Node 17及以下版本上失败。由于Digital Oceans应用平台目前不支持Node 18,所以我被限制在Node 17及以下版本。
我还尝试了this method,它在客户端方面效果良好,但会暴露API密钥。我想在NextJS API路由中实现它,但无法将流式响应传递给客户端。
使用下面的代码,我只能从API路由获取第一个响应块,并且无法获得流式响应以产生ChatGPT效果。请亲切地帮助。
// /api/prompt.js
import { Configuration, OpenAIApi } from "openai";
import { Readable } from "readable-stream";
const configuration = new Configuration({
apiKey: process.env.NEXT_PUBLIC_OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);
export default async function handler(req, res) {
const completion = await openai.createCompletion(
{
model: "text-davinci-003",
prompt: "tell me a story",
max_tokens: 500,
stream: true,
},
{ responseType: "stream" }
);
completion.data.on("data", async (data) => {
const lines = data
.toString()
.split("\n")
.filter((line) => line.trim() !== "");
for (const line of lines) {
const message = line.replace(/^data: /, "");
if (message === "[DONE]") {
return;
}
try {
const parsed = JSON.parse(message);
const string = parsed.choices[0].text;
Readable.from(string).pipe(res);
} catch (error) {
console.error("Could not JSON parse stream message", message, error);
}
}
});
// /components/Completion.js
export default function Completion() {
const [text, setText] = useState();
const generate = async () => {
const response = await fetch("/api/prompt");
console.log("response: ", response);
const text = await response.text();
console.log("text: ", text);
setText((state) => state + text);
};
// ... rest
}
data.choices[0].message?.content
)和自定义字段的对象。我的理解是,由于OpenAiStream
格式化响应的原因,这是不可能的,您需要构建一个自定义流。 - undefineddata.choices[0].message?.content
)和自定义字段的对象。我的理解是,由于OpenAiStream
格式化响应的原因,这是不可能的,您需要构建一个自定义流程。 - DeveloperRyan