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.
- langroid/agent/special/doc_chat_agent.py +28 -7
- langroid/agent/special/lance_doc_chat_agent.py +58 -9
- langroid/agent/special/lance_rag/query_planner_agent.py +2 -1
- langroid/language_models/openai_gpt.py +11 -2
- langroid/utils/pydantic_utils.py +75 -0
- langroid/vector_store/lancedb.py +28 -2
- {langroid-0.1.190.dist-info → langroid-0.1.192.dist-info}/METADATA +1 -1
- {langroid-0.1.190.dist-info → langroid-0.1.192.dist-info}/RECORD +10 -10
- {langroid-0.1.190.dist-info → langroid-0.1.192.dist-info}/LICENSE +0 -0
- {langroid-0.1.190.dist-info → langroid-0.1.192.dist-info}/WHEEL +0 -0
@@ -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]]
|
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 = {
|
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
|
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]]
|
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(
|
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
|
-
|
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
|
70
|
-
{
|
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
|
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"
|
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]]
|
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
|
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
|
-
|
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
|
-
|
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()
|
langroid/utils/pydantic_utils.py
CHANGED
@@ -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
|
langroid/vector_store/lancedb.py
CHANGED
@@ -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
|
-
|
235
|
-
|
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
|
|
@@ -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=
|
14
|
-
langroid/agent/special/lance_doc_chat_agent.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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.
|
119
|
-
langroid-0.1.
|
120
|
-
langroid-0.1.
|
121
|
-
langroid-0.1.
|
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,,
|
File without changes
|
File without changes
|