我测试了使用 Nest 的 SSE 的端点,它在我的本地计算机上成功了。
将我的 Nest.js 应用程序部署到 AWS Lambda 后,我发现该端点无法在无服务器上运行。
我发现了来自 AWS Lambda 的响应流,但没有找到适合我的案例的任何解决方案。
您知道如何使用 Nest.js 在 AWS Lambda 上运行流函数吗?
async sendMessage(dto: ChatDto): Promise\<Observable\<{ data: string }\>\> {
const configuration = {
apiKey: process.env.OPENAI_API_KEY
}
const openai = new OpenAI(configuration)
return new Observable((subscriber) => {
(async () => {
try {
const responseStream = await openai.chat.completions.create({
model: dto.model,
messages: dto.messages as any,
stream: true,
})
for await (const chunk of responseStream) {
const response = chunk.choices[0].delta.content;
subscriber.next({ data: response })
}
subscriber.complete()
} catch (error) {
subscriber.error(error)
}
})()
})
}
@UseGuards(JwtGuard, ApiKeyGuard)
@Post("conversation")
@Sse()
sendMessage(@Body() dto: ChatDto) {
return this.service.sendMessage(dto)
}
我需要使用 Nest.js 修复我的 AWS Lambda 问题。
这可以使用 AWS Lambda 响应流来实现。你可以编写自己的 Lambda 处理程序(它只能在 Lambda 上运行,而不能在其他地方运行),我还没有找到任何人以“NestJS 方式”运行它。
这是响应流 lambda 处理程序的示例:
exports.handler = awslambda.streamifyResponse(
async (event, responseStream, context) => {
responseStream.setContentType("text/event-stream");
responseStream.write("event: test\n");
responseStream.write('data: {"key": "value"}');
responseStream.write('\n\n');
responseStream.end();
}
);
SSE只是一个MIME类型text/event-stream的响应流。命名事件的格式为:
event: firstEvent
data: {...}
event: secondEvent
data: {...}
...
为了让您的 SSE NestJS 控制器正常工作,需要有人制作一个适配器库 - 我还没有找到一个可以处理 NestJS SSE 实现的适配器库。也许你刚刚给了我一个想法。
请记住,实际上,无服务器确实并不适合这样的用例,您可能会遇到比您想象的更多的麻烦。我真的建议在这个用例中放弃 Lambda,而只使用 ECS/EC2 来处理这个问题。