langroid 0.1.190__py3-none-any.whl → 0.1.192__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -34,7 +34,7 @@ from langroid.agent.task import Task
34
34
  from langroid.embedding_models.models import OpenAIEmbeddingsConfig
35
35
  from langroid.language_models.base import StreamingIfAllowed
36
36
  from langroid.language_models.openai_gpt import OpenAIChatModel, OpenAIGPTConfig
37
- from langroid.mytypes import Document, Entity
37
+ from langroid.mytypes import DocMetaData, Document, Entity
38
38
  from langroid.parsing.parser import Parser, ParsingConfig, PdfParsingConfig, Splitter
39
39
  from langroid.parsing.repo_loader import RepoLoader
40
40
  from langroid.parsing.search import (
@@ -238,7 +238,10 @@ class DocChatAgent(ChatAgent):
238
238
  def ingest_doc_paths(
239
239
  self,
240
240
  paths: List[str],
241
- metadata: List[Dict[str, Any]] | Dict[str, Any] = [],
241
+ metadata: List[Dict[str, Any]]
242
+ | Dict[str, Any]
243
+ | DocMetaData
244
+ | List[DocMetaData] = [],
242
245
  ) -> List[Document]:
243
246
  """Split, ingest docs from specified paths,
244
247
  do not add these to config.doc_paths.
@@ -250,14 +253,24 @@ class DocChatAgent(ChatAgent):
250
253
  Returns:
251
254
  List of Document objects
252
255
  """
256
+ all_paths = paths
253
257
  paths_meta: Dict[str, Any] = {}
254
258
  urls_meta: Dict[str, Any] = {}
255
259
  urls, paths = get_urls_and_paths(paths)
256
- if len(metadata) > 0:
260
+ if (isinstance(metadata, list) and len(metadata) > 0) or not isinstance(
261
+ metadata, list
262
+ ):
257
263
  if isinstance(metadata, list):
258
- path2meta = {p: m for p, m in zip(paths, metadata)}
264
+ path2meta = {
265
+ p: m
266
+ if isinstance(m, dict)
267
+ else (isinstance(m, DocMetaData) and m.dict()) # appease mypy
268
+ for p, m in zip(all_paths, metadata)
269
+ }
270
+ elif isinstance(metadata, dict):
271
+ path2meta = {p: metadata for p in all_paths}
259
272
  else:
260
- path2meta = {p: metadata for p in paths}
273
+ path2meta = {p: metadata.dict() for p in all_paths}
261
274
  urls_meta = {u: path2meta[u] for u in urls}
262
275
  paths_meta = {p: path2meta[p] for p in paths}
263
276
  docs: List[Document] = []
@@ -298,7 +311,10 @@ class DocChatAgent(ChatAgent):
298
311
  self,
299
312
  docs: List[Document],
300
313
  split: bool = True,
301
- metadata: List[Dict[str, Any]] | Dict[str, Any] = [],
314
+ metadata: List[Dict[str, Any]]
315
+ | Dict[str, Any]
316
+ | DocMetaData
317
+ | List[DocMetaData] = [],
302
318
  ) -> int:
303
319
  """
304
320
  Chunk docs into pieces, map each chunk to vec-embedding, store in vec-db
@@ -314,10 +330,15 @@ class DocChatAgent(ChatAgent):
314
330
  """
315
331
  if isinstance(metadata, list) and len(metadata) > 0:
316
332
  for d, m in zip(docs, metadata):
317
- d.metadata = d.metadata.copy(update=m)
333
+ d.metadata = d.metadata.copy(
334
+ update=m if isinstance(m, dict) else m.dict() # type: ignore
335
+ )
318
336
  elif isinstance(metadata, dict):
319
337
  for d in docs:
320
338
  d.metadata = d.metadata.copy(update=metadata)
339
+ elif isinstance(metadata, DocMetaData):
340
+ for d in docs:
341
+ d.metadata = d.metadata.copy(update=metadata.dict())
321
342
 
322
343
  self.original_docs.extend(docs)
323
344
  if self.parser is None:
@@ -17,7 +17,7 @@ import pandas as pd
17
17
 
18
18
  from langroid.agent.special.doc_chat_agent import DocChatAgent, DocChatAgentConfig
19
19
  from langroid.agent.special.lance_rag.lance_tools import QueryPlanTool
20
- from langroid.mytypes import Document
20
+ from langroid.mytypes import DocMetaData, Document
21
21
  from langroid.parsing.table_loader import describe_dataframe
