ragaai-catalyst 2.1.4b4__tar.gz → 2.1.4b6__tar.gz

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.
Files changed (84) hide show
  1. {ragaai_catalyst-2.1.4b4/ragaai_catalyst.egg-info → ragaai_catalyst-2.1.4b6}/PKG-INFO +1 -1
  2. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/pyproject.toml +1 -1
  3. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/tracers/agent_tracer.py +14 -5
  4. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/tracers/base.py +85 -0
  5. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/tracers/llm_tracer.py +15 -5
  6. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/tracers/main_tracer.py +3 -0
  7. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/tracers/tool_tracer.py +15 -5
  8. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/tracer.py +3 -2
  9. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6/ragaai_catalyst.egg-info}/PKG-INFO +1 -1
  10. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/.gitignore +0 -0
  11. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/README.md +0 -0
  12. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/__init__.py +0 -0
  13. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/docs/dataset_management.md +0 -0
  14. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/docs/prompt_management.md +0 -0
  15. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/examples/prompt_management_litellm.ipynb +0 -0
  16. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/examples/prompt_management_openai.ipynb +0 -0
  17. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/poetry.lock +0 -0
  18. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/__init__.py +0 -0
  19. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/_version.py +0 -0
  20. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/dataset.py +0 -0
  21. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/evaluation.py +0 -0
  22. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/experiment.py +0 -0
  23. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/guard_executor.py +0 -0
  24. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/guardrails_manager.py +0 -0
  25. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/internal_api_completion.py +0 -0
  26. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/prompt_manager.py +0 -0
  27. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/proxy_call.py +0 -0
  28. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/ragaai_catalyst.py +0 -0
  29. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/synthetic_data_generation.py +0 -0
  30. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/__init__.py +0 -0
  31. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/README.md +0 -0
  32. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/__init__.py +0 -0
  33. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/data/__init__.py +0 -0
  34. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/data/data_structure.py +0 -0
  35. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/tests/FinancialAnalysisSystem.ipynb +0 -0
  36. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/tests/GameActivityEventPlanner.ipynb +0 -0
  37. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/tests/TravelPlanner.ipynb +0 -0
  38. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/tests/__init__.py +0 -0
  39. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/tests/ai_travel_agent.py +0 -0
  40. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/tests/unique_decorator_test.py +0 -0
  41. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/tracers/__init__.py +0 -0
  42. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/tracers/custom_tracer.py +0 -0
  43. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/tracers/langgraph_tracer.py +0 -0
  44. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/tracers/network_tracer.py +0 -0
  45. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/tracers/user_interaction_tracer.py +0 -0
  46. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/upload/__init__.py +0 -0
  47. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/upload/upload_agentic_traces.py +0 -0
  48. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/upload/upload_code.py +0 -0
  49. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/upload/upload_trace_metric.py +0 -0
  50. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/utils/__init__.py +0 -0
  51. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/utils/api_utils.py +0 -0
  52. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/utils/create_dataset_schema.py +0 -0
  53. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/utils/file_name_tracker.py +0 -0
  54. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/utils/generic.py +0 -0
  55. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/utils/get_user_trace_metrics.py +0 -0
  56. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/utils/llm_utils.py +0 -0
  57. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/utils/model_costs.json +0 -0
  58. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/utils/span_attributes.py +0 -0
  59. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/utils/trace_utils.py +0 -0
  60. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/utils/unique_decorator.py +0 -0
  61. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/agentic_tracing/utils/zip_list_of_unique_files.py +0 -0
  62. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/exporters/__init__.py +0 -0
  63. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/exporters/file_span_exporter.py +0 -0
  64. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/exporters/raga_exporter.py +0 -0
  65. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/instrumentators/__init__.py +0 -0
  66. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/instrumentators/langchain.py +0 -0
  67. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/instrumentators/llamaindex.py +0 -0
  68. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/instrumentators/openai.py +0 -0
  69. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/llamaindex_callback.py +0 -0
  70. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/upload_traces.py +0 -0
  71. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/utils/__init__.py +0 -0
  72. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/tracers/utils/utils.py +0 -0
  73. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst/utils.py +0 -0
  74. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst.egg-info/SOURCES.txt +0 -0
  75. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst.egg-info/dependency_links.txt +0 -0
  76. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst.egg-info/requires.txt +0 -0
  77. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/ragaai_catalyst.egg-info/top_level.txt +0 -0
  78. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/requirements.txt +0 -0
  79. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/setup.cfg +0 -0
  80. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/test/test_catalyst/test_configuration.py +0 -0
  81. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/test/test_catalyst/test_dataset.py +0 -0
  82. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/test/test_catalyst/test_evaluation.py +0 -0
  83. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/test/test_catalyst/test_prompt_manager.py +0 -0
  84. {ragaai_catalyst-2.1.4b4 → ragaai_catalyst-2.1.4b6}/test/test_catalyst/test_synthetic_data_generation.py +0 -0
@@ -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
@@ -9,7 +9,7 @@ readme = "README.md"
9
9
  requires-python = ">=3.9,<3.13"
10
10
  # license = {file = "LICENSE"}
11
11
 
12
- version = "2.1.4.beta.4"
12
+ version = "2.1.4.beta.6"
13
13
  authors = [
14
14
  {name = "Kiran Scaria", email = "kiran.scaria@raga.ai"},
15
15
  {name = "Kedar Gaikwad", email = "kedar.gaikwad@raga.ai"},
@@ -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