lionagi 0.0.305__py3-none-any.whl → 0.0.307__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 +2 -5
- lionagi/core/__init__.py +7 -4
- lionagi/core/agent/__init__.py +3 -0
- lionagi/core/agent/base_agent.py +46 -0
- lionagi/core/branch/__init__.py +4 -0
- lionagi/core/branch/base/__init__.py +0 -0
- lionagi/core/branch/base_branch.py +100 -78
- lionagi/core/branch/branch.py +22 -34
- lionagi/core/branch/branch_flow_mixin.py +3 -7
- lionagi/core/branch/executable_branch.py +192 -0
- lionagi/core/branch/util.py +77 -162
- lionagi/core/direct/__init__.py +13 -0
- lionagi/core/direct/parallel_predict.py +127 -0
- lionagi/core/direct/parallel_react.py +0 -0
- lionagi/core/direct/parallel_score.py +0 -0
- lionagi/core/direct/parallel_select.py +0 -0
- lionagi/core/direct/parallel_sentiment.py +0 -0
- lionagi/core/direct/predict.py +174 -0
- lionagi/core/direct/react.py +33 -0
- lionagi/core/direct/score.py +163 -0
- lionagi/core/direct/select.py +144 -0
- lionagi/core/direct/sentiment.py +51 -0
- lionagi/core/direct/utils.py +83 -0
- lionagi/core/flow/__init__.py +0 -3
- lionagi/core/flow/monoflow/{mono_react.py → ReAct.py} +52 -9
- lionagi/core/flow/monoflow/__init__.py +9 -0
- lionagi/core/flow/monoflow/{mono_chat.py → chat.py} +11 -11
- lionagi/core/flow/monoflow/{mono_chat_mixin.py → chat_mixin.py} +33 -27
- lionagi/core/flow/monoflow/{mono_followup.py → followup.py} +7 -6
- lionagi/core/flow/polyflow/__init__.py +1 -0
- lionagi/core/flow/polyflow/{polychat.py → chat.py} +15 -3
- lionagi/core/mail/__init__.py +8 -0
- lionagi/core/mail/mail_manager.py +88 -40
- lionagi/core/mail/schema.py +32 -6
- lionagi/core/messages/__init__.py +3 -0
- lionagi/core/messages/schema.py +56 -25
- lionagi/core/prompt/__init__.py +0 -0
- lionagi/core/prompt/prompt_template.py +0 -0
- lionagi/core/schema/__init__.py +7 -5
- lionagi/core/schema/action_node.py +29 -0
- lionagi/core/schema/base_mixin.py +56 -59
- lionagi/core/schema/base_node.py +35 -38
- lionagi/core/schema/condition.py +24 -0
- lionagi/core/schema/data_logger.py +98 -98
- lionagi/core/schema/data_node.py +19 -19
- lionagi/core/schema/prompt_template.py +0 -0
- lionagi/core/schema/structure.py +293 -190
- lionagi/core/session/__init__.py +1 -3
- lionagi/core/session/session.py +196 -214
- lionagi/core/tool/tool_manager.py +95 -103
- lionagi/integrations/__init__.py +1 -3
- lionagi/integrations/bridge/langchain_/documents.py +17 -18
- lionagi/integrations/bridge/langchain_/langchain_bridge.py +14 -14
- lionagi/integrations/bridge/llamaindex_/llama_index_bridge.py +22 -22
- lionagi/integrations/bridge/llamaindex_/node_parser.py +12 -12
- lionagi/integrations/bridge/llamaindex_/reader.py +11 -11
- lionagi/integrations/bridge/llamaindex_/textnode.py +7 -7
- lionagi/integrations/config/openrouter_configs.py +0 -1
- lionagi/integrations/provider/oai.py +26 -26
- lionagi/integrations/provider/services.py +38 -38
- lionagi/libs/__init__.py +34 -1
- lionagi/libs/ln_api.py +211 -221
- lionagi/libs/ln_async.py +53 -60
- lionagi/libs/ln_convert.py +118 -120
- lionagi/libs/ln_dataframe.py +32 -33
- lionagi/libs/ln_func_call.py +334 -342
- lionagi/libs/ln_nested.py +99 -107
- lionagi/libs/ln_parse.py +175 -158
- lionagi/libs/sys_util.py +52 -52
- lionagi/tests/test_core/test_base_branch.py +427 -427
- lionagi/tests/test_core/test_branch.py +292 -292
- lionagi/tests/test_core/test_mail_manager.py +57 -57
- lionagi/tests/test_core/test_session.py +254 -266
- lionagi/tests/test_core/test_session_base_util.py +299 -300
- lionagi/tests/test_core/test_tool_manager.py +70 -74
- lionagi/tests/test_libs/test_nested.py +2 -7
- lionagi/tests/test_libs/test_parse.py +2 -2
- lionagi/version.py +1 -1
- {lionagi-0.0.305.dist-info → lionagi-0.0.307.dist-info}/METADATA +4 -2
- lionagi-0.0.307.dist-info/RECORD +115 -0
- lionagi-0.0.305.dist-info/RECORD +0 -94
- {lionagi-0.0.305.dist-info → lionagi-0.0.307.dist-info}/LICENSE +0 -0
- {lionagi-0.0.305.dist-info → lionagi-0.0.307.dist-info}/WHEEL +0 -0
- {lionagi-0.0.305.dist-info → lionagi-0.0.307.dist-info}/top_level.txt +0 -0
lionagi/core/messages/schema.py
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
from enum import Enum
|
2
2
|
|
3
|
-
from lionagi.libs import
|
4
|
-
from
|
3
|
+
from lionagi.libs import nested, convert
|
4
|
+
from ..schema import DataNode
|
5
5
|
|
6
|
-
|
6
|
+
_message_fields = ["node_id", "timestamp", "role", "sender", "recipient", "content"]
|
7
7
|
|
8
|
-
_message_fields = ["node_id", "timestamp", "role", "sender", "content"]
|
9
8
|
|
10
9
|
# ToDo: actually implement the new message classes
|
11
10
|
|
@@ -99,13 +98,14 @@ class BaseMessage(DataNode):
|
|
99
98
|
Represents a message in a chatbot-like system, inheriting from BaseNode.
|
100
99
|
|
101
100
|
Attributes:
|
102
|
-
|
103
|
-
|
104
|
-
|
101
|
+
role (str | None): The role of the entity sending the message, e.g., 'user', 'system'.
|
102
|
+
sender (str | None): The identifier of the sender of the message.
|
103
|
+
content (Any): The actual content of the message.
|
105
104
|
"""
|
106
105
|
|
107
106
|
role: str | None = None
|
108
107
|
sender: str | None = None
|
108
|
+
recipient: str | None = None
|
109
109
|
|
110
110
|
@property
|
111
111
|
def msg(self) -> dict:
|
@@ -113,7 +113,7 @@ class BaseMessage(DataNode):
|
|
113
113
|
Constructs and returns a dictionary representation of the message.
|
114
114
|
|
115
115
|
Returns:
|
116
|
-
|
116
|
+
A dictionary representation of the message with 'role' and 'content' keys.
|
117
117
|
"""
|
118
118
|
return self._to_message()
|
119
119
|
|
@@ -123,7 +123,7 @@ class BaseMessage(DataNode):
|
|
123
123
|
Gets the 'content' field of the message.
|
124
124
|
|
125
125
|
Returns:
|
126
|
-
|
126
|
+
The 'content' part of the message.
|
127
127
|
"""
|
128
128
|
return self.msg["content"]
|
129
129
|
|
@@ -132,14 +132,13 @@ class BaseMessage(DataNode):
|
|
132
132
|
Constructs and returns a dictionary representation of the message.
|
133
133
|
|
134
134
|
Returns:
|
135
|
-
|
135
|
+
dict: A dictionary representation of the message with 'role' and 'content' keys.
|
136
136
|
"""
|
137
|
-
|
138
|
-
return out
|
137
|
+
return {"role": self.role, "content": convert.to_str(self.content)}
|
139
138
|
|
140
139
|
def __str__(self):
|
141
140
|
content_preview = (
|
142
|
-
|
141
|
+
f"{str(self.content)[:75]}..."
|
143
142
|
if self.content and len(self.content) > 75
|
144
143
|
else str(self.content)
|
145
144
|
)
|
@@ -160,9 +159,13 @@ class Instruction(BaseMessage):
|
|
160
159
|
context=None,
|
161
160
|
sender: str | None = None,
|
162
161
|
output_fields=None,
|
163
|
-
|
162
|
+
recipient=None,
|
163
|
+
): # sourcery skip: avoid-builtin-shadow
|
164
164
|
super().__init__(
|
165
|
-
role="user",
|
165
|
+
role="user",
|
166
|
+
sender=sender or "user",
|
167
|
+
content={"instruction": instruction},
|
168
|
+
recipient=recipient or "assistant",
|
166
169
|
)
|
167
170
|
if context:
|
168
171
|
self.content.update({"context": context})
|
@@ -176,6 +179,10 @@ class Instruction(BaseMessage):
|
|
176
179
|
"""
|
177
180
|
self.content.update({"response_format": format})
|
178
181
|
|
182
|
+
@property
|
183
|
+
def instruct(self):
|
184
|
+
return self.content["instruction"]
|
185
|
+
|
179
186
|
|
180
187
|
class System(BaseMessage):
|
181
188
|
"""
|
@@ -184,11 +191,20 @@ class System(BaseMessage):
|
|
184
191
|
Designed for messages containing system information, this class sets the message role to 'system'.
|
185
192
|
"""
|
186
193
|
|
187
|
-
def __init__(
|
194
|
+
def __init__(
|
195
|
+
self, system: dict | list | str, sender: str | None = None, recipient=None
|
196
|
+
):
|
188
197
|
super().__init__(
|
189
|
-
role="system",
|
198
|
+
role="system",
|
199
|
+
sender=sender or "system",
|
200
|
+
content={"system_info": system},
|
201
|
+
recipient=recipient or "assistant",
|
190
202
|
)
|
191
203
|
|
204
|
+
@property
|
205
|
+
def system_info(self):
|
206
|
+
return self.content["system_info"]
|
207
|
+
|
192
208
|
|
193
209
|
class Response(BaseMessage):
|
194
210
|
"""
|
@@ -199,7 +215,9 @@ class Response(BaseMessage):
|
|
199
215
|
|
200
216
|
"""
|
201
217
|
|
202
|
-
def __init__(
|
218
|
+
def __init__(
|
219
|
+
self, response: dict | list | str, sender: str | None = None, recipient=None
|
220
|
+
) -> None:
|
203
221
|
content_key = ""
|
204
222
|
try:
|
205
223
|
response = response["message"]
|
@@ -207,6 +225,7 @@ class Response(BaseMessage):
|
|
207
225
|
content_ = self._handle_action_request(response)
|
208
226
|
sender = sender or "action_request"
|
209
227
|
content_key = content_key or "action_request"
|
228
|
+
recipient = recipient or "action"
|
210
229
|
|
211
230
|
else:
|
212
231
|
try:
|
@@ -214,32 +233,44 @@ class Response(BaseMessage):
|
|
214
233
|
content_ = convert.to_dict(response["content"])["tool_uses"]
|
215
234
|
content_key = content_key or "action_request"
|
216
235
|
sender = sender or "action_request"
|
236
|
+
recipient = recipient or "action"
|
237
|
+
|
217
238
|
elif "response" in convert.to_dict(response["content"]):
|
218
239
|
sender = sender or "assistant"
|
219
240
|
content_key = content_key or "response"
|
220
241
|
content_ = convert.to_dict(response["content"])["response"]
|
242
|
+
recipient = recipient or "user"
|
243
|
+
|
221
244
|
elif "action_request" in convert.to_dict(response["content"]):
|
222
245
|
sender = sender or "action_request"
|
223
246
|
content_key = content_key or "action_request"
|
224
247
|
content_ = convert.to_dict(response["content"])[
|
225
248
|
"action_request"
|
226
249
|
]
|
250
|
+
recipient = recipient or "action"
|
251
|
+
|
227
252
|
else:
|
228
253
|
content_ = response["content"]
|
229
254
|
content_key = content_key or "response"
|
230
255
|
sender = sender or "assistant"
|
231
|
-
|
256
|
+
recipient = recipient or "user"
|
257
|
+
except Exception:
|
232
258
|
content_ = response["content"]
|
233
259
|
content_key = content_key or "response"
|
234
260
|
sender = sender or "assistant"
|
261
|
+
recipient = recipient or "user"
|
235
262
|
|
236
|
-
except:
|
263
|
+
except Exception:
|
237
264
|
sender = sender or "action_response"
|
238
265
|
content_ = response
|
239
266
|
content_key = content_key or "action_response"
|
267
|
+
recipient = recipient or "assistant"
|
240
268
|
|
241
269
|
super().__init__(
|
242
|
-
role="assistant",
|
270
|
+
role="assistant",
|
271
|
+
sender=sender,
|
272
|
+
content={content_key: content_},
|
273
|
+
recipient=recipient,
|
243
274
|
)
|
244
275
|
|
245
276
|
@staticmethod
|
@@ -248,13 +279,13 @@ class Response(BaseMessage):
|
|
248
279
|
Processes an action request response and extracts relevant information.
|
249
280
|
|
250
281
|
Args:
|
251
|
-
|
282
|
+
response (dict): The response dictionary containing tool calls and other information.
|
252
283
|
|
253
284
|
Returns:
|
254
|
-
|
285
|
+
list: A list of dictionaries, each representing a function call with action and arguments.
|
255
286
|
|
256
287
|
Raises:
|
257
|
-
|
288
|
+
ValueError: If the response does not conform to the expected format for action requests.
|
258
289
|
"""
|
259
290
|
try:
|
260
291
|
tool_count = 0
|
@@ -267,7 +298,7 @@ class Response(BaseMessage):
|
|
267
298
|
_path2 = ["tool_calls", tool_count, "function", "arguments"]
|
268
299
|
|
269
300
|
func_content = {
|
270
|
-
"action":
|
301
|
+
"action": f"action_{nested.nget(response, _path1)}",
|
271
302
|
"arguments": nested.nget(response, _path2),
|
272
303
|
}
|
273
304
|
func_list.append(func_content)
|
File without changes
|
File without changes
|
lionagi/core/schema/__init__.py
CHANGED
@@ -1,17 +1,19 @@
|
|
1
|
-
from .base_node import BaseNode, BaseRelatableNode, Tool
|
2
|
-
from .data_logger import DataLogger, DLog
|
1
|
+
from .base_node import BaseNode, BaseRelatableNode, Tool, TOOL_TYPE
|
3
2
|
from .data_node import DataNode
|
3
|
+
from .data_logger import DLog, DataLogger
|
4
4
|
from .structure import Relationship, Graph, Structure
|
5
|
-
|
5
|
+
from .action_node import ActionNode
|
6
6
|
|
7
7
|
__all__ = [
|
8
|
-
"DLog",
|
9
8
|
"BaseNode",
|
10
9
|
"BaseRelatableNode",
|
11
10
|
"Tool",
|
12
|
-
"DataLogger",
|
13
11
|
"DataNode",
|
12
|
+
"DLog",
|
13
|
+
"DataLogger",
|
14
14
|
"Relationship",
|
15
15
|
"Graph",
|
16
16
|
"Structure",
|
17
|
+
"ActionNode",
|
18
|
+
"TOOL_TYPE",
|
17
19
|
]
|
@@ -0,0 +1,29 @@
|
|
1
|
+
from enum import Enum
|
2
|
+
|
3
|
+
from .base_node import BaseNode
|
4
|
+
|
5
|
+
|
6
|
+
class ActionSelection(BaseNode):
|
7
|
+
|
8
|
+
def __init__(self, action: str = "chat", action_kwargs=None):
|
9
|
+
if action_kwargs is None:
|
10
|
+
action_kwargs = {}
|
11
|
+
super().__init__()
|
12
|
+
self.action = action
|
13
|
+
self.action_kwargs = action_kwargs
|
14
|
+
|
15
|
+
|
16
|
+
class ActionNode(BaseNode):
|
17
|
+
|
18
|
+
def __init__(
|
19
|
+
self, instruction, action: str = "chat", tools=None, action_kwargs=None
|
20
|
+
):
|
21
|
+
if tools is None:
|
22
|
+
tools = []
|
23
|
+
if action_kwargs is None:
|
24
|
+
action_kwargs = {}
|
25
|
+
super().__init__()
|
26
|
+
self.instruction = instruction
|
27
|
+
self.action = action
|
28
|
+
self.tools = tools
|
29
|
+
self.action_kwargs = action_kwargs
|
@@ -5,10 +5,7 @@ from typing import Any, TypeVar, Type, Callable
|
|
5
5
|
import pandas as pd
|
6
6
|
from pydantic import BaseModel, ValidationError
|
7
7
|
|
8
|
-
|
9
|
-
import lionagi.libs.ln_convert as convert
|
10
|
-
from lionagi.libs.ln_parse import ParseUtil
|
11
|
-
from lionagi.libs.sys_util import SysUtil
|
8
|
+
from lionagi.libs import nested, convert, ParseUtil, SysUtil
|
12
9
|
|
13
10
|
T = TypeVar("T") # Generic type for return type of from_obj method
|
14
11
|
|
@@ -24,12 +21,12 @@ class BaseToObjectMixin(ABC, BaseModel):
|
|
24
21
|
string. It supports passing arbitrary arguments to the underlying `model_dump_json` method.
|
25
22
|
|
26
23
|
Args:
|
27
|
-
|
28
|
-
|
29
|
-
|
24
|
+
*args: Variable-length argument list to be passed to `model_dump_json`.
|
25
|
+
**kwargs: Arbitrary keyword arguments, with `by_alias=True` set by default to use
|
26
|
+
model field aliases in the output JSON, if any.
|
30
27
|
|
31
28
|
Returns:
|
32
|
-
|
29
|
+
str: A JSON string representation of the model instance.
|
33
30
|
"""
|
34
31
|
return self.model_dump_json(*args, by_alias=True, **kwargs)
|
35
32
|
|
@@ -42,12 +39,12 @@ class BaseToObjectMixin(ABC, BaseModel):
|
|
42
39
|
aliases instead of the original field names.
|
43
40
|
|
44
41
|
Args:
|
45
|
-
|
46
|
-
|
47
|
-
|
42
|
+
*args: Variable-length argument list for the `model_dump` method.
|
43
|
+
**kwargs: Arbitrary keyword arguments. By default, `by_alias=True` is applied, indicating
|
44
|
+
that field aliases should be used as keys in the resulting dictionary.
|
48
45
|
|
49
46
|
Returns:
|
50
|
-
|
47
|
+
dict[str, Any]: The dictionary representation of the model instance.
|
51
48
|
"""
|
52
49
|
return self.model_dump(*args, by_alias=True, **kwargs)
|
53
50
|
|
@@ -60,7 +57,7 @@ class BaseToObjectMixin(ABC, BaseModel):
|
|
60
57
|
The root element of the XML tree is named after the class of the model instance.
|
61
58
|
|
62
59
|
Returns:
|
63
|
-
|
60
|
+
str: An XML string representation of the model instance.
|
64
61
|
"""
|
65
62
|
|
66
63
|
import xml.etree.ElementTree as ET
|
@@ -88,15 +85,15 @@ class BaseToObjectMixin(ABC, BaseModel):
|
|
88
85
|
customize the Series creation through `pd_kwargs`.
|
89
86
|
|
90
87
|
Args:
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
88
|
+
*args: Variable-length argument list for the `to_dict` method.
|
89
|
+
pd_kwargs (dict | None): Optional dictionary of keyword arguments to pass to the pandas
|
90
|
+
Series constructor. Defaults to None, in which case an empty
|
91
|
+
dictionary is used.
|
92
|
+
**kwargs: Arbitrary keyword arguments for the `to_dict` method, influencing the dictionary
|
93
|
+
representation used for Series creation.
|
97
94
|
|
98
95
|
Returns:
|
99
|
-
|
96
|
+
pd.Series: A pandas Series representation of the model instance.
|
100
97
|
"""
|
101
98
|
pd_kwargs = {} if pd_kwargs is None else pd_kwargs
|
102
99
|
dict_ = self.to_dict(*args, **kwargs)
|
@@ -118,15 +115,11 @@ class BaseFromObjectMixin(ABC, BaseModel):
|
|
118
115
|
@from_obj.register(str)
|
119
116
|
@classmethod
|
120
117
|
def _from_str(cls, obj: str, *args, fuzzy_parse=False, **kwargs) -> T:
|
121
|
-
if fuzzy_parse
|
122
|
-
obj = ParseUtil.fuzzy_parse_json(obj)
|
123
|
-
else:
|
124
|
-
obj = convert.to_dict(obj)
|
125
|
-
|
118
|
+
obj = ParseUtil.fuzzy_parse_json(obj) if fuzzy_parse else convert.to_dict(obj)
|
126
119
|
try:
|
127
120
|
return cls.from_obj(obj, *args, **kwargs)
|
128
121
|
except ValidationError as e:
|
129
|
-
raise ValueError(f"Invalid JSON for deserialization: {e}")
|
122
|
+
raise ValueError(f"Invalid JSON for deserialization: {e}") from e
|
130
123
|
|
131
124
|
@from_obj.register(list)
|
132
125
|
@classmethod
|
@@ -135,23 +128,27 @@ class BaseFromObjectMixin(ABC, BaseModel):
|
|
135
128
|
|
136
129
|
@from_obj.register(pd.Series)
|
137
130
|
@classmethod
|
138
|
-
def _from_pd_series(cls, obj: pd.Series, *args, pd_kwargs=
|
131
|
+
def _from_pd_series(cls, obj: pd.Series, *args, pd_kwargs=None, **kwargs) -> T:
|
132
|
+
if pd_kwargs is None:
|
133
|
+
pd_kwargs = {}
|
139
134
|
return cls.from_obj(obj.to_dict(**pd_kwargs), *args, **kwargs)
|
140
135
|
|
141
136
|
@from_obj.register(pd.DataFrame)
|
142
137
|
@classmethod
|
143
138
|
def _from_pd_dataframe(
|
144
|
-
cls, obj: pd.DataFrame, *args, pd_kwargs=
|
139
|
+
cls, obj: pd.DataFrame, *args, pd_kwargs=None, **kwargs
|
145
140
|
) -> list[T]:
|
141
|
+
if pd_kwargs is None:
|
142
|
+
pd_kwargs = {}
|
146
143
|
return [
|
147
144
|
cls.from_obj(row, *args, **pd_kwargs, **kwargs) for _, row in obj.iterrows()
|
148
145
|
]
|
149
146
|
|
150
147
|
@from_obj.register(BaseModel)
|
151
148
|
@classmethod
|
152
|
-
def _from_base_model(
|
153
|
-
|
154
|
-
|
149
|
+
def _from_base_model(cls, obj: BaseModel, pydantic_kwargs=None, **kwargs) -> T:
|
150
|
+
if pydantic_kwargs is None:
|
151
|
+
pydantic_kwargs = {"by_alias": True}
|
155
152
|
config_ = {**obj.model_dump(**pydantic_kwargs), **kwargs}
|
156
153
|
return cls.from_obj(**config_)
|
157
154
|
|
@@ -163,11 +160,11 @@ class BaseMetaManageMixin(ABC, BaseModel):
|
|
163
160
|
Retrieves a list of metadata keys.
|
164
161
|
|
165
162
|
Args:
|
166
|
-
|
167
|
-
|
163
|
+
flattened (bool): If True, returns keys from a flattened metadata structure.
|
164
|
+
**kwargs: Additional keyword arguments passed to the flattening function.
|
168
165
|
|
169
166
|
Returns:
|
170
|
-
|
167
|
+
list[str]: List of metadata keys.
|
171
168
|
"""
|
172
169
|
if flattened:
|
173
170
|
return nested.get_flattened_keys(self.metadata, **kwargs)
|
@@ -178,12 +175,12 @@ class BaseMetaManageMixin(ABC, BaseModel):
|
|
178
175
|
Checks if a specified key exists in the metadata.
|
179
176
|
|
180
177
|
Args:
|
181
|
-
|
182
|
-
|
183
|
-
|
178
|
+
key (str): The key to check.
|
179
|
+
flattened (bool): If True, checks within a flattened metadata structure.
|
180
|
+
**kwargs: Additional keyword arguments for flattening.
|
184
181
|
|
185
182
|
Returns:
|
186
|
-
|
183
|
+
bool: True if key exists, False otherwise.
|
187
184
|
"""
|
188
185
|
if flattened:
|
189
186
|
return key in nested.get_flattened_keys(self.metadata, **kwargs)
|
@@ -196,12 +193,12 @@ class BaseMetaManageMixin(ABC, BaseModel):
|
|
196
193
|
Retrieves the value associated with a given key from the metadata.
|
197
194
|
|
198
195
|
Args:
|
199
|
-
|
200
|
-
|
201
|
-
|
196
|
+
key (str): The key for the desired value.
|
197
|
+
indices: Optional indices for nested retrieval.
|
198
|
+
default (Any): The default value to return if the key is not found.
|
202
199
|
|
203
200
|
Returns:
|
204
|
-
|
201
|
+
Any: The value associated with the key or the default value.
|
205
202
|
"""
|
206
203
|
if indices:
|
207
204
|
return nested.nget(self.metadata, key, indices, default)
|
@@ -212,11 +209,11 @@ class BaseMetaManageMixin(ABC, BaseModel):
|
|
212
209
|
Renames a key in the metadata.
|
213
210
|
|
214
211
|
Args:
|
215
|
-
|
216
|
-
|
212
|
+
old_key (str): The current key name.
|
213
|
+
new_key (str): The new key name.
|
217
214
|
|
218
215
|
Returns:
|
219
|
-
|
216
|
+
bool: True if the key was changed, False otherwise.
|
220
217
|
"""
|
221
218
|
if old_key in self.metadata:
|
222
219
|
SysUtil.change_dict_key(self.metadata, old_key, new_key)
|
@@ -228,12 +225,12 @@ class BaseMetaManageMixin(ABC, BaseModel):
|
|
228
225
|
Inserts a value into the metadata at specified indices.
|
229
226
|
|
230
227
|
Args:
|
231
|
-
|
232
|
-
|
233
|
-
|
228
|
+
indices (str | list): The indices where the value should be inserted.
|
229
|
+
value (Any): The value to insert.
|
230
|
+
**kwargs: Additional keyword arguments.
|
234
231
|
|
235
232
|
Returns:
|
236
|
-
|
233
|
+
bool: True if the insertion was successful, False otherwise.
|
237
234
|
"""
|
238
235
|
return nested.ninsert(self.metadata, indices, value, **kwargs)
|
239
236
|
|
@@ -243,11 +240,11 @@ class BaseMetaManageMixin(ABC, BaseModel):
|
|
243
240
|
Removes a key from the metadata and returns its value.
|
244
241
|
|
245
242
|
Args:
|
246
|
-
|
247
|
-
|
243
|
+
key (str): The key to remove.
|
244
|
+
default (Any): The default value to return if the key is not found.
|
248
245
|
|
249
246
|
Returns:
|
250
|
-
|
247
|
+
Any: The value of the removed key or the default value.
|
251
248
|
"""
|
252
249
|
return self.metadata.pop(key, default)
|
253
250
|
|
@@ -258,12 +255,12 @@ class BaseMetaManageMixin(ABC, BaseModel):
|
|
258
255
|
Merges additional metadata into the existing metadata.
|
259
256
|
|
260
257
|
Args:
|
261
|
-
|
262
|
-
|
263
|
-
|
258
|
+
additional_metadata (dict[str, Any]): The metadata to merge in.
|
259
|
+
overwrite (bool): If True, existing keys will be overwritten by those in additional_metadata.
|
260
|
+
**kwargs: Additional keyword arguments for the merge.
|
264
261
|
|
265
262
|
Returns:
|
266
|
-
|
263
|
+
None
|
267
264
|
"""
|
268
265
|
nested.nmerge(
|
269
266
|
[self.metadata, additional_metadata], overwrite=overwrite, **kwargs
|
@@ -278,7 +275,7 @@ class BaseMetaManageMixin(ABC, BaseModel):
|
|
278
275
|
Clears all metadata.
|
279
276
|
|
280
277
|
Returns:
|
281
|
-
|
278
|
+
None
|
282
279
|
"""
|
283
280
|
self.metadata.clear()
|
284
281
|
|
@@ -287,10 +284,10 @@ class BaseMetaManageMixin(ABC, BaseModel):
|
|
287
284
|
Filters the metadata based on a condition.
|
288
285
|
|
289
286
|
Args:
|
290
|
-
|
287
|
+
condition (Callable[[Any, Any], bool]): The condition function to apply.
|
291
288
|
|
292
289
|
Returns:
|
293
|
-
|
290
|
+
dict[str, Any]: The filtered metadata.
|
294
291
|
"""
|
295
292
|
return nested.nfilter(self.metadata, condition)
|
296
293
|
|