22
22
  from langroid.utils.constants import DONE, NO_ANSWER
23
23
  from langroid.utils.pydantic_utils import (
@@ -38,6 +38,34 @@ class LanceDocChatAgent(DocChatAgent):
38
38
  self.enable_message(QueryPlanTool, use=False, handle=True)
39
39
 
40
40
  def _get_clean_vecdb_schema(self) -> str:
41
+ """Get a cleaned schema of the vector-db, to pass to the LLM
42
+ as part of instructions on how to generate a SQL filter."""
43
+ if len(self.config.filter_fields) == 0:
44
+ filterable_fields = (
45
+ self.vecdb.client.open_table(self.vecdb.config.collection_name)
46
+ .search()
47
+ .limit(1)
48
+ .to_pandas(flatten=True)
49
+ .columns.tolist()
50
+ )
51
+ # drop id, vector, metadata.id, metadata.window_ids, metadata.is_chunk
52
+ for fields in [
53
+ "id",
54
+ "vector",
55
+ "metadata.id",
56
+ "metadata.window_ids",
57
+ "metadata.is_chunk",
58
+ ]:
59
+ if fields in filterable_fields:
60
+ filterable_fields.remove(fields)
61
+ logger.warning(
62
+ f"""
63
+ No filter_fields set in config, so using these fields as filterable fields:
64
+ {filterable_fields}
65
+ """
66
+ )
67
+ self.config.filter_fields = filterable_fields
68
+
41
69
  if self.from_dataframe:
42
70
  return self.df_description
43
71
  schema_dict = clean_schema(
@@ -50,6 +78,9 @@ class LanceDocChatAgent(DocChatAgent):
50
78
  self.config.filter_fields or schema_dict.keys()
51
79
  ).intersection(schema_dict.keys())
52
80
 
81
+ # remove 'content' from filter_fields_set, even if it's not in filter_fields_set
82
+ filter_fields_set.discard("content")
83
+
53
84
  # possible values of filterable fields
54
85
  filter_field_values = self.get_field_values(list(filter_fields_set))
55
86
 
@@ -63,18 +94,26 @@ class LanceDocChatAgent(DocChatAgent):
63
94
  k: v for k, v in schema_dict.items() if k in self.config.filter_fields
64
95
  }
65
96
  schema = json.dumps(schema_dict, indent=4)
66
- if len(fields := self.config.add_fields_to_content) > 0:
97
+
98
+ schema += f"""
99
+ NOTE when creating a filter for a query,
100
+ ONLY the following fields are allowed:
101
+ {",".join(self.config.filter_fields)}
102
+ """
103
+ if len(content_fields := self.config.add_fields_to_content) > 0:
67
104
  schema += f"""
68
105
  Additional fields added to `content` as key=value pairs:
69
- NOTE That CAN Help with matching queries!
70
- {fields}
106
+ NOTE that these CAN Help with matching queries!
107
+ {content_fields}
71
108
  """
72
109
  return schema
73
110
 
74
111
  def query_plan(self, msg: QueryPlanTool) -> str:
75
112
  """
76
113
  Handle the LLM's use of the FilterTool.
77
- Temporarily set the config filter and invoke the DocChatAgent.llm_response()
114
+ Temporarily set the config filter and either return the final answer
115
+ in case there's a dataframe_calc, or return the rephrased query
116
+ so the LLM can handle it.
78
117
  """
79
118
  # create document-subset based on this filter
80
119
  plan = msg.plan
@@ -83,7 +122,14 @@ class LanceDocChatAgent(DocChatAgent):
83
122
  except Exception as e:
84
123
  logger.error(f"Error setting up documents: {e}")
85
124
  # say DONE with err msg so it goes back to LanceFilterAgent
86
- return f"{DONE} Possible Filter Error:\n {e}"
125
+ return f"""
126
+ {DONE} Possible Filter Error:\n {e}
127
+
128
+ Note that only the following fields are allowed in the filter
129
+ of a query plan:
130
+ {", ".join(self.config.filter_fields)}
131
+ """
132
+
87
133
  # update the filter so it is used in the DocChatAgent
88
134
  self.config.filter = plan.filter or None
89
135
  if plan.dataframe_calc:
@@ -116,13 +162,16 @@ class LanceDocChatAgent(DocChatAgent):
116
162
  self,
117
163
  docs: List[Document],
118
164
  split: bool = True,
