Add save to Prisma (#1)

This commit is contained in:
Shu Ding 2023-05-22 14:35:37 +02:00 committed by GitHub
commit 3b8bb9dea4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 97 additions and 76 deletions

View file

@ -1,7 +1,6 @@
import { OpenAIStream, openai } from "@/lib/openai";
import { getServerSession } from "@/lib/session/get-server-session";
export const runtime = "edge";
import { prisma } from "@/lib/prisma";
export async function POST(req: Request) {
const json = await req.json();
@ -20,7 +19,25 @@ export async function POST(req: Request) {
const stream = await OpenAIStream(res);
return new Response(stream, {
let fullResponse = "";
const decoder = new TextDecoder();
const saveToPrisma = new TransformStream({
transform: async (chunk, controller) => {
controller.enqueue(chunk);
fullResponse += decoder.decode(chunk);
},
flush: async () => {
await prisma.chat.upsert({
where: {
id: json.id,
},
create: json,
update: json,
});
},
});
return new Response(stream.pipeThrough(saveToPrisma), {
status: 200,
headers: { "Content-Type": "text/event-stream" },
});

View file

@ -13,7 +13,7 @@ export interface ChatProps {
}
export function Chat({
id: _id,
id,
// create,
messages,
}: ChatProps) {
@ -22,7 +22,7 @@ export function Chat({
const { isLoading, messageList, appendUserMessage, reloadLastMessage } =
usePrompt({
messages,
_id,
id,
// onCreate: (id: string) => {
// router.push(`/chat/${id}`);
// },

View file

@ -4,10 +4,10 @@ import { nanoid } from "@/lib/utils";
export function usePrompt({
messages = [],
_id,
id,
}: {
messages?: Message[];
_id: string | undefined | null;
id: string | undefined;
}) {
const [isLoading, setIsLoading] = useState(false);
const [messageList, setMessageList] = useState(messages);
@ -23,7 +23,8 @@ export function usePrompt({
messageListRef.current = messageList;
}, [messageList]);
const appendUserMessage = useCallback(async (content: string | Message) => {
const appendUserMessage = useCallback(
async (content: string | Message) => {
// Prevent multiple requests at once
if (isLoadingRef.current) return;
@ -49,6 +50,7 @@ export function usePrompt({
const response = await fetch(`/api/generate`, {
method: "POST",
body: JSON.stringify({
id: id || nanoid(10),
messages: [...messageListSnapshot, userMsg].map((m) => ({
role: m.role,
content: m.content,
@ -99,7 +101,9 @@ export function usePrompt({
} finally {
setIsLoading(false);
}
}, []);
},
[id]
);
const reloadLastMessage = useCallback(async () => {
// Prevent multiple requests at once