ragaai-catalyst 2.1.4b4__py3-none-any.whl → 2.1.4b6__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.
@@ -66,8 +66,8 @@ class AgentTracerMixin:
66
66
  if metrics:
67
67
  if isinstance(metrics, dict):
68
68
  metrics = [metrics]
69
- for metric in metrics:
70
- try:
69
+ try:
70
+ for metric in metrics:
71
71
  self.span(name).add_metrics(
72
72
  name=metric["name"],
73
73
  score=metric["score"],
@@ -77,8 +77,10 @@ class AgentTracerMixin:
77
77
  metadata=metric.get("metadata", {}),
78
78
  config=metric.get("config", {}),
79
79
  )
80
- except KeyError as e:
81
- logger.error(f"Error adding metric: {e}")
80
+ except ValueError as e:
81
+ logger.error(f"Validation Error: {e}")
82
+ except Exception as e:
83
+ logger.error(f"Error adding metric: {e}")
82
84
  if feedback:
83
85
  self.span(name).add_feedback(feedback)
84
86
 
@@ -525,7 +527,14 @@ class AgentTracerMixin:
525
527
  # metrics
526
528
  metrics = []
527
529
  if name in self.span_attributes_dict:
528
- metrics = self.span_attributes_dict[name].metrics or []
530
+ raw_metrics = self.span_attributes_dict[name].metrics or []
531
+ for metric in raw_metrics:
532
+ base_metric_name = metric["name"]
533
+ counter = sum(1 for x in self.visited_metrics if x.startswith(base_metric_name))
534
+ metric_name = f'{base_metric_name}_{counter}' if counter > 0 else base_metric_name
535
+ self.visited_metrics.append(metric_name)
536
+ metric["name"] = metric_name
537
+ metrics.append(metric)
529
538
 
