diff --git a/litellm/proxy/rag_endpoints/endpoints.py b/litellm/proxy/rag_endpoints/endpoints.py index 470372f1476..f9e0b724cb4 100644 --- a/litellm/proxy/rag_endpoints/endpoints.py +++ b/litellm/proxy/rag_endpoints/endpoints.py @@ -51,7 +51,17 @@ async def _save_vector_store_to_db_from_rag_ingest( create_vector_store_in_db, ) - vector_store_id = response.get("vector_store_id") + # Handle both dict and object responses + if hasattr(response, "get"): + vector_store_id = response.get("vector_store_id") + elif hasattr(response, "vector_store_id"): + vector_store_id = response.vector_store_id + else: + verbose_proxy_logger.warning( + f"Unable to extract vector_store_id from response type: {type(response)}" + ) + return + if vector_store_id is None or not isinstance(vector_store_id, str): verbose_proxy_logger.warning( "Vector store ID is None or not a string, skipping database save" @@ -81,16 +91,18 @@ async def _save_vector_store_to_db_from_rag_ingest( prisma_client=prisma_client, vector_store_name=f"RAG Vector Store - {vector_store_id[:8]}", vector_store_description="Created via RAG ingest endpoint", - created_by=user_api_key_dict.user_id, - updated_by=user_api_key_dict.user_id, ) verbose_proxy_logger.info( f"Vector store {vector_store_id} saved to database successfully" ) + else: + verbose_proxy_logger.info( + f"Vector store {vector_store_id} already exists in database, skipping creation" + ) except Exception as db_error: # Log the error but don't fail the request since ingestion succeeded - verbose_proxy_logger.warning( + verbose_proxy_logger.exception( f"Failed to save vector store {vector_store_id} to database: {db_error}" ) @@ -261,18 +273,21 @@ async def rag_ingest( ) # Save vector store to database if it was newly created and prisma_client is available - if ( - prisma_client is not None - and response is not None - and isinstance(response, dict) - and response.get("vector_store_id") - ): + verbose_proxy_logger.debug( + f"RAG Ingest - Checking database save conditions: prisma_client={prisma_client is not None}, response={response is not None}, response_type={type(response)}" + ) + + if prisma_client is not None and response is not None: await _save_vector_store_to_db_from_rag_ingest( response=response, ingest_options=ingest_options, prisma_client=prisma_client, user_api_key_dict=user_api_key_dict, ) + else: + verbose_proxy_logger.warning( + f"Skipping database save: prisma_client={prisma_client is not None}, response={response is not None}" + ) return response diff --git a/litellm/proxy/vector_store_endpoints/management_endpoints.py b/litellm/proxy/vector_store_endpoints/management_endpoints.py index 47adb8c03ba..f3787e62f4d 100644 --- a/litellm/proxy/vector_store_endpoints/management_endpoints.py +++ b/litellm/proxy/vector_store_endpoints/management_endpoints.py @@ -144,8 +144,7 @@ async def create_vector_store_in_db( vector_store_description: Optional[str] = None, vector_store_metadata: Optional[Dict] = None, litellm_params: Optional[Dict] = None, - created_by: Optional[str] = None, - updated_by: Optional[str] = None, + litellm_credential_name: Optional[str] = None, ) -> LiteLLM_ManagedVectorStore: """ Helper function to create a vector store in the database. @@ -190,13 +189,10 @@ async def create_vector_store_in_db( data_to_create["vector_store_description"] = vector_store_description if vector_store_metadata is not None: data_to_create["vector_store_metadata"] = safe_dumps(vector_store_metadata) - if created_by is not None: - data_to_create["created_by"] = created_by - if updated_by is not None: - data_to_create["updated_by"] = updated_by + if litellm_credential_name is not None: + data_to_create["litellm_credential_name"] = litellm_credential_name - # Handle litellm_params - litellm_params_json: Optional[str] = None + # Handle litellm_params - always provide at least an empty dict if litellm_params: # Auto-resolve embedding config if embedding model is provided but config is not embedding_model = litellm_params.get("litellm_embedding_model") @@ -214,9 +210,10 @@ async def create_vector_store_in_db( litellm_params_dict = GenericLiteLLMParams( **litellm_params ).model_dump(exclude_none=True) - litellm_params_json = safe_dumps(litellm_params_dict) - - data_to_create["litellm_params"] = litellm_params_json + data_to_create["litellm_params"] = safe_dumps(litellm_params_dict) + else: + # Provide empty dict if no litellm_params provided + data_to_create["litellm_params"] = safe_dumps({}) # Create in database _new_vector_store = ( @@ -290,8 +287,7 @@ async def new_vector_store( vector_store_description=vector_store.get("vector_store_description"), vector_store_metadata=validated_metadata, litellm_params=vector_store.get("litellm_params"), - created_by=user_api_key_dict.user_id, - updated_by=user_api_key_dict.user_id, + litellm_credential_name=vector_store.get("litellm_credential_name"), ) return {