From 4ffe29c649b98e3f369ac6c37e75fe53ff95618c Mon Sep 17 00:00:00 2001
From: Vits <vittorio.mayellaro.dev@gmail.com>
Date: Thu, 11 Jul 2024 23:00:30 +0200
Subject: [PATCH] Fixed pinecone.py _get_all method unordered return for ids
 and metadata and used the fixed version inside _get_routes_with_ids

---
 semantic_router/index/pinecone.py | 33 ++++++++++++++-----------------
 1 file changed, 15 insertions(+), 18 deletions(-)

diff --git a/semantic_router/index/pinecone.py b/semantic_router/index/pinecone.py
index dc86004a..27038824 100644
--- a/semantic_router/index/pinecone.py
+++ b/semantic_router/index/pinecone.py
@@ -332,23 +332,15 @@ class PineconeIndex(BaseIndex):
 
     def _get_routes_with_ids(self, route_name: str):
         clean_route = clean_route_name(route_name)
-        ids, _ = self._get_all(prefix=f"{clean_route}#")
+        ids, metadata = self._get_all(prefix=f"{clean_route}#", include_metadata=True)
         route_tuples = []
-        for id in ids:
-            res_meta = (
-                self.index.fetch(ids=[id], namespace=self.namespace)
-                if self.index
-                else {}
-            )
-            route_tuples.extend(
-                [
-                    {
-                        "id": id,
-                        "route": x["metadata"]["sr_route"],
-                        "utterance": x["metadata"]["sr_utterance"],
-                    }
-                    for x in res_meta["vectors"].values()
-                ]
+        for id, data in zip(ids, metadata):
+            route_tuples.append(
+                {
+                    "id": id,
+                    "route": data["sr_route"],
+                    "utterance": data["sr_utterance"],
+                }
             )
         return route_tuples
 
@@ -391,9 +383,14 @@ class PineconeIndex(BaseIndex):
 
             # if we need metadata, we fetch it
             if include_metadata:
-                res_meta = self.index.fetch(ids=vector_ids, namespace=self.namespace)
+                for id in vector_ids:
+                    res_meta = (
+                        self.index.fetch(ids=[id], namespace=self.namespace)
+                        if self.index
+                        else {}
+                    )
+                    metadata.extend([x["metadata"] for x in res_meta["vectors"].values()])
                 # extract metadata only
-                metadata.extend([x["metadata"] for x in res_meta["vectors"].values()])
 
             # Check if there's a next page token; if not, break the loop
             next_page_token = response_data.get("pagination", {}).get("next")
-- 
GitLab