530
539
  component = {
531
540
  "id": kwargs["component_id"],
@@ -9,6 +9,8 @@ from typing import List, Any
9
9
  import uuid
10
10
  import sys
11
11
  import tempfile
12
+ import threading
13
+ import time
12
14
  from ....ragaai_catalyst import RagaAICatalyst
13
15
  from ..data.data_structure import (
14
16
  Trace,
@@ -78,6 +80,7 @@ class BaseTracer:
78
80
  self.dataset_name = self.user_details["dataset_name"] # Access the dataset_name
79
81
  self.project_id = self.user_details["project_id"] # Access the project_id
80
82
  self.trace_name = self.user_details["trace_name"] # Access the trace_name
83
+ self.visited_metrics = []
81
84
 
82
85
  # Initialize trace data
83
86
  self.trace_id = None
@@ -86,6 +89,14 @@ class BaseTracer:
86
89
  self.file_tracker = TrackName()
87
90
  self.span_attributes_dict = {}
88
91
 
92
+ self.interval_time = self.user_details['interval_time']
93
+ self.memory_usage_list = []
94
+ self.cpu_usage_list = []
95
+ self.disk_usage_list = []
96
+ self.network_usage_list = []
97
+ self.tracking_thread = None
98
+ self.tracking = False
99
+
89
100
  def _get_system_info(self) -> SystemInfo:
90
101
  # Get OS info
91
102
  os_info = OSInfo(
@@ -157,8 +168,49 @@ class BaseTracer:
157
168
 
158
169
  return Resources(cpu=cpu, memory=mem, disk=disk_resource, network=net)
159
170
 
171
+ def _track_memory_usage(self):
172
+ self.memory_usage_list = []
173
+ while self.tracking:
174
+ memory_usage = psutil.Process().memory_info().rss
175
+ self.memory_usage_list.append(memory_usage / (1024 * 1024)) # Convert to MB and append to the list
176
+ time.sleep(self.interval_time)
177
+
178
+ def _track_cpu_usage(self):
179
+ self.cpu_usage_list = []
180
+ while self.tracking:
181
+ cpu_usage = psutil.cpu_percent(interval=self.interval_time)
182
+ self.cpu_usage_list.append(cpu_usage)
183
+ time.sleep(self.interval_time)
184
+
185
+ def _track_disk_usage(self):
186
+ self.disk_usage_list = []
187
+ while self.tracking:
188
+ disk_io = psutil.disk_io_counters()
189
+ self.disk_usage_list.append({
190
+ 'disk_read': disk_io.read_bytes / (1024 * 1024), # Convert to MB
191
+ 'disk_write': disk_io.write_bytes / (1024 * 1024) # Convert to MB
192
+ })
193
+ time.sleep(self.interval_time)
194
+
195
+ def _track_network_usage(self):
196
+ self.network_usage_list = []
197
+ while self.tracking:
198
+ net_io = psutil.net_io_counters()
199
+ self.network_usage_list.append({
200
+ 'uploads': net_io.bytes_sent / (1024 * 1024), # Convert to MB
201
+ 'downloads': net_io.bytes_recv / (1024 * 1024) # Convert to MB
202
+ })
203
+ time.sleep(self.interval_time)
204
+
160
205
  def start(self):
161
206
  """Initialize a new trace"""
207
+ self.tracking = True
208
+ self.tracking_thread = threading.Thread(target=self._track_memory_usage)
209
+ self.tracking_thread.start()
210
+ threading.Thread(target=self._track_cpu_usage).start()
211
+ threading.Thread(target=self._track_disk_usage).start()
212
+ threading.Thread(target=self._track_network_usage).start()
213
+
162
214
  metadata = Metadata(
163
215
  cost={},
164
216
  tokens={},
@@ -197,6 +249,38 @@ class BaseTracer:
197
249
  self.trace.data[0]["end_time"] = datetime.now().astimezone().isoformat()
198
250
  self.trace.end_time = datetime.now().astimezone().isoformat()
199
251
 
252
+ #track memory usage
253
+ self.tracking = False
254
+ if self.tracking_thread is not None:
255
+ self.tracking_thread.join()
256
+ self.trace.metadata.resources.memory.values = self.memory_usage_list
257
+
258
+ #track cpu usage
259
+ self.trace.metadata.resources.cpu.values = self.cpu_usage_list
260
+
261
+ #track network and disk usage
262
+ network_upoloads, network_downloads = 0, 0
263
+ disk_read, disk_write = 0, 0
264
+ for network_usage, disk_usage in zip(self.network_usage_list, self.disk_usage_list):
265
+ network_upoloads += network_usage['uploads']
266
+ network_downloads += network_usage['downloads']
267
+ disk_read += disk_usage['disk_read']
268
+ disk_write += disk_usage['disk_write']
269
+
270
+ #track disk usage
271
+ self.trace.metadata.resources.disk.read = [disk_read / len(self.disk_usage_list)]
272
+ self.trace.metadata.resources.disk.write = [disk_write / len(self.disk_usage_list)]
273
+
274
+ #track network usage
275
+ self.trace.metadata.resources.network.uploads = [network_upoloads / len(self.network_usage_list)]
276
+ self.trace.metadata.resources.network.downloads = [network_downloads / len(self.network_usage_list)]
277
+
278
+ # update interval time
279
+ self.trace.metadata.resources.cpu.interval = float(self.interval_time)
280
+ self.trace.metadata.resources.memory.interval = float(self.interval_time)
281
+ self.trace.metadata.resources.disk.interval = float(self.interval_time)
282
+ self.trace.metadata.resources.network.interval = float(self.interval_time)
283
+
200
284
  # Change span ids to int
201
285
  self.trace = self._change_span_ids_to_int(self.trace)
202
286
  self.trace = self._change_agent_input_output(self.trace)
@@ -802,3 +886,4 @@ class BaseTracer:
802
886
  if span_name not in self.span_attributes_dict:
803
887
  self.span_attributes_dict[span_name] = SpanAttributes(span_name)
804
888
  return self.span_attributes_dict[span_name]
889
+
@@ -363,7 +363,14 @@ class LLMTracerMixin:
363
363
  # metrics
364
364
  metrics = []
365
365
  if name in self.span_attributes_dict:
366
- metrics = self.span_attributes_dict[name].metrics or []
366
+ raw_metrics = self.span_attributes_dict[name].metrics or []
367
+ for metric in raw_metrics:
368
+ base_metric_name = metric["name"]
369
+ counter = sum(1 for x in self.visited_metrics if x.startswith(base_metric_name))
370
+ metric_name = f'{base_metric_name}_{counter}' if counter > 0 else base_metric_name
371
+ self.visited_metrics.append(metric_name)
372
+ metric["name"] = metric_name
373
+ metrics.append(metric)
367
374
 
368
375
  component = {
369
376
  "id": component_id,
@@ -621,8 +628,8 @@ class LLMTracerMixin:
621
628
  if metrics:
622
629
  if isinstance(metrics, dict):
623
630
  metrics = [metrics]
624
- for metric in metrics:
625
- try:
631
+ try:
632
+ for metric in metrics:
626
633
  self.span(name).add_metrics(
627
634
  name=metric["name"],
628
635
  score=metric["score"],
@@ -632,8 +639,11 @@ class LLMTracerMixin:
632
639
  metadata=metric.get("metadata", {}),
633
640
  config=metric.get("config", {}),
634
641
  )
635
- except KeyError as e:
636
- logger.error(f"Error adding metric: {e}")
642
+ except ValueError as e:
643
+ logger.error(f"Validation Error: {e}")
644
+ except Exception as e:
645
+ logger.error(f"Error adding metric: {e}")
646
+
637
647
  if feedback:
638
648
  self.span(name).add_feedback(feedback)
639
649
 
@@ -209,6 +209,9 @@ class AgenticTracing(
209
209
  # Deactivate network tracing
210
210
  self.network_tracer.deactivate_patches()
211
211
 
212
+ # Clear visited metrics when stopping trace
213
+ self.visited_metrics.clear()
214
+
212
215
  # Stop base tracer (includes saving to file)
213
216
  super().stop()
214
217
 
@@ -63,8 +63,8 @@ class ToolTracerMixin:
63
63
  if metrics:
64
64
  if isinstance(metrics, dict):
65
65
  metrics = [metrics]
66
- for metric in metrics:
67
- try:
66
+ try:
67
+ for metric in metrics:
68
68
  self.span(name).add_metrics(
69
69
  name=metric["name"],
70
70
  score=metric["score"],
@@ -74,8 +74,11 @@ class ToolTracerMixin:
74
74
  metadata=metric.get("metadata", {}),
75
75
  config=metric.get("config", {}),
76
76
  )
77
- except KeyError as e:
78
- logger.error(f"Error adding metric: {e}")
77
+ except ValueError as e:
78
+ logger.error(f"Validation Error: {e}")
79
+ except Exception as e:
80
+ logger.error(f"Error adding metric: {e}")
81
+
79
82
  if feedback:
80
83
  self.span(name).add_feedback(feedback)
81
84
 
@@ -275,7 +278,14 @@ class ToolTracerMixin:
275
278
  # metrics
276
279
  metrics = []
277
280
  if name in self.span_attributes_dict:
278
- metrics = self.span_attributes_dict[name].metrics or []
281
+ raw_metrics = self.span_attributes_dict[name].metrics or []
282
+ for metric in raw_metrics:
283
+ base_metric_name = metric["name"]
284
+ counter = sum(1 for x in self.visited_metrics if x.startswith(base_metric_name))
285
+ metric_name = f'{base_metric_name}_{counter}' if counter > 0 else base_metric_name
286
+ self.visited_metrics.append(metric_name)
287
+ metric["name"] = metric_name
288
+ metrics.append(metric)
279
289
 
280
290
  start_time = kwargs["start_time"]
281
291
  component = {
@@ -25,7 +25,6 @@ from ragaai_catalyst.tracers.agentic_tracing.utils.trace_utils import load_model
25
25
 
26
26
  logger = logging.getLogger(__name__)
27
27
 
28
-
29
28
  class Tracer(AgenticTracing):
30
29
  NUM_PROJECTS = 100
31
30
  TIMEOUT = 10
@@ -48,7 +47,8 @@ class Tracer(AgenticTracing):
48
47
  'file_io':True,
49
48
  'network':True,
50
49
  'custom':True
51
- }
50
+ },
51
+ interval_time=2,
52
52
  # auto_instrumentation=True/False # to control automatic instrumentation of everything
53
53
 
54
54
  ):
@@ -70,6 +70,7 @@ class Tracer(AgenticTracing):
70
70
  "project_name": project_name,
71
71
  "project_id": None, # Will be set after project validation
72
72
  "dataset_name": dataset_name,
73
+ "interval_time": interval_time,
73
74
  "trace_name": trace_name if trace_name else f"trace_{datetime.datetime.now().strftime('%Y%m%d%H%M%S')}",
74
75
  "trace_user_detail": {"metadata": metadata} if metadata else {}
75
76
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: ragaai_catalyst
3
- Version: 2.1.4b4
3
+ Version: 2.1.4b6
4
4
  Summary: RAGA AI CATALYST
5
5
  Author-email: Kiran Scaria <kiran.scaria@raga.ai>, Kedar Gaikwad <kedar.gaikwad@raga.ai>, Dushyant Mahajan <dushyant.mahajan@raga.ai>, Siddhartha Kosti <siddhartha.kosti@raga.ai>, Ritika Goel <ritika.goel@raga.ai>, Vijay Chaurasia <vijay.chaurasia@raga.ai>
6
6
  Requires-Python: <3.13,>=3.9
@@ -13,7 +13,7 @@ ragaai_catalyst/synthetic_data_generation.py,sha256=uDV9tNwto2xSkWg5XHXUvjErW-4P
13
13
  ragaai_catalyst/utils.py,sha256=TlhEFwLyRU690HvANbyoRycR3nQ67lxVUQoUOfTPYQ0,3772
14
14
  ragaai_catalyst/tracers/__init__.py,sha256=yxepo7iVjTNI_wFdk3Z6Ghu64SazVyszCPEHYrX5WQk,50
15
15
  ragaai_catalyst/tracers/llamaindex_callback.py,sha256=HGs0TgtSgn8xXL8CSgdL9ymvYQGxZCNmPY5tRTw-I4s,14047
16
- ragaai_catalyst/tracers/tracer.py,sha256=4RaLmtAvVA-KT-O4Oi5T-VLVFmKqhbWjHYNxuQ6Fktk,15585
16
+ ragaai_catalyst/tracers/tracer.py,sha256=UX-01NYWcH2y4UW1W287Cn-jy760rgaFqu8llJbeMdg,15654
17
17
  ragaai_catalyst/tracers/upload_traces.py,sha256=hs0PEmit3n3_uUqrdbwcBdyK5Nbkik3JQVwJMEwYTd4,4796
18
18
  ragaai_catalyst/tracers/agentic_tracing/README.md,sha256=X4QwLb7-Jg7GQMIXj-SerZIgDETfw-7VgYlczOR8ZeQ,4508
19
19
  ragaai_catalyst/tracers/agentic_tracing/__init__.py,sha256=yf6SKvOPSpH-9LiKaoLKXwqj5sez8F_5wkOb91yp0oE,260
@@ -26,14 +26,14 @@ ragaai_catalyst/tracers/agentic_tracing/tests/__init__.py,sha256=47DEQpj8HBSa-_T
26
26
  ragaai_catalyst/tracers/agentic_tracing/tests/ai_travel_agent.py,sha256=S4rCcKzU_5SB62BYEbNn_1VbbTdG4396N8rdZ3ZNGcE,5654
27
27
  ragaai_catalyst/tracers/agentic_tracing/tests/unique_decorator_test.py,sha256=Xk1cLzs-2A3dgyBwRRnCWs7Eubki40FVonwd433hPN8,4805
28
28
  ragaai_catalyst/tracers/agentic_tracing/tracers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
- ragaai_catalyst/tracers/agentic_tracing/tracers/agent_tracer.py,sha256=IpcSJG8lxghWmkIpcOvQ_4G0OqK79-Y2_75CEa5dHtg,25027
30
- ragaai_catalyst/tracers/agentic_tracing/tracers/base.py,sha256=xNiWN0xJDm0GbnB0jo8xFnt-BO0-x4CmaHInsWxHREA,31266
29
+ ragaai_catalyst/tracers/agentic_tracing/tracers/agent_tracer.py,sha256=aLiq5nPie5TT61QYtvAtvErsxjPFYiUxjayn5aCX1_k,25543
30
+ ragaai_catalyst/tracers/agentic_tracing/tracers/base.py,sha256=u2DX_BsMGsuJkWqN6ucxboMO8GnvOcArKJe5L08y-YI,35014
31
31
  ragaai_catalyst/tracers/agentic_tracing/tracers/custom_tracer.py,sha256=uay8lU7T-CKsVu8KvWX31qfMqufK9S3Ive7XKo2Ksmk,12252
32
32
  ragaai_catalyst/tracers/agentic_tracing/tracers/langgraph_tracer.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
- ragaai_catalyst/tracers/agentic_tracing/tracers/llm_tracer.py,sha256=NzMLIf21foZplOBx2zq32sUHV8geBNQmI2B-sIoSpPI,28810
34
- ragaai_catalyst/tracers/agentic_tracing/tracers/main_tracer.py,sha256=5zUfKG87-sJPvDY56uueEL4J8Qk797vl0WDVbqhbx7Y,15117
33
+ ragaai_catalyst/tracers/agentic_tracing/tracers/llm_tracer.py,sha256=fn5qxb365GmQkJy_yZAY5TiiWRMFKPNJdYk8KFr8uWA,29343
34
+ ragaai_catalyst/tracers/agentic_tracing/tracers/main_tracer.py,sha256=nxUOQSyWBTnbsZfxmr1lje2OggqNf9fwtGUb-sBo6mI,15215
35
35
  ragaai_catalyst/tracers/agentic_tracing/tracers/network_tracer.py,sha256=CviGiAg0W0krJxORMBDTosQytIoJDQ5RwU6xt_U_mOg,10408
36
- ragaai_catalyst/tracers/agentic_tracing/tracers/tool_tracer.py,sha256=PD027GHkbEwLUINXYradgblSEN8d2cqkHwpyX3RP_uw,11627
36
+ ragaai_catalyst/tracers/agentic_tracing/tracers/tool_tracer.py,sha256=4h6epgRHPVRfTrCznwc6KPK6xevwBaZwE-q0Zj-4Kkk,12160
37
37
  ragaai_catalyst/tracers/agentic_tracing/tracers/user_interaction_tracer.py,sha256=bhSUhNQCuJXKjgJAXhjKEYjnHMpYN90FSZdR84fNIKU,4614
38
38
  ragaai_catalyst/tracers/agentic_tracing/upload/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
39
  ragaai_catalyst/tracers/agentic_tracing/upload/upload_agentic_traces.py,sha256=1MDKXAAPzOEdxFKWWQrRgrmM3kz--DGXSywGXQmR3lQ,6041
@@ -60,7 +60,7 @@ ragaai_catalyst/tracers/instrumentators/llamaindex.py,sha256=SMrRlR4xM7k9HK43hak
60
60
  ragaai_catalyst/tracers/instrumentators/openai.py,sha256=14R4KW9wQCR1xysLfsP_nxS7cqXrTPoD8En4MBAaZUU,379
61
61
  ragaai_catalyst/tracers/utils/__init__.py,sha256=KeMaZtYaTojilpLv65qH08QmpYclfpacDA0U3wg6Ybw,64
62
62
  ragaai_catalyst/tracers/utils/utils.py,sha256=ViygfJ7vZ7U0CTSA1lbxVloHp4NSlmfDzBRNCJuMhis,2374
63
- ragaai_catalyst-2.1.4b4.dist-info/METADATA,sha256=4xoAwoSRRw5GD6yEeygoXU49jMKM4RXa1_MWLV9EblA,12770
64
- ragaai_catalyst-2.1.4b4.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
65
- ragaai_catalyst-2.1.4b4.dist-info/top_level.txt,sha256=HpgsdRgEJMk8nqrU6qdCYk3di7MJkDL0B19lkc7dLfM,16
66
- ragaai_catalyst-2.1.4b4.dist-info/RECORD,,
63
+ ragaai_catalyst-2.1.4b6.dist-info/METADATA,sha256=DiX0GlNTSTjVKVNaj0sIp5Bvtbpw5gLaPZJws6gPHUw,12770
64
+ ragaai_catalyst-2.1.4b6.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
65
+ ragaai_catalyst-2.1.4b6.dist-info/top_level.txt,sha256=HpgsdRgEJMk8nqrU6qdCYk3di7MJkDL0B19lkc7dLfM,16
66
+ ragaai_catalyst-2.1.4b6.dist-info/RECORD,,