lionagi 0.14.6__py3-none-any.whl → 0.14.7__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.
@@ -0,0 +1,3 @@
1
+ from .manager import HashUtils
2
+
3
+ __all__ = ("HashUtils",)
@@ -0,0 +1,108 @@
1
+ import copy
2
+
3
+ from pydantic import BaseModel as PydanticBaseModel
4
+
5
+ __all__ = ("hash_dict",)
6
+
7
+ # --- Canonical Representation Generator ---
8
+ _PRIMITIVE_TYPES = (str, int, float, bool, type(None))
9
+ _TYPE_MARKER_DICT = 0
10
+ _TYPE_MARKER_LIST = 1
11
+ _TYPE_MARKER_TUPLE = 2
12
+ _TYPE_MARKER_SET = 3
13
+ _TYPE_MARKER_FROZENSET = 4
14
+ _TYPE_MARKER_PYDANTIC = 5 # Distinguishes dumped Pydantic models
15
+
16
+
17
+ def _generate_hashable_representation(item: any) -> any:
18
+ """
19
+ Recursively converts a Python object into a stable, hashable representation.
20
+ This ensures that logically identical but structurally different inputs
21
+ (e.g., dicts with different key orders) produce the same representation.
22
+ """
23
+ if isinstance(item, _PRIMITIVE_TYPES):
24
+ return item
25
+
26
+ if isinstance(item, PydanticBaseModel):
27
+ # Process the Pydantic model by first dumping it to a dict, then processing that dict.
28
+ # The type marker distinguishes this from a regular dictionary.
29
+ return (
30
+ _TYPE_MARKER_PYDANTIC,
31
+ _generate_hashable_representation(item.model_dump()),
32
+ )
33
+
34
+ if isinstance(item, dict):
35
+ # Sort dictionary items by key (stringified) for order-insensitivity.
36
+ return (
37
+ _TYPE_MARKER_DICT,
38
+ tuple(
39
+ (str(k), _generate_hashable_representation(v))
40
+ for k, v in sorted(item.items(), key=lambda x: str(x[0]))
41
+ ),
42
+ )
43
+
44
+ if isinstance(item, list):
45
+ return (
46
+ _TYPE_MARKER_LIST,
47
+ tuple(_generate_hashable_representation(elem) for elem in item),
48
+ )
49
+
50
+ if isinstance(item, tuple):
51
+ return (
52
+ _TYPE_MARKER_TUPLE,
53
+ tuple(_generate_hashable_representation(elem) for elem in item),
54
+ )
55
+
56
+ # frozenset must be checked before set
57
+ if isinstance(item, frozenset):
58
+ try: # Attempt direct sort for comparable elements
59
+ sorted_elements = sorted(list(item))
60
+ except TypeError: # Fallback for unorderable mixed types
61
+ sorted_elements = sorted(
62
+ list(item), key=lambda x: (str(type(x)), str(x))
63
+ )
64
+ return (
65
+ _TYPE_MARKER_FROZENSET,
66
+ tuple(
67
+ _generate_hashable_representation(elem)
68
+ for elem in sorted_elements
69
+ ),
70
+ )
71
+
72
+ if isinstance(item, set):
73
+ try:
74
+ sorted_elements = sorted(list(item))
75
+ except TypeError:
76
+ sorted_elements = sorted(
77
+ list(item), key=lambda x: (str(type(x)), str(x))
78
+ )
79
+ return (
80
+ _TYPE_MARKER_SET,
81
+ tuple(
82
+ _generate_hashable_representation(elem)
83
+ for elem in sorted_elements
84
+ ),
85
+ )
86
+
87
+ # Fallback for other types (e.g., custom objects not derived from the above)
88
+ try:
89
+ return str(item)
90
+ except Exception: # If str() fails for some reason
91
+ return repr(item)
92
+
93
+
94
+ def hash_dict(data: any, strict: bool = False) -> int:
95
+ data_to_process = data
96
+ if strict:
97
+ data_to_process = copy.deepcopy(data)
98
+
99
+ hashable_repr = _generate_hashable_representation(data_to_process)
100
+
101
+ try:
102
+ return hash(hashable_repr)
103
+ except TypeError as e:
104
+ raise TypeError(
105
+ f"The generated representation for the input data was not hashable. "
106
+ f"Input type: {type(data).__name__}, Representation type: {type(hashable_repr).__name__}. "
107
+ f"Original error: {e}"
108
+ )
@@ -0,0 +1,26 @@
1
+ class HashUtils:
2
+ @staticmethod
3
+ def hash_dict(data: any, strict: bool = False) -> int:
4
+ """
5
+ Computes a deterministic hash for various Python data structures including
6
+ dictionaries, Pydantic BaseModels, lists, tuples, sets, frozensets, and primitives.
7
+
8
+ The hash is deterministic within the same Python process run (respecting
9
+ PYTHONHASHSEED for built-in hash behavior on strings, bytes, etc.).
10
+ It's suitable for tasks like finding unique objects within a collection
11
+ during a single program execution.
12
+
13
+ Args:
14
+ data: The Python object to hash.
15
+ strict: if True, will make a deep copy of the input data to ensure immutability.
16
+
17
+ Returns:
18
+ An integer hash value.
19
+
20
+ Raises:
21
+ TypeError: If the generated internal representation of the data is not hashable,
22
+ though this is unlikely with the current _generate_hashable_representation.
23
+ """
24
+ from .hash_dict import hash_dict as _hash_dict
25
+
26
+ return _hash_dict(data, strict=strict)
@@ -1,7 +1,8 @@
1
1
  from pydantic import BaseModel
