lionagi 0.9.2__py3-none-any.whl → 0.9.4__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.
- lionagi/libs/file/process.py +7 -1
- lionagi/libs/file/save.py +1 -0
- lionagi/service/imodel.py +7 -0
- lionagi/tools/__init__.py +3 -0
- lionagi/tools/base.py +4 -0
- lionagi/tools/browser/__init__.py +0 -0
- lionagi/tools/browser/providers/__init__.py +3 -0
- lionagi/tools/browser/providers/browser_use_.py +3 -0
- lionagi/tools/code/__init__.py +3 -0
- lionagi/tools/code/coder.py +3 -0
- lionagi/tools/code/manager.py +3 -0
- lionagi/tools/code/providers/__init__.py +3 -0
- lionagi/tools/code/providers/aider_.py +3 -0
- lionagi/tools/code/providers/e2b_.py +3 -0
- lionagi/tools/code/sandbox.py +3 -0
- lionagi/tools/file/__init__.py +3 -0
- lionagi/tools/file/manager.py +3 -0
- lionagi/tools/file/providers/__init__.py +3 -0
- lionagi/tools/file/providers/docling_.py +3 -0
- lionagi/tools/file/reader.py +77 -23
- lionagi/tools/file/writer.py +3 -0
- lionagi/tools/query/__init__.py +3 -0
- lionagi/tools/types.py +5 -0
- lionagi/utils.py +6 -5
- lionagi/version.py +1 -1
- {lionagi-0.9.2.dist-info → lionagi-0.9.4.dist-info}/METADATA +1 -1
- {lionagi-0.9.2.dist-info → lionagi-0.9.4.dist-info}/RECORD +29 -14
- {lionagi-0.9.2.dist-info → lionagi-0.9.4.dist-info}/WHEEL +0 -0
- {lionagi-0.9.2.dist-info → lionagi-0.9.4.dist-info}/licenses/LICENSE +0 -0
lionagi/libs/file/process.py
CHANGED
@@ -18,6 +18,7 @@ def dir_to_files(
|
|
18
18
|
max_workers: int | None = None,
|
19
19
|
ignore_errors: bool = False,
|
20
20
|
verbose: bool = False,
|
21
|
+
recursive: bool = False,
|
21
22
|
) -> list[Path]:
|
22
23
|
"""
|
23
24
|
Recursively process a directory and return a list of file paths.
|
@@ -33,6 +34,8 @@ def dir_to_files(
|
|
33
34
|
If None, uses the default ThreadPoolExecutor behavior.
|
34
35
|
ignore_errors (bool): If True, log warnings for errors instead of raising exceptions.
|
35
36
|
verbose (bool): If True, print verbose output.
|
37
|
+
recursive (bool): If True, process directories recursively (the default).
|
38
|
+
If False, only process files in the top-level directory.
|
36
39
|
|
37
40
|
Returns:
|
38
41
|
List[Path]: A list of Path objects representing the files found.
|
@@ -58,11 +61,14 @@ def dir_to_files(
|
|
58
61
|
raise ValueError(f"Error processing {file_path}: {e}") from e
|
59
62
|
return None
|
60
63
|
|
64
|
+
file_iterator = (
|
65
|
+
directory_path.rglob("*") if recursive else directory_path.glob("*")
|
66
|
+
)
|
61
67
|
try:
|
62
68
|
with ThreadPoolExecutor(max_workers=max_workers) as executor:
|
63
69
|
futures = [
|
64
70
|
executor.submit(process_file, f)
|
65
|
-
for f in
|
71
|
+
for f in file_iterator
|
66
72
|
if f.is_file()
|
67
73
|
]
|
68
74
|
files = [
|
lionagi/libs/file/save.py
CHANGED
lionagi/service/imodel.py
CHANGED
@@ -54,6 +54,7 @@ class iModel:
|
|
54
54
|
invoke_with_endpoint: bool = False,
|
55
55
|
concurrency_limit: int | None = None,
|
56
56
|
streaming_process_func: Callable = None,
|
57
|
+
requires_api_key: bool = True,
|
57
58
|
**kwargs,
|
58
59
|
) -> None:
|
59
60
|
"""Initializes the iModel instance.
|
@@ -95,6 +96,7 @@ class iModel:
|
|
95
96
|
provider-specific fields.
|
96
97
|
"""
|
97
98
|
if api_key is None:
|
99
|
+
provider = str(provider or "").strip().lower()
|
98
100
|
match provider:
|
99
101
|
case "openai":
|
100
102
|
api_key = "OPENAI_API_KEY"
|
@@ -108,6 +110,11 @@ class iModel:
|
|
108
110
|
api_key = "GROQ_API_KEY"
|
109
111
|
case "exa":
|
110
112
|
api_key = "EXA_API_KEY"
|
113
|
+
case "":
|
114
|
+
if requires_api_key:
|
115
|
+
raise ValueError("API key must be provided")
|
116
|
+
case _:
|
117
|
+
api_key = f"{provider.upper()}_API_KEY"
|
111
118
|
|
112
119
|
if os.getenv(api_key, None) is not None:
|
113
120
|
self.api_key_scheme = api_key
|
lionagi/tools/__init__.py
CHANGED
lionagi/tools/base.py
CHANGED
File without changes
|
lionagi/tools/file/__init__.py
CHANGED
lionagi/tools/file/reader.py
CHANGED
@@ -1,9 +1,14 @@
|
|
1
|
+
# Copyright (c) 2023 - 2025, HaiyangLi <quantocean.li at gmail dot com>
|
2
|
+
#
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
4
|
+
|
1
5
|
import tempfile
|
2
6
|
from enum import Enum
|
3
7
|
|
4
|
-
from pydantic import BaseModel, Field,
|
8
|
+
from pydantic import BaseModel, Field, model_validator
|
5
9
|
|
6
10
|
from lionagi.operatives.action.tool import Tool
|
11
|
+
from lionagi.service.endpoints.token_calculator import TokenCalculator
|
7
12
|
from lionagi.utils import to_num
|
8
13
|
|
9
14
|
from ..base import LionTool
|
@@ -14,10 +19,12 @@ class ReaderAction(str, Enum):
|
|
14
19
|
This enumeration indicates the *type* of action the LLM wants to perform.
|
15
20
|
- 'open': Convert a file/URL to text and store it internally for partial reads
|
16
21
|
- 'read': Return a partial slice of the already-opened doc
|
22
|
+
- 'list_dir': List all files in a directory and store it internally for partial reads
|
17
23
|
"""
|
18
24
|
|
19
25
|
open = "open"
|
20
26
|
read = "read"
|
27
|
+
list_dir = "list_dir"
|
21
28
|
|
22
29
|
|
23
30
|
class ReaderRequest(BaseModel):
|
@@ -35,6 +42,7 @@ class ReaderRequest(BaseModel):
|
|
35
42
|
"Action to perform. Must be one of: "
|
36
43
|
"- 'open': Convert a file/URL to text and store it internally for partial reads. "
|
37
44
|
"- 'read': Return a partial slice of the already-opened doc."
|
45
|
+
"- 'list_dir': List all files in a directory."
|
38
46
|
),
|
39
47
|
)
|
40
48
|
|
@@ -50,7 +58,8 @@ class ReaderRequest(BaseModel):
|
|
50
58
|
None,
|
51
59
|
description=(
|
52
60
|
"Unique ID referencing a previously opened document. "
|
53
|
-
"This field is REQUIRED if action='read'.
|
61
|
+
"This field is REQUIRED if action='read'. Else leave it None."
|
62
|
+
"this field starts with 'DOC_' for document and 'DIR_' for directory listing."
|
54
63
|
),
|
55
64
|
)
|
56
65
|
|
@@ -70,6 +79,22 @@ class ReaderRequest(BaseModel):
|
|
70
79
|
),
|
71
80
|
)
|
72
81
|
|
82
|
+
recursive: bool = Field(
|
83
|
+
False,
|
84
|
+
description=(
|
85
|
+
"Whether to recursively list files in subdirectories. Defaults to False."
|
86
|
+
"Only used if action='list_dir'."
|
87
|
+
),
|
88
|
+
)
|
89
|
+
|
90
|
+
file_types: list[str] | None = Field(
|
91
|
+
None,
|
92
|
+
description=(
|
93
|
+
"List files with specific extensions. "
|
94
|
+
"If omitted or None, list all files. Only used if action='list_dir'."
|
95
|
+
),
|
96
|
+
)
|
97
|
+
|
73
98
|
@model_validator(mode="before")
|
74
99
|
def _validate_request(cls, values):
|
75
100
|
for k, v in values.items():
|
@@ -92,6 +117,7 @@ class DocumentInfo(BaseModel):
|
|
92
117
|
|
93
118
|
doc_id: str
|
94
119
|
length: int | None = None
|
120
|
+
num_tokens: int | None = None
|
95
121
|
|
96
122
|
|
97
123
|
class PartialChunk(BaseModel):
|
@@ -146,17 +172,17 @@ class ReaderTool(LionTool):
|
|
146
172
|
is_lion_system_tool = True
|
147
173
|
system_tool_name = "reader_tool"
|
148
174
|
|
149
|
-
|
175
|
+
def __init__(self):
|
176
|
+
from lionagi.libs.package.imports import check_import
|
150
177
|
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
178
|
+
DocumentConverter = check_import(
|
179
|
+
"docling",
|
180
|
+
module_name="document_converter",
|
181
|
+
import_name="DocumentConverter",
|
182
|
+
)
|
156
183
|
|
157
|
-
def __init__(self):
|
158
184
|
super().__init__()
|
159
|
-
self.converter =
|
185
|
+
self.converter = DocumentConverter()
|
160
186
|
self.documents = {} # doc_id -> (temp_file_path, doc_length)
|
161
187
|
self._tool = None
|
162
188
|
|
@@ -170,23 +196,18 @@ class ReaderTool(LionTool):
|
|
170
196
|
request = ReaderRequest(**request)
|
171
197
|
if request.action == "open":
|
172
198
|
return self._open_doc(request.path_or_url)
|
173
|
-
|
199
|
+
if request.action == "read":
|
174
200
|
return self._read_doc(
|
175
201
|
request.doc_id, request.start_offset, request.end_offset
|
176
202
|
)
|
203
|
+
if request.action == "list_dir":
|
204
|
+
return self._list_dir(
|
205
|
+
request.path_or_url, request.recursive, request.file_types
|
206
|
+
)
|
177
207
|
else:
|
178
208
|
return ReaderResponse(success=False, error="Unknown action type")
|
179
209
|
|
180
|
-
def
|
181
|
-
try:
|
182
|
-
result = self.converter.convert(source)
|
183
|
-
text = result.document.export_to_markdown()
|
184
|
-
except Exception as e:
|
185
|
-
return ReaderResponse(
|
186
|
-
success=False, error=f"Conversion error: {str(e)}"
|
187
|
-
)
|
188
|
-
|
189
|
-
doc_id = f"DOC_{abs(hash(source))}"
|
210
|
+
def _save_to_temp(self, text, doc_id):
|
190
211
|
temp_file = tempfile.NamedTemporaryFile(
|
191
212
|
delete=False, mode="w", encoding="utf-8"
|
192
213
|
)
|
@@ -198,9 +219,26 @@ class ReaderTool(LionTool):
|
|
198
219
|
self.documents[doc_id] = (temp_file.name, doc_len)
|
199
220
|
|
200
221
|
return ReaderResponse(
|
201
|
-
success=True,
|
222
|
+
success=True,
|
223
|
+
doc_info=DocumentInfo(
|
224
|
+
doc_id=doc_id,
|
225
|
+
length=doc_len,
|
226
|
+
num_tokens=TokenCalculator.tokenize(text),
|
227
|
+
),
|
202
228
|
)
|
203
229
|
|
230
|
+
def _open_doc(self, source: str) -> ReaderResponse:
|
231
|
+
try:
|
232
|
+
result = self.converter.convert(source)
|
233
|
+
text = result.document.export_to_markdown()
|
234
|
+
except Exception as e:
|
235
|
+
return ReaderResponse(
|
236
|
+
success=False, error=f"Conversion error: {str(e)}"
|
237
|
+
)
|
238
|
+
|
239
|
+
doc_id = f"DOC_{abs(hash(source))}"
|
240
|
+
return self._save_to_temp(text, doc_id)
|
241
|
+
|
204
242
|
def _read_doc(self, doc_id: str, start: int, end: int) -> ReaderResponse:
|
205
243
|
if doc_id not in self.documents:
|
206
244
|
return ReaderResponse(
|
@@ -226,14 +264,30 @@ class ReaderTool(LionTool):
|
|
226
264
|
chunk=PartialChunk(start_offset=s, end_offset=e, content=content),
|
227
265
|
)
|
228
266
|
|
267
|
+
def _list_dir(
|
268
|
+
self,
|
269
|
+
directory: str,
|
270
|
+
recursive: bool = False,
|
271
|
+
file_types: list[str] | None = None,
|
272
|
+
):
|
273
|
+
from lionagi.libs.file.process import dir_to_files
|
274
|
+
|
275
|
+
files = dir_to_files(
|
276
|
+
directory, recursive=recursive, file_types=file_types
|
277
|
+
)
|
278
|
+
files = "\n".join([str(f) for f in files])
|
279
|
+
doc_id = f"DIR_{abs(hash(directory))}"
|
280
|
+
return self._save_to_temp(files, doc_id)
|
281
|
+
|
229
282
|
def to_tool(self):
|
230
283
|
if self._tool is None:
|
231
284
|
|
232
285
|
def reader_tool(**kwargs):
|
233
286
|
"""
|
234
|
-
A function that takes ReaderRequest to
|
287
|
+
A function that takes ReaderRequest to do one of:
|
235
288
|
- open a doc (File/URL) -> returns doc_id, doc length
|
236
289
|
- read partial text from doc -> returns chunk
|
290
|
+
- list all files in a directory -> returns list of files as doc format
|
237
291
|
"""
|
238
292
|
return self.handle_request(
|
239
293
|
ReaderRequest(**kwargs)
|
lionagi/tools/types.py
CHANGED
lionagi/utils.py
CHANGED
@@ -1022,10 +1022,14 @@ def create_path(
|
|
1022
1022
|
The full Path to the new or existing file.
|
1023
1023
|
|
1024
1024
|
Raises:
|
1025
|
-
ValueError: If
|
1025
|
+
ValueError: If filename is invalid.
|
1026
1026
|
FileExistsError: If file exists and file_exist_ok=False.
|
1027
1027
|
"""
|
1028
|
-
if "/" in filename
|
1028
|
+
if "/" in filename:
|
1029
|
+
sub_dir, filename = filename.split("/")[:-1], filename.split("/")[-1]
|
1030
|
+
directory = Path(directory) / "/".join(sub_dir)
|
1031
|
+
|
1032
|
+
if "\\" in filename:
|
1029
1033
|
raise ValueError("Filename cannot contain directory separators.")
|
1030
1034
|
|
1031
1035
|
directory = Path(directory)
|
@@ -1036,9 +1040,6 @@ def create_path(
|
|
1036
1040
|
else:
|
1037
1041
|
name, ext = filename, extension
|
1038
1042
|
|
1039
|
-
if not ext:
|
1040
|
-
raise ValueError("No extension provided for filename.")
|
1041
|
-
|
1042
1043
|
# Ensure extension has a single leading dot
|
1043
1044
|
ext = f".{ext.lstrip('.')}" if ext else ""
|
1044
1045
|
|
lionagi/version.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__version__ = "0.9.
|
1
|
+
__version__ = "0.9.4"
|
@@ -3,16 +3,16 @@ lionagi/_class_registry.py,sha256=pfUO1DjFZIqr3OwnNMkFqL_fiEBrrf8-swkGmP_KDLE,31
|
|
3
3
|
lionagi/_errors.py,sha256=JlBTFJnRWtVYcRxKb7fWFiJHLbykl1E19mSJ8sXYVxg,455
|
4
4
|
lionagi/_types.py,sha256=9g7iytvSj3UjZxD-jL06_fxuNfgZyWT3Qnp0XYp1wQU,63
|
5
5
|
lionagi/settings.py,sha256=W52mM34E6jXF3GyqCFzVREKZrmnUqtZm_BVDsUiDI_s,1627
|
6
|
-
lionagi/utils.py,sha256=
|
7
|
-
lionagi/version.py,sha256=
|
6
|
+
lionagi/utils.py,sha256=K36D9AAGiMPR4eM9tYoiVgvH-NdPPSeMQPls09s7keQ,73223
|
7
|
+
lionagi/version.py,sha256=e56AvHfJCtG2ZwwINqsxINVbehWdKxMYgIDbjd7P-II,22
|
8
8
|
lionagi/libs/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
|
9
9
|
lionagi/libs/parse.py,sha256=JRS3bql0InHJqATnAatl-hQv4N--XXw4P77JHhTFnrc,1011
|
10
10
|
lionagi/libs/file/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
|
11
11
|
lionagi/libs/file/chunk.py,sha256=UiN92z52tlK2fUlnOYpAzTrjZV8sVDmPTnutnWkWH8Y,8835
|
12
12
|
lionagi/libs/file/file_ops.py,sha256=HBiIh1EljIJ5VTIXuyvJM0ppSs0YYOPUWmgDMJT634U,3430
|
13
13
|
lionagi/libs/file/params.py,sha256=SZ5DkoffWfxWudOAYCfCxpL8UIm-1UjeyTtploo-Lqs,5824
|
14
|
-
lionagi/libs/file/process.py,sha256=
|
15
|
-
lionagi/libs/file/save.py,sha256=
|
14
|
+
lionagi/libs/file/process.py,sha256=1nILukF_JXr03hVPQKmqOTwFYv9FhgZirLQuZG2u4KY,5486
|
15
|
+
lionagi/libs/file/save.py,sha256=TCxVlKxFFnr3xZ-HAXPpTomQoyiVrp6nKRoj-bcQt4k,2863
|
16
16
|
lionagi/libs/nested/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
|
17
17
|
lionagi/libs/nested/flatten.py,sha256=sB4jxZRoaUbjak9RbIWVWNKz2hzkhQJPFffV_Ws1GA0,5479
|
18
18
|
lionagi/libs/nested/nfilter.py,sha256=kF7AWjLFHr22SOjRBSTx-7iRPaR7gs0FY5Y4XF2sWJ8,1768
|
@@ -161,7 +161,7 @@ lionagi/protocols/messages/templates/instruction_message.jinja2,sha256=L-ptw5OHx
|
|
161
161
|
lionagi/protocols/messages/templates/system_message.jinja2,sha256=JRKJ0aFpYfaXSFouKc_N4unZ35C3yZTOWhIrIdCB5qk,215
|
162
162
|
lionagi/protocols/messages/templates/tool_schemas.jinja2,sha256=ozIaSDCRjIAhLyA8VM6S-YqS0w2NcctALSwx4LjDwII,126
|
163
163
|
lionagi/service/__init__.py,sha256=DMGXIqPsmut9H5GT0ZeSzQIzYzzPwI-2gLXydpbwiV8,21
|
164
|
-
lionagi/service/imodel.py,sha256=
|
164
|
+
lionagi/service/imodel.py,sha256=w3cqrJSz2q7k_Y3BXsuS85ZTpBOfa0bNM7Gr58IdTaA,14589
|
165
165
|
lionagi/service/manager.py,sha256=FkuqAtLErqLmXNnDtuAdTUFo4uuE_VL660BBGBhzInU,1435
|
166
166
|
lionagi/service/types.py,sha256=CHPi8Bxl_yJ1pl2jYZBOrTHbT8_oO9sK75d4LMB651g,486
|
167
167
|
lionagi/service/endpoints/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
|
@@ -191,12 +191,27 @@ lionagi/session/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,1
|
|
191
191
|
lionagi/session/branch.py,sha256=XL0P507Jfqk9LhC8rDvajkjVE8FkPx7hnLltb-LdqHw,71503
|
192
192
|
lionagi/session/prompts.py,sha256=AhuHL19s0TijVZX3tMKUKMi6l88xeVdpkuEn2vJSRyU,3236
|
193
193
|
lionagi/session/session.py,sha256=8SuNMiJX6IAW6Ou8aDK0LsVG7zcD5yd22sakMyrd3pw,8987
|
194
|
-
lionagi/tools/__init__.py,sha256=
|
195
|
-
lionagi/tools/base.py,sha256=
|
196
|
-
lionagi/tools/types.py,sha256=
|
197
|
-
lionagi/tools/
|
198
|
-
lionagi/tools/
|
199
|
-
lionagi
|
200
|
-
lionagi
|
201
|
-
lionagi
|
202
|
-
lionagi
|
194
|
+
lionagi/tools/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
|
195
|
+
lionagi/tools/base.py,sha256=R5T8hliDfJwXitNcgs2RPogE3yYserRjfRAVzAY2kM4,349
|
196
|
+
lionagi/tools/types.py,sha256=f4TgF9LJ86P5dHIXNAHMSnLDnjto45M8Q_UJlyI-G3Y,177
|
197
|
+
lionagi/tools/browser/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
198
|
+
lionagi/tools/browser/providers/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
|
199
|
+
lionagi/tools/browser/providers/browser_use_.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
|
200
|
+
lionagi/tools/code/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
|
201
|
+
lionagi/tools/code/coder.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
|
202
|
+
lionagi/tools/code/manager.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
|
203
|
+
lionagi/tools/code/sandbox.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
|
204
|
+
lionagi/tools/code/providers/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
|
205
|
+
lionagi/tools/code/providers/aider_.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
|
206
|
+
lionagi/tools/code/providers/e2b_.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
|
207
|
+
lionagi/tools/file/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
|
208
|
+
lionagi/tools/file/manager.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
|
209
|
+
lionagi/tools/file/reader.py,sha256=6Fmw67cOODnFmC7yValfzKmfvgunovT9Cs8QiSiIQZU,9540
|
210
|
+
lionagi/tools/file/writer.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
|
211
|
+
lionagi/tools/file/providers/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
|
212
|
+
lionagi/tools/file/providers/docling_.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
|
213
|
+
lionagi/tools/query/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
|
214
|
+
lionagi-0.9.4.dist-info/METADATA,sha256=46U0oyzqf8A6wuF-KlmsEZWVDiRQCFyZrYfPeG5ZgOQ,18053
|
215
|
+
lionagi-0.9.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
216
|
+
lionagi-0.9.4.dist-info/licenses/LICENSE,sha256=VXFWsdoN5AAknBCgFqQNgPWYx7OPp-PFEP961zGdOjc,11288
|
217
|
+
lionagi-0.9.4.dist-info/RECORD,,
|
File without changes
|
File without changes
|