ragaai-catalyst 2.1.7b1__py3-none-any.whl → 2.1.7.1b0__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.
@@ -14,7 +14,7 @@ class DynamicTraceExporter(SpanExporter):
14
14
  certain properties to be updated dynamically during execution.
15
15
  """
16
16
 
17
- def __init__(self, tracer_type, files_to_zip, project_name, project_id, dataset_name, user_details, base_url, custom_model_cost, timeout=120, post_processor = None, max_upload_workers = 30):
17
+ def __init__(self, tracer_type, files_to_zip, project_name, project_id, dataset_name, user_details, base_url, custom_model_cost, timeout=120, post_processor = None, max_upload_workers = 30,user_context = None, external_id=None):
18
18
  """
19
19
  Initialize the DynamicTraceExporter.
20
20
 
@@ -40,7 +40,9 @@ class DynamicTraceExporter(SpanExporter):
40
40
  custom_model_cost=custom_model_cost,
41
41
  timeout=timeout,
42
42
  post_processor= post_processor,
43
- max_upload_workers = max_upload_workers
43
+ max_upload_workers = max_upload_workers,
44
+ user_context = user_context,
45
+ external_id=external_id
44
46
  )
45
47
 
46
48
  # Store the initial values
@@ -53,6 +55,7 @@ class DynamicTraceExporter(SpanExporter):
53
55
  self._custom_model_cost = custom_model_cost
54
56
  self._post_processor = post_processor
55
57
  self._max_upload_workers = max_upload_workers
58
+ self._user_context = user_context
56
59
 
57
60
 
58
61
  def export(self, spans):
@@ -111,6 +114,7 @@ class DynamicTraceExporter(SpanExporter):
111
114
  self._exporter.custom_model_cost = self._custom_model_cost
112
115
  self._exporter.post_processor = self._post_processor
113
116
  self._exporter.max_upload_workers = self._max_upload_workers
117
+ self._exporter.user_context = self._user_context
114
118
 
115
119
  # Getter and setter methods for dynamic properties
116
120
 
@@ -177,3 +181,12 @@ class DynamicTraceExporter(SpanExporter):
177
181
  @max_upload_workers.setter
178
182
  def max_upload_workers(self, value):
179
183
  self._max_upload_workers = value