2
2
  from typing_extensions import Self
3
3
 
4
- from lionagi.utils import UNDEFINED, hash_dict
4
+ from lionagi.libs.hash.hash_dict import hash_dict
5
+ from lionagi.utils import UNDEFINED
5
6
 
6
7
 
7
8
  class HashableModel(BaseModel):
@@ -2,6 +2,8 @@
2
2
  #
3
3
  # SPDX-License-Identifier: Apache-2.0
4
4
 
5
+ from __future__ import annotations
6
+
5
7
  import json
6
8
  from pathlib import Path
7
9
  from typing import Any
@@ -147,7 +149,7 @@ class RoledMessage(Node, Sendable):
147
149
  """
148
150
  return self._flag == MessageFlag.MESSAGE_CLONE
149
151
 
150
- def clone(self, keep_role: bool = True) -> "RoledMessage":
152
+ def clone(self, keep_role: bool = True) -> RoledMessage:
151
153
  """
152
154
  Create a shallow copy of this message, possibly resetting the role.
153
155
 
@@ -43,7 +43,7 @@ CLAUDE_CODE_OPTION_PARAMS = {
43
43
  # --------------------------------------------------------------------------- request model
44
44
  class ClaudeCodeRequest(BaseModel):
45
45
  # -- conversational bits -------------------------------------------------
46
- prompt: str = Field(description="The prompt for Claude Code")
46
+ prompt: str = Field(description="The prompt for Claude Code")
47
47
  system_prompt: str | None = None
48
48
  append_system_prompt: str | None = None
49
49
  max_turns: int | None = None
@@ -68,10 +68,9 @@ class ClaudeCodeRequest(BaseModel):
68
68
  # -- internal use --------------------------------------------------------
69
69
  auto_finish: bool = Field(
70
70
  default=False,
71
- exclude=True,
72
71
  description="Automatically finish the conversation after the first response",
73
72
  )
74
- verbose_output: bool = Field(default=False, exclude=True)
73
+ verbose_output: bool = Field(default=False)
75
74
  cli_display_theme: Literal["light", "dark"] = "light"
76
75
 
77
76
  # ------------------------ validators & helpers --------------------------
@@ -348,3 +348,12 @@ async def stream_claude_code_cli( # noqa: C901 (complexity from branching is f
348
348
  _pp_final(session, theme)
349
349
 
350
350
  yield session
351
+
352
+
353
+ __all__ = (
354
+ "CLAUDE",
355
+ "stream_claude_code_cli",
356
+ "ndjson_from_cli",
357
+ "ClaudeChunk",
358
+ "ClaudeSession",
359
+ )
lionagi/service/types.py CHANGED
@@ -3,7 +3,7 @@
3
3
  # SPDX-License-Identifier: Apache-2.0
4
4
 
5
5
  from .connections.api_calling import APICalling
6
- from .connections.endpoint import Endpoint
6
+ from .connections.endpoint import Endpoint, EndpointConfig
7
7
  from .imodel import iModel
8
8
  from .manager import iModelManager
9
9
  from .rate_limited_processor import RateLimitedAPIExecutor
@@ -12,6 +12,7 @@ from .token_calculator import TokenCalculator
12
12
  __all__ = (
13
13
  "APICalling",
14
14
  "Endpoint",
15
+ "EndpointConfig",
15
16
  "RateLimitedAPIExecutor",
16
17
  "TokenCalculator",
17
18
  "iModel",
lionagi/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.14.6"
1
+ __version__ = "0.14.7"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lionagi
3
- Version: 0.14.6
3
+ Version: 0.14.7
4
4
  Summary: An Intelligence Operating System.
5
5
  Author-email: HaiyangLi <quantocean.li@gmail.com>, Liangbingyan Luo <llby_luo@outlook.com>
6
6
  License: Apache License
@@ -234,9 +234,9 @@ Requires-Dist: tiktoken>=0.8.0
234
234
  Requires-Dist: toml>=0.9.0
235
235
  Provides-Extra: all
236
236
  Requires-Dist: aiosqlite>=0.21.0; extra == 'all'
237
- Requires-Dist: claude-code-sdk>=0.0.14; extra == 'all'
237
+ Requires-Dist: claude-code-sdk>=0.0.15; extra == 'all'
238
238
  Requires-Dist: datamodel-code-generator>=0.31.2; extra == 'all'
239
- Requires-Dist: docling>=2.15.1; extra == 'all'
239
+ Requires-Dist: docling>=2.15.0; extra == 'all'
240
240
  Requires-Dist: fastmcp>=2.10.5; extra == 'all'
241
241
  Requires-Dist: matplotlib>=3.7.0; extra == 'all'
242
242
  Requires-Dist: networkx>=3.0.0; extra == 'all'
@@ -244,36 +244,26 @@ Requires-Dist: ollama>=0.4.0; extra == 'all'
244
244
  Requires-Dist: pydapter[postgres]; extra == 'all'
245
245
  Requires-Dist: rich>=13.0.0; extra == 'all'
246
246
  Provides-Extra: claude-code
247
- Requires-Dist: claude-code-sdk>=0.0.14; extra == 'claude-code'
248
- Provides-Extra: docs
249
- Requires-Dist: furo>=2024.8.6; extra == 'docs'
250
- Requires-Dist: sphinx-autobuild>=2024.10.3; extra == 'docs'
251
- Requires-Dist: sphinx>=8.1.3; extra == 'docs'
247
+ Requires-Dist: claude-code-sdk>=0.0.15; extra == 'claude-code'
252
248
  Provides-Extra: graph
253
249
  Requires-Dist: matplotlib>=3.7.0; extra == 'graph'
254
250
  Requires-Dist: networkx>=3.0.0; extra == 'graph'
255
- Provides-Extra: lint
256
- Requires-Dist: black[jupyter]>=24.10.0; extra == 'lint'
257
- Requires-Dist: isort>=5.13.2; extra == 'lint'
258
- Requires-Dist: pre-commit>=4.0.1; extra == 'lint'
259
251
  Provides-Extra: mcp
260
252
  Requires-Dist: fastmcp>=2.10.5; extra == 'mcp'
261
253
  Provides-Extra: ollama
262
254
  Requires-Dist: ollama>=0.4.0; extra == 'ollama'
263
255
  Provides-Extra: postgres
264
- Requires-Dist: aiosqlite>=0.21.0; extra == 'postgres'
265
256
  Requires-Dist: pydapter[postgres]; extra == 'postgres'
266
257
  Provides-Extra: reader
267
- Requires-Dist: docling>=2.15.1; extra == 'reader'
258
+ Requires-Dist: docling>=2.15.0; extra == 'reader'
268
259
  Provides-Extra: rich
269
260
  Requires-Dist: rich>=13.0.0; extra == 'rich'
270
261
  Provides-Extra: schema
271
262
  Requires-Dist: datamodel-code-generator>=0.31.2; extra == 'schema'
272
- Provides-Extra: test
273
- Requires-Dist: pytest-asyncio>=1.0.0; extra == 'test'
274
- Requires-Dist: pytest>=8.3.4; extra == 'test'
263
+ Provides-Extra: sqlite
264
+ Requires-Dist: aiosqlite>=0.21.0; extra == 'sqlite'
275
265
  Provides-Extra: tools
276
- Requires-Dist: docling>=2.15.1; extra == 'tools'
266
+ Requires-Dist: docling>=2.15.0; extra == 'tools'
277
267
  Description-Content-Type: text/markdown
278
268
 
279
269
  ![PyPI - Version](https://img.shields.io/pypi/v/lionagi?labelColor=233476aa&color=231fc935)
@@ -416,7 +406,7 @@ Seamlessly route to different models in the same workflow.
416
406
 
417
407
  ### Claude Code Integration
418
408
 
419
- LionAGI now supports Anthropic's [Claude Code SDK](https://github.com/anthropics/claude-code-sdk), enabling autonomous coding capabilities with persistent session management:
409
+ LionAGI now supports Anthropic's [Claude Code Python SDK](https://github.com/anthropics/claude-code-sdk-python), enabling autonomous coding capabilities with persistent session management:
420
410
 
421
411
  ```python
422
412
  from lionagi import iModel, Branch
@@ -6,7 +6,7 @@ lionagi/config.py,sha256=Dxs5FA9UCv1YX5H54qOJcPsDrIF9wFokWEPZ212eH-k,3715
6
6
  lionagi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  lionagi/settings.py,sha256=HDuKCEJCpc4HudKodBnhoQUGuTGhRHdlIFhbtf3VBtY,1633
8
8
  lionagi/utils.py,sha256=n2aUMSnLLgy7HWFlfzDV1OqMDbatLNX0QYc7jIjXwQA,75023
9
- lionagi/version.py,sha256=8YscPb5efWnULR4pGFhtuY0RRhqCGPpeGi69mc5MYv4,23
9
+ lionagi/version.py,sha256=yNRy8QmCVyuml0ju8L9u6swkKYhN3lS8nPbf2IWPDOU,23
10
10
  lionagi/adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  lionagi/adapters/async_postgres_adapter.py,sha256=Kf2YCzwRqKpEHY3GQCXEiMl201CCIkDvXcvddwZNkkE,12723
12
12
  lionagi/adapters/postgres_model_adapter.py,sha256=e_wfJNyihbpLCXuAs_W9tbLoMXAXbAXtkQDaHfqWz3o,4555
@@ -35,6 +35,9 @@ lionagi/libs/file/file_ops.py,sha256=HBiIh1EljIJ5VTIXuyvJM0ppSs0YYOPUWmgDMJT634U
35
35
  lionagi/libs/file/params.py,sha256=SZ5DkoffWfxWudOAYCfCxpL8UIm-1UjeyTtploo-Lqs,5824
36
36
  lionagi/libs/file/process.py,sha256=EsnEJcQUm4ReP7qkCeMvL4Qe6fLRcENVWZndh9TSUsc,8692
37
37
  lionagi/libs/file/save.py,sha256=5PvX1o1danZEq6S7V-GHIbZ6n-m-1IDdWhXPRbUXSVE,2865
38
+ lionagi/libs/hash/__init__.py,sha256=z3H4Wu7VBiyZe54vMIA_Kpcbexl-GY0KGEJkIcP1S6M,57
39
+ lionagi/libs/hash/hash_dict.py,sha256=g20yJfuVhAsfsBOWlkO889DHte6cbUCl6vV5QMT8nUo,3499
40
+ lionagi/libs/hash/manager.py,sha256=DhFHC_yh5p9_yCgc8QNgsUDFOJAQY2qNxjw8rhh69G8,1089
38
41
  lionagi/libs/nested/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
39
42
  lionagi/libs/nested/flatten.py,sha256=sB4jxZRoaUbjak9RbIWVWNKz2hzkhQJPFffV_Ws1GA0,5479
40
43
  lionagi/libs/nested/nfilter.py,sha256=kF7AWjLFHr22SOjRBSTx-7iRPaR7gs0FY5Y4XF2sWJ8,1768
@@ -87,7 +90,7 @@ lionagi/libs/validate/string_similarity.py,sha256=ymuqTKd95_h8ywD9VTzf24gIPyMz1M
87
90
  lionagi/libs/validate/validate_boolean.py,sha256=bjiX_WZ3Bg8XcqoWLzE1G9BpO0AisrlZUxrpye_mlGk,3614
88
91
  lionagi/models/__init__.py,sha256=R7DEGWuhH-izP7eN6SOw24-I4Mr2IVPXF4gNysmF2zQ,457
89
92
  lionagi/models/field_model.py,sha256=pRFUYs72BRB6jo4NkgeqslCp0xwqzvh00ibh8uaMAws,23674
90
- lionagi/models/hashable_model.py,sha256=oOqR3OJCU9cJfWHiG0WaEw0GMqfE2WTt4cy7WsAsiRg,829
93
+ lionagi/models/hashable_model.py,sha256=fpBv4_BcD5F5Laxa_uQ13EPMnVUBP-J0IMxzV9-35Cc,868
91
94
  lionagi/models/model_params.py,sha256=zVU-PHp3skjK5ZVjpsPs1k_VJiS8X0hgct0xs6Z6W_Y,10955
92
95
  lionagi/models/note.py,sha256=okWJL4mGqt0bUVxHRyqsfJr7tEh6wwgYhF1CegxudIA,12202
93
96
  lionagi/models/operable_model.py,sha256=fXbcpBjO-SoaeF8fn-F1_KIcYw9_L73VIUM1BDg5hj4,19905
@@ -163,7 +166,7 @@ lionagi/protocols/messages/assistant_response.py,sha256=jrzRPVHHDnPw86Xp0IHnPy0t
163
166
  lionagi/protocols/messages/base.py,sha256=Ng1Q8yIIIFauUv53LnwDeyOrM-cSCfsHM1GwkxChf2o,2317
164
167
  lionagi/protocols/messages/instruction.py,sha256=0dUsUYd6xYsbOHU7GafvqBkpDQQoFOXJXT-UoJArYWU,21146
165
168
  lionagi/protocols/messages/manager.py,sha256=e1jW5JH_3jZpZbFCvWZX0TG0DCgzANRUejW_6NqbtDc,17182
166
- lionagi/protocols/messages/message.py,sha256=GJLDgluTc_dBikTjGM3Im73kQQaCGsvSoJcaxAJwtFo,7723
169
+ lionagi/protocols/messages/message.py,sha256=RPP-zLs1Ly_-bBua9FIzSnDyyK9s4X0_WaQVyZJqToM,7757
167
170
  lionagi/protocols/messages/system.py,sha256=x0F1C57SFHaO2-Z9cy1QshYlxv8wjl7VppooaGKbMIg,4658
168
171
  lionagi/protocols/messages/templates/README.md,sha256=Ch4JrKSjd85fLitAYO1OhZjNOGKHoEwaKQlcV16jiUI,1286
169
172
  lionagi/protocols/messages/templates/action_request.jinja2,sha256=d6OmxHKyvvNDSK4bnBM3TGSUk_HeE_Q2EtLAQ0ZBEJg,120
@@ -181,7 +184,7 @@ lionagi/service/manager.py,sha256=tN3p0kM7pg_CEs6wXK62_B_h49Q3nrU-9qniFhw2ABE,11
181
184
  lionagi/service/rate_limited_processor.py,sha256=JhkuzJMHUCdndkRbAUf9wUQI9zOw-dutRy_nHf8EE5I,6101
182
185
  lionagi/service/resilience.py,sha256=uYJYZQ9M-tje8ME3vJmYabXwKHF1c3Ij4-WrdCwogcs,18742
183
186
  lionagi/service/token_calculator.py,sha256=piTidArzUkIMCtOLC_HBLoZNYZcENQywgeKM31bxezM,6457
184
- lionagi/service/types.py,sha256=6zavqBxK1Fj0nB9eZgJn3JICxmdT-n0nn8YWZFzM5LU,508
187
+ lionagi/service/types.py,sha256=zZQL9tTTuqAPbUTi2U4wl5tKBNWl51qbPKwDVGhTeqs,546
185
188
  lionagi/service/connections/__init__.py,sha256=yHQZ7OJpCftd6CStYR8inbxjJydYdmv9kCvbUBhJ2zU,362
186
189
  lionagi/service/connections/api_calling.py,sha256=XetCrjMhOHNKGGv-NzHhBhVS7XjKPalrS_iExzU-4S4,8005
187
190
  lionagi/service/connections/endpoint.py,sha256=yNIjq9wETMnytynGbq3qY_dkyaMlaHrcfiZjS-tnmLg,14756
@@ -197,8 +200,8 @@ lionagi/service/connections/providers/oai_.py,sha256=FmQMEmOY7H7dZd4og-_cdd1Unzy
197
200
  lionagi/service/connections/providers/ollama_.py,sha256=jdx6dGeChwVk5TFfFRbpnrpKzj8YQZw6D5iWJ6zYmfk,4096
198
201
  lionagi/service/connections/providers/perplexity_.py,sha256=9MH9YmMy9Jg7JDMJHQxxMYHyjJ4NP0OlN7sCuhla85I,917
199
202
  lionagi/service/connections/providers/_claude_code/__init__.py,sha256=3lzOakDoBWmMaNnT2g-YwktPKa_Wme4lnPRSmOQfayY,105
200
- lionagi/service/connections/providers/_claude_code/models.py,sha256=NfKvD9ccjSFHn0iqcI5KnNbMLbqw1dnXqHn2a5y9vds,8032
201
- lionagi/service/connections/providers/_claude_code/stream_cli.py,sha256=lNXln8_o-vRAgZMPGF0j_7j-GS6mDA3CJsdkCiHYSmM,12265
203
+ lionagi/service/connections/providers/_claude_code/models.py,sha256=vMY2QoGpW2_hv_49IZiFzqiite8gCPKkkYzN6QqWPFQ,7995
204
+ lionagi/service/connections/providers/_claude_code/stream_cli.py,sha256=0brD9mWRXPIiRSmha5n77JudW5tmhLNZmsjGgUWM060,12388
202
205
  lionagi/service/third_party/README.md,sha256=qFjWnI8rmLivIyr6Tc-hRZh-rQwntROp76af4MBNJJc,2214
203
206
  lionagi/service/third_party/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
204
207
  lionagi/service/third_party/anthropic_models.py,sha256=oqSPSlcayYG-fS5BLiLeTtkrpaxgkPhEK_YgneumrOo,4004
@@ -215,7 +218,7 @@ lionagi/tools/types.py,sha256=XtJLY0m-Yi_ZLWhm0KycayvqMCZd--HxfQ0x9vFUYDE,230
215
218
  lionagi/tools/file/__init__.py,sha256=5y5joOZzfFWERl75auAcNcKC3lImVJ5ZZGvvHZUFCJM,112
216
219
  lionagi/tools/file/reader.py,sha256=0TdnfVGVCKuM58MmGM-NyVjhU9BFoitkNYEepdc0z_Y,9529
217
220
  lionagi/tools/memory/tools.py,sha256=zTGBenVsF8Wuh303kWntmQSGlAFKonHNdh5ePuQ26KE,15948
218
- lionagi-0.14.6.dist-info/METADATA,sha256=uUjYz80ekrDdAq2blmqNu-K2AR0geC4oykPbMC61cbw,21236
219
- lionagi-0.14.6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
220
- lionagi-0.14.6.dist-info/licenses/LICENSE,sha256=VXFWsdoN5AAknBCgFqQNgPWYx7OPp-PFEP961zGdOjc,11288
221
- lionagi-0.14.6.dist-info/RECORD,,
221
+ lionagi-0.14.7.dist-info/METADATA,sha256=LIGnpV3vzJiX-2RNPyjWuuNBm1u7ww0kZtjMsWN2Mgs,20803
222
+ lionagi-0.14.7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
223
+ lionagi-0.14.7.dist-info/licenses/LICENSE,sha256=VXFWsdoN5AAknBCgFqQNgPWYx7OPp-PFEP961zGdOjc,11288
224
+ lionagi-0.14.7.dist-info/RECORD,,