lionagi 0.17.0__py3-none-any.whl → 0.17.2__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/__init__.py CHANGED
@@ -6,9 +6,8 @@ import logging
6
6
 
7
7
  from pydantic import BaseModel, Field
8
8
 
9
- from . import _types as types
9
+ # Eager imports for commonly used components
10
10
  from . import ln as ln
11
- from .operations.builder import OperationGraphBuilder as Builder
12
11
  from .operations.node import Operation
13
12
  from .service.imodel import iModel
14
13
  from .session.session import Branch, Session
@@ -17,6 +16,29 @@ from .version import __version__
17
16
  logger = logging.getLogger(__name__)
18
17
  logger.setLevel(logging.INFO)
19
18
 
19
+ # Module-level lazy loading cache
20
+ _lazy_imports = {}
21
+
22
+
23
+ def __getattr__(name: str):
24
+ """Lazy loading for expensive imports."""
25
+ if name in _lazy_imports:
26
+ return _lazy_imports[name]
27
+
28
+ if name == "types":
29
+ from . import _types as types
30
+
31
+ _lazy_imports["types"] = types
32
+ return types
33
+ elif name == "Builder":
34
+ from .operations.builder import OperationGraphBuilder as Builder
35
+
36
+ _lazy_imports["Builder"] = Builder
37
+ return Builder
38
+
39
+ raise AttributeError(f"module '{__name__}' has no attribute '{name}'")
40
+
41
+
20
42
  __all__ = (
21
43
  "Session",
22
44
  "Branch",
lionagi/_types.py CHANGED
@@ -1,3 +1,47 @@
1
- from .fields import *
2
- from .models import *
3
- from .protocols.types import *
1
+ # Lazy loading for heavy type imports to improve startup performance
2
+ _lazy_type_imports = {}
3
+
4
+
5
+ def __getattr__(name: str):
6
+ """Lazy loading for type definitions."""
7
+ if name in _lazy_type_imports:
8
+ return _lazy_type_imports[name]
9
+
10
+ # Import from fields
11
+ try:
12
+ from .fields import __all__ as fields_all
13
+
14
+ if name in fields_all:
15
+ from . import fields
16
+
17
+ attr = getattr(fields, name)
18
+ _lazy_type_imports[name] = attr
19
+ return attr
20
+ except (ImportError, AttributeError):
21
+ pass
22
+
23
+ # Import from models
24
+ try:
25
+ from .models import __all__ as models_all
26
+
27
+ if name in models_all:
28
+ from . import models
29
+
30
+ attr = getattr(models, name)
31
+ _lazy_type_imports[name] = attr
32
+ return attr
33
+ except (ImportError, AttributeError):
34
+ pass
35
+
36
+ # Import from protocols.types
37
+ try:
38
+ from .protocols import types as protocol_types
39
+
40
+ if hasattr(protocol_types, name):
41
+ attr = getattr(protocol_types, name)
42
+ _lazy_type_imports[name] = attr
43
+ return attr
44
+ except (ImportError, AttributeError):
45
+ pass
46
+
47
+ raise AttributeError(f"module '{__name__}' has no attribute '{name}'")
@@ -549,3 +549,94 @@ async def flow(
549
549
  )
550
550
 
551
551
  return await executor.execute()
552
+
553
+
554
+ def cleanup_flow_results(
555
+ result: dict[str, Any], keep_only: list[str] = None
556
+ ) -> dict[str, Any]:
557
+ """
558
+ Clean up flow execution results to reduce memory usage.
559
+
560
+ Args:
561
+ result: Flow execution result dictionary
562
+ keep_only: List of operation IDs to keep results for (optional)
563
+
564
+ Returns:
565
+ Modified result dictionary with reduced memory footprint
566
+ """
567
+ if not isinstance(result, dict) or "operation_results" not in result:
568
+ return result
569
+
570
+ # If keep_only is specified, only keep those results
571
+ if keep_only is not None:
572
+ filtered_results = {
573
+ op_id: res
574
+ for op_id, res in result["operation_results"].items()
575
+ if op_id in keep_only
576
+ }
577
+ result["operation_results"] = filtered_results
578
+ # Update completed_operations to match
579
+ result["completed_operations"] = [
580
+ op_id
581
+ for op_id in result.get("completed_operations", [])
582
+ if op_id in keep_only
583
+ ]
584
+ else:
585
+ # Clear all results to free memory
586
+ result["operation_results"] = {}
587
+ result["completed_operations"] = []
588
+
589
+ return result
590
+
591
+
592
+ async def flow_with_cleanup(
593
+ session: "Session",
594
+ graph: "Graph",
595
+ context: dict[str, Any] | None = None,
596
+ parallel: bool = True,
597
+ max_concurrent: int = 5,
598
+ verbose: bool = False,
599
+ branch: "Branch" = None,
600
+ alcall_params: AlcallParams | None = None,
601
+ cleanup_results: bool = True,
602
+ keep_only: list[str] = None,
603
+ ) -> dict[str, Any]:
604
+ """
605
+ Execute flow with automatic cleanup to prevent memory accumulation.
606
+
607
+ Args:
608
+ session: Session instance for branch management
609
+ graph: Operation graph to execute
610
+ context: Initial context data
611
+ parallel: Execute independent operations in parallel
612
+ max_concurrent: Max concurrent operations (1 if not parallel)
613
+ verbose: Enable verbose logging
614
+ branch: Default branch for operations
615
+ alcall_params: Parameters for async parallel call execution
616
+ cleanup_results: Whether to clean up operation results after execution
617
+ keep_only: List of operation IDs to keep results for (if cleanup_results=True)
618
+
619
+ Returns:
620
+ Execution results (potentially with cleaned up memory footprint)
621
+ """
622
+ # Execute the flow normally
623
+ result = await flow(
624
+ session=session,
625
+ graph=graph,
626
+ context=context,
627
+ parallel=parallel,
628
+ max_concurrent=max_concurrent,
629
+ verbose=verbose,
630
+ branch=branch,
631
+ alcall_params=alcall_params,
632
+ )
633
+
634
+ # Clean up session memory
635
+ if hasattr(session, "cleanup_memory"):
636
+ session.cleanup_memory()
637
+
638
+ # Clean up results if requested
639
+ if cleanup_results:
640
+ result = cleanup_flow_results(result, keep_only=keep_only)
641
+
642
+ return result
@@ -62,6 +62,10 @@ class Node(Element, Relational, AsyncAdaptable, Adaptable):
62
62
  async def adapt_to_async(
63
63
  self, obj_key: str, many=False, **kwargs: Any
64
64
  ) -> Any:
65
+ # Only register postgres adapter if this specific operation needs it
66
+ if obj_key == "lionagi_async_pg":
67
+ _ensure_postgres_adapter()
68
+
65
69
  kwargs["adapt_meth"] = "to_dict"
66
70
  kwargs["adapt_kw"] = {"mode": "db"}
67
71
  return await super().adapt_to_async(
@@ -76,6 +80,10 @@ class Node(Element, Relational, AsyncAdaptable, Adaptable):
76
80
  many=False,
77
81
  **kwargs: Any,
78
82
  ) -> Node:
83
+ # Only register postgres adapter if this specific operation needs it
84
+ if obj_key == "lionagi_async_pg":
85
+ _ensure_postgres_adapter()
86
+
79
87
  kwargs["adapt_meth"] = "from_dict"
80
88
  return await super().adapt_from_async(
81
89
  obj, obj_key=obj_key, many=many, **kwargs
@@ -122,20 +130,31 @@ class Node(Element, Relational, AsyncAdaptable, Adaptable):
122
130
  return value
123
131
 
124
132
 
133
+ def _ensure_postgres_adapter():
134
+ """Lazy registration of postgres adapter when needed"""
135
+ if not hasattr(Node, "_postgres_adapter_checked"):
136
+ from lionagi.adapters._utils import check_async_postgres_available
137
+
138
+ if check_async_postgres_available() is True:
139
+ try:
140
+ from lionagi.adapters.async_postgres_adapter import (
141
+ LionAGIAsyncPostgresAdapter,
142
+ )
143
+
144
+ Node.register_async_adapter(LionAGIAsyncPostgresAdapter)
145
+ except ImportError:
146
+ pass # Graceful degradation if postgres dependencies missing
147
+ Node._postgres_adapter_checked = True
148
+
149
+
125
150
  if not _ADAPATER_REGISTERED:
126
151
  from pydapter.adapters import JsonAdapter, TomlAdapter
127
152
 
128
153
  Node.register_adapter(JsonAdapter)
129
154
  Node.register_adapter(TomlAdapter)
130
155
 
131
- from lionagi.adapters._utils import check_async_postgres_available
132
-
133
- if check_async_postgres_available() is True:
134
- from lionagi.adapters.async_postgres_adapter import (
135
- LionAGIAsyncPostgresAdapter,
136
- )
137
-
138
- Node.register_async_adapter(LionAGIAsyncPostgresAdapter)
156
+ # PostgreSQL adapter registration is now lazy - only loaded when needed
157
+ # Call _ensure_postgres_adapter() in methods that actually use async adapters
139
158
 
140
159
  _ADAPATER_REGISTERED = True
141
160
 
@@ -1,10 +1,28 @@
1
+ # Eager imports for core functionality
1
2
  from .connections.api_calling import APICalling
2
3
  from .connections.endpoint import Endpoint, EndpointConfig
3
4
  from .hooks import *
4
5
  from .imodel import iModel
5
6
  from .manager import iModelManager
6
7
  from .rate_limited_processor import RateLimitedAPIExecutor
7
- from .token_calculator import TokenCalculator
8
+
9
+ # Lazy loading cache
10
+ _lazy_imports = {}
11
+
12
+
13
+ def __getattr__(name: str):
14
+ """Lazy loading for heavy service imports."""
15
+ if name in _lazy_imports:
16
+ return _lazy_imports[name]
17
+
18
+ if name == "TokenCalculator":
19
+ from .token_calculator import TokenCalculator
20
+
21
+ _lazy_imports["TokenCalculator"] = TokenCalculator
22
+ return TokenCalculator
23
+
24
+ raise AttributeError(f"module '{__name__}' has no attribute '{name}'")
25
+
8
26
 
9
27
  __all__ = (
10
28
  "APICalling",
@@ -12,10 +12,17 @@ from typing_extensions import Self
12
12
  from lionagi.protocols.generic.event import Event, EventStatus
13
13
  from lionagi.protocols.types import Log
14
14
  from lionagi.service.hooks import HookEvent, HookEventTypes, global_hook_logger
15
- from lionagi.service.token_calculator import TokenCalculator
16
15
 
17
16
  from .endpoint import Endpoint
18
17
 
18
+
19
+ # Lazy import for TokenCalculator
20
+ def _get_token_calculator():
21
+ from lionagi.service.token_calculator import TokenCalculator
22
+
23
+ return TokenCalculator
24
+
25
+
19
26
  logger = logging.getLogger(__name__)
20
27
 
21
28
 
@@ -129,7 +136,7 @@ class APICalling(Event):
129
136
 
130
137
  # Handle chat completions format
131
138
  if "messages" in self.payload:
132
- return TokenCalculator.calculate_message_tokens(
139
+ return _get_token_calculator().calculate_message_tokens(
133
140
  self.payload["messages"], **self.payload
134
141
  )
135
142
  # Handle responses API format
@@ -150,12 +157,14 @@ class APICalling(Event):
150
157
  messages.append(item)
151
158
  else:
152
159
  return None
153
- return TokenCalculator.calculate_message_tokens(
160
+ return _get_token_calculator().calculate_message_tokens(
154
161
  messages, **self.payload
155
162
  )
156
163
  # Handle embeddings endpoint
157
164
  elif "embed" in self.endpoint.config.endpoint:
158
- return TokenCalculator.calculate_embed_token(**self.payload)
165
+ return _get_token_calculator().calculate_embed_token(
166
+ **self.payload
167
+ )
159
168
 
160
169
  return None
161
170
 
lionagi/service/types.py CHANGED
@@ -2,6 +2,7 @@
2
2
  #
3
3
  # SPDX-License-Identifier: Apache-2.0
4
4
 
5
+ # Eager imports for core functionality
5
6
  from .connections.api_calling import APICalling
6
7
  from .connections.endpoint import Endpoint, EndpointConfig
7
8
  from .connections.providers.types import *
@@ -9,7 +10,24 @@ from .hooks import *
9
10
  from .imodel import iModel
10
11
  from .manager import iModelManager
11
12
  from .rate_limited_processor import RateLimitedAPIExecutor
12
- from .token_calculator import TokenCalculator
13
+
14
+ # Lazy loading cache
15
+ _lazy_imports = {}
16
+
17
+
18
+ def __getattr__(name: str):
19
+ """Lazy loading for heavy service imports."""
20
+ if name in _lazy_imports:
21
+ return _lazy_imports[name]
22
+
23
+ if name == "TokenCalculator":
24
+ from .token_calculator import TokenCalculator
25
+
26
+ _lazy_imports["TokenCalculator"] = TokenCalculator
27
+ return TokenCalculator
28
+
29
+ raise AttributeError(f"module '{__name__}' has no attribute '{name}'")
30
+
13
31
 
14
32
  __all__ = (
15
33
  "APICalling",
@@ -416,6 +416,48 @@ class Session(Node, Communicatable, Relational):
416
416
  alcall_params=alcall_params,
417
417
  )
418
418
 
419
+ def cleanup_memory(
420
+ self, clear_branches: bool = True, clear_mail: bool = True
421
+ ):
422
+ """
423
+ Clean up session memory to prevent memory accumulation.
424
+
425
+ Args:
426
+ clear_branches: Whether to clear branch logs and memory
427
+ clear_mail: Whether to clear mail transfer history
428
+ """
429
+ if clear_branches and self.branches:
430
+ for branch in self.branches:
431
+ if hasattr(branch, "dump_logs"):
432
+ branch.dump_logs(clear=True)
433
+
434
+ if clear_mail and self.mail_transfer:
435
+ # Clear mail transfer history if available
436
+ if hasattr(self.mail_transfer, "clear"):
437
+ self.mail_transfer.clear()
438
+
439
+ async def acleanup_memory(
440
+ self, clear_branches: bool = True, clear_mail: bool = True
441
+ ):
442
+ """
443
+ Asynchronously clean up session memory to prevent memory accumulation.
444
+
445
+ Args:
446
+ clear_branches: Whether to clear branch logs and memory
447
+ clear_mail: Whether to clear mail transfer history
448
+ """
449
+ if clear_branches and self.branches:
450
+ for branch in self.branches:
451
+ if hasattr(branch, "adump_logs"):
452
+ await branch.adump_logs(clear=True)
453
+
454
+ if clear_mail and self.mail_transfer:
455
+ # Clear mail transfer history if available
456
+ if hasattr(self.mail_transfer, "aclear"):
457
+ await self.mail_transfer.aclear()
458
+ elif hasattr(self.mail_transfer, "clear"):
459
+ self.mail_transfer.clear()
460
+
419
461
 
420
462
  __all__ = ["Session"]
421
463
  # File: autoos/session/session.py
lionagi/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.17.0"
1
+ __version__ = "0.17.2"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lionagi
3
- Version: 0.17.0
3
+ Version: 0.17.2
4
4
  Summary: An Intelligence Operating System.
5
5
  Author-email: HaiyangLi <quantocean.li@gmail.com>
6
6
  License: Apache License
@@ -1,12 +1,12 @@
1
- lionagi/__init__.py,sha256=HZmhhYeplh06qAJQ7cW8JUlJsqG_Q4JKJ3GGFW_ZQnw,682
1
+ lionagi/__init__.py,sha256=KDyBBo2Ahdk44akAbUG7ZZATdZhVvl8WHEr6HXMC6vA,1196
2
2
  lionagi/_class_registry.py,sha256=pfUO1DjFZIqr3OwnNMkFqL_fiEBrrf8-swkGmP_KDLE,3112
3
3
  lionagi/_errors.py,sha256=ia_VWhPSyr5FIJLSdPpl04SrNOLI2skN40VC8ePmzeQ,3748
4
- lionagi/_types.py,sha256=j8XwSGeGrYwfmSJ8o-80bsfoalLWJgQH41ZkVevc4wk,75
4
+ lionagi/_types.py,sha256=COWRrmstmABGKKn-h_cKiAREGsMp_Ik49OdR4lSS3P8,1263
5
5
  lionagi/config.py,sha256=D13nnjpgJKz_LlQrzaKKVefm4hqesz_dP9ROjWmGuLE,3811
6
6
  lionagi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  lionagi/settings.py,sha256=HDuKCEJCpc4HudKodBnhoQUGuTGhRHdlIFhbtf3VBtY,1633
8
8
  lionagi/utils.py,sha256=pfAibR84sx-aPxGNPrdlHqUAf2OXoCBGRCMseMrzhi4,18046
9
- lionagi/version.py,sha256=XpM3lncCzPBIwMSvDN7i10pke_c6KdJtVLZYbCiaTRw,23
9
+ lionagi/version.py,sha256=I5u6uLh7NsbyGkKLvVteW175Afe6HJt5UsjBZ28EGks,23
10
10
  lionagi/adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  lionagi/adapters/_utils.py,sha256=sniMG1LDDkwJNzUF2K32jv7rA6Y1QcohgyNclYsptzI,453
12
12
  lionagi/adapters/async_postgres_adapter.py,sha256=2XlxYNPow78dFHIQs8W1oJ2zkVD5Udn3aynMBF9Nf3k,3498
@@ -71,7 +71,7 @@ lionagi/models/schema_model.py,sha256=ghRIM8aBNaToAknwNlhQKpuKXcwzyCw5pDE31bVKxs
71
71
  lionagi/operations/__init__.py,sha256=DU9sIhtw1vPBVllZ1Fbum8GE3qC9yfyQtt6_8vyv_cA,444
72
72
  lionagi/operations/_visualize_graph.py,sha256=F0KadgRthP-6-R-FPgvlwiiaiWH3ueO-rjSd1bzRUbE,8594
73
73
  lionagi/operations/builder.py,sha256=c6OIBwIX2-V4oH7wRBQf4SEs38L9lHdSX1ODb7ETLuI,14722
74
- lionagi/operations/flow.py,sha256=StGPmpPLe_ZFVwWmc9RiUpH7i1gkhN4q7A94ax0_b1E,22298
74
+ lionagi/operations/flow.py,sha256=7mjyKCXN1GYNDxNMqjALr9j6vsgm8TC2Z4ZNpzzfUMU,25141
75
75
  lionagi/operations/manager.py,sha256=YZr3VjPAZVVFd_bIjF1aoQqzzKZHNA1kcqefNi5QFFM,683
76
76
  lionagi/operations/node.py,sha256=zntelS3kO6q4H6vpS2lpw3iNUTLR3a6I3dp07fdSGJs,3465
77
77
  lionagi/operations/types.py,sha256=zBhTQ4od4yXo84_Osbed7Zqhnp-PA90mrjGsQSSCuzw,644
@@ -126,7 +126,7 @@ lionagi/protocols/generic/progression.py,sha256=HCV_EnQCFvjg6D7eF4ygGrZNQPEOtu75
126
126
  lionagi/protocols/graph/__init__.py,sha256=UPu3OmUpjSgX2aBuBJUdG2fppGlfqAH96hU0qIMBMp0,253
127
127
  lionagi/protocols/graph/edge.py,sha256=YxSGj4w_fG7khm-zpKduuK5fJzhJDx23JhU1dZp29d8,5241
128
128
  lionagi/protocols/graph/graph.py,sha256=l-12vTRblpWS_M4Ae-NTZThdeioaQvmhCS83mjB2fe8,11159
129
- lionagi/protocols/graph/node.py,sha256=TuPNHSlkSpqp7nxUV2gj-SkCZVkY4ZocnB79ONlkY6o,4467
129
+ lionagi/protocols/graph/node.py,sha256=AtMw-Z88aW0YjOlN1g6cxmRrSSC3qyGV1MYqBg5hUrY,5305
130
130
  lionagi/protocols/mail/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
131
131
  lionagi/protocols/mail/exchange.py,sha256=P1PcrFylIBeiQa8kox9H1qyJ4kjhUlbLiTUT8rs1OXg,7041
132
132
  lionagi/protocols/mail/mail.py,sha256=RB5CUft_4J85H9nM9g6aRXomTaqKwF5xVjJacPAhoa8,1356
@@ -152,15 +152,15 @@ lionagi/protocols/messages/templates/tool_schemas.jinja2,sha256=ozIaSDCRjIAhLyA8
152
152
  lionagi/protocols/operatives/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
153
153
  lionagi/protocols/operatives/operative.py,sha256=Y_prGR7aPQtO3ws91W_KkjJTVnb5lYkfwMKaEIN2FVU,13331
154
154
  lionagi/protocols/operatives/step.py,sha256=uF92QO2KZiY3YR1cxhrbD844VFidOKfmeQn2Fv637iY,9280
155
- lionagi/service/__init__.py,sha256=C_TPk1roVYz6uVLK1JVxrK3tPtYqN6W0D7FzI-s6CWY,556
155
+ lionagi/service/__init__.py,sha256=qcscXOKVQtDDQ7YV-_D9jcIABDkGaxAEsCKsBBtf4XE,992
156
156
  lionagi/service/imodel.py,sha256=ya406sf42-KRrKN4TJJLtI6wsKeM5hAhWr7Hubg7W0E,16371
157
157
  lionagi/service/manager.py,sha256=tN3p0kM7pg_CEs6wXK62_B_h49Q3nrU-9qniFhw2ABE,1164
158
158
  lionagi/service/rate_limited_processor.py,sha256=h2_F71aVeBrgZ0a7ARS8-8NDaAHvfWrLykI5QcNuYbk,6099
159
159
  lionagi/service/resilience.py,sha256=91RPFtQY4QyNga_nuSNLsbzNE26pXJMTAfLaQqVdvmg,18714
160
160
  lionagi/service/token_calculator.py,sha256=piTidArzUkIMCtOLC_HBLoZNYZcENQywgeKM31bxezM,6457
161
- lionagi/service/types.py,sha256=9zX08BhdmPE9FE1YTyvsy14hdDGRYzyyVBmoBURzQvI,1096
161
+ lionagi/service/types.py,sha256=KxUM3m6LMPqIO3l1nNdaSJ8vt46ozOKWFZyI4LXBTRk,1532
162
162
  lionagi/service/connections/__init__.py,sha256=yHQZ7OJpCftd6CStYR8inbxjJydYdmv9kCvbUBhJ2zU,362
163
- lionagi/service/connections/api_calling.py,sha256=fY-fzwSJvQKpUT27TF0MTfE5TxroYKkL4SHWYrmYznI,9958
163
+ lionagi/service/connections/api_calling.py,sha256=n_FA_Q8R7s0KsgsUE-obyVPB73UbOxTD2c_qpi9ngso,10110
164
164
  lionagi/service/connections/endpoint.py,sha256=0r4-8NPyAvLNey09BBsUr5KGJCXchBmVZm2pCe3Nbq4,15165
165
165
  lionagi/service/connections/endpoint_config.py,sha256=6sA06uCzriT6p0kFxhDCFH8N6V6MVp8ytlOw5ctBhDI,5169
166
166
  lionagi/service/connections/header_factory.py,sha256=IYeTQQk7r8FXcdhmW7orCxHjNO-Nb1EOXhgNK7CAp-I,1821
@@ -189,13 +189,13 @@ lionagi/service/third_party/pplx_models.py,sha256=-EhyJgOWR6rzSv3zczUtk80X6c19p1
189
189
  lionagi/session/__init__.py,sha256=kDypY6L3kGPnatAw7YNQAykgg-9MlIBnlhHExaXvt-c,202
190
190
  lionagi/session/branch.py,sha256=Gz9QOhZ2e6UJtTTkqY4P1Oa0UnjXHwIJTP7YCpcbA9o,65064
191
191
  lionagi/session/prompts.py,sha256=GPr0jibyAAqS3awDzGC8SoCL6aWJLLCCbXY0JUuxOC0,3170
192
- lionagi/session/session.py,sha256=BVouy9xiqVfD6AucTVs80vSvs7nIKsgGjgvIFgMsO0Q,12970
192
+ lionagi/session/session.py,sha256=mPUUm-NG9UtUdn98UqIGRkxcZoFswrob70tVb_QZSf8,14536
193
193
  lionagi/tools/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
194
194
  lionagi/tools/base.py,sha256=hEGnE4MD0CM4UqnF0xsDRKB0aM-pyrTFHl8utHhyJLU,1897
195
195
  lionagi/tools/types.py,sha256=XtJLY0m-Yi_ZLWhm0KycayvqMCZd--HxfQ0x9vFUYDE,230
196
196
  lionagi/tools/file/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
197
197
  lionagi/tools/file/reader.py,sha256=2YKgU3VKo76zfL_buDAUQJoPLC56f6WJ4_mdJjlMDIM,9509
198
- lionagi-0.17.0.dist-info/METADATA,sha256=x9SSUvfLlKC40Tta8exQJnp7T5ajT9dX-FjFCW3iBvc,22674
199
- lionagi-0.17.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
200
- lionagi-0.17.0.dist-info/licenses/LICENSE,sha256=VXFWsdoN5AAknBCgFqQNgPWYx7OPp-PFEP961zGdOjc,11288
201
- lionagi-0.17.0.dist-info/RECORD,,
198
+ lionagi-0.17.2.dist-info/METADATA,sha256=AXGNj_mj3gEEDpn7gAtSO5t7W1dkhW_8LVbfSxfbP7A,22674
199
+ lionagi-0.17.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
200
+ lionagi-0.17.2.dist-info/licenses/LICENSE,sha256=VXFWsdoN5AAknBCgFqQNgPWYx7OPp-PFEP961zGdOjc,11288
201
+ lionagi-0.17.2.dist-info/RECORD,,