diff --git a/llama_stack/providers/inline/vector_io/faiss/faiss.py b/llama_stack/providers/inline/vector_io/faiss/faiss.py index 355750b25..62a98413d 100644 --- a/llama_stack/providers/inline/vector_io/faiss/faiss.py +++ b/llama_stack/providers/inline/vector_io/faiss/faiss.py @@ -73,7 +73,15 @@ class FaissIndex(EmbeddingIndex): self.chunk_by_index = {int(k): Chunk.model_validate_json(v) for k, v in data["chunk_by_index"].items()} buffer = io.BytesIO(base64.b64decode(data["faiss_index"])) - self.index = faiss.deserialize_index(np.loadtxt(buffer, dtype=np.uint8)) + try: + self.index = faiss.deserialize_index(np.load(buffer, allow_pickle=False)) + except Exception as e: + logger.debug(e, exc_info=True) + raise ValueError( + "Error deserializing Faiss index from storage. If you recently upgraded your Llama Stack, Faiss, " + "or NumPy versions, you may need to delete the index and re-create it again or downgrade versions.\n" + f"The problematic index is stored in the key value store {self.kvstore} under the key '{index_key}'." + ) from e async def _save_index(self): if not self.kvstore or not self.bank_id: @@ -81,7 +89,7 @@ class FaissIndex(EmbeddingIndex): np_index = faiss.serialize_index(self.index) buffer = io.BytesIO() - np.savetxt(buffer, np_index) + np.save(buffer, np_index, allow_pickle=False) data = { "chunk_by_index": {k: v.model_dump_json() for k, v in self.chunk_by_index.items()}, "faiss_index": base64.b64encode(buffer.getvalue()).decode("utf-8"), diff --git a/llama_stack/providers/utils/kvstore/sqlite/sqlite.py b/llama_stack/providers/utils/kvstore/sqlite/sqlite.py index 4e49e4d8c..6a6a170dc 100644 --- a/llama_stack/providers/utils/kvstore/sqlite/sqlite.py +++ b/llama_stack/providers/utils/kvstore/sqlite/sqlite.py @@ -18,6 +18,9 @@ class SqliteKVStoreImpl(KVStore): self.db_path = config.db_path self.table_name = "kvstore" + def __str__(self): + return f"SqliteKVStoreImpl(db_path={self.db_path}, table_name={self.table_name})" + async def initialize(self): os.makedirs(os.path.dirname(self.db_path), exist_ok=True) async with aiosqlite.connect(self.db_path) as db: