// main function for handling the route
exports.chat = catchAsync(async (req, res, next) => {
const { question, sessionId } = req.body;
if (!question || !sessionId) {
return res
.status(400)
.json({ status: "fail", message: "Please provide a prompt" });
}
let session = await sessionModel.get(sessionId);
session.messages.push({ role: "user", content: question });
const responseStream = await chatModel(session.system, session.messages);
let assistantMessage = "";
for await (const chunk of responseStream) {
const lines = chunk
.toString("utf8")
.split("\n")
.filter((line) => line.trim().startsWith("data: "));
for (const line of lines) {
const message = line.replace(/^data: /, "");
if (message === "[DONE]") {
res.end();
session.messages.push({
role: "assistant",
content: assistantMessage,
});
await sessionModel.set(sessionId, session);
return;
}
const json = JSON.parse(message);
const token = json.choices[0].delta.content;
if (token) {
res.write(token);
assistantMessage += token;
res.flush();
}
}
}
});
// chatModel funciton that process the api calling
const { Configuration, OpenAIApi } = require("openai");
const configuration = new Configuration({
apiKey: process.env.OPENAI_API_KEY,
});
const openAi = new OpenAIApi(configuration);
module.exports = async (systemPrompt, messagesHistory) => {
let lastMessages = messagesHistory.slice(-50);
let responseStream;
try {
responseStream = await openAi.createChatCompletion(
{
model: "gpt-3.5-turbo",
messages: [
{
role: "system",
content: systemPrompt,
},
...lastMessages,
],
temperature: 0.7,
stream: true,
},
{
responseType: "stream",
}
);
} catch (err) {
console.log(err);
}
return responseStream.data;
};