lionagi 0.2.4__py3-none-any.whl → 0.2.5__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -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 key in self.mailbox.pending_ins and self.mailbox.pending_ins.get(key, Pile()).size() == 0:
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:
@@ -202,7 +202,9 @@ class Graph(Node):
202
202
 
203
203
  return g
204
204
 
205
- def display(self, node_label="class_name", edge_label="label", draw_kwargs={}, **kwargs):
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)
@@ -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
@@ -658,7 +658,7 @@ class DirectiveMixin(ABC):
658
658
  if allow_action and not tools:
659
659
  tools = True
660
660
 
661
- tool_schema=None
661
+ tool_schema = None
662
662
  if tools:
663
663
  tool_schema = branch.tool_manager.get_tool_schema(tools)
664
664
 
@@ -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="parameters for the worklink function other than \"from_work\" and \"from_result\""
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 = ("Task stopped proceeding further as all available steps have been used up, "
85
- "but the task has not yet reached completion.")
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, assignment, function, retry_kwargs=None, guidance=None, capacity=10, refresh_time=1
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
- Gets the execution mode of the work function's queue.
79
+ Gets the execution mode of the work function's queue.
73
80
 
74
- Returns:
75
- bool: The execution mode of the work function's queue.
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__(self, assignment, function, retry_kwargs=None, guidance=None, capacity=10, refresh_time=1, **kwargs):
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__(self,
39
- assignment=assignment,
40
- function=function,
41
- retry_kwargs=retry_kwargs,
42
- guidance=guidance,
43
- capacity=capacity,
44
- refresh_time=refresh_time)
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
+ )
@@ -90,11 +90,11 @@ class WorkQueue:
90
90
 
91
91
  async def execute(self):
92
92
  """
93
- Continuously executes the process method at a specified refresh interval.
93
+ Continuously executes the process method at a specified refresh interval.
94
94
 
95
- Args:
96
- refresh_time (int, optional): The time in seconds to wait between
97
- successive calls to `process`. Defaults to 1.
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()
@@ -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
- name: str | None = Field(
24
- None,
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(name=self.name, status=self.status, max_steps=self.max_steps, current_work=self.current_work)
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
@@ -93,7 +93,9 @@ class Worker(ABC):
93
93
 
94
94
  """
95
95
  if form_key not in self.forms.keys():
96
- raise ValueError(f"Unable to change default form. Key {form_key} does not exist.")
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(self.__class__, predicate=inspect.isfunction):
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(decorator_attr="_worklink_decorator_params", name_only=False)
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 "from_work" not in func_signature.parameters and "from_result" not in func_signature.parameters:
128
- raise ValueError(f"Either \"from_work\" or \"from_result\" must be a parameter in function {func_name}")
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(decorator_attr="_work_decorator_params", name_only=False)
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(f"Failed to locate form. \"{form_param_key}\" is not defined in the function.")
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__(assignment=work_func.assignment, task=work_func.guidance)
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(f"Cannot locate form in Worker's forms and default_form is not available.")
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
- wrapper._work_decorator_params = {"assignment": assignment,
275
- "function": func,
276
- "retry_kwargs": retry_kwargs,
277
- "guidance": guidance,
278
- "capacity": capacity,
279
- "refresh_time": refresh_time}
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(decorator_attr="_work_decorator_params")
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("Invalid link. 'from_' and 'to_' must be the name of work decorated functions.")
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 "from_work" not in func_signature.parameters and "from_result" not in func_signature.parameters:
321
- raise ValueError(f"Either \"from_work\" or \"from_result\" must be a parameter in function {func.__name__}")
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("Invalid type for from_work. Only work objects are accepted.")
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(f"Invalid work object in from_work. "
337
- f"async_task_name \"{from_work.async_task_name}\" does not match from_ \"{from_}\"")
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(next_params[1], dict):
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(self, *args, task_function: str, task_name=None, task_max_steps=10, task_post_processing=None, **kwargs):
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(name=task_name, max_steps=task_max_steps, post_processing=task_post_processing)
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
- Activates the work queues for all work functions.
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(decorator_attr="_work_decorator_params",
158
- name_only=False)
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(self.worker.work_functions[func_name], WorkFunctionNode):
165
- raise TypeError(f"WorkFunction {func_name} already exists but is not a WorkFunctionNode. "
166
- f"If you would like to use it in WorkerEngine, please convert it to a "
167
- f"WorkFunctionNode, or initiate a new worker, or pop it from work_function dict")
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(decorator_attr="_worklink_decorator_params",
174
- name_only=False)
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(head=head, tail=tail, convert_function=func, associated_worker=self.worker, edge_class=WorkEdge)
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
+ )
@@ -4,7 +4,7 @@ API_key_schema = ("OPENAI_API_KEY",)
4
4
 
5
5
  # ChatCompletion
