from fastapi import UploadFile from src.utils import PineconeClient from src.models import File, VectorStoreRecordId from src.repositories import ( FileRepository, VectorStoreRecordIdRepository, UserRepository, ) class FileService: def __init__(self): self.pinecone_client = PineconeClient self.user_repository = UserRepository() self.file_repository = FileRepository() self.vector_store_record_id_repository = VectorStoreRecordIdRepository() async def __aenter__(self): return self async def __aexit__(self, *args): pass async def insert_file(self, file: UploadFile, user_id: str): try: user_object = await self.user_repository.get_by_id(user_id) metadata = [{"file_name": file.filename}] while content := await file.read(): async with self.pinecone_client() as client: ids = await client.insert_data( text=[content.decode()], metadata=metadata ) file_object = await self.file_repository.insert_one( File( user=user_object, file_name=file.filename, file_type=file.content_type, ) ) for id in ids: await self.vector_store_record_id_repository.insert_one( VectorStoreRecordId(file=file_object, record_id=id) ) return file_object finally: await file.close() async def semantic_search(self, query): try: async with self.pinecone_client() as client: return await client.similarity_search(query=query) except Exception as e: return str(e)