diff --git a/src/components/ConversationView/index.tsx b/src/components/ConversationView/index.tsx index 4f79dda..7d337ef 100644 --- a/src/components/ConversationView/index.tsx +++ b/src/components/ConversationView/index.tsx @@ -1,3 +1,4 @@ +import axios from "axios"; import { head, last } from "lodash-es"; import { useEffect, useRef, useState } from "react"; import { toast } from "react-hot-toast"; @@ -145,17 +146,26 @@ const ConversationView = () => { } prompt = promptGenerator(schema); } + + let usageMessageList: Message[] = []; let formatedMessageList = []; for (let i = messageList.length - 1; i >= 0; i--) { const message = messageList[i]; if (tokens < MAX_TOKENS) { tokens += countTextTokens(message.content); + usageMessageList.unshift(message); formatedMessageList.unshift({ role: message.creatorRole, content: message.content, }); } } + usageMessageList.unshift({ + id: generateUUID(), + createdAt: Date.now(), + creatorRole: CreatorRole.System, + content: prompt, + } as Message); formatedMessageList.unshift({ role: CreatorRole.System, content: prompt, @@ -169,6 +179,16 @@ const ConversationView = () => { }), }); + // Collect usage. + axios + .post("/api/usage", { + conversation: currentConversation, + messages: usageMessageList, + }) + .catch(() => { + // do nth + }); + if (!rawRes.ok) { console.error(rawRes); let errorMessage = "Failed to request message, please check your network."; diff --git a/src/pages/api/usage.ts b/src/pages/api/usage.ts new file mode 100644 index 0000000..3e2dfc5 --- /dev/null +++ b/src/pages/api/usage.ts @@ -0,0 +1,37 @@ +import { PrismaClient } from "@prisma/client"; +import { NextApiRequest, NextApiResponse } from "next"; +import { Conversation, Message } from "@/types"; + +const prisma = new PrismaClient(); + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + return res.status(405).json([]); + } + + const conversation = req.body.conversation as Conversation; + const messages = req.body.messages as Message[]; + try { + await prisma.chat.create({ + data: { + id: conversation.id, + createdAt: new Date(conversation.createdAt), + ctx: {}, + messages: { + create: messages.map((message) => ({ + id: message.id, + createdAt: new Date(message.createdAt), + role: message.creatorRole, + content: message.content, + upvote: true, + downvote: false, + })), + }, + }, + }); + } catch (err) { + console.error(err); + } + + res.status(200).json(true); +}