chatbot-template/app/(chat)/api/chat/route.ts

169 lines
4.4 KiB
TypeScript
Raw Normal View History

2024-10-30 16:01:24 +05:30
import {
2024-11-15 12:18:17 -05:00
type Message,
createDataStreamResponse,
2025-01-23 01:53:41 +05:30
smoothStream,
2024-10-30 16:01:24 +05:30
streamText,
} from 'ai';
2024-10-11 18:00:22 +05:30
import { auth } from '@/app/(auth)/auth';
import { customModel } from '@/lib/ai';
2024-11-15 12:33:12 -05:00
import { models } from '@/lib/ai/models';
import { systemPrompt } from '@/lib/ai/prompts';
2024-10-30 16:01:24 +05:30
import {
deleteChatById,
getChatById,
saveChat,
2024-11-05 17:15:51 +03:00
saveMessages,
2024-11-15 10:13:21 -05:00
} from '@/lib/db/queries';
2024-11-05 17:15:51 +03:00
import {
generateUUID,
getMostRecentUserMessage,
sanitizeResponseMessages,
} from '@/lib/utils';
import { generateTitleFromUserMessage } from '../../actions';
import { createDocument } from '@/lib/ai/tools/create-document';
import { updateDocument } from '@/lib/ai/tools/update-document';
import { requestSuggestions } from '@/lib/ai/tools/request-suggestions';
import { getWeather } from '@/lib/ai/tools/get-weather';
2024-10-30 16:01:24 +05:30
export const maxDuration = 60;
type AllowedTools =
| 'createDocument'
| 'updateDocument'
| 'requestSuggestions'
| 'getWeather';
2024-11-07 02:40:29 +03:00
const blocksTools: AllowedTools[] = [
2024-10-30 16:01:24 +05:30
'createDocument',
'updateDocument',
'requestSuggestions',
];
const weatherTools: AllowedTools[] = ['getWeather'];
const allTools: AllowedTools[] = [...blocksTools, ...weatherTools];
2024-10-11 18:00:22 +05:30
export async function POST(request: Request) {
const {
id,
messages,
2024-10-30 16:01:24 +05:30
modelId,
}: { id: string; messages: Array<Message>; modelId: string } =
2024-10-11 18:00:22 +05:30
await request.json();
const session = await auth();
2024-11-05 17:15:51 +03:00
if (!session || !session.user || !session.user.id) {
return new Response('Unauthorized', { status: 401 });
}
2024-10-30 16:01:24 +05:30
const model = models.find((model) => model.id === modelId);
if (!model) {
return new Response('Model not found', { status: 404 });
2024-10-11 18:00:22 +05:30
}
const userMessage = getMostRecentUserMessage(messages);
2024-11-05 17:15:51 +03:00
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, createdAt: new Date(), chatId: id }],
2024-11-05 17:15:51 +03:00
});
return createDataStreamResponse({
execute: (dataStream) => {
const result = streamText({
model: customModel(model.apiIdentifier),
system: systemPrompt,
messages,
maxSteps: 5,
experimental_activeTools: allTools,
2025-01-23 01:53:41 +05:30
experimental_transform: smoothStream({ chunking: 'word' }),
experimental_generateMessageId: generateUUID,
tools: {
getWeather,
createDocument: createDocument({ session, dataStream, model }),
updateDocument: updateDocument({ session, dataStream, model }),
requestSuggestions: requestSuggestions({
session,
dataStream,
model,
}),
},
onFinish: async ({ response }) => {
2024-11-15 12:18:17 -05:00
if (session.user?.id) {
try {
const responseMessagesWithoutIncompleteToolCalls =
sanitizeResponseMessages(response.messages);
await saveMessages({
messages: responseMessagesWithoutIncompleteToolCalls.map(
(message) => {
return {
id: message.id,
chatId: id,
role: message.role,
content: message.content,
createdAt: new Date(),
};
},
),
});
} catch (error) {
console.error('Failed to save chat');
}
2024-10-30 16:01:24 +05:30
}
},
experimental_telemetry: {
isEnabled: true,
functionId: 'stream-text',
},
});
2024-11-05 17:15:51 +03:00
result.mergeIntoDataStream(dataStream);
2024-10-11 18:00:22 +05:30
},
});
}
export async function DELETE(request: Request) {
const { searchParams } = new URL(request.url);
const id = searchParams.get('id');
2024-10-11 18:00:22 +05:30
if (!id) {
return new Response('Not Found', { status: 404 });
2024-10-11 18:00:22 +05:30
}
const session = await auth();
if (!session || !session.user) {
return new Response('Unauthorized', { status: 401 });
2024-10-11 18:00:22 +05:30
}
try {
const chat = await getChatById({ id });
if (chat.userId !== session.user.id) {
return new Response('Unauthorized', { status: 401 });
2024-10-11 18:00:22 +05:30
}
await deleteChatById({ id });
return new Response('Chat deleted', { status: 200 });
2024-10-11 18:00:22 +05:30
} catch (error) {
return new Response('An error occurred while processing your request', {
2024-10-11 18:00:22 +05:30
status: 500,
});
}
}