From fb6663a12f0cf7d90e9b5807881c155849d90cdb Mon Sep 17 00:00:00 2001
From: DosticJelena <jelenadostic2@gmail.com>
Date: Thu, 28 Dec 2023 13:57:02 +0100
Subject: [PATCH] support different Pinecone initialization depending on the
 version

---
 .../vectorstores/pinecone.py                  | 42 +++++++++++++++----
 1 file changed, 33 insertions(+), 9 deletions(-)

diff --git a/libs/community/langchain_community/vectorstores/pinecone.py b/libs/community/langchain_community/vectorstores/pinecone.py
index 0ecfb875bf48f..bd033f563acbb 100644
--- a/libs/community/langchain_community/vectorstores/pinecone.py
+++ b/libs/community/langchain_community/vectorstores/pinecone.py
@@ -1,15 +1,27 @@
 from __future__ import annotations
 
 import logging
+import os
 import uuid
 import warnings
-from typing import TYPE_CHECKING, Any, Callable, Iterable, List, Optional, Tuple, Union
+from typing import (
+    TYPE_CHECKING,
+    Any,
+    Callable,
+    Iterable,
+    List,
+    Optional,
+    Tuple,
+    Union,
+)
 
 import numpy as np
 from langchain_core.documents import Document
 from langchain_core.embeddings import Embeddings
 from langchain_core.utils.iter import batch_iterate
 from langchain_core.vectorstores import VectorStore
+from packaging import version
+from pkg_resources import get_distribution
 
 from langchain_community.vectorstores.utils import (
     DistanceStrategy,
@@ -63,10 +75,9 @@ def __init__(
                 "Passing in `embedding` as a Callable is deprecated. Please pass in an"
                 " Embeddings object instead."
             )
-        if not isinstance(index, pinecone.index.Index):
+        if not isinstance(index, pinecone.Index):
             raise ValueError(
-                f"client should be an instance of pinecone.index.Index, "
-                f"got {type(index)}"
+                f"client should be an instance of pinecone.Index, " f"got {type(index)}"
             )
         self._index = index
         self._embedding = embedding
@@ -359,11 +370,24 @@ def get_pinecone_index(
                 "Please install it with `pip install pinecone-client`."
             )
 
-        indexes = pinecone.list_indexes()  # checks if provided index exists
+        pinecone_client_version = get_distribution("pinecone-client").version
 
-        if index_name in indexes:
-            index = pinecone.Index(index_name, pool_threads=pool_threads)
-        elif len(indexes) == 0:
+        if version.parse(pinecone_client_version) >= version.parse("3.0.0"):
+            pinecone_instance = pinecone.Pinecone(
+                api_key=os.environ.get("PINECONE_API_KEY"), pool_threads=pool_threads
+            )
+            indexes = pinecone_instance.list_indexes()
+            index_names = [i.name for i in indexes.index_list["indexes"]]
+        else:
+            index_names = pinecone.list_indexes()
+
+        if index_name in index_names:
+            index = (
+                pinecone_instance.Index(index_name)
+                if version.parse(pinecone_client_version) >= version.parse("3.0.0")
+                else pinecone.Index(index_name, pool_threads=pool_threads)
+            )
+        elif len(index_names) == 0:
             raise ValueError(
                 "No active indexes found in your Pinecone project, "
                 "are you sure you're using the right Pinecone API key and Environment? "
@@ -372,7 +396,7 @@ def get_pinecone_index(
         else:
             raise ValueError(
                 f"Index '{index_name}' not found in your Pinecone project. "
-                f"Did you mean one of the following indexes: {', '.join(indexes)}"
+                f"Did you mean one of the following indexes: {', '.join(index_names)}"
             )
         return index