184
+
185
+ @property
186
+ def user_context(self):
187
+ return self._user_context
188
+
189
+ @user_context.setter
190
+ def user_context(self, value):
191
+ self._user_context = value
192
+
@@ -26,7 +26,7 @@ logging_level = (
26
26
 
27
27
 
28
28
  class RAGATraceExporter(SpanExporter):
29
- def __init__(self, tracer_type, files_to_zip, project_name, project_id, dataset_name, user_details, base_url, custom_model_cost, timeout=120, post_processor = None, max_upload_workers = 30):
29
+ def __init__(self, tracer_type, files_to_zip, project_name, project_id, dataset_name, user_details, base_url, custom_model_cost, timeout=120, post_processor = None, max_upload_workers = 30,user_context = None, external_id=None):
30
30
  self.trace_spans = dict()
31
31
  self.tmp_dir = tempfile.gettempdir()
32
32
  self.tracer_type = tracer_type
@@ -41,6 +41,8 @@ class RAGATraceExporter(SpanExporter):
41
41
  self.timeout = timeout
42
42
  self.post_processor = post_processor
43
43
  self.max_upload_workers = max_upload_workers
44
+ self.user_context = user_context
45
+ self.external_id = external_id
44
46
 
45
47
  def export(self, spans):
46
48
  for span in spans:
@@ -86,12 +88,33 @@ class RAGATraceExporter(SpanExporter):
86
88
  ragaai_trace_details = self.prepare_trace(spans, trace_id)
87
89
  except Exception as e:
88
90
  print(f"Error converting trace {trace_id}: {e}")
91
+ return # Exit early if conversion fails
92
+
93
+ # Check if trace details are None (conversion failed)
94
+ if ragaai_trace_details is None:
95
+ logger.error(f"Cannot upload trace {trace_id}: conversion failed and returned None")
96
+ return # Exit early if conversion failed
97
+
89
98
  # Upload the trace if upload_trace function is provided
90
99
  try:
91
100
  if self.post_processor!=None:
92
101
  ragaai_trace_details['trace_file_path'] = self.post_processor(ragaai_trace_details['trace_file_path'])
93
102
  if self.tracer_type == "langchain":
94
- asyncio.run(self.upload_rag_trace(ragaai_trace_details, additional_metadata, trace_id))
103
+ # Check if we're already in an event loop
104
+ try:
105
+ loop = asyncio.get_event_loop()
106
+ if loop.is_running():
107
+ # We're in a running event loop (like in Colab/Jupyter)
108
+ # Create a future and run the coroutine
109
+ future = asyncio.ensure_future(self.upload_rag_trace(ragaai_trace_details, additional_metadata, trace_id))
110
+ # We don't wait for it to complete as this would block the event loop
111
+ logger.info(f"Scheduled async upload for trace {trace_id} in existing event loop")
112
+ else:
113
+ # No running event loop, use asyncio.run()
114
+ asyncio.run(self.upload_rag_trace(ragaai_trace_details, additional_metadata, trace_id))
115
+ except RuntimeError:
116
+ # No event loop exists, create one
117
+ asyncio.run(self.upload_rag_trace(ragaai_trace_details, additional_metadata, trace_id))
95
118
  else:
96
119
  self.upload_trace(ragaai_trace_details, trace_id)
97
120
  except Exception as e:
@@ -185,10 +208,12 @@ class RAGATraceExporter(SpanExporter):
185
208
 
186
209
  async def upload_rag_trace(self, ragaai_trace, additional_metadata, trace_id):
187
210
  try:
211
+ ragaai_trace[0]['external_id'] = self.external_id
188
212
  trace_file_path = os.path.join(self.tmp_dir, f"{trace_id}.json")
189
213
  with open(trace_file_path, 'w') as f:
190
214
  json.dump(ragaai_trace, f, indent=2)
191
-
215
+ logger.info(f"Trace file saved at {trace_file_path}")
216
+
192
217
  # Create a ThreadPoolExecutor with max_workers=30
193
218
  with concurrent.futures.ThreadPoolExecutor(max_workers=self.max_upload_workers) as executor:
194
219
  # Create a partial function with all the necessary arguments
@@ -233,7 +258,7 @@ class RAGATraceExporter(SpanExporter):
233
258
 
234
259
  def prepare_rag_trace(self, spans, trace_id):
235
260
  try:
236
- ragaai_trace, additional_metadata = rag_trace_json_converter(spans, self.custom_model_cost, trace_id, self.user_details, self.tracer_type)
261
+ ragaai_trace, additional_metadata = rag_trace_json_converter(spans, self.custom_model_cost, trace_id, self.user_details, self.tracer_type,self.user_context)
237
262
  ragaai_trace["metadata"]["recorded_on"] = datetime.datetime.now().astimezone().isoformat()
238
263
  ragaai_trace["metadata"]["log_source"] = "langchain_tracer"
239
264
 
@@ -24,6 +24,7 @@ from ragaai_catalyst.tracers.exporters.raga_exporter import RagaExporter
24
24
  from ragaai_catalyst.tracers.utils import get_unique_key
25
25
  # from ragaai_catalyst.tracers.llamaindex_callback import LlamaIndexTracer
26
26
  from ragaai_catalyst.tracers.llamaindex_instrumentation import LlamaIndexInstrumentationTracer
27
+ from openinference.instrumentation.langchain import LangChainInstrumentor
27
28
  from ragaai_catalyst import RagaAICatalyst
28
29
  from ragaai_catalyst.tracers.agentic_tracing import AgenticTracing
29
30
  from ragaai_catalyst.tracers.agentic_tracing.tracers.llm_tracer import LLMTracerMixin
@@ -59,7 +60,8 @@ class Tracer(AgenticTracing):
59
60
  },
