Add message actions (#482)

This commit is contained in:
Jeremy 2024-11-05 17:15:51 +03:00 committed by GitHub
parent 94f563f179
commit 171914941e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
20 changed files with 1011 additions and 150 deletions

View file

@ -1,6 +1,5 @@
import {
convertToCoreMessages,
generateObject,
Message,
StreamData,
streamObject,
@ -18,10 +17,17 @@ import {
getDocumentById,
saveChat,
saveDocument,
saveMessages,
saveSuggestions,
} from '@/db/queries';
import { Suggestion } from '@/db/schema';
import { generateUUID, sanitizeResponseMessages } from '@/lib/utils';
import {
generateUUID,
getMostRecentUserMessage,
sanitizeResponseMessages,
} from '@/lib/utils';
import { generateTitleFromUserMessage } from '../../actions';
export const maxDuration = 60;
@ -49,7 +55,7 @@ export async function POST(request: Request) {
const session = await auth();
if (!session) {
if (!session || !session.user || !session.user.id) {
return new Response('Unauthorized', { status: 401 });
}
@ -60,6 +66,25 @@ export async function POST(request: Request) {
}
const coreMessages = convertToCoreMessages(messages);
const userMessage = getMostRecentUserMessage(coreMessages);
if (!userMessage) {
return new Response('No user message found', { status: 400 });
}
const chat = await getChatById({ id });
if (!chat) {
const title = await generateTitleFromUserMessage({ message: userMessage });
await saveChat({ id, userId: session.user.id, title });
}
await saveMessages({
messages: [
{ ...userMessage, id: generateUUID(), createdAt: new Date(), chatId: id },
],
});
const streamingData = new StreamData();
const result = await streamText({
@ -298,13 +323,26 @@ export async function POST(request: Request) {
const responseMessagesWithoutIncompleteToolCalls =
sanitizeResponseMessages(responseMessages);
await saveChat({
id,
messages: [
...coreMessages,
...responseMessagesWithoutIncompleteToolCalls,
],
userId: session.user.id,
await saveMessages({
messages: responseMessagesWithoutIncompleteToolCalls.map(
(message) => {
const messageId = generateUUID();
if (message.role === 'assistant') {
streamingData.appendMessageAnnotation({
messageIdFromServer: messageId,
});
}
return {
id: messageId,
chatId: id,
role: message.role,
content: message.content,
createdAt: new Date(),
};
}
),
});
} catch (error) {
console.error('Failed to save chat');

View file

@ -0,0 +1,48 @@
import { auth } from '@/app/(auth)/auth';
import { getVotesByChatId, voteMessage } from '@/db/queries';
export async function GET(request: Request) {
const { searchParams } = new URL(request.url);
const chatId = searchParams.get('chatId');
if (!chatId) {
return new Response('chatId is required', { status: 400 });
}
const session = await auth();
if (!session || !session.user || !session.user.email) {
return new Response('Unauthorized', { status: 401 });
}
const votes = await getVotesByChatId({ id: chatId });
return Response.json(votes, { status: 200 });
}
export async function PATCH(request: Request) {
const {
chatId,
messageId,
type,
}: { chatId: string; messageId: string; type: 'up' | 'down' } =
await request.json();
if (!chatId || !messageId || !type) {
return new Response('messageId and type are required', { status: 400 });
}
const session = await auth();
if (!session || !session.user || !session.user.email) {
return new Response('Unauthorized', { status: 401 });
}
await voteMessage({
chatId,
messageId,
type: type,
});
return new Response('Message voted', { status: 200 });
}