119
- metadata: List[Dict[str, Any]] | Dict[str, Any] = [],
165
+ metadata: List[Dict[str, Any]]
166
+ | Dict[str, Any]
167
+ | DocMetaData
168
+ | List[DocMetaData] = [],
120
169
  ) -> int:
121
170
  n = super().ingest_docs(docs, split, metadata)
122
171
  tbl = self.vecdb.client.open_table(self.vecdb.config.collection_name)
123
172
  # We assume "content" is available as top-level field
124
173
  if "content" in tbl.schema.names:
125
- tbl.create_fts_index("content")
174
+ tbl.create_fts_index("content", replace=True)
126
175
  return n
127
176
 
128
177
  def ingest_dataframe(
@@ -167,7 +216,7 @@ class LanceDocChatAgent(DocChatAgent):
167
216
  tbl = self.vecdb.client.open_table(self.vecdb.config.collection_name)
168
217
  # We assume "content" is available as top-level field
169
218
  if "content" in tbl.schema.names:
170
- tbl.create_fts_index("content")
219
+ tbl.create_fts_index("content", replace=True)
171
220
  # We still need to do the below so that
172
221
  # other types of searches in DocChatAgent
173
222
  # can work, as they require Document objects
@@ -159,7 +159,7 @@ class LanceQueryPlanAgent(ChatAgent):
159
159
  # then we know there was no tool, so we run below code
160
160
  if (
161
161
  isinstance(msg, ChatDocument)
162
- and msg.metadata.sender_name == self.config.doc_agent_name
162
+ and self.curr_query_plan is not None
163
163
  and msg.metadata.parent is not None
164
164
  ):
165
165
  # save result, to be used in query_plan_feedback()
@@ -175,5 +175,6 @@ class LanceQueryPlanAgent(ChatAgent):
175
175
  response_tmpl.tool_messages = [query_plan_answer_tool]
176
176
  # set the recipient to the Critic so it can give feedback
177
177
  response_tmpl.metadata.recipient = self.config.critic_name
178
+ self.curr_query_plan = None # reset
178
179
  return response_tmpl
179
180
  return None
@@ -759,7 +759,11 @@ class OpenAIGPT(LanguageModel):
759
759
  )
760
760
 
761
761
  def _cache_store(self, k: str, v: Any) -> None:
762
- self.cache.store(k, v)
762
+ try:
763
+ self.cache.store(k, v)
764
+ except Exception as e:
765
+ logging.error(f"Error in OpenAIGPT._cache_store: {e}")
766
+ pass
763
767
 
764
768
  def _cache_lookup(self, fn_name: str, **kwargs: Dict[str, Any]) -> Tuple[str, Any]:
765
769
  # Use the kwargs as the cache key
@@ -773,7 +777,12 @@ class OpenAIGPT(LanguageModel):
773
777
  # when caching disabled, return the hashed_key and none result
774
778
  return hashed_key, None
775
779
  # Try to get the result from the cache
776
- return hashed_key, self.cache.retrieve(hashed_key)
780
+ try:
781
+ cached_val = self.cache.retrieve(hashed_key)
782
+ except Exception as e:
783
+ logging.error(f"Error in OpenAIGPT._cache_lookup: {e}")
784
+ return hashed_key, None
785
+ return hashed_key, cached_val
777
786
 
778
787
  def _cost_chat_model(self, prompt: int, completion: int) -> float:
779
788
  price = self.chat_cost()
@@ -498,3 +498,78 @@ def dataframe_to_documents(
498
498
  for _, row in df.iterrows()
499
499
  ]
500
500
  return [m for m in docs if m is not None]
