lionagi 0.2.4__py3-none-any.whl → 0.2.6__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- lionagi/core/collections/model.py +32 -0
- 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 +29 -5
- lionagi/core/unit/unit.py +18 -2
- lionagi/core/unit/unit_mixin.py +10 -12
- lionagi/core/validator/validator.py +17 -4
- 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.6.dist-info}/METADATA +2 -2
- {lionagi-0.2.4.dist-info → lionagi-0.2.6.dist-info}/RECORD +33 -33
- {lionagi-0.2.4.dist-info → lionagi-0.2.6.dist-info}/WHEEL +1 -1
- {lionagi-0.2.4.dist-info → lionagi-0.2.6.dist-info}/LICENSE +0 -0
- {lionagi-0.2.4.dist-info → lionagi-0.2.6.dist-info}/top_level.txt +0 -0
@@ -322,6 +322,38 @@ class iModel:
|
|
322
322
|
node.add_field("embedding", embed["data"][0]["embedding"])
|
323
323
|
node._meta_insert("embedding_meta", payload)
|
324
324
|
|
325
|
+
async def format_structure(
|
326
|
+
self,
|
327
|
+
data: str | dict,
|
328
|
+
json_schema: dict | str = None,
|
329
|
+
request_fields: dict | list = None,
|
330
|
+
**kwargs,
|
331
|
+
) -> dict:
|
332
|
+
if json_schema:
|
333
|
+
kwargs["response_format"] = {
|
334
|
+
"type": "json_schema",
|
335
|
+
"json_schema": json_schema,
|
336
|
+
}
|
337
|
+
kwargs["model"] = kwargs.pop("model", "gpt-4o-mini")
|
338
|
+
if not request_fields and not json_schema:
|
339
|
+
raise ValueError("Either request_fields or json_schema must be provided")
|
340
|
+
request_fields = request_fields or json_schema["properties"]
|
341
|
+
|
342
|
+
messages = [
|
343
|
+
{
|
344
|
+
"role": "system",
|
345
|
+
"content": "You are a helpful json formatting assistant.",
|
346
|
+
},
|
347
|
+
{
|
348
|
+
"role": "user",
|
349
|
+
"content": f"can you please format the given data into given json schema?"
|
350
|
+
f"--- data --- {data} |||| ----json fields required --- {request_fields}",
|
351
|
+
},
|
352
|
+
]
|
353
|
+
|
354
|
+
result = await self.call_chat_completion(messages, **kwargs)
|
355
|
+
return result["choices"][0]["message"]["content"]
|
356
|
+
|
325
357
|
def to_dict(self):
|
326
358
|
"""
|
327
359
|
Converts the model instance to a dictionary representation.
|
@@ -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)
|
@@ -51,6 +51,10 @@ class DirectiveMixin:
|
|
51
51
|
return_branch=False,
|
52
52
|
images=None,
|
53
53
|
image_path=None,
|
54
|
+
template=None,
|
55
|
+
verbose=True,
|
56
|
+
formatter=None,
|
57
|
+
format_kwargs=None,
|
54
58
|
**kwargs,
|
55
59
|
):
|
56
60
|
"""
|
@@ -114,7 +118,15 @@ class DirectiveMixin:
|
|
114
118
|
>>> print(result)
|
115
119
|
"""
|
116
120
|
|
117
|
-
directive = Unit(
|
121
|
+
directive = Unit(
|
122
|
+
self,
|
123
|
+
imodel=imodel,
|
124
|
+
rulebook=rulebook,
|
125
|
+
template=template,
|
126
|
+
verbose=verbose,
|
127
|
+
formatter=formatter,
|
128
|
+
format_kwargs=format_kwargs,
|
129
|
+
)
|
118
130
|
if system:
|
119
131
|
self.add_message(system=system)
|
120
132
|
|
@@ -174,7 +186,10 @@ class DirectiveMixin:
|
|
174
186
|
directive=None,
|
175
187
|
images=None,
|
176
188
|
image_path=None,
|
177
|
-
|
189
|
+
template=None,
|
190
|
+
verbose=True,
|
191
|
+
formatter=None,
|
192
|
+
format_kwargs=None,
|
178
193
|
**kwargs,
|
179
194
|
):
|
180
195
|
"""
|
@@ -220,7 +235,14 @@ class DirectiveMixin:
|
|
220
235
|
|
221
236
|
images = ImageUtil.read_image_to_base64(image_path)
|
222
237
|
|
223
|
-
_directive = Unit(
|
238
|
+
_directive = Unit(
|
239
|
+
self,
|
240
|
+
imodel=imodel,
|
241
|
+
rulebook=rulebook,
|
242
|
+
verbose=verbose,
|
243
|
+
formatter=formatter,
|
244
|
+
format_kwargs=format_kwargs,
|
245
|
+
)
|
224
246
|
|
225
247
|
idx = len(self.progress)
|
226
248
|
if directive and isinstance(directive, str):
|
@@ -232,6 +254,7 @@ class DirectiveMixin:
|
|
232
254
|
reason=reason,
|
233
255
|
confidence=confidence,
|
234
256
|
images=images,
|
257
|
+
template=template,
|
235
258
|
**kwargs,
|
236
259
|
)
|
237
260
|
|
@@ -248,7 +271,7 @@ class DirectiveMixin:
|
|
248
271
|
form.action_response.update(_dict)
|
249
272
|
|
250
273
|
return form
|
251
|
-
|
274
|
+
|
252
275
|
form = await _directive.direct(
|
253
276
|
instruction=instruction,
|
254
277
|
context=context,
|
@@ -269,6 +292,7 @@ class DirectiveMixin:
|
|
269
292
|
plan_num_step=plan_num_step,
|
270
293
|
predict_num_sentences=predict_num_sentences,
|
271
294
|
images=images,
|
295
|
+
template=template,
|
272
296
|
**kwargs,
|
273
297
|
)
|
274
298
|
|
@@ -283,5 +307,5 @@ class DirectiveMixin:
|
|
283
307
|
if not hasattr(form, "action_response"):
|
284
308
|
form.append_to_request("action_response", {})
|
285
309
|
form.action_response.update(_dict)
|
286
|
-
|
310
|
+
|
287
311
|
return form
|
lionagi/core/unit/unit.py
CHANGED
@@ -14,6 +14,7 @@ See the License for the specific language governing permissions and
|
|
14
14
|
limitations under the License.
|
15
15
|
"""
|
16
16
|
|
17
|
+
from typing import Callable
|
17
18
|
from lionagi.libs.ln_convert import strip_lower
|
18
19
|
from lionagi.libs.ln_func_call import rcall
|
19
20
|
from lionagi.core.collections.abc import Directive
|
@@ -40,7 +41,14 @@ class Unit(Directive, DirectiveMixin):
|
|
40
41
|
default_template = UnitForm
|
41
42
|
|
42
43
|
def __init__(
|
43
|
-
self,
|
44
|
+
self,
|
45
|
+
branch,
|
46
|
+
imodel: iModel = None,
|
47
|
+
template=None,
|
48
|
+
rulebook=None,
|
49
|
+
verbose=False,
|
50
|
+
formatter: Callable = None,
|
51
|
+
format_kwargs: dict = {},
|
44
52
|
) -> None:
|
45
53
|
self.branch = branch
|
46
54
|
if imodel and isinstance(imodel, iModel):
|
@@ -49,7 +57,11 @@ class Unit(Directive, DirectiveMixin):
|
|
49
57
|
else:
|
50
58
|
self.imodel = branch.imodel
|
51
59
|
self.form_template = template or self.default_template
|
52
|
-
|
60
|
+
rule_config = {"formatter": formatter, "format_kwargs": format_kwargs}
|
61
|
+
if rulebook:
|
62
|
+
rule_config["rulebook"] = rulebook
|
63
|
+
|
64
|
+
self.validator = Validator(**rule_config)
|
53
65
|
self.verbose = verbose
|
54
66
|
|
55
67
|
async def chat(
|
@@ -71,6 +83,8 @@ class Unit(Directive, DirectiveMixin):
|
|
71
83
|
clear_messages=False,
|
72
84
|
use_annotation=True,
|
73
85
|
return_branch=False,
|
86
|
+
formatter=None,
|
87
|
+
format_kwargs={},
|
74
88
|
**kwargs,
|
75
89
|
):
|
76
90
|
"""
|
@@ -119,6 +133,8 @@ class Unit(Directive, DirectiveMixin):
|
|
119
133
|
clear_messages=clear_messages,
|
120
134
|
use_annotation=use_annotation,
|
121
135
|
return_branch=return_branch,
|
136
|
+
formatter=formatter,
|
137
|
+
format_kwargs=format_kwargs,
|
122
138
|
**kwargs,
|
123
139
|
)
|
124
140
|
|
lionagi/core/unit/unit_mixin.py
CHANGED
@@ -257,7 +257,6 @@ class DirectiveMixin(ABC):
|
|
257
257
|
form: Form = None,
|
258
258
|
return_form: bool = True,
|
259
259
|
strict: bool = False,
|
260
|
-
rulebook: Any = None,
|
261
260
|
use_annotation: bool = True,
|
262
261
|
template_name: str = None,
|
263
262
|
costs=None,
|
@@ -274,7 +273,6 @@ class DirectiveMixin(ABC):
|
|
274
273
|
form: Form data.
|
275
274
|
return_form: Flag indicating if form should be returned.
|
276
275
|
strict: Flag indicating if strict validation should be applied.
|
277
|
-
rulebook: Rulebook instance for validation.
|
278
276
|
use_annotation: Flag indicating if annotations should be used.
|
279
277
|
template_name: Template name for form.
|
280
278
|
|
@@ -295,8 +293,7 @@ class DirectiveMixin(ABC):
|
|
295
293
|
response_ = self._process_model_response(_msg, requested_fields)
|
296
294
|
|
297
295
|
if form:
|
298
|
-
|
299
|
-
form = await validator.validate_response(
|
296
|
+
form = await self.validator.validate_response(
|
300
297
|
form=form,
|
301
298
|
response=response_,
|
302
299
|
strict=strict,
|
@@ -332,7 +329,6 @@ class DirectiveMixin(ABC):
|
|
332
329
|
invoke_tool: bool = True,
|
333
330
|
return_form: bool = True,
|
334
331
|
strict: bool = False,
|
335
|
-
rulebook: Any = None,
|
336
332
|
imodel: Any = None,
|
337
333
|
use_annotation: bool = True,
|
338
334
|
branch: Any = None,
|
@@ -356,7 +352,6 @@ class DirectiveMixin(ABC):
|
|
356
352
|
invoke_tool: Flag indicating if tools should be invoked.
|
357
353
|
return_form: Flag indicating if form should be returned.
|
358
354
|
strict: Flag indicating if strict validation should be applied.
|
359
|
-
rulebook: Rulebook instance for validation.
|
360
355
|
imodel: Model instance.
|
361
356
|
use_annotation: Flag indicating if annotations should be used.
|
362
357
|
branch: Branch instance.
|
@@ -400,9 +395,8 @@ class DirectiveMixin(ABC):
|
|
400
395
|
form=form,
|
401
396
|
return_form=return_form,
|
402
397
|
strict=strict,
|
403
|
-
rulebook=rulebook,
|
404
398
|
use_annotation=use_annotation,
|
405
|
-
costs=imodel.costs,
|
399
|
+
costs=imodel.costs or (0, 0),
|
406
400
|
)
|
407
401
|
|
408
402
|
return out_, branch if return_branch else out_
|
@@ -421,13 +415,14 @@ class DirectiveMixin(ABC):
|
|
421
415
|
invoke_tool=True,
|
422
416
|
return_form=True,
|
423
417
|
strict=False,
|
424
|
-
rulebook=None,
|
425
418
|
imodel=None,
|
426
419
|
images: Optional[str] = None,
|
427
420
|
clear_messages=False,
|
428
421
|
use_annotation=True,
|
429
422
|
timeout: float = None,
|
430
423
|
return_branch=False,
|
424
|
+
formatter=None,
|
425
|
+
format_kwargs={},
|
431
426
|
**kwargs,
|
432
427
|
):
|
433
428
|
"""
|
@@ -470,13 +465,14 @@ class DirectiveMixin(ABC):
|
|
470
465
|
invoke_tool=invoke_tool,
|
471
466
|
return_form=return_form,
|
472
467
|
strict=strict,
|
473
|
-
rulebook=rulebook,
|
474
468
|
imodel=imodel,
|
475
469
|
use_annotation=use_annotation,
|
476
470
|
timeout=timeout,
|
477
471
|
branch=branch,
|
478
472
|
clear_messages=clear_messages,
|
479
473
|
return_branch=return_branch,
|
474
|
+
formatter=formatter,
|
475
|
+
format_kwargs=format_kwargs,
|
480
476
|
**kwargs,
|
481
477
|
)
|
482
478
|
|
@@ -609,7 +605,9 @@ class DirectiveMixin(ABC):
|
|
609
605
|
clear_messages=False,
|
610
606
|
return_branch=False,
|
611
607
|
images: Optional[str] = None,
|
612
|
-
verbose=
|
608
|
+
verbose=True,
|
609
|
+
formatter=None,
|
610
|
+
format_kwargs=None,
|
613
611
|
**kwargs,
|
614
612
|
):
|
615
613
|
"""
|
@@ -658,7 +656,7 @@ class DirectiveMixin(ABC):
|
|
658
656
|
if allow_action and not tools:
|
659
657
|
tools = True
|
660
658
|
|
661
|
-
tool_schema=None
|
659
|
+
tool_schema = None
|
662
660
|
if tools:
|
663
661
|
tool_schema = branch.tool_manager.get_tool_schema(tools)
|
664
662
|
|
@@ -14,10 +14,12 @@ See the License for the specific language governing permissions and
|
|
14
14
|
limitations under the License.
|
15
15
|
"""
|
16
16
|
|
17
|
-
|
17
|
+
import asyncio
|
18
|
+
from typing import Any, Dict, List, Union, Callable
|
18
19
|
from lionagi.libs import SysUtil
|
19
20
|
from lionagi.libs.ln_func_call import lcall
|
20
21
|
from lionagi.core.collections.abc import FieldError
|
22
|
+
from lionagi.core.collections.model import iModel
|
21
23
|
from ..rule.base import Rule
|
22
24
|
from ..rule._default import DEFAULT_RULES
|
23
25
|
from ..rule.rulebook import RuleBook
|
@@ -56,6 +58,8 @@ class Validator:
|
|
56
58
|
order: List[str] = None,
|
57
59
|
init_config: Dict[str, Dict] = None,
|
58
60
|
active_rules: Dict[str, Rule] = None,
|
61
|
+
formatter: Callable = None,
|
62
|
+
format_kwargs: dict = {},
|
59
63
|
):
|
60
64
|
"""
|
61
65
|
Initialize the Validator.
|
@@ -75,6 +79,8 @@ class Validator:
|
|
75
79
|
)
|
76
80
|
self.active_rules: Dict[str, Rule] = active_rules or self._initiate_rules()
|
77
81
|
self.validation_log = []
|
82
|
+
self.formatter = formatter
|
83
|
+
self.format_kwargs = format_kwargs
|
78
84
|
|
79
85
|
def _initiate_rules(self) -> Dict[str, Rule]:
|
80
86
|
"""
|
@@ -207,9 +213,16 @@ class Validator:
|
|
207
213
|
if len(form.requested_fields) == 1:
|
208
214
|
response = {form.requested_fields[0]: response}
|
209
215
|
else:
|
210
|
-
|
211
|
-
|
212
|
-
|
216
|
+
if self.formatter:
|
217
|
+
if asyncio.iscoroutinefunction(self.formatter):
|
218
|
+
response = await self.formatter(response, **self.format_kwargs)
|
219
|
+
print("formatter used")
|
220
|
+
else:
|
221
|
+
response = self.formatter(response, **self.format_kwargs)
|
222
|
+
print("formatter used")
|
223
|
+
|
224
|
+
if not isinstance(response, dict):
|
225
|
+
raise ValueError(f"The form response format is invalid for filling.")
|
213
226
|
|
214
227
|
dict_ = {}
|
215
228
|
for k, v in response.items():
|
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
|