Skip to content

Commit 256b589

Browse files
authored
Merge pull request #531 from aurelio-labs/james/pinecone-init-logic
fix: pinecone init logic
2 parents af60b19 + ea0c5bb commit 256b589

File tree

6 files changed

+67
-51
lines changed

6 files changed

+67
-51
lines changed

docs/source/conf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
project = "Semantic Router"
1616
copyright = "2025, Aurelio AI"
1717
author = "Aurelio AI"
18-
release = "0.1.0.dev9"
18+
release = "0.1.0.dev10"
1919

2020
# -- General configuration ---------------------------------------------------
2121
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "semantic-router"
3-
version = "0.1.0.dev9"
3+
version = "0.1.0.dev10"
44
description = "Super fast semantic router for AI decision making"
55
authors = ["Aurelio AI <[email protected]>"]
66
readme = "README.md"

semantic_router/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@
33

44
__all__ = ["SemanticRouter", "HybridRouter", "Route", "RouterConfig"]
55

6-
__version__ = "0.1.0.dev9"
6+
__version__ = "0.1.0.dev10"

semantic_router/index/pinecone.py

Lines changed: 60 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,20 @@ def _initialize_client(self, api_key: Optional[str] = None):
202202

203203
return Pinecone(**pinecone_args)
204204

205+
def _calculate_index_host(self):
206+
if self.index_host and self.base_url:
207+
if "api.pinecone.io" in self.base_url:
208+
if not self.index_host.startswith("http"):
209+
self.index_host = f"https://{self.index_host}"
210+
else:
211+
if "http" not in self.index_host:
212+
self.index_host = f"http://{self.base_url.split(':')[-2].strip('/')}:{self.index_host.split(':')[-1]}"
213+
elif not self.index_host.startswith("http://"):
214+
if "localhost" in self.index_host:
215+
self.index_host = f"http://{self.base_url.split(':')[-2].strip('/')}:{self.index_host.split(':')[-1]}"
216+
else:
217+
self.index_host = f"http://{self.index_host}"
218+
205219
def _init_index(self, force_create: bool = False) -> Union[Any, None]:
206220
"""Initializing the index can be done after the object has been created
207221
to allow for the user to set the dimensions and other parameters.
@@ -215,58 +229,59 @@ def _init_index(self, force_create: bool = False) -> Union[Any, None]:
215229
dimensions are not given (which will raise an error).
216230
:type force_create: bool, optional
217231
"""
218-
index_exists = self.index_name in self.client.list_indexes().names()
219232
dimensions_given = self.dimensions is not None
220-
if dimensions_given and not index_exists:
221-
# if the index doesn't exist and we have dimension value
222-
# we create the index
223-
self.client.create_index(
224-
name=self.index_name,
225-
dimension=self.dimensions,
226-
metric=self.metric,
227-
spec=self.ServerlessSpec(cloud=self.cloud, region=self.region),
228-
)
229-
# wait for index to be created
230-
while not self.client.describe_index(self.index_name).status["ready"]:
231-
time.sleep(1)
232-
index = self.client.Index(self.index_name)
233-
time.sleep(0.5)
234-
elif index_exists:
233+
if self.index is None:
234+
index_exists = self.index_name in self.client.list_indexes().names()
235+
if dimensions_given and not index_exists:
236+
# if the index doesn't exist and we have dimension value
237+
# we create the index
238+
self.client.create_index(
239+
name=self.index_name,
240+
dimension=self.dimensions,
241+
metric=self.metric,
242+
spec=self.ServerlessSpec(cloud=self.cloud, region=self.region),
243+
)
244+
# wait for index to be created
245+
while not self.client.describe_index(self.index_name).status["ready"]:
246+
time.sleep(0.2)
247+
index = self.client.Index(self.index_name)
248+
self.index = index
249+
time.sleep(0.2)
250+
elif index_exists:
251+
# if the index exists we just return it
252+
# index = self.client.Index(self.index_name)
253+
254+
self.index_host = self.client.describe_index(self.index_name).host
255+
self._calculate_index_host()
256+
index = self.client.Index(self.index_name, host=self.index_host)
257+
self.index = index
258+
259+
# grab the dimensions from the index
260+
self.dimensions = index.describe_index_stats()["dimension"]
261+
elif force_create and not dimensions_given:
262+
raise ValueError(
263+
"Cannot create an index without specifying the dimensions."
264+
)
265+
else:
266+
# if the index doesn't exist and we don't have the dimensions
267+
# we return None
268+
logger.warning(
269+
"Index could not be initialized. Init parameters: "
270+
f"{self.index_name=}, {self.dimensions=}, {self.metric=}, "
271+
f"{self.cloud=}, {self.region=}, {self.host=}, {self.namespace=}, "
272+
f"{force_create=}"
273+
)
274+
index = None
275+
else:
276+
index = self.index
277+
if self.index is not None and self.host == "":
235278
# if the index exists we just return it
236279
self.index_host = self.client.describe_index(self.index_name).host
237280

238281
if self.index_host and self.base_url:
239-
if "api.pinecone.io" in self.base_url:
240-
if not self.index_host.startswith("http"):
241-
self.index_host = f"https://{self.index_host}"
242-
else:
243-
if "http" not in self.index_host:
244-
self.index_host = f"http://{self.base_url.split(':')[-2].strip('/')}:{self.index_host.split(':')[-1]}"
245-
elif not self.index_host.startswith("http://"):
246-
if "localhost" in self.index_host:
247-
self.index_host = f"http://{self.base_url.split(':')[-2].strip('/')}:{self.index_host.split(':')[-1]}"
248-
else:
249-
self.index_host = f"http://{self.index_host}"
282+
self._calculate_index_host()
250283
index = self.client.Index(self.index_name, host=self.index_host)
251284
self.host = self.index_host
252-
# grab the dimensions from the index
253-
self.dimensions = index.describe_index_stats()["dimension"]
254-
elif force_create and not dimensions_given:
255-
raise ValueError(
256-
"Cannot create an index without specifying the dimensions."
257-
)
258-
else:
259-
# if the index doesn't exist and we don't have the dimensions
260-
# we return None
261-
logger.warning(
262-
"Index could not be initialized. Init parameters: "
263-
f"{self.index_name=}, {self.dimensions=}, {self.metric=}, "
264-
f"{self.cloud=}, {self.region=}, {self.host=}, {self.namespace=}, "
265-
f"{force_create=}"
266-
)
267-
index = None
268-
if index is not None:
269-
self.host = self.client.describe_index(self.index_name)["host"]
270285
return index
271286

272287
async def _init_async_index(self, force_create: bool = False):

semantic_router/routers/base.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,9 @@ def _init_index_state(self):
397397
self.index.dimensions = dims
398398
# now init index
399399
if isinstance(self.index, PineconeIndex):
400+
# _init_index will not create index if already exists — it will also check
401+
# for required attributes like self.index.host and self.index.dimensions and
402+
# fetch them if not set
400403
self.index.index = self.index._init_index(force_create=True)
401404

402405
# run auto sync if active

tests/unit/test_router.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,7 @@ def init_index(
9393
index_name = TEST_ID if not index_name else f"{TEST_ID}-{index_name.lower()}"
9494

9595
index = index_cls(
96-
index_name=index_name,
97-
dimensions=dimensions,
98-
# namespace=namespace
96+
index_name=index_name, dimensions=dimensions, namespace=namespace
9997
)
10098
else:
10199
index = index_cls()

0 commit comments

Comments
 (0)