From 16b31fe34f7dab7f62ff00e44e52d804904fdcf9 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 18 Oct 2025 15:08:31 +0530 Subject: [PATCH] feat(uploads): use new model registry --- src/app/api/uploads/route.ts | 23 +++++-------------- src/components/MessageInputActions/Attach.tsx | 20 +++++++++++----- .../MessageInputActions/AttachSmall.tsx | 16 ++++++------- 3 files changed, 28 insertions(+), 31 deletions(-) diff --git a/src/app/api/uploads/route.ts b/src/app/api/uploads/route.ts index 9fbaf2d..6db17dd 100644 --- a/src/app/api/uploads/route.ts +++ b/src/app/api/uploads/route.ts @@ -2,11 +2,11 @@ import { NextResponse } from 'next/server'; import fs from 'fs'; import path from 'path'; import crypto from 'crypto'; -import { getAvailableEmbeddingModelProviders } from '@/lib/providers'; import { PDFLoader } from '@langchain/community/document_loaders/fs/pdf'; import { DocxLoader } from '@langchain/community/document_loaders/fs/docx'; import { RecursiveCharacterTextSplitter } from '@langchain/textsplitters'; import { Document } from 'langchain/document'; +import ModelRegistry from '@/lib/models/registry'; interface FileRes { fileName: string; @@ -30,8 +30,8 @@ export async function POST(req: Request) { const formData = await req.formData(); const files = formData.getAll('files') as File[]; - const embedding_model = formData.get('embedding_model'); - const embedding_model_provider = formData.get('embedding_model_provider'); + const embedding_model = formData.get('embedding_model_key') as string; + const embedding_model_provider = formData.get('embedding_model_provider_id') as string; if (!embedding_model || !embedding_model_provider) { return NextResponse.json( @@ -40,20 +40,9 @@ export async function POST(req: Request) { ); } - const embeddingModels = await getAvailableEmbeddingModelProviders(); - const provider = - embedding_model_provider ?? Object.keys(embeddingModels)[0]; - const embeddingModel = - embedding_model ?? Object.keys(embeddingModels[provider as string])[0]; + const registry = new ModelRegistry(); - let embeddingsModel = - embeddingModels[provider as string]?.[embeddingModel as string]?.model; - if (!embeddingsModel) { - return NextResponse.json( - { message: 'Invalid embedding model selected' }, - { status: 400 }, - ); - } + const model = await registry.loadEmbeddingModel(embedding_model_provider, embedding_model); const processedFiles: FileRes[] = []; @@ -98,7 +87,7 @@ export async function POST(req: Request) { }), ); - const embeddings = await embeddingsModel.embedDocuments( + const embeddings = await model.embedDocuments( splitted.map((doc) => doc.pageContent), ); const embeddingsDataPath = filePath.replace( diff --git a/src/components/MessageInputActions/Attach.tsx b/src/components/MessageInputActions/Attach.tsx index 5004e4d..48f14d9 100644 --- a/src/components/MessageInputActions/Attach.tsx +++ b/src/components/MessageInputActions/Attach.tsx @@ -5,7 +5,15 @@ import { PopoverPanel, Transition, } from '@headlessui/react'; -import { CopyPlus, File, LoaderCircle, Plus, Trash } from 'lucide-react'; +import { + CopyPlus, + File, + Link, + LoaderCircle, + Paperclip, + Plus, + Trash, +} from 'lucide-react'; import { Fragment, useRef, useState } from 'react'; import { useChat } from '@/lib/hooks/useChat'; @@ -24,12 +32,12 @@ const Attach = ({ showText }: { showText?: boolean }) => { } const embeddingModelProvider = localStorage.getItem( - 'embeddingModelProvider', + 'embeddingModelProviderId', ); - const embeddingModel = localStorage.getItem('embeddingModel'); + const embeddingModel = localStorage.getItem('embeddingModelKey'); - data.append('embedding_model_provider', embeddingModelProvider!); - data.append('embedding_model', embeddingModel!); + data.append('embedding_model_provider_id', embeddingModelProvider!); + data.append('embedding_model_key', embeddingModel!); const res = await fetch(`/api/uploads`, { method: 'POST', @@ -169,7 +177,7 @@ const Attach = ({ showText }: { showText?: boolean }) => { multiple hidden /> - + {showText &&

Attach

} ); diff --git a/src/components/MessageInputActions/AttachSmall.tsx b/src/components/MessageInputActions/AttachSmall.tsx index 2df8186..20aa141 100644 --- a/src/components/MessageInputActions/AttachSmall.tsx +++ b/src/components/MessageInputActions/AttachSmall.tsx @@ -5,7 +5,7 @@ import { PopoverPanel, Transition, } from '@headlessui/react'; -import { CopyPlus, File, LoaderCircle, Plus, Trash } from 'lucide-react'; +import { CopyPlus, File, LoaderCircle, Paperclip, Plus, Trash } from 'lucide-react'; import { Fragment, useRef, useState } from 'react'; import { File as FileType } from '../ChatWindow'; import { useChat } from '@/lib/hooks/useChat'; @@ -25,12 +25,12 @@ const AttachSmall = () => { } const embeddingModelProvider = localStorage.getItem( - 'embeddingModelProvider', + 'embeddingModelProviderId', ); - const embeddingModel = localStorage.getItem('embeddingModel'); + const embeddingModel = localStorage.getItem('embeddingModelKey'); - data.append('embedding_model_provider', embeddingModelProvider!); - data.append('embedding_model', embeddingModel!); + data.append('embedding_model_provider_id', embeddingModelProvider!); + data.append('embedding_model_key', embeddingModel!); const res = await fetch(`/api/uploads`, { method: 'POST', @@ -116,8 +116,8 @@ const AttachSmall = () => {

{file.fileName.length > 25 ? file.fileName.replace(/\.\w+$/, '').substring(0, 25) + - '...' + - file.fileExtension + '...' + + file.fileExtension : file.fileName}

@@ -141,7 +141,7 @@ const AttachSmall = () => { multiple hidden /> - + ); };