lionagi 0.2.4__py3-none-any.whl → 0.2.5__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/core/engine/branch_engine.py +4 -1
- lionagi/core/generic/graph.py +4 -2
- lionagi/core/generic/node.py +2 -2
- lionagi/core/session/directive_mixin.py +2 -2
- lionagi/core/unit/unit_mixin.py +1 -1
- lionagi/core/work/work_edge.py +8 -6
- lionagi/core/work/work_function.py +13 -6
- lionagi/core/work/work_function_node.py +19 -8
- lionagi/core/work/work_queue.py +4 -4
- lionagi/core/work/work_task.py +14 -24
- lionagi/core/work/worker.py +66 -39
- lionagi/core/work/worker_engine.py +38 -13
- lionagi/integrations/config/oai_configs.py +1 -1
- lionagi/integrations/provider/litellm.py +3 -4
- lionagi/libs/ln_parse.py +2 -2
- lionagi/tests/api/aws/conftest.py +17 -20
- lionagi/tests/api/aws/test_aws_s3.py +4 -5
- lionagi/tests/test_core/generic/test_structure.py +2 -2
- lionagi/tests/test_core/graph/test_graph.py +1 -1
- lionagi/tests/test_core/graph/test_tree.py +1 -1
- lionagi/tests/test_core/mail/test_mail.py +4 -5
- lionagi/tests/test_core/test_structure/test_base_structure.py +1 -1
- lionagi/tests/test_core/test_structure/test_graph.py +1 -1
- lionagi/tests/test_core/test_structure/test_tree.py +1 -1
- lionagi/version.py +1 -1
- {lionagi-0.2.4.dist-info → lionagi-0.2.5.dist-info}/METADATA +2 -2
- {lionagi-0.2.4.dist-info → lionagi-0.2.5.dist-info}/RECORD +30 -30
- {lionagi-0.2.4.dist-info → lionagi-0.2.5.dist-info}/LICENSE +0 -0
- {lionagi-0.2.4.dist-info → lionagi-0.2.5.dist-info}/WHEEL +0 -0
- {lionagi-0.2.4.dist-info → lionagi-0.2.5.dist-info}/top_level.txt +0 -0
@@ -57,7 +57,10 @@ class BranchExecutor(Branch, BaseExecutor):
|
|
57
57
|
await self._process_condition(mail)
|
58
58
|
elif mail.category == "end":
|
59
59
|
self._process_end(mail)
|
60
|
-
if
|
60
|
+
if (
|
61
|
+
key in self.mailbox.pending_ins
|
62
|
+
and self.mailbox.pending_ins.get(key, Pile()).size() == 0
|
63
|
+
):
|
61
64
|
self.mailbox.pending_ins.pop(key)
|
62
65
|
|
63
66
|
async def execute(self, refresh_time=1) -> None:
|
lionagi/core/generic/graph.py
CHANGED
@@ -202,7 +202,9 @@ class Graph(Node):
|
|
202
202
|
|
203
203
|
return g
|
204
204
|
|
205
|
-
def display(
|
205
|
+
def display(
|
206
|
+
self, node_label="class_name", edge_label="label", draw_kwargs={}, **kwargs
|
207
|
+
):
|
206
208
|
"""Display the graph using NetworkX and Matplotlib."""
|
207
209
|
from lionagi.libs import SysUtil
|
208
210
|
|
@@ -224,7 +226,7 @@ class Graph(Node):
|
|
224
226
|
node_color="orange",
|
225
227
|
alpha=0.9,
|
226
228
|
labels=nx.get_node_attributes(g, node_label),
|
227
|
-
**draw_kwargs
|
229
|
+
**draw_kwargs,
|
228
230
|
)
|
229
231
|
|
230
232
|
labels = nx.get_edge_attributes(g, edge_label)
|
lionagi/core/generic/node.py
CHANGED
@@ -124,7 +124,7 @@ class Node(Component, Relatable):
|
|
124
124
|
label: str | None = None,
|
125
125
|
bundle: bool = False,
|
126
126
|
edge_class: Callable = Edge,
|
127
|
-
**kwargs
|
127
|
+
**kwargs,
|
128
128
|
) -> None:
|
129
129
|
"""
|
130
130
|
Establish directed relationship from this node to another.
|
@@ -150,7 +150,7 @@ class Node(Component, Relatable):
|
|
150
150
|
condition=condition,
|
151
151
|
bundle=bundle,
|
152
152
|
label=label,
|
153
|
-
**kwargs
|
153
|
+
**kwargs,
|
154
154
|
)
|
155
155
|
|
156
156
|
self.relations[direction].include(edge)
|
@@ -248,7 +248,7 @@ class DirectiveMixin:
|
|
248
248
|
form.action_response.update(_dict)
|
249
249
|
|
250
250
|
return form
|
251
|
-
|
251
|
+
|
252
252
|
form = await _directive.direct(
|
253
253
|
instruction=instruction,
|
254
254
|
context=context,
|
@@ -283,5 +283,5 @@ class DirectiveMixin:
|
|
283
283
|
if not hasattr(form, "action_response"):
|
284
284
|
form.append_to_request("action_response", {})
|
285
285
|
form.action_response.update(_dict)
|
286
|
-
|
286
|
+
|
287
287
|
return form
|
lionagi/core/unit/unit_mixin.py
CHANGED
lionagi/core/work/work_edge.py
CHANGED
@@ -21,19 +21,19 @@ class WorkEdge(Edge, Progressable):
|
|
21
21
|
other than "from_work" and "from_result".
|
22
22
|
associated_worker (Worker): The worker to which this WorkEdge belongs.
|
23
23
|
"""
|
24
|
+
|
24
25
|
convert_function: Callable = Field(
|
25
26
|
...,
|
26
|
-
description="Function to transform the result of the previous work into parameters for the next work."
|
27
|
+
description="Function to transform the result of the previous work into parameters for the next work.",
|
27
28
|
)
|
28
29
|
|
29
30
|
convert_function_kwargs: dict = Field(
|
30
31
|
{},
|
31
|
-
description=
|
32
|
+
description='parameters for the worklink function other than "from_work" and "from_result"',
|
32
33
|
)
|
33
34
|
|
34
35
|
associated_worker: Worker = Field(
|
35
|
-
...,
|
36
|
-
description="The worker to which this WorkEdge belongs."
|
36
|
+
..., description="The worker to which this WorkEdge belongs."
|
37
37
|
)
|
38
38
|
|
39
39
|
@field_validator("convert_function", mode="before")
|
@@ -81,8 +81,10 @@ class WorkEdge(Edge, Progressable):
|
|
81
81
|
StopIteration: If the task has no available steps left to proceed.
|
82
82
|
"""
|
83
83
|
if task.available_steps == 0:
|
84
|
-
task.status_note = (
|
85
|
-
|
84
|
+
task.status_note = (
|
85
|
+
"Task stopped proceeding further as all available steps have been used up, "
|
86
|
+
"but the task has not yet reached completion."
|
87
|
+
)
|
86
88
|
return
|
87
89
|
func_signature = inspect.signature(self.convert_function)
|
88
90
|
kwargs = self.convert_function_kwargs.copy()
|
@@ -13,6 +13,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
13
|
See the License for the specific language governing permissions and
|
14
14
|
limitations under the License.
|
15
15
|
"""
|
16
|
+
|
16
17
|
import asyncio
|
17
18
|
import logging
|
18
19
|
|
@@ -33,7 +34,13 @@ class WorkFunction:
|
|
33
34
|
"""
|
34
35
|
|
35
36
|
def __init__(
|
36
|
-
self,
|
37
|
+
self,
|
38
|
+
assignment,
|
39
|
+
function,
|
40
|
+
retry_kwargs=None,
|
41
|
+
guidance=None,
|
42
|
+
capacity=10,
|
43
|
+
refresh_time=1,
|
37
44
|
):
|
38
45
|
"""
|
39
46
|
Initializes a WorkFunction instance.
|
@@ -69,11 +76,11 @@ class WorkFunction:
|
|
69
76
|
@property
|
70
77
|
def execution_mode(self):
|
71
78
|
"""
|
72
|
-
|
79
|
+
Gets the execution mode of the work function's queue.
|
73
80
|
|
74
|
-
|
75
|
-
|
76
|
-
|
81
|
+
Returns:
|
82
|
+
bool: The execution mode of the work function's queue.
|
83
|
+
"""
|
77
84
|
return self.worklog.queue.execution_mode
|
78
85
|
|
79
86
|
def is_progressable(self):
|
@@ -121,4 +128,4 @@ class WorkFunction:
|
|
121
128
|
"""
|
122
129
|
Stops the execution of the work function's queue.
|
123
130
|
"""
|
124
|
-
await self.worklog.stop()
|
131
|
+
await self.worklog.stop()
|
@@ -21,7 +21,16 @@ class WorkFunctionNode(WorkFunction, Node):
|
|
21
21
|
refresh_time (int): The time interval to refresh the work log queue.
|
22
22
|
"""
|
23
23
|
|
24
|
-
def __init__(
|
24
|
+
def __init__(
|
25
|
+
self,
|
26
|
+
assignment,
|
27
|
+
function,
|
28
|
+
retry_kwargs=None,
|
29
|
+
guidance=None,
|
30
|
+
capacity=10,
|
31
|
+
refresh_time=1,
|
32
|
+
**kwargs,
|
33
|
+
):
|
25
34
|
"""
|
26
35
|
Initializes a WorkFunctionNode instance.
|
27
36
|
|
@@ -35,10 +44,12 @@ class WorkFunctionNode(WorkFunction, Node):
|
|
35
44
|
**kwargs: Additional keyword arguments for the Node initialization.
|
36
45
|
"""
|
37
46
|
Node.__init__(self, **kwargs)
|
38
|
-
WorkFunction.__init__(
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
47
|
+
WorkFunction.__init__(
|
48
|
+
self,
|
49
|
+
assignment=assignment,
|
50
|
+
function=function,
|
51
|
+
retry_kwargs=retry_kwargs,
|
52
|
+
guidance=guidance,
|
53
|
+
capacity=capacity,
|
54
|
+
refresh_time=refresh_time,
|
55
|
+
)
|
lionagi/core/work/work_queue.py
CHANGED
@@ -90,11 +90,11 @@ class WorkQueue:
|
|
90
90
|
|
91
91
|
async def execute(self):
|
92
92
|
"""
|
93
|
-
|
93
|
+
Continuously executes the process method at a specified refresh interval.
|
94
94
|
|
95
|
-
|
96
|
-
|
97
|
-
|
95
|
+
Args:
|
96
|
+
refresh_time (int, optional): The time in seconds to wait between
|
97
|
+
successive calls to `process`. Defaults to 1.
|
98
98
|
"""
|
99
99
|
self.execution_mode = True
|
100
100
|
self._stop_event.clear()
|
lionagi/core/work/work_task.py
CHANGED
@@ -20,39 +20,24 @@ class WorkTask(Component):
|
|
20
20
|
current_work (Work | None): The current work in progress.
|
21
21
|
post_processing (Callable | None): The post-processing function to be executed after the entire task is successfully completed.
|
22
22
|
"""
|
23
|
-
|
24
|
-
|
25
|
-
description="Name of the task"
|
26
|
-
)
|
23
|
+
|
24
|
+
name: str | None = Field(None, description="Name of the task")
|
27
25
|
|
28
26
|
status: WorkStatus = Field(
|
29
|
-
WorkStatus.PENDING,
|
30
|
-
description="The current status of the task"
|
27
|
+
WorkStatus.PENDING, description="The current status of the task"
|
31
28
|
)
|
32
29
|
|
33
|
-
status_note: str = Field(
|
34
|
-
None,
|
35
|
-
description="Note for tasks current status"
|
36
|
-
)
|
30
|
+
status_note: str = Field(None, description="Note for tasks current status")
|
37
31
|
|
38
|
-
work_history: list[Work] = Field(
|
39
|
-
[],
|
40
|
-
description="List of works processed"
|
41
|
-
)
|
32
|
+
work_history: list[Work] = Field([], description="List of works processed")
|
42
33
|
|
43
|
-
max_steps: int | None = Field(
|
44
|
-
10,
|
45
|
-
description="Maximum number of works allowed"
|
46
|
-
)
|
34
|
+
max_steps: int | None = Field(10, description="Maximum number of works allowed")
|
47
35
|
|
48
|
-
current_work: Work | None = Field(
|
49
|
-
None,
|
50
|
-
description="The current work in progress"
|
51
|
-
)
|
36
|
+
current_work: Work | None = Field(None, description="The current work in progress")
|
52
37
|
|
53
38
|
post_processing: Callable | None = Field(
|
54
39
|
None,
|
55
|
-
description="The post-processing function to be executed after the entire task has been successfully completed."
|
40
|
+
description="The post-processing function to be executed after the entire task has been successfully completed.",
|
56
41
|
)
|
57
42
|
|
58
43
|
@field_validator("max_steps", mode="before")
|
@@ -108,7 +93,12 @@ class WorkTask(Component):
|
|
108
93
|
Returns:
|
109
94
|
WorkTask: A new instance of WorkTask with the same attributes.
|
110
95
|
"""
|
111
|
-
new_worktask = WorkTask(
|
96
|
+
new_worktask = WorkTask(
|
97
|
+
name=self.name,
|
98
|
+
status=self.status,
|
99
|
+
max_steps=self.max_steps,
|
100
|
+
current_work=self.current_work,
|
101
|
+
)
|
112
102
|
for work in self.work_history:
|
113
103
|
new_worktask.work_history.append(work)
|
114
104
|
return new_worktask
|
lionagi/core/work/worker.py
CHANGED
@@ -93,7 +93,9 @@ class Worker(ABC):
|
|
93
93
|
|
94
94
|
"""
|
95
95
|
if form_key not in self.forms.keys():
|
96
|
-
raise ValueError(
|
96
|
+
raise ValueError(
|
97
|
+
f"Unable to change default form. Key {form_key} does not exist."
|
98
|
+
)
|
97
99
|
self.default_form = self.forms[form_key]
|
98
100
|
|
99
101
|
def _get_decorated_functions(self, decorator_attr, name_only=True):
|
@@ -108,7 +110,9 @@ class Worker(ABC):
|
|
108
110
|
list: List of decorated function names or tuples containing function details.
|
109
111
|
"""
|
110
112
|
decorated_functions = []
|
111
|
-
for name, func in inspect.getmembers(
|
113
|
+
for name, func in inspect.getmembers(
|
114
|
+
self.__class__, predicate=inspect.isfunction
|
115
|
+
):
|
112
116
|
if hasattr(func, decorator_attr):
|
113
117
|
if name_only:
|
114
118
|
decorated_functions.append(name)
|
@@ -121,11 +125,18 @@ class Worker(ABC):
|
|
121
125
|
"""
|
122
126
|
Validates worklink functions to ensure they have the required parameters.
|
123
127
|
"""
|
124
|
-
worklink_decorated_function = self._get_decorated_functions(
|
128
|
+
worklink_decorated_function = self._get_decorated_functions(
|
129
|
+
decorator_attr="_worklink_decorator_params", name_only=False
|
130
|
+
)
|
125
131
|
for func_name, func, _ in worklink_decorated_function:
|
126
132
|
func_signature = inspect.signature(func)
|
127
|
-
if
|
128
|
-
|
133
|
+
if (
|
134
|
+
"from_work" not in func_signature.parameters
|
135
|
+
and "from_result" not in func_signature.parameters
|
136
|
+
):
|
137
|
+
raise ValueError(
|
138
|
+
f'Either "from_work" or "from_result" must be a parameter in function {func_name}'
|
139
|
+
)
|
129
140
|
|
130
141
|
def construct_all_work_functions(self):
|
131
142
|
"""
|
@@ -133,7 +144,9 @@ class Worker(ABC):
|
|
133
144
|
"""
|
134
145
|
if getattr(self, "work_functions", None) is None:
|
135
146
|
self.work_functions = {}
|
136
|
-
work_decorated_function = self._get_decorated_functions(
|
147
|
+
work_decorated_function = self._get_decorated_functions(
|
148
|
+
decorator_attr="_work_decorator_params", name_only=False
|
149
|
+
)
|
137
150
|
for func_name, func, dec_params in work_decorated_function:
|
138
151
|
if func_name not in self.work_functions:
|
139
152
|
self.work_functions[func_name] = WorkFunction(**dec_params)
|
@@ -174,7 +187,7 @@ class Worker(ABC):
|
|
174
187
|
retry_kwargs=retry_kwargs or {},
|
175
188
|
guidance=guidance or function.__doc__,
|
176
189
|
capacity=capacity,
|
177
|
-
refresh_time=refresh_time
|
190
|
+
refresh_time=refresh_time,
|
178
191
|
)
|
179
192
|
|
180
193
|
work_func: WorkFunction = self.work_functions[function.__name__]
|
@@ -183,7 +196,9 @@ class Worker(ABC):
|
|
183
196
|
if form_param_key:
|
184
197
|
func_signature = inspect.signature(function)
|
185
198
|
if form_param_key not in func_signature.parameters:
|
186
|
-
raise KeyError(
|
199
|
+
raise KeyError(
|
200
|
+
f'Failed to locate form. "{form_param_key}" is not defined in the function.'
|
201
|
+
)
|
187
202
|
if "self" in func_signature.parameters:
|
188
203
|
bound_args = func_signature.bind(None, *args, **kwargs)
|
189
204
|
else:
|
@@ -199,14 +214,18 @@ class Worker(ABC):
|
|
199
214
|
form = self.forms.get(form_key) or self.default_form
|
200
215
|
|
201
216
|
if form:
|
202
|
-
subform = form.__class__(
|
217
|
+
subform = form.__class__(
|
218
|
+
assignment=work_func.assignment, task=work_func.guidance
|
219
|
+
)
|
203
220
|
for k in subform.input_fields:
|
204
221
|
v = getattr(form, k, None)
|
205
222
|
setattr(subform, k, v)
|
206
223
|
subform.origin = form
|
207
224
|
kwargs = {"form": subform} | kwargs
|
208
225
|
else:
|
209
|
-
raise ValueError(
|
226
|
+
raise ValueError(
|
227
|
+
f"Cannot locate form in Worker's forms and default_form is not available."
|
228
|
+
)
|
210
229
|
|
211
230
|
task = work_func.perform(self, *args, **kwargs)
|
212
231
|
work = Work(async_task=task, async_task_name=work_func.name)
|
@@ -221,7 +240,7 @@ def work(
|
|
221
240
|
guidance=None,
|
222
241
|
retry_kwargs=None,
|
223
242
|
timeout=10,
|
224
|
-
refresh_time=1
|
243
|
+
refresh_time=1,
|
225
244
|
):
|
226
245
|
"""
|
227
246
|
Decorator to mark a method as a work function.
|
@@ -271,23 +290,22 @@ def work(
|
|
271
290
|
refresh_time=refresh_time,
|
272
291
|
**kwargs,
|
273
292
|
)
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
293
|
+
|
294
|
+
wrapper._work_decorator_params = {
|
295
|
+
"assignment": assignment,
|
296
|
+
"function": func,
|
297
|
+
"retry_kwargs": retry_kwargs,
|
298
|
+
"guidance": guidance,
|
299
|
+
"capacity": capacity,
|
300
|
+
"refresh_time": refresh_time,
|
301
|
+
}
|
280
302
|
|
281
303
|
return wrapper
|
282
304
|
|
283
305
|
return decorator
|
284
306
|
|
285
307
|
|
286
|
-
def worklink(
|
287
|
-
from_: str,
|
288
|
-
to_: str,
|
289
|
-
auto_schedule: bool = True
|
290
|
-
):
|
308
|
+
def worklink(from_: str, to_: str, auto_schedule: bool = True):
|
291
309
|
"""
|
292
310
|
Decorator to create a link between two work functions.
|
293
311
|
|
@@ -299,26 +317,31 @@ def worklink(
|
|
299
317
|
Returns:
|
300
318
|
Callable: The decorated function.
|
301
319
|
"""
|
320
|
+
|
302
321
|
def decorator(func):
|
303
322
|
@wraps(func)
|
304
323
|
async def wrapper(
|
305
|
-
self: Worker,
|
306
|
-
*args,
|
307
|
-
func=func,
|
308
|
-
from_=from_,
|
309
|
-
to_=to_,
|
310
|
-
**kwargs
|
324
|
+
self: Worker, *args, func=func, from_=from_, to_=to_, **kwargs
|
311
325
|
):
|
312
326
|
if not inspect.iscoroutinefunction(func):
|
313
327
|
raise TypeError(f"{func.__name__} must be an asynchronous function")
|
314
328
|
|
315
|
-
work_funcs = self._get_decorated_functions(
|
329
|
+
work_funcs = self._get_decorated_functions(
|
330
|
+
decorator_attr="_work_decorator_params"
|
331
|
+
)
|
316
332
|
if from_ not in work_funcs or to_ not in work_funcs:
|
317
|
-
raise ValueError(
|
333
|
+
raise ValueError(
|
334
|
+
"Invalid link. 'from_' and 'to_' must be the name of work decorated functions."
|
335
|
+
)
|
318
336
|
|
319
337
|
func_signature = inspect.signature(func)
|
320
|
-
if
|
321
|
-
|
338
|
+
if (
|
339
|
+
"from_work" not in func_signature.parameters
|
340
|
+
and "from_result" not in func_signature.parameters
|
341
|
+
):
|
342
|
+
raise ValueError(
|
343
|
+
f'Either "from_work" or "from_result" must be a parameter in function {func.__name__}'
|
344
|
+
)
|
322
345
|
|
323
346
|
if "self" in func_signature.parameters:
|
324
347
|
bound_args = func_signature.bind(None, *args, **kwargs)
|
@@ -331,10 +354,14 @@ def worklink(
|
|
331
354
|
|
332
355
|
if from_work := arguments.get("from_work"):
|
333
356
|
if not isinstance(from_work, Work):
|
334
|
-
raise ValueError(
|
357
|
+
raise ValueError(
|
358
|
+
"Invalid type for from_work. Only work objects are accepted."
|
359
|
+
)
|
335
360
|
if from_work.async_task_name != from_:
|
336
|
-
raise ValueError(
|
337
|
-
|
361
|
+
raise ValueError(
|
362
|
+
f"Invalid work object in from_work. "
|
363
|
+
f'async_task_name "{from_work.async_task_name}" does not match from_ "{from_}"'
|
364
|
+
)
|
338
365
|
|
339
366
|
next_params = await func(self, *args, **kwargs)
|
340
367
|
to_work_func = getattr(self, to_)
|
@@ -347,7 +374,9 @@ def worklink(
|
|
347
374
|
if wrapper.auto_schedule:
|
348
375
|
return await to_work_func(**next_params)
|
349
376
|
elif isinstance(next_params, tuple) and len(next_params) == 2:
|
350
|
-
if isinstance(next_params[0], list) and isinstance(
|
377
|
+
if isinstance(next_params[0], list) and isinstance(
|
378
|
+
next_params[1], dict
|
379
|
+
):
|
351
380
|
if wrapper.auto_schedule:
|
352
381
|
return await to_work_func(*next_params[0], **next_params[1])
|
353
382
|
else:
|
@@ -358,9 +387,7 @@ def worklink(
|
|
358
387
|
return next_params
|
359
388
|
|
360
389
|
wrapper.auto_schedule = auto_schedule
|
361
|
-
wrapper._worklink_decorator_params = {"func": func,
|
362
|
-
"from_": from_,
|
363
|
-
"to_": to_}
|
390
|
+
wrapper._worklink_decorator_params = {"func": func, "from_": from_, "to_": to_}
|
364
391
|
|
365
392
|
return wrapper
|
366
393
|
|
@@ -41,7 +41,15 @@ class WorkerEngine:
|
|
41
41
|
self.refresh_time = refresh_time
|
42
42
|
self._stop_event = asyncio.Event()
|
43
43
|
|
44
|
-
async def add_task(
|
44
|
+
async def add_task(
|
45
|
+
self,
|
46
|
+
*args,
|
47
|
+
task_function: str,
|
48
|
+
task_name=None,
|
49
|
+
task_max_steps=10,
|
50
|
+
task_post_processing=None,
|
51
|
+
**kwargs,
|
52
|
+
):
|
45
53
|
"""
|
46
54
|
Adds a new task to the task queue.
|
47
55
|
|
@@ -56,7 +64,11 @@ class WorkerEngine:
|
|
56
64
|
Returns:
|
57
65
|
WorkTask: The newly created task.
|
58
66
|
"""
|
59
|
-
task = WorkTask(
|
67
|
+
task = WorkTask(
|
68
|
+
name=task_name,
|
69
|
+
max_steps=task_max_steps,
|
70
|
+
post_processing=task_post_processing,
|
71
|
+
)
|
60
72
|
self.tasks.append(task)
|
61
73
|
function = getattr(self.worker, task_function)
|
62
74
|
work = await function(*args, **kwargs)
|
@@ -66,7 +78,7 @@ class WorkerEngine:
|
|
66
78
|
|
67
79
|
async def activate_work_queues(self):
|
68
80
|
"""
|
69
|
-
|
81
|
+
Activates the work queues for all work functions.
|
70
82
|
"""
|
71
83
|
for work_function in self.worker.work_functions.values():
|
72
84
|
if not work_function.worklog.queue.execution_mode:
|
@@ -141,11 +153,12 @@ class WorkerEngine:
|
|
141
153
|
Executes tasks continuously until stopped.
|
142
154
|
"""
|
143
155
|
self._stop_event.clear()
|
144
|
-
|
156
|
+
|
145
157
|
async def execute_lasting_inner():
|
146
158
|
while not self.stopped:
|
147
159
|
await self.execute(stop_queue=False)
|
148
160
|
await asyncio.sleep(self.refresh_time)
|
161
|
+
|
149
162
|
asyncio.create_task(execute_lasting_inner())
|
150
163
|
|
151
164
|
def _construct_work_functions(self):
|
@@ -154,26 +167,38 @@ class WorkerEngine:
|
|
154
167
|
"""
|
155
168
|
if getattr(self.worker, "work_functions", None) is None:
|
156
169
|
self.worker.work_functions = {}
|
157
|
-
work_decorated_function = self.worker._get_decorated_functions(
|
158
|
-
|
170
|
+
work_decorated_function = self.worker._get_decorated_functions(
|
171
|
+
decorator_attr="_work_decorator_params", name_only=False
|
172
|
+
)
|
159
173
|
for func_name, func, dec_params in work_decorated_function:
|
160
174
|
if func_name not in self.worker.work_functions:
|
161
175
|
self.worker.work_functions[func_name] = WorkFunctionNode(**dec_params)
|
162
176
|
self.worker_graph.add_node(self.worker.work_functions[func_name])
|
163
177
|
else:
|
164
|
-
if not isinstance(
|
165
|
-
|
166
|
-
|
167
|
-
|
178
|
+
if not isinstance(
|
179
|
+
self.worker.work_functions[func_name], WorkFunctionNode
|
180
|
+
):
|
181
|
+
raise TypeError(
|
182
|
+
f"WorkFunction {func_name} already exists but is not a WorkFunctionNode. "
|
183
|
+
f"If you would like to use it in WorkerEngine, please convert it to a "
|
184
|
+
f"WorkFunctionNode, or initiate a new worker, or pop it from work_function dict"
|
185
|
+
)
|
168
186
|
|
169
187
|
def _construct_workedges(self):
|
170
188
|
"""
|
171
189
|
Constructs work edges for the worker graph.
|
172
190
|
"""
|
173
|
-
worklink_decorated_function = self.worker._get_decorated_functions(
|
174
|
-
|
191
|
+
worklink_decorated_function = self.worker._get_decorated_functions(
|
192
|
+
decorator_attr="_worklink_decorator_params", name_only=False
|
193
|
+
)
|
175
194
|
|
176
195
|
for func_name, func, dec_params in worklink_decorated_function:
|
177
196
|
head = self.worker.work_functions[dec_params["from_"]]
|
178
197
|
tail = self.worker.work_functions[dec_params["to_"]]
|
179
|
-
self.worker_graph.add_edge(
|
198
|
+
self.worker_graph.add_edge(
|
199
|
+
head=head,
|
200
|
+
tail=tail,
|
201
|
+
convert_function=func,
|
202
|
+
associated_worker=self.worker,
|
203
|
+
edge_class=WorkEdge,
|
204
|
+
)
|
@@ -27,8 +27,9 @@ class LiteLLMService(BaseService):
|
|
27
27
|
SysUtil.check_import("litellm")
|
28
28
|
|
29
29
|
import litellm
|
30
|
+
|
30
31
|
litellm.drop_params = True
|
31
|
-
|
32
|
+
|
32
33
|
self.acompletion = litellm.acompletion
|
33
34
|
self.model = model
|
34
35
|
self.kwargs = kwargs
|
@@ -45,9 +46,7 @@ class LiteLLMService(BaseService):
|
|
45
46
|
kwargs["model"] = self.model or kwargs.get("model")
|
46
47
|
|
47
48
|
try:
|
48
|
-
completion = await self.acompletion(
|
49
|
-
messages=messages, **kwargs
|
50
|
-
)
|
49
|
+
completion = await self.acompletion(messages=messages, **kwargs)
|
51
50
|
return payload, completion.model_dump()
|
52
51
|
except Exception as e:
|
53
52
|
self.status_tracker.num_tasks_failed += 1
|
lionagi/libs/ln_parse.py
CHANGED
@@ -694,11 +694,11 @@ class StringMatch:
|
|
694
694
|
|
695
695
|
if isinstance(out_, str):
|
696
696
|
# first try to parse it straight as a fuzzy json
|
697
|
-
|
697
|
+
|
698
698
|
try:
|
699
699
|
out_ = ParseUtil.fuzzy_parse_json(out_)
|
700
700
|
return StringMatch.correct_dict_keys(keys, out_)
|
701
|
-
|
701
|
+
|
702
702
|
except:
|
703
703
|
try:
|
704
704
|
out_ = ParseUtil.md_to_json(out_)
|
@@ -1,28 +1,25 @@
|
|
1
|
-
import pytest
|
2
|
-
from api.apicore import _connect as _connect_
|
3
|
-
from api.apicore import _config as _config_
|
1
|
+
# import pytest
|
2
|
+
# from api.apicore import _connect as _connect_
|
3
|
+
# from api.apicore import _config as _config_
|
4
4
|
|
5
5
|
|
6
|
-
"""
|
7
|
-
Setup the testing construct to ease future testing cases
|
8
|
-
"""
|
6
|
+
# """
|
7
|
+
# Setup the testing construct to ease future testing cases
|
8
|
+
# """
|
9
9
|
|
10
10
|
|
11
|
-
@pytest.fixture()
|
12
|
-
def config():
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
# @pytest.fixture()
|
12
|
+
# def config():
|
13
|
+
# _config = _config_.ConfigSingleton()
|
14
|
+
# _config.config["MOCK"] = True # turn on mock mode
|
15
|
+
# yield _config
|
16
16
|
|
17
17
|
|
18
|
-
@pytest.fixture
|
19
|
-
def test_s3_conn(config):
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
@pytest.fixture
|
24
|
-
def test_ec2_conn(config):
|
25
|
-
yield _connect_.get_object("AWSEC2")
|
26
|
-
|
18
|
+
# @pytest.fixture
|
19
|
+
# def test_s3_conn(config):
|
20
|
+
# yield _connect_.get_object("AWSS3")
|
27
21
|
|
28
22
|
|
23
|
+
# @pytest.fixture
|
24
|
+
# def test_ec2_conn(config):
|
25
|
+
# yield _connect_.get_object("AWSEC2")
|
@@ -1,7 +1,6 @@
|
|
1
|
-
from moto import mock_aws
|
1
|
+
# from moto import mock_aws
|
2
2
|
|
3
3
|
|
4
|
-
@mock_aws
|
5
|
-
def test_awss3_list_bucket_pass(test_s3_conn):
|
6
|
-
|
7
|
-
|
4
|
+
# @mock_aws
|
5
|
+
# def test_awss3_list_bucket_pass(test_s3_conn):
|
6
|
+
# assert test_s3_conn.list_bucket_names() == []
|
@@ -11,7 +11,7 @@ More to be added
|
|
11
11
|
|
12
12
|
def trim_timestamp_to_day(timestamp_str):
|
13
13
|
dt = datetime.fromisoformat(timestamp_str)
|
14
|
-
return dt.strftime(
|
14
|
+
return dt.strftime("%Y-%m-%d")
|
15
15
|
|
16
16
|
|
17
17
|
class MockPackage(Package):
|
@@ -22,7 +22,9 @@ class MockPackage(Package):
|
|
22
22
|
def mail():
|
23
23
|
"""Fixture to create a Mail instance with a MockPackage."""
|
24
24
|
package = MockPackage()
|
25
|
-
mail_instance = Mail(
|
25
|
+
mail_instance = Mail(
|
26
|
+
timestamp=datetime.today().strftime("%Y-%m-%d"), package=package
|
27
|
+
)
|
26
28
|
return mail_instance
|
27
29
|
|
28
30
|
|
@@ -31,9 +33,6 @@ def test_mail_category(mail):
|
|
31
33
|
assert mail.category is None
|
32
34
|
|
33
35
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
36
|
# from lionagi.core.generic.mail import *
|
38
37
|
#
|
39
38
|
# import unittest
|
lionagi/version.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__version__ = "0.2.
|
1
|
+
__version__ = "0.2.5"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: lionagi
|
3
|
-
Version: 0.2.
|
3
|
+
Version: 0.2.5
|
4
4
|
Summary: Towards automated general intelligence.
|
5
5
|
Author: HaiyangLi
|
6
6
|
Author-email: Haiyang Li <ocean@lionagi.ai>
|
@@ -237,7 +237,7 @@ Requires-Dist: boto3 >=1.34.131
|
|
237
237
|
### an AGentic Intelligence Operating System
|
238
238
|
|
239
239
|
```
|
240
|
-
pip install lionagi==0.2.
|
240
|
+
pip install lionagi==0.2.5
|
241
241
|
```
|
242
242
|
|
243
243
|
**Powerful Intelligent Workflow Automation**
|
@@ -1,5 +1,5 @@
|
|
1
1
|
lionagi/__init__.py,sha256=amQal6CUIv4QDI4Qmb0M5qwTbn3_F430Wl5vaSNG6-U,1952
|
2
|
-
lionagi/version.py,sha256=
|
2
|
+
lionagi/version.py,sha256=Xsa3ayOMVkhUWm4t06YeyHE0apjpZefxLH4ylp0CDtU,22
|
3
3
|
lionagi/core/__init__.py,sha256=Il5Q9ATdX8yXqVxtP_nYqUhExzxPC_qk_WXQ_4h0exg,16
|
4
4
|
lionagi/core/_setting/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
5
5
|
lionagi/core/_setting/_setting.py,sha256=p23fHtrzIZlQ8s8CDZICn8C6k7mdB_088nIDx19JaqM,1907
|
@@ -36,7 +36,7 @@ lionagi/core/director/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
|
|
36
36
|
lionagi/core/director/direct.py,sha256=AkSeam9wFjmFRhZtqTV3XU5bG1bOc7Cl2QpE9gugNlg,10111
|
37
37
|
lionagi/core/director/director.py,sha256=E-zgbAj5gbUgDrfE0YzFoipZnr0WWGZwIreEGGY2KJc,103
|
38
38
|
lionagi/core/engine/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
39
|
-
lionagi/core/engine/branch_engine.py,sha256=
|
39
|
+
lionagi/core/engine/branch_engine.py,sha256=y08Sh2s44q7Q---bAUe03xyyOZheH5qD_Ts9Iha29YY,12322
|
40
40
|
lionagi/core/engine/instruction_map_engine.py,sha256=IXUgpK5dm9f2vD1UPo1aaIIfjgSaZrabx5qJuyNApgU,8532
|
41
41
|
lionagi/core/engine/sandbox_.py,sha256=yjq8aznCEBeflus68VVQavy6ChfdIoZeVvPhUx_UzrI,459
|
42
42
|
lionagi/core/engine/script_engine.py,sha256=4aL34i57ODmeZhdMjwt8HW3Xm0Qqk96VD_fqlNT06vg,3644
|
@@ -47,9 +47,9 @@ lionagi/core/executor/neo4j_executor.py,sha256=POPqYo1f86PT9JMgPvTQ4dgTCw5jS17cs
|
|
47
47
|
lionagi/core/generic/__init__.py,sha256=YFIUtzKwabE4UIs9EySXMirz97vsD2aHoqEKBCpc0Z0,140
|
48
48
|
lionagi/core/generic/edge.py,sha256=5JDzy4RAaj5UQea4vbvmoyMTVQU--PUQgtMy1OoJuBU,3987
|
49
49
|
lionagi/core/generic/edge_condition.py,sha256=F1FUJNcQvksCZBMCyAaOTQNNzg4bnUi_t-O_NZOmsQk,374
|
50
|
-
lionagi/core/generic/graph.py,sha256=
|
50
|
+
lionagi/core/generic/graph.py,sha256=bYsXn8OkppMZwUxIP3_ooxsc6XXPSfITU3G5-aIDjic,7614
|
51
51
|
lionagi/core/generic/hyperedge.py,sha256=DkeLUlrb7rGx3nZ04aADU9HXXu5mZTf_DBwT0xhzIv4,7
|
52
|
-
lionagi/core/generic/node.py,sha256=
|
52
|
+
lionagi/core/generic/node.py,sha256=wdOeUzo51OXCzE-ANjlhnGQxLgpC-MfXKcTVJohgat0,7020
|
53
53
|
lionagi/core/generic/tree.py,sha256=HOylit6dAcUoYsqDqPIcZ2IdO92bCiwDlq_mMTOM_f4,1540
|
54
54
|
lionagi/core/generic/tree_node.py,sha256=dveu_LPUTP5LcLDuIOkWUgUqzrl8lr9HMupP66IZeAs,2411
|
55
55
|
lionagi/core/mail/__init__.py,sha256=fHNlcHwPCUbnrf8ItQ6HJQwmAG9KrDKouKBXjbo7h78,203
|
@@ -83,7 +83,7 @@ lionagi/core/rule/string.py,sha256=8nSxEhHUFs-gWM1MW5fiNuDP1Yd_IIZ2ipBVphgCmQ0,1
|
|
83
83
|
lionagi/core/rule/util.py,sha256=qqtUqt4BL_sikW2XZ73NDzb3p-Awu4za_2B5mZvzFdA,1042
|
84
84
|
lionagi/core/session/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
85
85
|
lionagi/core/session/branch.py,sha256=6ySBqEZHYbQ1AKJmcoBtU9MwF5WT5wAr3z2NB6TF8gg,14761
|
86
|
-
lionagi/core/session/directive_mixin.py,sha256=
|
86
|
+
lionagi/core/session/directive_mixin.py,sha256=SgLFQwZyqnP6pCoZU1YBJuO6olnSBKZ6FIfl-Je3uVQ,11724
|
87
87
|
lionagi/core/session/session.py,sha256=uESwIyGfRrX8Ii03-QIQYUlQKR7lsJWREdSZrHxfNW4,11012
|
88
88
|
lionagi/core/structure/__init__.py,sha256=DkeLUlrb7rGx3nZ04aADU9HXXu5mZTf_DBwT0xhzIv4,7
|
89
89
|
lionagi/core/structure/chain.py,sha256=DkeLUlrb7rGx3nZ04aADU9HXXu5mZTf_DBwT0xhzIv4,7
|
@@ -94,7 +94,7 @@ lionagi/core/unit/__init__.py,sha256=cxASNHNw2wK-SO9a4FQTjKDOOpT3HRE_qFD5GEvHdbQ
|
|
94
94
|
lionagi/core/unit/parallel_unit.py,sha256=DB5PjGMin2PkXc4qR7u6zEMxkj8WVgtSfdMoPhSby0A,9332
|
95
95
|
lionagi/core/unit/unit.py,sha256=V-0qOUtW5v5XHNUGJl9aE1j8fxYVWwLulrxySkN814w,12986
|
96
96
|
lionagi/core/unit/unit_form.py,sha256=1WDBXDprnsyz8OEbDH7LLRceldhvZHmswVoZb1CV80E,11580
|
97
|
-
lionagi/core/unit/unit_mixin.py,sha256=
|
97
|
+
lionagi/core/unit/unit_mixin.py,sha256=E8GY7eAjtvlfYW4Thpd-XoOeAZMLYC13HMyC2erCueE,39314
|
98
98
|
lionagi/core/unit/util.py,sha256=GqErzoWlUeSBtl3qcjqMONJoNK7i1DYJ_S3JW6MnEp8,1994
|
99
99
|
lionagi/core/unit/template/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
100
100
|
lionagi/core/unit/template/action.py,sha256=AETiRQKDvjB-EEyi-i6u3UqQ8650HbDkUaSSNxQJ8P0,2791
|
@@ -107,13 +107,13 @@ lionagi/core/validator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
|
|
107
107
|
lionagi/core/validator/validator.py,sha256=ngThQTzNSOa6N0mKrAQuhwM_gb_IWhF58OefOyUjTK8,12012
|
108
108
|
lionagi/core/work/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
109
109
|
lionagi/core/work/work.py,sha256=oVbx0b8arvXSjDZa2Rs1s37_Fiue6gbR0Tt4oL7Dzkk,2532
|
110
|
-
lionagi/core/work/work_edge.py,sha256=
|
111
|
-
lionagi/core/work/work_function.py,sha256=
|
112
|
-
lionagi/core/work/work_function_node.py,sha256=
|
113
|
-
lionagi/core/work/work_queue.py,sha256=
|
114
|
-
lionagi/core/work/work_task.py,sha256=
|
115
|
-
lionagi/core/work/worker.py,sha256=
|
116
|
-
lionagi/core/work/worker_engine.py,sha256=
|
110
|
+
lionagi/core/work/work_edge.py,sha256=o6bCDjQIfBjnnpbd7ZVNLGuRQgmvLDwPah58TaTK0eU,3408
|
111
|
+
lionagi/core/work/work_function.py,sha256=305sudzXGX9gwnAxpCzWrUJm3q2bCCjvtgI8KXJSbFI,4018
|
112
|
+
lionagi/core/work/work_function_node.py,sha256=Ac92do8qq5ulUiY88p3S7MbVLowJ51qjoyKPkeGDLxk,2056
|
113
|
+
lionagi/core/work/work_queue.py,sha256=J30_hEWKmgW0217VUnADkmwxXyMBfZUIqi91IcJAKnY,3610
|
114
|
+
lionagi/core/work/work_task.py,sha256=wL5rpVHFjjs9BrQ7Zz0wP2iYthMwcpmZyl3QL4Dk6DA,5348
|
115
|
+
lionagi/core/work/worker.py,sha256=iE2qeTJOB1EVJWdqWzNWkjtqM-h0_BYB3gfM2qHowEw,15200
|
116
|
+
lionagi/core/work/worker_engine.py,sha256=1Zrx5XVfIDw_L--w-GjvUa2cPn8PeaYwcttkt93eNH4,7538
|
117
117
|
lionagi/core/work/worklog.py,sha256=R6UC7CUczne41msrV9ekvYIKkZnNUz6IT1XPZ3_Nd7I,3619
|
118
118
|
lionagi/experimental/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
119
119
|
lionagi/experimental/compressor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -159,7 +159,7 @@ lionagi/integrations/chunker/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
|
|
159
159
|
lionagi/integrations/chunker/chunk.py,sha256=NZw3wdRkHWjollZDl9my2-MtUrWzp6AcZNNdS0MnDxA,10655
|
160
160
|
lionagi/integrations/config/__init__.py,sha256=zzQGZe3H5vofcNWSjjoqe_gqHpCO8Yl7FefmrUpLqnw,133
|
161
161
|
lionagi/integrations/config/mlx_configs.py,sha256=xbostqjnk3aAN-qKyC54YBprHPA38C8YDevXMMEHXWY,44
|
162
|
-
lionagi/integrations/config/oai_configs.py,sha256=
|
162
|
+
lionagi/integrations/config/oai_configs.py,sha256=fgby-3o_tO24QhSiPyko-oeAMEa0cWCThh6L6ChiXoo,3625
|
163
163
|
lionagi/integrations/config/ollama_configs.py,sha256=GUn0kagrQA3gpIiaxYyfdi2LAf_Ohz1sVrsAb20OBwo,17
|
164
164
|
lionagi/integrations/config/openrouter_configs.py,sha256=x5LjLx-aqCLzzrqr15gVzuTTG4Y_BVS6tRrKout5vPQ,1690
|
165
165
|
lionagi/integrations/loader/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -167,7 +167,7 @@ lionagi/integrations/loader/load.py,sha256=TCKXePhEdNDeBH7iv__7lG0GwhPU4j3qyjhTY
|
|
167
167
|
lionagi/integrations/loader/load_util.py,sha256=F0VAGS16sl6P4aolP0Us0E641RGv8zpTefdHgRDL-p4,6438
|
168
168
|
lionagi/integrations/provider/__init__.py,sha256=MJhnq2tkBRcMH-3utc0G-Co20MmsxLBbp3fUwHrJGQ8,198
|
169
169
|
lionagi/integrations/provider/_mapping.py,sha256=1IcE4IE7L1zhTIOE1W4LslGcanomdAzJYiYyGMPDhN8,1346
|
170
|
-
lionagi/integrations/provider/litellm.py,sha256=
|
170
|
+
lionagi/integrations/provider/litellm.py,sha256=75ElNHYXmgPrgcUElelT_MH2FSB2D8Nvqerc2Pv_zUQ,1283
|
171
171
|
lionagi/integrations/provider/mistralai.py,sha256=G-StbfrnUcWZvl0eRby6CZYXxmJf6BRMFzDaix-brmU,7
|
172
172
|
lionagi/integrations/provider/mlx_service.py,sha256=m9c9793xlNVNkNBXlNcavczueF5bdWD1urrIw6rDf5E,1726
|
173
173
|
lionagi/integrations/provider/oai.py,sha256=Bkh0VJPJwbQGYOFfBdSR5JG3sBkCfHHZm3dx3gmkIms,7054
|
@@ -191,7 +191,7 @@ lionagi/libs/ln_func_call.py,sha256=lkjme5eA-u-6cgp-conaEkZhRh38sEAxYlH8QGwejPM,
|
|
191
191
|
lionagi/libs/ln_image.py,sha256=t9tyHoW1K_Mf_X8IhymND38rkfP1zd6q9mc9bkQmxxY,3622
|
192
192
|
lionagi/libs/ln_knowledge_graph.py,sha256=LZn1MjMKIRSTaaabrfovTVssQgCZuab4tdnxzzOIxpw,14930
|
193
193
|
lionagi/libs/ln_nested.py,sha256=4nR1uBGsPJMfN2Q3NE5VxyMolbNmrSAewRIRIxe1szk,30183
|
194
|
-
lionagi/libs/ln_parse.py,sha256=
|
194
|
+
lionagi/libs/ln_parse.py,sha256=PUA9SiMOguLZvIkZVAs_Q_8fJv8Pp0pg1x-9wG3FqqU,27202
|
195
195
|
lionagi/libs/ln_queue.py,sha256=rQPJr_bGcCD4zdl37XfrfnHVfmdJuXBf4rUx8zXm-z0,3977
|
196
196
|
lionagi/libs/ln_tokenize.py,sha256=YatTjIoCHgGoBWex_5VTfgBSfcKJBMBQALXhxcQE7ZQ,5178
|
197
197
|
lionagi/libs/ln_validate.py,sha256=FKUOe30AahwJPdV-CnkFe07YPK7Thz910Y3pvatUSuM,8963
|
@@ -213,8 +213,8 @@ lionagi/lions/researcher/data_source/yfinance_.py,sha256=snAf897J69MyAc6fcFjF0ir
|
|
213
213
|
lionagi/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
214
214
|
lionagi/tests/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
215
215
|
lionagi/tests/api/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
216
|
-
lionagi/tests/api/aws/conftest.py,sha256=
|
217
|
-
lionagi/tests/api/aws/test_aws_s3.py,sha256=
|
216
|
+
lionagi/tests/api/aws/conftest.py,sha256=NfI8VhEhyNUG9Xe8R7LV8wpbvis4zPBR_PgB4DySsag,523
|
217
|
+
lionagi/tests/api/aws/test_aws_s3.py,sha256=KUDCOtWMIwXNrGzfTWNYwM549v-pWJZK2paInJhxDes,143
|
218
218
|
lionagi/tests/integrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
219
219
|
lionagi/tests/libs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
220
220
|
lionagi/tests/libs/test_api.py,sha256=wi8uEsV7vO-stJxvdajtOGBdnO76nGsZ_wjN0qXESEQ,1681
|
@@ -240,19 +240,19 @@ lionagi/tests/test_core/generic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm
|
|
240
240
|
lionagi/tests/test_core/generic/test_edge.py,sha256=_wSRz8r8bmIib-XgIVoEPSbtJ7vuuymS2mPpr4Sy01I,2532
|
241
241
|
lionagi/tests/test_core/generic/test_graph.py,sha256=-vAg45cNx0CQczURgU8E0CW8lfXnBrqZwaq4OMuPUWA,3568
|
242
242
|
lionagi/tests/test_core/generic/test_node.py,sha256=SIGKts5FURH84NEHWy1if39FeVx-RAoOryXOrtIWMFY,4417
|
243
|
-
lionagi/tests/test_core/generic/test_structure.py,sha256=
|
243
|
+
lionagi/tests/test_core/generic/test_structure.py,sha256=C7EOtOuqJMm7iqq6yzEH7Assr3tp9HV0ADd_7Ewj4TM,8848
|
244
244
|
lionagi/tests/test_core/generic/test_tree_node.py,sha256=a1aMpGDAgtPD1W1HYco7Z3X7gBih-pndTbebf-K7YTA,2934
|
245
245
|
lionagi/tests/test_core/graph/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
246
|
-
lionagi/tests/test_core/graph/test_graph.py,sha256=
|
247
|
-
lionagi/tests/test_core/graph/test_tree.py,sha256=
|
246
|
+
lionagi/tests/test_core/graph/test_graph.py,sha256=EicIGp2-LVXIrgrWZaKg7_1IRrkDZDTvtIfX3t58IOU,2709
|
247
|
+
lionagi/tests/test_core/graph/test_tree.py,sha256=C3wuwg5f7Rtr6KH5S97jfu829YPPTOf7IvNFf4nEwqU,3381
|
248
248
|
lionagi/tests/test_core/mail/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
249
|
-
lionagi/tests/test_core/mail/test_mail.py,sha256=
|
249
|
+
lionagi/tests/test_core/mail/test_mail.py,sha256=CkUw0Ncy4Y56ydype5pzxeNqbzihqlBV6rCEupxY3tM,3074
|
250
250
|
lionagi/tests/test_core/test_structure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
251
|
-
lionagi/tests/test_core/test_structure/test_base_structure.py,sha256=
|
252
|
-
lionagi/tests/test_core/test_structure/test_graph.py,sha256=
|
253
|
-
lionagi/tests/test_core/test_structure/test_tree.py,sha256=
|
254
|
-
lionagi-0.2.
|
255
|
-
lionagi-0.2.
|
256
|
-
lionagi-0.2.
|
257
|
-
lionagi-0.2.
|
258
|
-
lionagi-0.2.
|
251
|
+
lionagi/tests/test_core/test_structure/test_base_structure.py,sha256=qsaYP745fFIst5ZNiPFb9-ATScLyUFqQ5UQzyyBgJPM,9388
|
252
|
+
lionagi/tests/test_core/test_structure/test_graph.py,sha256=hLsTZmZMs9vCZW-KiOwYY3npk6WxaVU6zZSA9-ltDvQ,2162
|
253
|
+
lionagi/tests/test_core/test_structure/test_tree.py,sha256=PvMJXDsNPpJFgEQCan-5Q5JREgMrBOpYIaWcwHd-WDY,1944
|
254
|
+
lionagi-0.2.5.dist-info/LICENSE,sha256=VXFWsdoN5AAknBCgFqQNgPWYx7OPp-PFEP961zGdOjc,11288
|
255
|
+
lionagi-0.2.5.dist-info/METADATA,sha256=svScDN5_cqlfWuaNVwMnRnTUdf5Sx8MY4f1hk03HXjc,16276
|
256
|
+
lionagi-0.2.5.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
|
257
|
+
lionagi-0.2.5.dist-info/top_level.txt,sha256=szvch_d2jE1Lu9ZIKsl26Ll6BGfYfbOgt5lm-UpFSo4,8
|
258
|
+
lionagi-0.2.5.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|