501
+
502
+
503
+ def extra_metadata(document: Document, doc_cls: Type[Document] = Document) -> List[str]:
504
+ """
505
+ Checks for extra fields in a document's metadata that are not defined in the
506
+ original metadata schema.
507
+
508
+ Args:
509
+ document (Document): The document instance to check for extra fields.
510
+ doc_cls (Type[Document]): The class type derived from Document, used
511
+ as a reference to identify extra fields in the document's metadata.
512
+
513
+ Returns:
514
+ List[str]: A list of strings representing the keys of the extra fields found
515
+ in the document's metadata.
516
+ """
517
+ # Convert metadata to dict, including extra fields.
518
+ metadata_fields = set(document.metadata.dict().keys())
519
+
520
+ # Get defined fields in the metadata of doc_cls
521
+ defined_fields = set(doc_cls.__fields__["metadata"].type_.__fields__.keys())
522
+
523
+ # Identify extra fields not in defined fields.
524
+ extra_fields = list(metadata_fields - defined_fields)
525
+
526
+ return extra_fields
527
+
528
+
529
+ def extend_document_class(d: Document) -> Type[Document]:
530
+ """Generates a new pydantic class based on a given document instance.
531
+
532
+ This function dynamically creates a new pydantic class with additional
533
+ fields based on the "extra" metadata fields present in the given document
534
+ instance. The new class is a subclass of the original Document class, with
535
+ the original metadata fields retained and extra fields added as normal
536
+ fields to the metadata.
537
+
538
+ Args:
539
+ d: An instance of the Document class.
540
+
541
+ Returns:
542
+ A new subclass of the Document class that includes the additional fields
543
+ found in the metadata of the given document instance.
544
+ """
545
+ # Extract the fields from the original metadata class, including types,
546
+ # correctly handling special types like List[str].
547
+ original_metadata_fields = {
548
+ k: (v.outer_type_ if v.shape != 1 else v.type_, ...)
549
+ for k, v in DocMetaData.__fields__.items()
550
+ }
551
+ # Extract extra fields from the metadata instance with their types
552
+ extra_fields = {
553
+ k: (type(v), ...)
554
+ for k, v in d.metadata.__dict__.items()
555
+ if k not in DocMetaData.__fields__
556
+ }
557
+
558
+ # Combine original and extra fields for the new metadata class
559
+ combined_fields = {**original_metadata_fields, **extra_fields}
560
+
561
+ # Create a new metadata class with combined fields
562
+ NewMetadataClass = create_model( # type: ignore
563
+ "ExtendedDocMetadata", **combined_fields, __base__=DocMetaData
564
+ )
565
+ # NewMetadataClass.__config__.arbitrary_types_allowed = True
566
+
567
+ # Create a new document class using the new metadata class
568
+ NewDocumentClass = create_model(
569
+ "ExtendedDocument",
570
+ content=(str, ...),
571
+ metadata=(NewMetadataClass, ...),
572
+ __base__=Document,
573
+ )
574
+
575
+ return NewDocumentClass
@@ -18,6 +18,8 @@ from langroid.utils.configuration import settings
18
18
  from langroid.utils.pydantic_utils import (
19
19
  dataframe_to_document_model,
20
20
  dataframe_to_documents,
21
+ extend_document_class,
22
+ extra_metadata,
21
23
  flatten_pydantic_instance,
22
24
  flatten_pydantic_model,
23
25
  nested_dict_from_flat,
@@ -33,6 +35,8 @@ class LanceDBConfig(VectorStoreConfig):
33
35
  storage_path: str = ".lancedb/data"
34
36
  embedding: EmbeddingModelsConfig = OpenAIEmbeddingsConfig()
35
37
  distance: str = "cosine"
38
+ # document_class is used to store in lancedb with right schema,
39
+ # and also to retrieve the right type of Documents when searching.
36
40
  document_class: Type[Document] = Document
37
41
  flatten: bool = False # flatten Document class into LanceSchema ?
38
42
 
@@ -231,8 +235,30 @@ class LanceDB(VectorStore):
231
235
  ):
232
236
  # collection either doesn't exist or is empty, so replace it,
233
237
  # possibly with a new schema
234
- doc_cls = type(documents[0])
235
- self.config.document_class = doc_cls
238
+ extra_metadata_fields = extra_metadata(
239
+ documents[0], self.config.document_class
240
+ )
241
+ if len(extra_metadata_fields) > 0:
242
+ logger.warning(
243
+ f"""
244
+ Added documents contain extra metadata fields:
245
+ {extra_metadata_fields}
246
+ Trying to recreate the collection {coll_name} with a new schema:
247
+ Overriding LanceDBConfig.document_class with an auto-generated
248
+ Pydantic class that includes these extra fields.
249
+ If this fails, or you see odd results, it is recommended that you
250
+ define a subclass of Document, with metadata of class derived from
251
+ DocMetaData, with extra fields defined via
252
+ `Field(..., description="...")` declarations,
253
+ and set this document class as the value of the
254
+ LanceDBConfig.document_class attribute.
255
+ """
256
+ )
257
+
258
+ doc_cls = extend_document_class(documents[0])
259
+ self.config.document_class = doc_cls
260
+
261
+ doc_cls = self.config.document_class
236
262
  self._setup_schemas(doc_cls)
