Skip to content

Commit b3ae05a

Browse files
author
Wassim
committed
feat: add insert functionality to BaseVectorStorageDriver
1 parent ef43913 commit b3ae05a

File tree

2 files changed

+67
-2
lines changed

2 files changed

+67
-2
lines changed

griptape/drivers/embedding/base_embedding_driver.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
if TYPE_CHECKING:
1616
from griptape.tokenizers import BaseTokenizer
1717

18-
VectorOperation = Literal["query", "upsert"]
18+
VectorOperation = Literal["query", "upsert", "insert"]
1919

2020

2121
@define

griptape/drivers/vector/base_vector_store_driver.py

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def upsert_text_artifact(
5858
**kwargs,
5959
) -> str:
6060
warnings.warn(
61-
"`BaseVectorStoreDriver.upsert_text_artifacts` is deprecated and will be removed in a future release. `BaseVectorStoreDriver.upsert` is a drop-in replacement.",
61+
"`BaseVectorStoreDriver.upsert_text_artifact` is deprecated and will be removed in a future release. `BaseVectorStoreDriver.upsert` is a drop-in replacement.",
6262
DeprecationWarning,
6363
stacklevel=2,
6464
)
@@ -80,6 +80,60 @@ def upsert_text(
8080
)
8181
return self.upsert(string, namespace=namespace, meta=meta, vector_id=vector_id, **kwargs)
8282

83+
def insert_collection(
84+
self,
85+
artifacts: list[TextArtifact] | list[ImageArtifact] | dict[str, list[TextArtifact]] | dict[
86+
str, list[ImageArtifact]],
87+
*,
88+
meta: Optional[dict] = None,
89+
**kwargs,
90+
) -> list[str] | dict[str, list[str]]:
91+
92+
with self.create_futures_executor() as futures_executor:
93+
if isinstance(artifacts, list):
94+
return utils.execute_futures_list(
95+
[
96+
futures_executor.submit(with_contextvars(self.insert), a, namespace=None, meta=meta, **kwargs)
97+
for a in artifacts
98+
],
99+
)
100+
futures_dict = {}
101+
102+
for namespace, artifact_list in artifacts.items():
103+
for a in artifact_list:
104+
if not futures_dict.get(namespace):
105+
futures_dict[namespace] = []
106+
107+
futures_dict[namespace].append(
108+
futures_executor.submit(
109+
with_contextvars(self.insert), a, namespace=namespace, meta=meta, **kwargs
110+
)
111+
)
112+
113+
return utils.execute_futures_list_dict(futures_dict)
114+
115+
def insert(
116+
self,
117+
value: str | TextArtifact | ImageArtifact,
118+
*,
119+
namespace: Optional[str] = None,
120+
meta: Optional[dict] = None,
121+
vector_id: Optional[str] = None,
122+
**kwargs,
123+
) -> str:
124+
125+
artifact = TextArtifact(value) if isinstance(value, str) else value
126+
127+
meta = {} if meta is None else meta
128+
129+
if vector_id is None:
130+
vector_id = str(uuid.uuid4())
131+
132+
meta = {**meta, "artifact": artifact.to_json()}
133+
vector = self.embedding_driver.embed(artifact, vector_operation="insert")
134+
135+
return self.insert_vector(vector, vector_id=vector_id, namespace=namespace, meta=meta, **kwargs)
136+
83137
@overload
84138
def upsert_collection(
85139
self,
@@ -169,6 +223,17 @@ def load_artifacts(self, *, namespace: Optional[str] = None) -> ListArtifact:
169223
@abstractmethod
170224
def delete_vector(self, vector_id: str) -> None: ...
171225

226+
@abstractmethod
227+
def insert_vector(
228+
self,
229+
vector: list[float],
230+
*,
231+
vector_id: Optional[str] = None,
232+
namespace: Optional[str] = None,
233+
meta: Optional[dict] = None,
234+
**kwargs,
235+
) -> str: ...
236+
172237
@abstractmethod
173238
def upsert_vector(
174239
self,

0 commit comments

Comments
 (0)