60
61
  interval_time=2,
61
62
  # auto_instrumentation=True/False # to control automatic instrumentation of everything
62
- max_upload_workers=30
63
+ max_upload_workers=30,
64
+ external_id=None
63
65
 
64
66
  ):
65
67
  """
@@ -143,6 +145,10 @@ class Tracer(AgenticTracing):
143
145
  self.file_tracker = TrackName()
144
146
  self.post_processor = None
145
147
  self.max_upload_workers = max_upload_workers
148
+ self.user_details = self._pass_user_data()
149
+ self.update_llm_cost = update_llm_cost
150
+ self.auto_instrumentation = auto_instrumentation
151
+ self.external_id = external_id
146
152
 
147
153
  try:
148
154
  response = requests.get(
@@ -460,6 +466,30 @@ class Tracer(AgenticTracing):
460
466
  self.dynamic_exporter._exporter.post_processor = post_processor_func
461
467
  self.dynamic_exporter._post_processor = post_processor_func
462
468
  logger.info("Registered post process as: "+str(post_processor_func))
469
+
470
+
471
+ def set_external_id(self, external_id):
472
+ current_params = {
473
+ 'project_name': self.project_name,
474
+ 'dataset_name': self.dataset_name,
475
+ 'trace_name': self.trace_name,
476
+ 'tracer_type': self.tracer_type,
477
+ 'pipeline': self.pipeline,
478
+ 'metadata': self.metadata,
479
+ 'description': self.description,
480
+ 'timeout': self.timeout,
481
+ 'update_llm_cost': self.update_llm_cost,
482
+ 'auto_instrumentation': self.auto_instrumentation,
483
+ 'interval_time': self.interval_time,
484
+ 'max_upload_workers': self.max_upload_workers
485
+ }
486
+
487
+ # Reinitialize self with new external_id and stored parameters
488
+ self.__init__(
489
+ external_id=external_id,
490
+ **current_params
491
+ )
492
+
463
493
 
464
494
 
465
495
  def set_dataset_name(self, dataset_name):
@@ -485,15 +515,20 @@ class Tracer(AgenticTracing):
485
515
  # Also update the user_details in the dynamic exporter
486
516
  self.dynamic_exporter.user_details = self.user_details
487
517
  else:
488
- # Store current parameters
489
518
  current_params = {
490
- 'project_name': self.project_name,
491
- 'tracer_type': self.tracer_type,
492
- 'pipeline': self.pipeline,
493
- 'metadata': self.metadata,
494
- 'description': self.description,
495
- 'timeout': self.timeout
496
- }
519
+ 'project_name': self.project_name,
520
+ 'trace_name': self.trace_name,
521
+ 'tracer_type': self.tracer_type,
522
+ 'pipeline': self.pipeline,
523
+ 'metadata': self.metadata,
524
+ 'description': self.description,
525
+ 'timeout': self.timeout,
526
+ 'update_llm_cost': self.update_llm_cost,
527
+ 'auto_instrumentation': self.auto_instrumentation,
528
+ 'interval_time': self.interval_time,
529
+ 'max_upload_workers': self.max_upload_workers,
530
+ 'external_id': self.external_id
531
+ }
497
532
 
498
533
  # Reinitialize self with new dataset_name and stored parameters
499
534
  self.__init__(
@@ -503,7 +538,7 @@ class Tracer(AgenticTracing):
503
538
 
504
539
  def _improve_metadata(self, metadata, tracer_type):
505
540
  if metadata is None:
506
- metadata = {}
541
+ metadata = {"metadata": {}}
507
542
  metadata.setdefault("log_source", f"{tracer_type}_tracer")
508
543
  metadata.setdefault("recorded_on", str(datetime.datetime.now()))
509
544
  return metadata
@@ -766,7 +801,9 @@ class Tracer(AgenticTracing):
766
801
  custom_model_cost=self.model_custom_cost,
767
802
  timeout = self.timeout,
768
803
  post_processor= self.post_processor,
769
- max_upload_workers = self.max_upload_workers
804
+ max_upload_workers = self.max_upload_workers,
805
+ user_context = self.user_context,
806
+ external_id=self.external_id
770
807
  )
771
808
 
772
809
  # Set up tracer provider
@@ -775,7 +812,15 @@ class Tracer(AgenticTracing):
775
812
 
776
813
  # Instrument all specified instrumentors
777
814
  for instrumentor_class, args in instrumentors:
778
- instrumentor_class().instrument(tracer_provider=tracer_provider, *args)
815
+ # Create an instance of the instrumentor
816
+ instrumentor = instrumentor_class()
817
+
818
+ # Uninstrument only if it is already instrumented
819
+ if isinstance(instrumentor, LangChainInstrumentor) and instrumentor._is_instrumented_by_opentelemetry:
820
+ instrumentor.uninstrument()
821
+
822
+ # Instrument with the provided tracer provider and arguments
823
+ instrumentor.instrument(tracer_provider=tracer_provider, *args)
779
824
 
780
825
  def update_file_list(self):
781
826
  """