237
263
  self.create_collection(coll_name, replace=True)
238
264
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: langroid
3
- Version: 0.1.190
3
+ Version: 0.1.192
4
4
  Summary: Harness LLMs with Multi-Agent Programming
5
5
  License: MIT
6
6
  Author: Prasad Chalasani
@@ -10,13 +10,13 @@ langroid/agent/helpers.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  langroid/agent/junk,sha256=LxfuuW7Cijsg0szAzT81OjWWv1PMNI-6w_-DspVIO2s,339
11
11
  langroid/agent/openai_assistant.py,sha256=yBtxis64XOnxtJzlkwUoTm-wCyvKr4DGo9-laXYMok0,32654
12
12
  langroid/agent/special/__init__.py,sha256=xj4TvQ_oQX_xYPySbhmQAi2CPhuy_3yQPqqwzb4wsc0,943
13
- langroid/agent/special/doc_chat_agent.py,sha256=0CpI9Pt4aoOoAH2TP2gS3gWj0yKJJPmFfBSOGMTBXgs,48231
14
- langroid/agent/special/lance_doc_chat_agent.py,sha256=tUpn6vnbHzlkkpKEHJym7dtxS-s39AwPfH2PqyNJuxY,8371
13
+ langroid/agent/special/doc_chat_agent.py,sha256=XGKliuFv1KM58TQsvKeXpD1eAzsRdK1lpr1KVugDQ98,49015
14
+ langroid/agent/special/lance_doc_chat_agent.py,sha256=pAIJchnBOVZnd2fxTteF0KSyZHMzTLKDj8vziTRuUUk,10184
15
15
  langroid/agent/special/lance_rag/__init__.py,sha256=-pq--upe-8vycYoTwxoomBnuUqrcRFUukmW3uBL1cFM,219
16
16
  langroid/agent/special/lance_rag/critic_agent.py,sha256=9izW4keCxVZEqrFOgyVUHD7N1vTXLkRynXYYd1Vpwzw,5785
17
17
  langroid/agent/special/lance_rag/lance_rag_task.py,sha256=l_HQgrYY-CX2FwIsS961aEF3bYog3GDYo98fj0C0mSk,2889
18
18
  langroid/agent/special/lance_rag/lance_tools.py,sha256=WypIS-3ZMDqY_PZEGB2K80-o4RfS43_OnER0dyFlsDY,1339
19
- langroid/agent/special/lance_rag/query_planner_agent.py,sha256=dZXVano2NbRZy91nBcEW6LrvedsHfxL1oNCgMQEHZ-U,8016
19
+ langroid/agent/special/lance_rag/query_planner_agent.py,sha256=klWYyMSAaSwLwWBbTUHvZfni-nB7QWfni8vpo3QlfhQ,8043
20
20
  langroid/agent/special/neo4j/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  langroid/agent/special/neo4j/csv_kg_chat.py,sha256=YfuyblH9d307ggzN7fUD2mxLorIdexjVAlZ8uVDZqhY,6394
22
22
  langroid/agent/special/neo4j/neo4j_chat_agent.py,sha256=UGsnneFQVrzyNB5AhuY0BhnN-BH7me7dIpi7q8cw8ZA,12155
@@ -58,7 +58,7 @@ langroid/language_models/azure_openai.py,sha256=ncRCbKooqLVOY-PWQUIo9C3yTuKEFbAw
58
58
  langroid/language_models/base.py,sha256=RdXH-BnkFGS8xZTiukdxHTFxqELVSmf546itp9Fa8fs,21008
59
59
  langroid/language_models/config.py,sha256=5UF3DzO1a-Dfsc3vghE0XGq7g9t_xDsRCsuRiU4dgBg,366
60
60
  langroid/language_models/openai_assistants.py,sha256=9K-DEAL2aSWHeXj2hwCo2RAlK9_1oCPtqX2u1wISCj8,36
61
- langroid/language_models/openai_gpt.py,sha256=9gm6URAIh2-katOQGl8BTpDp0JtE20JJptPRR_-HfWY,48252
61
+ langroid/language_models/openai_gpt.py,sha256=oBvrEjiCMPeHzZCSWZm9mmfAIWrcVqc_hsrJCbzLOGU,48568
62
62
  langroid/language_models/prompt_formatter/__init__.py,sha256=9JXFF22QNMmbQV1q4nrIeQVTtA3Tx8tEZABLtLBdFyc,352
