diff --git a/src/actions/relatedpdf.ts b/src/actions/relatedpdf.ts deleted file mode 100644 index c18d564..0000000 --- a/src/actions/relatedpdf.ts +++ /dev/null @@ -1,163 +0,0 @@ -// "use server"; - -// import { db } from "@/db"; -// import { rateLimiter } from "@/lib/rateLimiter"; -// import { getRelatedWords } from "@/lib/templates/chat-templates"; -// import { PDFLoader } from "@langchain/community/document_loaders/fs/pdf"; -// import { StringOutputParser } from "@langchain/core/output_parsers"; -// import { RunnableSequence } from "@langchain/core/runnables"; -// import { ChatMistralAI } from "@langchain/mistralai"; -// import { RecursiveCharacterTextSplitter } from "@langchain/textsplitters"; -// import { File } from "@prisma/client"; -// import { currentUser } from "@clerk/nextjs/server"; - -// type ErrorResponse = { -// success: false; -// error: string; -// step?: string; -// }; - -// type SuccessResponse = { -// success: true; -// message: string; -// data: any; -// }; - -// export const relatedPdf = async (file: File): Promise => { -// const user = await currentUser(); - -// if (!user) -// return { -// success: false, -// error: "Unauthorized", -// }; - -// const { success, remaining } = await rateLimiter.limit(user.id); - -// if (!success) { -// return { -// success: false, -// error: `Rate limit exceeded. Please try again later. You have ${remaining} requests left.`, -// }; -// } - -// try { -// // Fetch PDF -// const response = await fetch(file.url); -// if (!response.ok) { -// throw new Error(`Failed to fetch PDF: ${response.statusText}`); -// } - -// // Load PDF -// const blob = await response.blob(); -// const loader = new PDFLoader(blob); -// let pageLevelDocs; -// try { -// pageLevelDocs = await loader.load(); -// } catch (error) { -// return { -// success: false, -// error: "Failed to load PDF", -// step: "PDF Loading", -// }; -// } - -// // Split text -// const splitter = new RecursiveCharacterTextSplitter({ -// chunkSize: 2000, -// chunkOverlap: 100, -// separators: ["\n\n", "\n", ". ", " ", ""], -// }); - -// let splitDocs; -// try { -// splitDocs = await splitter.splitDocuments(pageLevelDocs); -// } catch (error) { -// return { -// success: false, -// error: "Failed to split document", -// step: "Text Splitting", -// }; -// } - -// const textChunks = splitDocs.map((doc) => doc.pageContent); - -// // Initialize LLM -// if (!process.env.OPENAI_API_KEY) { -// return { -// success: false, -// error: "Missing OpenAI API key", -// step: "LLM Initialization", -// }; -// } - -// const llm = new ChatMistralAI({ -// model: "mistral-large-latest", -// apiKey: process.env.OPENAI_API_KEY, -// maxRetries: 2, -// temperature: 0.3, -// }); - -// // Get related words -// let res; -// try { -// const chain = RunnableSequence.from([getRelatedWords, llm, new StringOutputParser()]); -// res = await chain.invoke({ -// context: textChunks, -// }); -// } catch (error) { -// return { -// success: false, -// error: "Failed to generate related words", -// step: "LLM Processing", -// }; -// } - -// // Google Search -// const API_KEY = process.env.GOOGLE_SEARCH_API_KEY; -// const CX = process.env.GOOGLE_SEARCH_CX; - -// if (!API_KEY || !CX) { -// return { -// success: false, -// error: "Missing Google Search credentials", -// step: "Search Configuration", -// }; -// } - -// const query = res; - -// const searchResponse = await fetch( -// `https://www.googleapis.com/customsearch/v1?q=${query}%20filetype:pdf&key=${API_KEY}&cx=${CX}&num=4`, -// ); -// const data = await searchResponse.json(); - -// const textdata = data.items.map((item: any) => item); - -// const markdownLinks = textdata -// .map((url: any) => { -// return `- [📄 ${url.title + 1}](${url.link})`; -// }) -// .join("\n"); - -// const saveMessage = await db.message.create({ -// data: { -// text: markdownLinks, -// isUserMessage: false, -// fileId: file.id, -// userId: file.userId, -// }, -// }); - -// return { -// success: true, -// message: "Related PDF data", -// data: saveMessage, -// }; -// } catch (error: any) { -// return { -// success: false, -// error: error.message, -// }; -// } -// }; diff --git a/src/app/api/webhooks/clerk/route.ts b/src/app/api/webhooks/clerk/route.ts deleted file mode 100644 index 5c7f204..0000000 --- a/src/app/api/webhooks/clerk/route.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { UserJSON, WebhookEvent } from '@clerk/nextjs/server'; -import { headers } from 'next/headers'; -import { Webhook } from 'svix'; - -import { db } from '@/db'; - -export async function POST(req: Request) { - // You can find this in the Clerk Dashboard -> Webhooks -> choose the endpoint - const WEBHOOK_SECRET = process.env.WEBHOOK_SECRET; - - if (!WEBHOOK_SECRET) { - throw new Error( - 'Please add WEBHOOK_SECRET from Clerk Dashboard to .env or .env.local' - ); - } - - // Get the headers - const headerPayload = headers(); - const svix_id = headerPayload.get('svix-id'); - const svix_timestamp = headerPayload.get('svix-timestamp'); - const svix_signature = headerPayload.get('svix-signature'); - - // If there are no headers, error out - if (!svix_id || !svix_timestamp || !svix_signature) { - return new Response('Error occured -- no svix headers', { - status: 400, - }); - } - - // Get the body - const payload = await req.json(); - const body = JSON.stringify(payload); - - // Create a new Svix instance with your secret. - const wh = new Webhook(WEBHOOK_SECRET); - - let evt: WebhookEvent; - - // Verify the payload with the headers - try { - evt = wh.verify(body, { - 'svix-id': svix_id, - 'svix-timestamp': svix_timestamp, - 'svix-signature': svix_signature, - }) as WebhookEvent; - } catch (err) { - console.error('Error verifying webhook:', err); - return new Response('Error occured', { - status: 400, - }); - } - - // Do something with the payload - // For this guide, you simply log the payload to the console - - const eventType = evt.type; - - const { - id, - email_addresses: emailAddresses, - image_url: image, - } = evt.data as UserJSON; - - if (eventType === 'user.created') { - try { - const user = await db.user.create({ - data: { - userId: id!, - email: emailAddresses[0].email_address, - image: image ?? '', - }, - }); - - if (!user) { - throw new Error('User not created'); - } - } catch { - throw new Error('Error creating user'); - } - } - - if (eventType === 'user.updated') { - try { - const user = await db.user.update({ - where: { userId: id! }, - data: { - image: image, - email: emailAddresses[0].email_address, - }, - }); - - if (!user) { - throw new Error('User not updated'); - } - } catch { - throw new Error('Error updating user'); - } - } - - if (eventType === 'user.deleted') { - try { - await db.user.delete({ where: { userId: id! } }); - } catch { - throw new Error('Error deleting user'); - } - } - - return new Response('Webhook received', { status: 200 }); -} diff --git a/src/components/chat/ChatComponent.tsx b/src/components/chat/ChatComponent.tsx index 2d86ccb..f395035 100644 --- a/src/components/chat/ChatComponent.tsx +++ b/src/components/chat/ChatComponent.tsx @@ -72,7 +72,6 @@ const ChatComponent = ({ file }: { file: File }) => { .reverse(); }, [historyData]); - // Auto scroll when live messages change useEffect(() => { const timer = setTimeout(() => { messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); diff --git a/src/components/chat/MessageItem.tsx b/src/components/chat/MessageItem.tsx index 757b804..a663295 100644 --- a/src/components/chat/MessageItem.tsx +++ b/src/components/chat/MessageItem.tsx @@ -43,11 +43,6 @@ const MessageItem = ({ ? message.isUserMessage : message.role === 'user'; - // Skip system messages - if (!isHistoryMessage(message) && message.role === 'system') { - return null; - } - const messageText = isHistoryMessage(message) ? message.text : Array.isArray(message.parts) diff --git a/src/types/message.ts b/src/types/message.ts deleted file mode 100644 index 3a20ea7..0000000 --- a/src/types/message.ts +++ /dev/null @@ -1,21 +0,0 @@ -// Simple message type for our chat application -export interface ChatMessage { - id: string; - text: string; - isUserMessage: boolean; - createdAt: Date; - updatedAt: Date; - userId: string | null; - fileId: string; -} - -export interface MessageLoadingStates { - summarize?: boolean; - paraphrase?: boolean; - translate?: boolean; -} - -export interface MessageUpdate { - type: 'summarize' | 'paraphrase'; - content: string; -}