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.
@@ -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 directory_path.rglob("*")
71
+ for f in file_iterator
66
72
  if f.is_file()
67
73
  ]
68
74
  files = [
lionagi/libs/file/save.py CHANGED
@@ -60,6 +60,7 @@ def save_to_file(
60
60
  )
61
61
  with file_path.open("w", encoding="utf-8") as file:
62
62
  file.write(text)
63
+ file.close()
63
64
  if verbose:
64
65
  logging.info(f"Text saved to: {file_path}")
65
66
  return file_path
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
@@ -0,0 +1,3 @@
1
+ # Copyright (c) 2023 - 2025, HaiyangLi <quantocean.li at gmail dot com>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
lionagi/tools/base.py CHANGED
@@ -1,3 +1,7 @@
1
+ # Copyright (c) 2023 - 2025, HaiyangLi <quantocean.li at gmail dot com>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from abc import ABC, abstractmethod
2
6
 
3
7
  from lionagi.operatives.action.tool import Tool
File without changes
@@ -0,0 +1,3 @@
1
+ # Copyright (c) 2023 - 2025, HaiyangLi <quantocean.li at gmail dot com>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
@@ -0,0 +1,3 @@
1
+ # Copyright (c) 2023 - 2025, HaiyangLi <quantocean.li at gmail dot com>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
@@ -0,0 +1,3 @@
1
+ # Copyright (c) 2023 - 2025, HaiyangLi <quantocean.li at gmail dot com>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
@@ -0,0 +1,3 @@
1
+ # Copyright (c) 2023 - 2025, HaiyangLi <quantocean.li at gmail dot com>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
@@ -0,0 +1,3 @@
1
+ # Copyright (c) 2023 - 2025, HaiyangLi <quantocean.li at gmail dot com>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
@@ -0,0 +1,3 @@
1
+ # Copyright (c) 2023 - 2025, HaiyangLi <quantocean.li at gmail dot com>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
@@ -0,0 +1,3 @@
1
+ # Copyright (c) 2023 - 2025, HaiyangLi <quantocean.li at gmail dot com>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
@@ -0,0 +1,3 @@
1
+ # Copyright (c) 2023 - 2025, HaiyangLi <quantocean.li at gmail dot com>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
@@ -0,0 +1,3 @@
1
+ # Copyright (c) 2023 - 2025, HaiyangLi <quantocean.li at gmail dot com>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
@@ -0,0 +1,3 @@
1
+ # Copyright (c) 2023 - 2025, HaiyangLi <quantocean.li at gmail dot com>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
@@ -0,0 +1,3 @@
1
+ # Copyright (c) 2023 - 2025, HaiyangLi <quantocean.li at gmail dot com>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
@@ -0,0 +1,3 @@
1
+ # Copyright (c) 2023 - 2025, HaiyangLi <quantocean.li at gmail dot com>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
@@ -0,0 +1,3 @@
1
+ # Copyright (c) 2023 - 2025, HaiyangLi <quantocean.li at gmail dot com>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
@@ -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, field_validator, model_validator
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'. If action='open', leave it None."
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
- from lionagi.libs.package.imports import check_import
175
+ def __init__(self):
176
+ from lionagi.libs.package.imports import check_import
150
177
 
151
- DocumentConverter = check_import(
152
- "docling",
153
- module_name="document_converter",
154
- import_name="DocumentConverter",
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 = ReaderTool.DocumentConverter()
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
- elif request.action == "read":
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 _open_doc(self, source: str) -> ReaderResponse:
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, doc_info=DocumentInfo(doc_id=doc_id, length=doc_len)
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 either:
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)
@@ -0,0 +1,3 @@
1
+ # Copyright (c) 2023 - 2025, HaiyangLi <quantocean.li at gmail dot com>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
@@ -0,0 +1,3 @@
1
+ # Copyright (c) 2023 - 2025, HaiyangLi <quantocean.li at gmail dot com>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
lionagi/tools/types.py CHANGED
@@ -1,3 +1,8 @@
1
+ # Copyright (c) 2023 - 2025, HaiyangLi <quantocean.li at gmail dot com>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+
1
6
  from .file.reader import ReaderTool
2
7
 
3
8
  __all__ = ("ReaderTool",)
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 no extension or filename invalid.
1025
+ ValueError: If filename is invalid.
1026
1026
  FileExistsError: If file exists and file_exist_ok=False.
1027
1027
  """
1028
- if "/" in filename or "\\" 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.2"
1
+ __version__ = "0.9.4"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lionagi
3
- Version: 0.9.2
3
+ Version: 0.9.4
4
4
  Summary: An Intelligence Operating System.
5
5
  Author-email: HaiyangLi <quantocean.li@gmail.com>
6
6
  License: Apache License
@@ -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=_A98YIoJMeQXKchx9m_cWTOutjdZRZASWTOSIRGTOB4,73177
7
- lionagi/version.py,sha256=gqT-BGoeEItda9fICQDvLbxEjWRIBhFJxPxxKvmHLUo,22
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=SKo70p3Vx-a63xp9E51IcgTm2W6-0rabu_5o090g4SQ,5199
15
- lionagi/libs/file/save.py,sha256=tZGTo8c5vJSa8DHs05yGwDPnVNdxh9MiHuszFXRExDU,2842
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=SgLLuNXSJwmHJTfRpqaUlC0zF2qOyasTkVqrg_dXrsw,14272
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=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
195
- lionagi/tools/base.py,sha256=ffaIcLF_uwEphCkP_wsa3UfkqVenML3HpsnR5kRCTtA,236
196
- lionagi/tools/types.py,sha256=O6ipx7zX0piaIQ3c8V3zHWrXH-1gdIe-KQ4xTPSiLp0,63
197
- lionagi/tools/file/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
198
- lionagi/tools/file/reader.py,sha256=cMkS-r7wQb4gQSldLyCCOyD73VkUDSio9RxzsQ2xBxo,7706
199
- lionagi-0.9.2.dist-info/METADATA,sha256=bs44CDbfErTh8xI14pq3HZTcqNpR5j6V-gwjWvPOLho,18053
200
- lionagi-0.9.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
201
- lionagi-0.9.2.dist-info/licenses/LICENSE,sha256=VXFWsdoN5AAknBCgFqQNgPWYx7OPp-PFEP961zGdOjc,11288
202
- lionagi-0.9.2.dist-info/RECORD,,
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,,