diff --git a/litellm/llms/s3_vectors/vector_stores/transformation.py b/litellm/llms/s3_vectors/vector_stores/transformation.py index c8cad00b10e..829e8caae1a 100644 --- a/litellm/llms/s3_vectors/vector_stores/transformation.py +++ b/litellm/llms/s3_vectors/vector_stores/transformation.py @@ -81,16 +81,20 @@ class S3VectorsVectorStoreConfig(BaseVectorStoreConfig, BaseAWSLLM): """Sync version - generates embedding synchronously.""" # For S3 Vectors, vector_store_id should be in format: bucket_name:index_name # If not in that format, try to construct it from litellm_params + bucket_name: str + index_name: str + if ":" in vector_store_id: bucket_name, index_name = vector_store_id.split(":", 1) else: # Try to get bucket_name from litellm_params - bucket_name = litellm_params.get("vector_bucket_name") - if not bucket_name: + bucket_name_from_params = litellm_params.get("vector_bucket_name") + if not bucket_name_from_params or not isinstance(bucket_name_from_params, str): raise ValueError( "vector_store_id must be in format 'bucket_name:index_name' for S3 Vectors, " "or vector_bucket_name must be provided in litellm_params" ) + bucket_name = bucket_name_from_params index_name = vector_store_id if isinstance(query, list): @@ -129,16 +133,20 @@ class S3VectorsVectorStoreConfig(BaseVectorStoreConfig, BaseAWSLLM): """Async version - generates embedding asynchronously.""" # For S3 Vectors, vector_store_id should be in format: bucket_name:index_name # If not in that format, try to construct it from litellm_params + bucket_name: str + index_name: str + if ":" in vector_store_id: bucket_name, index_name = vector_store_id.split(":", 1) else: # Try to get bucket_name from litellm_params - bucket_name = litellm_params.get("vector_bucket_name") - if not bucket_name: + bucket_name_from_params = litellm_params.get("vector_bucket_name") + if not bucket_name_from_params or not isinstance(bucket_name_from_params, str): raise ValueError( "vector_store_id must be in format 'bucket_name:index_name' for S3 Vectors, " "or vector_bucket_name must be provided in litellm_params" ) + bucket_name = bucket_name_from_params index_name = vector_store_id if isinstance(query, list): diff --git a/litellm/rag/ingestion/file_parsers/pdf_parser.py b/litellm/rag/ingestion/file_parsers/pdf_parser.py index fda77270df9..9a533ccf138 100644 --- a/litellm/rag/ingestion/file_parsers/pdf_parser.py +++ b/litellm/rag/ingestion/file_parsers/pdf_parser.py @@ -20,14 +20,14 @@ def extract_text_from_pdf(file_content: bytes) -> Optional[str]: Extracted text or None if extraction fails """ try: + from io import BytesIO + # Try pypdf first (most common) try: - from io import BytesIO - - from pypdf import PdfReader + from pypdf import PdfReader as PypdfReader pdf_file = BytesIO(file_content) - reader = PdfReader(pdf_file) + reader = PypdfReader(pdf_file) text_parts = [] for page in reader.pages: @@ -45,12 +45,10 @@ def extract_text_from_pdf(file_content: bytes) -> Optional[str]: # Fallback to PyPDF2 try: - from io import BytesIO - - from PyPDF2 import PdfReader + from PyPDF2 import PdfReader as PyPDF2Reader pdf_file = BytesIO(file_content) - reader = PdfReader(pdf_file) + reader = PyPDF2Reader(pdf_file) text_parts = [] for page in reader.pages: diff --git a/litellm/rag/ingestion/s3_vectors_ingestion.py b/litellm/rag/ingestion/s3_vectors_ingestion.py index 2a938e47554..e6c166a1015 100644 --- a/litellm/rag/ingestion/s3_vectors_ingestion.py +++ b/litellm/rag/ingestion/s3_vectors_ingestion.py @@ -483,18 +483,21 @@ class S3VectorsRAGIngestion(BaseRAGIngestion, BaseAWSLLM): # Prepare vectors for PutVectors API vectors = [] for i, (chunk, embedding) in enumerate(zip(chunks, embeddings)): + # Build metadata dict + metadata: Dict[str, str] = { + "source_text": chunk, # Non-filterable (for reference) + "chunk_index": str(i), # Filterable + } + + if filename: + metadata["filename"] = filename # Filterable + vector_obj = { "key": f"{filename}_{i}" if filename else f"chunk_{i}", "data": {"float32": embedding}, - "metadata": { - "source_text": chunk, # Non-filterable (for reference) - "chunk_index": str(i), # Filterable - }, + "metadata": metadata, } - if filename: - vector_obj["metadata"]["filename"] = filename # Filterable - vectors.append(vector_obj) # Call PutVectors API