lionagi 0.0.201__py3-none-any.whl → 0.0.204__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/_services/anthropic.py +79 -1
- lionagi/_services/base_service.py +1 -1
- lionagi/_services/services.py +61 -25
- lionagi/_services/transformers.py +46 -0
- lionagi/agents/__init__.py +0 -0
- lionagi/configs/oai_configs.py +1 -1
- lionagi/configs/openrouter_configs.py +1 -1
- lionagi/core/__init__.py +3 -7
- lionagi/core/branch/__init__.py +0 -0
- lionagi/core/branch/branch.py +589 -0
- lionagi/core/branch/branch_manager.py +139 -0
- lionagi/core/branch/cluster.py +1 -0
- lionagi/core/branch/conversation.py +484 -0
- lionagi/core/core_util.py +59 -0
- lionagi/core/flow/__init__.py +0 -0
- lionagi/core/flow/flow.py +19 -0
- lionagi/core/instruction_set/__init__.py +0 -0
- lionagi/core/instruction_set/instruction_set.py +343 -0
- lionagi/core/messages/__init__.py +0 -0
- lionagi/core/messages/messages.py +176 -0
- lionagi/core/sessions/__init__.py +0 -0
- lionagi/core/sessions/session.py +428 -0
- lionagi/models/__init__.py +0 -0
- lionagi/models/base_model.py +0 -0
- lionagi/models/imodel.py +53 -0
- lionagi/schema/data_logger.py +75 -155
- lionagi/tests/test_utils/test_call_util.py +658 -657
- lionagi/tools/tool_manager.py +121 -188
- lionagi/utils/__init__.py +5 -10
- lionagi/utils/call_util.py +667 -585
- lionagi/utils/io_util.py +3 -0
- lionagi/utils/nested_util.py +17 -211
- lionagi/utils/pd_util.py +57 -0
- lionagi/utils/sys_util.py +220 -184
- lionagi/utils/url_util.py +55 -0
- lionagi/version.py +1 -1
- {lionagi-0.0.201.dist-info → lionagi-0.0.204.dist-info}/METADATA +12 -8
- {lionagi-0.0.201.dist-info → lionagi-0.0.204.dist-info}/RECORD +47 -32
- lionagi/core/branch.py +0 -193
- lionagi/core/conversation.py +0 -341
- lionagi/core/flow.py +0 -8
- lionagi/core/instruction_set.py +0 -150
- lionagi/core/messages.py +0 -243
- lionagi/core/sessions.py +0 -474
- /lionagi/{tools → agents}/planner.py +0 -0
- /lionagi/{tools → agents}/prompter.py +0 -0
- /lionagi/{tools → agents}/scorer.py +0 -0
- /lionagi/{tools → agents}/summarizer.py +0 -0
- /lionagi/{tools → agents}/validator.py +0 -0
- /lionagi/core/{flow_util.py → flow/flow_util.py} +0 -0
- {lionagi-0.0.201.dist-info → lionagi-0.0.204.dist-info}/LICENSE +0 -0
- {lionagi-0.0.201.dist-info → lionagi-0.0.204.dist-info}/WHEEL +0 -0
- {lionagi-0.0.201.dist-info → lionagi-0.0.204.dist-info}/top_level.txt +0 -0
lionagi/schema/data_logger.py
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
from collections import deque
|
2
|
-
from typing import
|
3
|
-
from ..utils import create_path,
|
2
|
+
from typing import Dict, Any
|
3
|
+
from ..utils.sys_util import get_timestamp, create_path, as_dict
|
4
|
+
from ..utils.io_util import IOUtil
|
4
5
|
|
5
6
|
|
6
7
|
class DataLogger:
|
@@ -38,49 +39,18 @@ class DataLogger:
|
|
38
39
|
self.dir = dir
|
39
40
|
self.log = deque(log) if log else deque()
|
40
41
|
|
41
|
-
def
|
42
|
+
def add_entry(self, entry: Dict[str, Any], level: str = "INFO") -> None:
|
42
43
|
"""
|
43
|
-
Adds a new entry to the log.
|
44
|
+
Adds a new entry to the log with a timestamp and a log level.
|
44
45
|
|
45
|
-
|
46
|
-
entry: The data entry to be added to the log.
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
# """
|
54
|
-
# Exports the logged data to a CSV file and optionally clears the log.
|
55
|
-
|
56
|
-
# Parameters:
|
57
|
-
# filename (str): The name of the CSV file.
|
58
|
-
|
59
|
-
# dir (Optional[str]): The directory to save the file. Defaults to the instance's dir attribute.
|
60
|
-
|
61
|
-
# verbose (bool): If True, prints a message upon completion. Defaults to True.
|
62
|
-
|
63
|
-
# timestamp (bool): If True, appends a timestamp to the filename. Defaults to True.
|
64
|
-
|
65
|
-
# dir_exist_ok (bool): If True, will not raise an error if the directory already exists. Defaults to True.
|
66
|
-
|
67
|
-
# file_exist_ok (bool): If True, overwrites the file if it exists. Defaults to False.
|
68
|
-
|
69
|
-
# Side Effects:
|
70
|
-
# Clears the log after saving the CSV file.
|
71
|
-
|
72
|
-
# Prints a message indicating the save location and number of logs saved if verbose is True.
|
73
|
-
# """
|
74
|
-
# dir = dir or self.dir
|
75
|
-
# filepath = create_path(
|
76
|
-
# dir=dir, filename=filename, timestamp=timestamp, dir_exist_ok=dir_exist_ok)
|
77
|
-
# # IOUtil.to_csv(list(self.log), filepath, file_exist_ok=file_exist_ok)
|
78
|
-
|
79
|
-
# n_logs = len(list(self.log))
|
80
|
-
# self.log = deque()
|
81
|
-
# if verbose:
|
82
|
-
# print(f"{n_logs} logs saved to {filepath}")
|
83
|
-
|
46
|
+
Args:
|
47
|
+
entry (Dict[str, Any]): The data entry to be added to the log.
|
48
|
+
level (str): The log level for the entry (e.g., "INFO", "ERROR"). Defaults to "INFO".
|
49
|
+
"""
|
50
|
+
self.log.append({
|
51
|
+
"timestamp": get_timestamp(), "level": level, **as_dict(entry)
|
52
|
+
})
|
53
|
+
|
84
54
|
def set_dir(self, dir: str) -> None:
|
85
55
|
"""
|
86
56
|
Sets the default directory for saving CSV files.
|
@@ -89,118 +59,68 @@ class DataLogger:
|
|
89
59
|
dir (str): The directory to be set as the default for saving files.
|
90
60
|
"""
|
91
61
|
self.dir = dir
|
62
|
+
|
63
|
+
def to_csv(
|
64
|
+
self, filename: str,
|
65
|
+
file_exist_ok: bool = False,
|
66
|
+
timestamp = True,
|
67
|
+
time_prefix: bool = False,
|
68
|
+
verbose: bool = True,
|
69
|
+
clear = True
|
70
|
+
) -> None:
|
71
|
+
"""
|
72
|
+
Exports the logged data to a CSV file, using the provided utilities for path creation and timestamping.
|
73
|
+
|
74
|
+
Args:
|
75
|
+
filename (str): The name of the CSV file.
|
76
|
+
file_exist_ok (bool): If True, creates the directory for the file if it does not exist. Defaults to False.
|
77
|
+
verbose (bool): If True, prints a message upon completion. Defaults to True.
|
78
|
+
time_prefix (bool): If True, adds the timestamp as a prefix to the filename. Defaults to False.
|
79
|
+
"""
|
80
|
+
if not filename.endswith('.csv'):
|
81
|
+
filename += '.csv'
|
82
|
+
|
83
|
+
filepath = create_path(
|
84
|
+
self.dir, filename, timestamp=timestamp,
|
85
|
+
dir_exist_ok=file_exist_ok, time_prefix=time_prefix
|
86
|
+
)
|
87
|
+
IOUtil.to_csv(list(self.log), filepath)
|
88
|
+
|
89
|
+
if verbose:
|
90
|
+
print(f"{len(self.log)} logs saved to {filepath}")
|
91
|
+
|
92
|
+
if clear:
|
93
|
+
self.log.clear()
|
94
|
+
|
95
|
+
def to_jsonl(
|
96
|
+
self, filename: str,
|
97
|
+
timestamp = False,
|
98
|
+
time_prefix=False,
|
99
|
+
file_exist_ok: bool = False,
|
100
|
+
verbose: bool = True,
|
101
|
+
clear = True
|
102
|
+
) -> None:
|
103
|
+
"""
|
104
|
+
Exports the logged data to a JSONL file and optionally clears the log.
|
105
|
+
|
106
|
+
Parameters:
|
107
|
+
filename (str): The name of the JSONL file.
|
108
|
+
file_exist_ok (bool): If True, creates the directory for the file if it does not exist. Defaults to False.
|
109
|
+
verbose (bool): If True, prints a message upon completion. Defaults to True.
|
110
|
+
"""
|
111
|
+
if not filename.endswith('.jsonl'):
|
112
|
+
filename += '.jsonl'
|
113
|
+
|
114
|
+
filepath = create_path(
|
115
|
+
self.dir, filename, timestamp=timestamp,
|
116
|
+
dir_exist_ok=file_exist_ok, time_prefix=time_prefix
|
117
|
+
)
|
92
118
|
|
119
|
+
for entry in self.log:
|
120
|
+
IOUtil.append_to_jsonl(entry, filepath)
|
93
121
|
|
122
|
+
if verbose:
|
123
|
+
print(f"{len(self.log)} logs saved to {filepath}")
|
94
124
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
# Attributes:
|
99
|
-
# dir (Optional[str]): The directory where log files will be saved.
|
100
|
-
# log (Deque[Dict[str, Any]]): A deque that stores log entries with a maximum size.
|
101
|
-
# buffer_limit (int): The maximum number of entries the log can hold.
|
102
|
-
# auto_flush_size (int): The number of entries to reach before auto-flushing the log.
|
103
|
-
# lock (Lock): A threading lock to ensure thread safety.
|
104
|
-
|
105
|
-
# Examples:
|
106
|
-
# >>> logger = EnhancedDataLogger(dir="logs", auto_flush_size=10)
|
107
|
-
# >>> logger({"event": "start", "value": 1}, level="INFO")
|
108
|
-
# >>> logger({"event": "stop", "value": 0}, level="ERROR")
|
109
|
-
# >>> logger.flush(filename="event_log", to_json=False)
|
110
|
-
|
111
|
-
# This will create a CSV file 'event_log.csv' in the 'logs' directory with two log entries.
|
112
|
-
|
113
|
-
# >>> logger = EnhancedDataLogger(dir="logs", auto_flush_size=10)
|
114
|
-
# >>> logger({"event": "start", "value": 1}, level="INFO")
|
115
|
-
# >>> logger({"event": "update", "value": 5}, level="DEBUG")
|
116
|
-
# >>> logger.flush(filename="event_log", to_json=True)
|
117
|
-
|
118
|
-
# This will create a JSON file 'event_log.jsonl' in the 'logs' directory with two log entries.
|
119
|
-
# """
|
120
|
-
|
121
|
-
# def __init__(self, dir: Optional[str] = None, log: Optional[List[Dict[str, Any]]] = None, buffer_limit: int = 1000, auto_flush_size: int = 100) -> None:
|
122
|
-
# self.dir = dir
|
123
|
-
# self.log: Deque[Dict[str, Any]] = deque(log, maxlen=buffer_limit) if log else deque(maxlen=buffer_limit)
|
124
|
-
# self.buffer_limit = buffer_limit
|
125
|
-
# self.auto_flush_size = auto_flush_size
|
126
|
-
# self.lock = Lock()
|
127
|
-
|
128
|
-
# def __call__(self, entry: Dict[str, Any], level: str = "INFO") -> None:
|
129
|
-
# """Add a log entry to the log deque with a specified log level.
|
130
|
-
|
131
|
-
# Args:
|
132
|
-
# entry (Dict[str, Any]): The log entry to be added.
|
133
|
-
# level (str): The log level for the entry (e.g., "INFO", "ERROR").
|
134
|
-
# """
|
135
|
-
# with self.lock:
|
136
|
-
# self.log.append({"timestamp": self.get_timestamp(), "level": level, **entry})
|
137
|
-
|
138
|
-
# def flush(self, filename: str = "log", to_json: bool = False) -> None:
|
139
|
-
# """Flush the log entries to a file in either CSV or JSON format.
|
140
|
-
|
141
|
-
# Args:
|
142
|
-
# filename (str): The base name of the file to write the logs to.
|
143
|
-
# to_json (bool): If True, logs are written in JSON format; otherwise, in CSV format.
|
144
|
-
# """
|
145
|
-
# if not self.log:
|
146
|
-
# return
|
147
|
-
# dir = self.dir or "."
|
148
|
-
# filepath = self.create_path(dir=dir, filename=filename, to_json=to_json)
|
149
|
-
# num_entries = len(self.log)
|
150
|
-
# if to_json:
|
151
|
-
# self.to_json(filepath)
|
152
|
-
# else:
|
153
|
-
# self.to_csv(filepath)
|
154
|
-
# self.log.clear()
|
155
|
-
# print(f"Flushed {num_entries} entries to {'JSON' if to_json else 'CSV'} file.")
|
156
|
-
|
157
|
-
# def to_csv(self, filepath: str) -> None:
|
158
|
-
# """Write the log entries to a CSV file.
|
159
|
-
|
160
|
-
# Args:
|
161
|
-
# filepath (str): The full path to the CSV file.
|
162
|
-
# """
|
163
|
-
# num_entries = len(self.log)
|
164
|
-
# with open(filepath, 'a', newline='') as csv_file:
|
165
|
-
# writer = csv.DictWriter(csv_file, fieldnames=self.log[0].keys())
|
166
|
-
# if os.stat(filepath).st_size == 0: # Write header only if file is empty
|
167
|
-
# writer.writeheader()
|
168
|
-
# writer.writerows(self.log)
|
169
|
-
# print(f"Wrote {num_entries} entries to CSV file.")
|
170
|
-
|
171
|
-
# def to_json(self, filepath: str) -> None:
|
172
|
-
# """Write the log entries to a JSON file.
|
173
|
-
|
174
|
-
# Args:
|
175
|
-
# filepath (str): The full path to the JSON file.
|
176
|
-
# """
|
177
|
-
# num_entries = len(self.log)
|
178
|
-
# with open(filepath, 'a') as json_file:
|
179
|
-
# for entry in self.log:
|
180
|
-
# json_file.write(json.dumps(entry) + "\n")
|
181
|
-
# print(f"Wrote {num_entries} entries to JSON file.")
|
182
|
-
|
183
|
-
# def create_path(self, dir: str, filename: str, to_json: bool = False) -> str:
|
184
|
-
# """Create the full file path for the log file, ensuring the directory exists.
|
185
|
-
|
186
|
-
# Args:
|
187
|
-
# dir (str): The directory where the file will be created.
|
188
|
-
# filename (str): The base name of the file.
|
189
|
-
# to_json (bool): If True, the file extension will be '.jsonl'; otherwise, '.csv'.
|
190
|
-
|
191
|
-
# Returns:
|
192
|
-
# str: The full file path for the log file.
|
193
|
-
# """
|
194
|
-
# ext = "jsonl" if to_json else "csv"
|
195
|
-
# filepath = f"{dir}/{filename}.{ext}"
|
196
|
-
# os.makedirs(dir, exist_ok=True)
|
197
|
-
# return filepath
|
198
|
-
|
199
|
-
# def get_timestamp(self) -> str:
|
200
|
-
# """Get the current timestamp in 'YYYYMMDDHHMMSS' format.
|
201
|
-
|
202
|
-
# Returns:
|
203
|
-
# str: The current timestamp.
|
204
|
-
# """
|
205
|
-
# return datetime.now().strftime("%Y%m%d%H%M%S")
|
206
|
-
|
125
|
+
if clear:
|
126
|
+
self.log.clear()
|