63
63
  langroid/language_models/prompt_formatter/base.py,sha256=eDS1sgRNZVnoajwV_ZIha6cba5Dt8xjgzdRbPITwx3Q,1221
64
64
  langroid/language_models/prompt_formatter/hf_formatter.py,sha256=3MQhu8--p168qPWXqlp_nK4phi-SuAUMqahSVyLHIkA,4177
@@ -102,7 +102,7 @@ langroid/utils/logging.py,sha256=R8TN-FqVpwZ4Ajgls9TDMthLvPpQd0QVNXK-PJDj1Z8,391
102
102
  langroid/utils/output/__init__.py,sha256=Z58-2ZKnGpGNaKw_nEjHV_CHTzjMz-WRSRQnazTLrWU,289
103
103
  langroid/utils/output/printing.py,sha256=5EsYB1O4qKhocW19aebOUzK82RD9U5nygbY21yo8gfg,2872
104
104
  langroid/utils/pandas_utils.py,sha256=nSA1tIgOUTkRDn-IKq7HP8XGJcL6bA110LcPfRF7h8I,707
105
- langroid/utils/pydantic_utils.py,sha256=hx5TV_U_8tTXn8rRItPs0RfYYo4og3EcXz7cddsJMS8,17008
105
+ langroid/utils/pydantic_utils.py,sha256=ctv5L6s94_F5CNnNsHybioQKu7Mp_upZcrMWxwmx57o,19827
106
106
  langroid/utils/system.py,sha256=x9204H1-6EubDe8-9yX87KZSmRCkf0puXQv91QOetF4,3326
107
107
  langroid/utils/web/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
108
108
  langroid/utils/web/login.py,sha256=1iz9eUAHa87vpKIkzwkmFa00avwFWivDSAr7QUhK7U0,2528
@@ -110,12 +110,12 @@ langroid/utils/web/selenium_login.py,sha256=mYI6EvVmne34N9RajlsxxRqJQJvV-WG4LGp6
110
110
  langroid/vector_store/__init__.py,sha256=qOa3_BLvf8tjdUBT4Zq7pSLTY9TD2Fgw62UHHJWNu8w,557
111
111
  langroid/vector_store/base.py,sha256=JNk-2f6t_WCavizU332tOoZcXHP73RpobRk88Aus52w,13706
112
112
  langroid/vector_store/chromadb.py,sha256=Y80k6an5sN0cRWtcl78Xr-Ht87nd_hBjvkSU5OdCyY8,7312
113
- langroid/vector_store/lancedb.py,sha256=dsdZVHfnvOcs1BhVK99UknbIjbND0j6I6d2_QozuL7A,16671
113
+ langroid/vector_store/lancedb.py,sha256=Vl0nWKqFyczgPRmWXLzof9UgOB0OhVZIuczY_rSAF10,17985
114
114
  langroid/vector_store/meilisearch.py,sha256=d2huA9P-NoYRuAQ9ZeXJmMKr7ry8u90RUSR28k2ecQg,11340
115
115
  langroid/vector_store/momento.py,sha256=j6Eo6oIDN2fe7lsBOlCXJn3uvvERHHTFL5QJfeREeOM,10044
116
116
  langroid/vector_store/qdrant_cloud.py,sha256=3im4Mip0QXLkR6wiqVsjV1QvhSElfxdFSuDKddBDQ-4,188
117
117
  langroid/vector_store/qdrantdb.py,sha256=_egbsP9SWBwmI827EDYSSOqfIQSmwNsmJfFTxrLpWYE,13457
118
- langroid-0.1.190.dist-info/LICENSE,sha256=EgVbvA6VSYgUlvC3RvPKehSg7MFaxWDsFuzLOsPPfJg,1065
119
- langroid-0.1.190.dist-info/METADATA,sha256=VX8PncumZaLEiukTyz2PmCiWDHIhJEcU-e5Ik7BDzZA,45671
120
- langroid-0.1.190.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
121
- langroid-0.1.190.dist-info/RECORD,,
118
+ langroid-0.1.192.dist-info/LICENSE,sha256=EgVbvA6VSYgUlvC3RvPKehSg7MFaxWDsFuzLOsPPfJg,1065
119
+ langroid-0.1.192.dist-info/METADATA,sha256=-_fDgrzNhWdaDfOQBooJicN992gMfxUbn8Enut6Ymvo,45671
120
+ langroid-0.1.192.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
121
+ langroid-0.1.192.dist-info/RECORD,,