diff --git a/semantic_router/index/pinecone.py b/semantic_router/index/pinecone.py index 75e0190291a0eaff347c635633d03b156a07fb6c..82ae008d4bccd165be242e87e2cfde7d5f084100 100644 --- a/semantic_router/index/pinecone.py +++ b/semantic_router/index/pinecone.py @@ -199,42 +199,43 @@ class PineconeIndex(BaseIndex): dimensions are not given (which will raise an error). :type force_create: bool, optional """ - index_exists = self.index_name in self.client.list_indexes().names() dimensions_given = self.dimensions is not None - if dimensions_given and not index_exists: - # if the index doesn't exist and we have dimension value - # we create the index - self.client.create_index( - name=self.index_name, - dimension=self.dimensions, - metric=self.metric, - spec=self.ServerlessSpec(cloud=self.cloud, region=self.region), - ) - # wait for index to be created - while not self.client.describe_index(self.index_name).status["ready"]: - time.sleep(1) - index = self.client.Index(self.index_name) - time.sleep(0.5) - elif index_exists: - # if the index exists we just return it - index = self.client.Index(self.index_name) - # grab the dimensions from the index - self.dimensions = index.describe_index_stats()["dimension"] - elif force_create and not dimensions_given: - raise ValueError( - "Cannot create an index without specifying the dimensions." - ) - else: - # if the index doesn't exist and we don't have the dimensions - # we return None - logger.warning( - "Index could not be initialized. Init parameters: " - f"{self.index_name=}, {self.dimensions=}, {self.metric=}, " - f"{self.cloud=}, {self.region=}, {self.host=}, {self.namespace=}, " - f"{force_create=}" - ) - index = None - if index is not None: + if self.index is None: + index_exists = self.index_name in self.client.list_indexes().names() + if dimensions_given and not index_exists: + # if the index doesn't exist and we have dimension value + # we create the index + self.client.create_index( + name=self.index_name, + dimension=self.dimensions, + metric=self.metric, + spec=self.ServerlessSpec(cloud=self.cloud, region=self.region), + ) + # wait for index to be created + while not self.client.describe_index(self.index_name).status["ready"]: + time.sleep(0.2) + index = self.client.Index(self.index_name) + time.sleep(0.2) + elif index_exists: + # if the index exists we just return it + index = self.client.Index(self.index_name) + # grab the dimensions from the index + self.dimensions = index.describe_index_stats()["dimension"] + elif force_create and not dimensions_given: + raise ValueError( + "Cannot create an index without specifying the dimensions." + ) + else: + # if the index doesn't exist and we don't have the dimensions + # we return None + logger.warning( + "Index could not be initialized. Init parameters: " + f"{self.index_name=}, {self.dimensions=}, {self.metric=}, " + f"{self.cloud=}, {self.region=}, {self.host=}, {self.namespace=}, " + f"{force_create=}" + ) + index = None + if self.index is not None and self.host == "": self.host = self.client.describe_index(self.index_name)["host"] return index diff --git a/semantic_router/routers/base.py b/semantic_router/routers/base.py index c59ee1c4b0d7fee3518459b2b8d59552a67a10cb..9c19380a73fec706cd59232f2dd86de7614545c2 100644 --- a/semantic_router/routers/base.py +++ b/semantic_router/routers/base.py @@ -397,9 +397,10 @@ class BaseRouter(BaseModel): self.index.dimensions = dims # now init index if isinstance(self.index, PineconeIndex): - # no need to init index if already initialized - if self.index.index is None: - self.index.index = self.index._init_index(force_create=True) + # _init_index will not create index if already exists — it will also check + # for required attributes like self.index.host and self.index.dimensions and + # fetch them if not set + self.index.index = self.index._init_index(force_create=True) # run auto sync if active if self.auto_sync: local_utterances = self.to_config().to_utterances()