Untitled

 avatar
unknown
javascript
2 years ago
2.1 kB
8
Indexable
// 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;
};