@@ -810,6 +855,7 @@ class Tracer(AgenticTracing):
810
855
 
811
856
  # Convert string context to string if needed
812
857
  if isinstance(context, str):
858
+ self.dynamic_exporter.user_context = context
813
859
  self.user_context = context
814
860
  else:
815
861
  raise TypeError("context must be a string")
@@ -11,9 +11,8 @@ logging_level = (
11
11
  logger.setLevel(logging.DEBUG) if os.getenv("DEBUG") == "1" else logging.INFO
12
12
  )
13
13
 
14
- def rag_trace_json_converter(input_trace, custom_model_cost, trace_id, user_details, tracer_type):
14
+ def rag_trace_json_converter(input_trace, custom_model_cost, trace_id, user_details, tracer_type,user_context):
15
15
  trace_aggregate = {}
16
-
17
16
  def get_prompt(input_trace):
18
17
  if tracer_type == "langchain":
19
18
  for span in input_trace:
@@ -46,7 +45,9 @@ def rag_trace_json_converter(input_trace, custom_model_cost, trace_id, user_deta
46
45
  return None
47
46
 
48
47
  def get_context(input_trace):
49
- if tracer_type == "langchain":
48
+ if user_context.strip():
49
+ return user_context
50
+ elif tracer_type == "langchain":
50
51
  for span in input_trace:
51
52
  if span["name"] == "VectorStoreRetriever":
52
53
  return span["attributes"].get("retrieval.documents.1.document.content")
@@ -82,6 +83,7 @@ def rag_trace_json_converter(input_trace, custom_model_cost, trace_id, user_deta
82
83
  else:
83
84
  additional_metadata = get_additional_metadata(input_trace, custom_model_cost, model_cost)
84
85
 
86
+ trace_aggregate["metadata"] = user_details.get("trace_user_detail", {}).get("metadata")
85
87
  trace_aggregate["metadata"].update(additional_metadata)
86
88
  additional_metadata.pop("total_cost")
87
89
  additional_metadata.pop("total_latency")
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ragaai_catalyst
3
- Version: 2.1.7b1
3
+ Version: 2.1.7.1b0
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>, Tushar Kumar <tushar.kumar@raga.ai>
6
- Requires-Python: <3.13,>=3.10
6
+ Requires-Python: <=3.13.2,>=3.10
7
7
  Description-Content-Type: text/markdown
8
8
  License-File: LICENSE
9
9
  Requires-Dist: aiohttp>=3.10.2
@@ -45,7 +45,7 @@ Requires-Dist: opentelemetry-sdk
45
45
  Requires-Dist: opentelemetry-exporter-otlp
46
46
  Requires-Dist: opentelemetry-proto>=1.12.0
47
47
  Provides-Extra: dev
48
- Requires-Dist: pytest; extra == "dev"
48
+ Requires-Dist: pytest>=8.3.5; extra == "dev"
49
49
  Requires-Dist: pytest-cov; extra == "dev"
50
50
  Requires-Dist: black; extra == "dev"
51
51
  Requires-Dist: isort; extra == "dev"
@@ -31,7 +31,7 @@ ragaai_catalyst/tracers/distributed.py,sha256=MwlBwIxCAng-OI-7Ove_rkE1mTLeuW4Jw-
31
31
  ragaai_catalyst/tracers/langchain_callback.py,sha256=CB75zzG3-DkYTELj0vI1MOHQTY0MuQJfoHIXz9Cl8S8,34568
32
32
  ragaai_catalyst/tracers/llamaindex_callback.py,sha256=ZY0BJrrlz-P9Mg2dX-ZkVKG3gSvzwqBtk7JL_05MiYA,14028
33
33
  ragaai_catalyst/tracers/llamaindex_instrumentation.py,sha256=Ys_jLkvVqo12bKgXDmkp4TxJu9HkBATrFE8cIcTYxWw,14329
34
- ragaai_catalyst/tracers/tracer.py,sha256=YZB3l55EXLog_rrAMb2jc5pvhQ63qtCc9UZcY7Yqmxo,37134
34
+ ragaai_catalyst/tracers/tracer.py,sha256=LHRd35rTFgYovxsI4tyXHgsCCdccO1_O1txFLFyLUKc,39069
35
35
  ragaai_catalyst/tracers/upload_traces.py,sha256=PEE_JhAmOAMKyb-pl4ZoFWhIePxJm1zs93crrk94iEg,5887
36
36
  ragaai_catalyst/tracers/agentic_tracing/README.md,sha256=X4QwLb7-Jg7GQMIXj-SerZIgDETfw-7VgYlczOR8ZeQ,4508
37
37
  ragaai_catalyst/tracers/agentic_tracing/__init__.py,sha256=yf6SKvOPSpH-9LiKaoLKXwqj5sez8F_5wkOb91yp0oE,260
@@ -74,10 +74,10 @@ ragaai_catalyst/tracers/agentic_tracing/utils/trace_utils.py,sha256=W7Nw-IpugejI
74
74
  ragaai_catalyst/tracers/agentic_tracing/utils/unique_decorator.py,sha256=G027toV-Km20JjKrc-Y_PilQ8ABEKrBvvzgLTnqVg7I,5819
75
75
  ragaai_catalyst/tracers/agentic_tracing/utils/zip_list_of_unique_files.py,sha256=4TeCGsFF26249fV6dJHLTZDrRa93SG9oer4rudoF8Y4,19443
76
76
  ragaai_catalyst/tracers/exporters/__init__.py,sha256=wQbaqyeIjVZxYprHCKZ9BeiqxeXYBKjzEgP79LWNxCU,293
77
- ragaai_catalyst/tracers/exporters/dynamic_trace_exporter.py,sha256=eR_bbWMg_q8g9SzutrOZA24Bptr0BWpauZKVWfiCM1c,5910
77
+ ragaai_catalyst/tracers/exporters/dynamic_trace_exporter.py,sha256=v2V-y1l9t9gQQbqoi2jlEhm1xRQjR5yTyr6rxSriXCE,6303
78
78
  ragaai_catalyst/tracers/exporters/file_span_exporter.py,sha256=RgGteu-NVGprXKkynvyIO5yOjpbtA41R3W_NzCjnkwE,6445
79
79
  ragaai_catalyst/tracers/exporters/raga_exporter.py,sha256=6xvjWXyh8XPkHKSLLmAZUQSvwuyY17ov8pv2VdfI0qA,17875
80
- ragaai_catalyst/tracers/exporters/ragaai_trace_exporter.py,sha256=jfJr836ahLyo2qYrP5Hmdx0XkZt8lEhlKGHIP7PNmGs,11463
80
+ ragaai_catalyst/tracers/exporters/ragaai_trace_exporter.py,sha256=BzL5u7yOcWHHtPueoJclXcvexBQo1SFu5lHY8ANnzP8,12998
81
81
  ragaai_catalyst/tracers/instrumentators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
82
  ragaai_catalyst/tracers/utils/__init__.py,sha256=KeMaZtYaTojilpLv65qH08QmpYclfpacDA0U3wg6Ybw,64
83
83
  ragaai_catalyst/tracers/utils/convert_langchain_callbacks_output.py,sha256=e0URuRWCdzpxuBLfL82FOTMjbRuDAkW8aIRi7s7Nocc,1655
@@ -85,11 +85,11 @@ ragaai_catalyst/tracers/utils/convert_llama_instru_callback.py,sha256=8qLo7x4Zsn
85
85
  ragaai_catalyst/tracers/utils/extraction_logic_llama_index.py,sha256=ZhPs0YhVtB82-Pq9o1BvCinKE_WPvVxPTEcZjlJbFYM,2371
86
86
  ragaai_catalyst/tracers/utils/langchain_tracer_extraction_logic.py,sha256=XS2_x2qneqEx9oAighLg-LRiueWcESLwIC2r7eJT-Ww,3117
87
87
  ragaai_catalyst/tracers/utils/model_prices_and_context_window_backup.json,sha256=C3uwkibJ08C9sOX-54kulZYmJlIpZ-SQpfE6HNGrjbM,343502
88
- ragaai_catalyst/tracers/utils/rag_trace_json_converter.py,sha256=XSanJ3ChRn_Nqj5mlJhy-jFUCAhkw6lBuhhzUx6Mo9k,11239
88
+ ragaai_catalyst/tracers/utils/rag_trace_json_converter.py,sha256=sIUWwzXlEGU8wkVVL0w944tXxsOVdUHHV9UCImvBVOU,11406
89
89
  ragaai_catalyst/tracers/utils/trace_json_converter.py,sha256=E0_QfciQMMpCtQYrNB4l8HJhlaFalr5bkMqkVRgQahY,14073
90
90
  ragaai_catalyst/tracers/utils/utils.py,sha256=ViygfJ7vZ7U0CTSA1lbxVloHp4NSlmfDzBRNCJuMhis,2374
91
- ragaai_catalyst-2.1.7b1.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
92
- ragaai_catalyst-2.1.7b1.dist-info/METADATA,sha256=t0urAW0WO0OddkYhXjrQt925JQcbdqPWKnv0urR-mwc,22139
93
- ragaai_catalyst-2.1.7b1.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
94
- ragaai_catalyst-2.1.7b1.dist-info/top_level.txt,sha256=HpgsdRgEJMk8nqrU6qdCYk3di7MJkDL0B19lkc7dLfM,16
95
- ragaai_catalyst-2.1.7b1.dist-info/RECORD,,
91
+ ragaai_catalyst-2.1.7.1b0.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
92
+ ragaai_catalyst-2.1.7.1b0.dist-info/METADATA,sha256=XmXgArVT9fOkKtws19dhu-OsyD4wAyinuEGl5z1VnoQ,22151
93
+ ragaai_catalyst-2.1.7.1b0.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
94
+ ragaai_catalyst-2.1.7.1b0.dist-info/top_level.txt,sha256=HpgsdRgEJMk8nqrU6qdCYk3di7MJkDL0B19lkc7dLfM,16
95
+ ragaai_catalyst-2.1.7.1b0.dist-info/RECORD,,