我正在使用Node.js和Express编写一个小型REST API,并使用AI.JSX和OpenAI API。AI.JSX文档提供了如何使用SSE在Next.js应用程序的上下文中流式传输响应的示例,并使用Vercel Edge Function:
https://docs.ai-jsx.com/tutorials/aijsxTutorials/part5-nextjs#the-aijsx-edge-function
上面使用了函数toStreamResponse,它创建/返回一个新的响应对象。因此,这种方法不与Express集成,Express希望您使用路由处理程序中现有的响应对象。我如何将这两种方法结合在一起?我已经尝试使用toTextStream函数:
routes.post("/chat-stream", async (req, res) => {
const { system = "", user = "" } = req.body || {};
if (!user) {
res.sendStatus(400);
return;
}
const RequestEl = getRequestEl(user, system);
const stream = toTextStream(RequestEl);
const reader = stream.getReader();
res.setHeader("Content-Type", "text/event-stream");
res.setHeader("Connection", "keep-alive");
res.setHeader("Cache-Control", "no-cache");
res.flushHeaders();
const pump = () => {
reader
.read()
.then(({ value, done }) => {
if (done) {
res.end();
return;
}
res.write(value);
pump();
})
.catch((err) => {
console.error(err);
if (!res.headersSent) {
res.status(500);
}
res.end();
});
};
pump();
});
字符串
使用上面的代码,我可以在Chrome开发工具中看到一个响应流,但是客户端AI. JSON提供的React钩子并没有报告收到的任何数据。换句话说,这是:
const { error, current, fetchAI } = useAIStream({});
型
始终报告error
和current
均为null。
1条答案
按热度按时间gudnpqoy1#
最简单的方法是直接将
toStreamResponse
中的代码拉到我的Express应用程序中,并使用流管道(尽管我不确定为什么在管道调用中需要any):字符串