6
6
  oai_chat_llmconfig = {
7
- "model": "gpt-4o",
7
+ "model": "gpt-4o-2024-08-06",
8
8
  "frequency_penalty": 0,
9
9
  "max_tokens": None,
10
10
  "n": 1,
@@ -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
- _config = _config_.ConfigSingleton()
14
- _config.config["MOCK"] = True # turn on mock mode
15
- yield _config
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
- yield _connect_.get_object("AWSS3")
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
- assert test_s3_conn.list_bucket_names() == []
7
-
4
+ # @mock_aws
5
+ # def test_awss3_list_bucket_pass(test_s3_conn):
6
+ # assert test_s3_conn.list_bucket_names() == []
@@ -1,4 +1,4 @@
1
- #TODO
1
+ # TODO
2
2
  # import unittest
3
3
  # from lionagi.core.generic.structure import *
4
4
  #
@@ -191,4 +191,4 @@
191
191
  # self.assertEqual(edge.label, "test_label")
192
192
  #
193
193
  # if __name__ == "__main__":
194
- # unittest.main()
194
+ # unittest.main()
@@ -1,4 +1,4 @@
1
- #TODO
1
+ # TODO
2
2
  # import unittest
3
3
  # from unittest.mock import MagicMock, patch
4
4
  # from lionagi.core.graph.graph import Graph
@@ -1,4 +1,4 @@
1
- #TODO
1
+ # TODO
2
2
  # import unittest
3
3
  # from lionagi.core.graph.tree import TreeNode, Tree
4
4
  #
@@ -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('%Y-%m-%d')
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(timestamp=datetime.today().strftime('%Y-%m-%d'), package=package)
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
@@ -1,4 +1,4 @@
1
- #TODO
1
+ # TODO
2
2
 
3
3
  # import unittest
4
4
  # from unittest.mock import MagicMock, patch
@@ -1,4 +1,4 @@
1
- #TODO
1
+ # TODO
2
2
  # import unittest
3
3
  # from unittest.mock import MagicMock, patch
4
4
  # from lionagi.core.generic import BaseNode, Edge
@@ -1,4 +1,4 @@
1
- #TODO
1
+ # TODO
2
2
  # import unittest
3
3
  # from lionagi.new.schema.todo.tree import Tree
4
4
  # from lionagi.core.generic import TreeNode
lionagi/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.2.4"
1
+ __version__ = "0.2.5"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lionagi
3
- Version: 0.2.4
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.3
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=SBl2EPFW-ltPvQ7vbVWItyAsz3aKYIpjO7vcfr84GkU,22
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=6Xwm6dsdUtzvpL9Thq0PUkB-NqlZch-C8bq8XssH_Uo,12274
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=U99JRyZldajngvTJeTasCsIwNms2bH9Nb1P_-2dWUxM,7599
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=CWfsaW4zb8IO8EQMJ9LKuk7uEouZTgNa53MMxQ6pDXM,7018
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=7sy5H73T4fyVVBdrU2By5NjLaJIPzSdwkNMRtYuaWtE,11740
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=axXqXFiR6pQ-q2Bx5nuryv0hkj_ywOgZTFAv-7Sg124,39312
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=OiJGqGV2rsRzYwmlIS9Hnf5yPAceY7gJeiHmd0Spdso,3403
111
- lionagi/core/work/work_function.py,sha256=hFjkdTUchwnzN5DX3pe05ADKWWJktzetmH8YlPiWnaw,3971
112
- lionagi/core/work/work_function_node.py,sha256=3X5CXtTuhhOspgZMlqt5haljCrp20vSIA59Tw8i-tLI,2069
113
- lionagi/core/work/work_queue.py,sha256=_qbTL9M5NdAfnzUV14--dFZQXiVnqEgXP2KWB7hry60,3626
114
- lionagi/core/work/work_task.py,sha256=t4ltNVOd1G1FLe1496H40V-kX8v22IdDHnR2VC8pAi4,5405
115
- lionagi/core/work/worker.py,sha256=M3SSHIVf8BR-yaaqEm9xaX8EgVn4MGInn7ODwY6tXSk,14948
116
- lionagi/core/work/worker_engine.py,sha256=1WF2aMBeQmWgfQ43-BS0PCuDmJxltznzNc-RvBx9iNw,7390
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=r4xkvVQ7FtMXoXc8HLe2OTnT4ljCK7o8l7RAKc_kRBg,3614
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=RTCqe7JiSOWRQXj6Ic4nL-m1jxGGJG1lw8HIl_qppLQ,1320
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=bfNDpo0O_Ic4SL3c7jkRT_bOJ6lozeYn1ABh8UYoNmQ,27226
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=9E8W_2a3jsm8fuQ30NBQ3-3TGQfEeJ9g5is0jV1nGlA,492
217
- lionagi/tests/api/aws/test_aws_s3.py,sha256=ATdbq6AmswgvLHF3zXW7Ow18wpcEIG-uglD1Al_8hZg,136
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=w8fqNHDbjC-5x7xSK9RJ5NSg_r17Psw8ZcigCdXnsOA,8846
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=JCvk7pn5hRBK8vBMm31tZgAv2kC9eDLn_8jJK0_2-Qs,2708
247
- lionagi/tests/test_core/graph/test_tree.py,sha256=vdRH9fSazbox1ajRS5FByQGAVu-mwvS6YEFpepV3Fb8,3380
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=PbxlTXXcPFe177TzUbpQOQiDV-XdzHE-Oorct_vuwnM,3063
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=Ik_G7lI8dV3Q1jw1f6mynoPQVYnvVTkOQrgAf7fpIxY,9387
252
- lionagi/tests/test_core/test_structure/test_graph.py,sha256=uC68zubRVbwSZ5JGzld7LnlpPqfGMNMZ9FDu9mcHp60,2161
253
- lionagi/tests/test_core/test_structure/test_tree.py,sha256=0vJMvG0YChCl7W2NwF0yl9ukSftlkuoMOZFrHwwMgL8,1943
254
- lionagi-0.2.4.dist-info/LICENSE,sha256=VXFWsdoN5AAknBCgFqQNgPWYx7OPp-PFEP961zGdOjc,11288
255
- lionagi-0.2.4.dist-info/METADATA,sha256=laDb2JoSzm-iwVq0_qrZVtaxcHMXxWjF6zbia1iP5HE,16276
256
- lionagi-0.2.4.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
257
- lionagi-0.2.4.dist-info/top_level.txt,sha256=szvch_d2jE1Lu9ZIKsl26Ll6BGfYfbOgt5lm-UpFSo4,8
258
- lionagi-0.2.4.dist-info/RECORD,,
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,,