ragaai-catalyst 2.1.7.2b0__py3-none-any.whl → 2.1.7.3__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.
@@ -45,6 +45,9 @@ class UploadTraces:
45
45
  else:
46
46
  SCHEMA_MAPPING_NEW[key] = {"columnType": key, "parentColumn": "response"}
47
47
 
48
+ if "error" in additional_metadata_keys and additional_metadata_keys["error"]:
49
+ SCHEMA_MAPPING_NEW["error"] = {"columnType": "metadata"}
50
+
48
51
  if additional_pipeline_keys:
49
52
  for key in additional_pipeline_keys:
50
53
  SCHEMA_MAPPING_NEW[key] = {"columnType": "pipeline"}
@@ -58,4 +58,5 @@ def convert_langchain_callbacks_output(result, project_name="", metadata="", pip
58
58
 
59
59
  initial_struc[0]["traces"] = traces_data
60
60
 
61
+ initial_struc[0]["error"] = result["error"]
61
62
  return initial_struc
@@ -44,7 +44,7 @@ def rag_trace_json_converter(input_trace, custom_model_cost, trace_id, user_deta
44
44
  if isinstance(message, str):
45
45
  human_index = message.find("Human:")
46
46
  if human_index != -1:
47
- human_message = message[human_index:]
47
+ human_message = message[human_index:].replace("Human:", "")
48
48
  break
49
49
  return human_message if human_message else value
50
50
  except Exception as e:
@@ -164,10 +164,30 @@ def rag_trace_json_converter(input_trace, custom_model_cost, trace_id, user_deta
164
164
  except Exception as e:
165
165
  logger.error(f"Error while extracting context from trace: {str(e)}")
166
166
  return ""
167
-
167
+
168
+ def get_span_errors(input_trace):
169
+ try:
170
+ if tracer_type == "langchain":
171
+ span_errors = {}
172
+ for span in input_trace:
173
+ try:
174
+ if "status" in span.keys() and span.get("status", {}).get("status_code", "").lower() == "error":
175
+ span_errors[f"{span['name']}"] = span["status"]
176
+ except:
177
+ logger.error(f"Error fetching status from span")
178
+ return span_errors
179
+ except:
180
+ logger.error(f"Error in get_span_errors")
181
+ return None
182
+
183
+
184
+
185
+
186
+
168
187
  prompt = get_prompt(input_trace)
169
188
  response = get_response(input_trace)
170
189
  context = get_context(input_trace)
190
+ error = get_span_errors(input_trace)
171
191
 
172
192
  if tracer_type == "langchain":
173
193
  trace_aggregate["tracer_type"] = "langchain"
@@ -183,6 +203,7 @@ def rag_trace_json_converter(input_trace, custom_model_cost, trace_id, user_deta
183
203
  trace_aggregate["data"]["prompt"] = prompt
184
204
  trace_aggregate["data"]["response"] = response
185
205
  trace_aggregate["data"]["context"] = context
206
+ trace_aggregate["error"] = error
186
207
 
187
208
  if tracer_type == "langchain":
188
209
  additional_metadata = get_additional_metadata(input_trace, custom_model_cost, model_cost, prompt, response)
@@ -191,6 +212,9 @@ def rag_trace_json_converter(input_trace, custom_model_cost, trace_id, user_deta
191
212
 
192
213
  trace_aggregate["metadata"] = user_details.get("trace_user_detail", {}).get("metadata")
193
214
  trace_aggregate["metadata"].update(additional_metadata)
215
+ trace_aggregate["metadata"]["error"] = f"{error}"
216
+ additional_metadata["error"] = error if error else None
217
+
194
218
  additional_metadata.pop("total_cost")
195
219
  additional_metadata.pop("total_latency")
196
220
  return trace_aggregate, additional_metadata
@@ -212,14 +236,14 @@ def get_additional_metadata(spans, custom_model_cost, model_cost_dict, prompt=""
212
236
  additional_metadata["tokens"]["prompt"] = span["attributes"]["llm.token_count.prompt"]
213
237
 
214
238
  except:
215
- logger.warning("Warning: prompt token not found. using fallback strategies to get tokens.")
239
+ logger.debug("Warning: prompt token not found. using fallback strategies to get tokens.")
216
240
  try:
217
241
  additional_metadata["tokens"]["prompt"] = num_tokens_from_messages(
218
242
  model=additional_metadata["model_name"],
219
243
  message=prompt
220
244
  )
221
245
  except Exception as e:
222
- logger.warning(f"Failed to count prompt tokens: {str(e)}. Using 'gpt-4o-mini' model count as fallback.")
246
+ logger.debug(f"Failed to count prompt tokens: {str(e)}. Using 'gpt-4o-mini' model count as fallback.")
223
247
  additional_metadata["tokens"]["prompt"] = num_tokens_from_messages(
224
248
  model="gpt-4o-mini",
225
249
  message=prompt
@@ -228,14 +252,14 @@ def get_additional_metadata(spans, custom_model_cost, model_cost_dict, prompt=""
228
252
  try:
229
253
  additional_metadata["tokens"]["completion"] = span["attributes"]["llm.token_count.completion"]
230
254
  except:
231
- logger.warning("Warning: completion token not found. using fallback strategies to get tokens.")
255
+ logger.debug("Warning: completion token not found. using fallback strategies to get tokens.")
232
256
  try:
233
257
  additional_metadata["tokens"]["completion"] = num_tokens_from_messages(
234
258
  model=additional_metadata["model_name"],
235
259
  message=response
236
260
  )
237
261
  except Exception as e:
238
- logger.warning(f"Failed to count completion tokens: {str(e)}. Using 'gpt-4o-mini' model count as fallback.")
262
+ logger.debug(f"Failed to count completion tokens: {str(e)}. Using 'gpt-4o-mini' model count as fallback.")
239
263
  additional_metadata["tokens"]["completion"] = num_tokens_from_messages(
240
264
  model="gpt-4o-mini",
241
265
  message=response
@@ -299,96 +323,47 @@ def get_additional_metadata(spans, custom_model_cost, model_cost_dict, prompt=""
299
323
 
300
324
  def num_tokens_from_messages(model, message):
301
325
  try:
302
- # Handle None or empty message
303
326
  if not message:
304
- logger.warning("Empty or None message provided to token counter")
327
+ logger.error("Empty or None message provided to token counter")
305
328
  return 0
306
-
307
- # GPT models
308
- if re.match(r'^gpt-', model):
309
- """Check if the model is any GPT model (pattern: ^gpt-)
310
- This matches any model name that starts with 'gpt-'
311
- """
312
- def num_tokens_from_string(string: str, encoding_name: str) -> int:
313
- """Returns the number of tokens in a text string."""
329
+
330
+ def num_tokens_from_string(text_content: str, encoding_name: str) -> int:
331
+ """Returns the number of tokens in a text string."""
332
+ if isinstance(text_content, list):
333
+ list_str = str(text_content[0]) if text_content else ""
334
+ pattern = r"content=\'(.*?)\'(?:\s+additional_kwargs=|$)"
335
+ match = re.search(pattern, list_str, re.DOTALL)
336
+ if match:
337
+ text_content = match.group(1) # Extract content and process it for tokens
338
+ else:
339
+ text_content = list_str
340
+ try:
341
+ encoding = tiktoken.get_encoding(encoding_name)
342
+ return len(encoding.encode(text_content))
343
+ except Exception as e:
344
+ logger.warning(f"Error encoding with {encoding_name}: {str(e)}")
314
345
  try:
315
- encoding = tiktoken.get_encoding(encoding_name)
316
- num_tokens = len(encoding.encode(string))
317
- return num_tokens
318
- except Exception as e:
319
- logger.warning(f"Error encoding with {encoding_name}: {str(e)}")
320
- # Fallback to a different encoding if the requested one fails
321
- try:
322
- fallback_encoding = tiktoken.get_encoding("cl100k_base")
323
- return len(fallback_encoding.encode(string))
324
- except:
325
- logger.error("Failed to use fallback encoding")
326
- return 0
327
-
328
- if re.match(r'^gpt-4o.*', model):
329
- """Check for GPT-4 Optimized models (pattern: ^gpt-4o.*)
330
- Examples that match:
331
- - gpt-4o
332
- - gpt-4o-mini
333
- - gpt-4o-2024-08-06
334
- The .* allows for any characters after 'gpt-4o'
335
- """
346
+ fallback_encoding = tiktoken.get_encoding("cl100k_base")
347
+ return len(fallback_encoding.encode(text_content))
348
+ except:
349
+ logger.debug("Failed to use fallback encoding")
350
+ return 0
351
+
352
+ # Determine which encoding to use based on model name
353
+ encoding_name = "o200k_base"
354
+
355
+ if re.match(r'^gpt-', model):
356
+ if re.match(r'^gpt-(4o|4\.1).*', model):
357
+ # GPT-4o and GPT-4.1 models
336
358
  encoding_name = "o200k_base"
337
- return num_tokens_from_string(message, encoding_name)
338
-
339
359
  elif re.match(r'^gpt-(4|3\.5).*', model):
340
- """Check for GPT-4 and GPT-3.5 models (pattern: ^gpt-(4|3\.5).*)
341
- Uses cl100k_base encoding for GPT-4 and GPT-3.5 models
342
- Examples that match:
343
- - gpt-4
344
- - gpt-4-turbo
345
- - gpt-4-2024-08-06
346
- - gpt-3.5-turbo
347
- - gpt-3.5-turbo-16k
348
- """
360
+ # GPT-4 and GPT-3.5 models
349
361
  encoding_name = "cl100k_base"
350
- return num_tokens_from_string(message, encoding_name)
362
+ else:
363
+ logger.debug(f"Using default token counter for: {model}.")
351
364
 
352
- else:
353
- """Default case for any other GPT models
354
- Uses o200k_base encoding as the default tokenizer
355
- """
356
- return num_tokens_from_string(message, encoding_name="o200k_base")
365
+ return num_tokens_from_string(message, encoding_name)
357
366
 
358
-
359
- # Gemini models
360
- elif re.match(r'^gemini-', model):
361
- try:
362
- GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY")
363
- if not GOOGLE_API_KEY:
364
- logger.warning("GOOGLE_API_KEY not found in environment variables")
365
- return 0
366
-
367
- import google.generativeai as genai
368
- client = genai.Client(api_key=GOOGLE_API_KEY)
369
-
370
- response = client.models.count_tokens(
371
- model=model,
372
- contents=message,
373
- )
374
- return response.total_tokens
375
- except ImportError:
376
- logger.warning("google.generativeai module not found. Install with pip install google-generativeai")
377
- return 0
378
- except Exception as e:
379
- logger.warning(f"Error counting tokens for Gemini model: {str(e)}")
380
- return 0
381
-
382
- # Default case for unknown models
383
- else:
384
- logger.warning(f"Unknown model type: {model}. Using default token counter.")
385
- try:
386
- # Use cl100k_base as a fallback for unknown models
387
- encoding = tiktoken.get_encoding("cl100k_base")
388
- return len(encoding.encode(message))
389
- except:
390
- logger.error("Failed to use fallback encoding for unknown model")
391
- return 0
392
367
  except Exception as e:
393
368
  logger.error(f"Unexpected error in token counting: {str(e)}")
394
369
  return 0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ragaai_catalyst
3
- Version: 2.1.7.2b0
3
+ Version: 2.1.7.3
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
6
  Requires-Python: <=3.13.2,>=3.10
@@ -32,7 +32,7 @@ ragaai_catalyst/tracers/langchain_callback.py,sha256=CB75zzG3-DkYTELj0vI1MOHQTY0
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
34
  ragaai_catalyst/tracers/tracer.py,sha256=LHRd35rTFgYovxsI4tyXHgsCCdccO1_O1txFLFyLUKc,39069
35
- ragaai_catalyst/tracers/upload_traces.py,sha256=PEE_JhAmOAMKyb-pl4ZoFWhIePxJm1zs93crrk94iEg,5887
35
+ ragaai_catalyst/tracers/upload_traces.py,sha256=xVDciX7iYtxasehKISYsXmKR_-pnB-fRGlszSnBkqtc,6043
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
38
38
  ragaai_catalyst/tracers/agentic_tracing/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -80,16 +80,16 @@ ragaai_catalyst/tracers/exporters/raga_exporter.py,sha256=6xvjWXyh8XPkHKSLLmAZUQ
80
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
- ragaai_catalyst/tracers/utils/convert_langchain_callbacks_output.py,sha256=e0URuRWCdzpxuBLfL82FOTMjbRuDAkW8aIRi7s7Nocc,1655
83
+ ragaai_catalyst/tracers/utils/convert_langchain_callbacks_output.py,sha256=SehrD7q8ytAiUYoWr406b4mWs3Lk0Rcy6Ekkihh22TI,1703
84
84
  ragaai_catalyst/tracers/utils/convert_llama_instru_callback.py,sha256=8qLo7x4Zsn3dhJfSv9gviB60YXZ2TOsWEouucJmBM0c,1724
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=Y1xWS9aPBUt4cg1Rsgg6m3K6B9LuWBp2BXPliCmGk3E,20615
88
+ ragaai_catalyst/tracers/utils/rag_trace_json_converter.py,sha256=adCKk7Nj8307XYYg2sB-QT-66OShOs2iTGwNVwqbHig,19373
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.7.2b0.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
92
- ragaai_catalyst-2.1.7.2b0.dist-info/METADATA,sha256=gZkHYlK9kJaM3_kNJtTQzFbIYV1T18LokNMGtqdwHzQ,17607
93
- ragaai_catalyst-2.1.7.2b0.dist-info/WHEEL,sha256=pxyMxgL8-pra_rKaQ4drOZAegBVuX-G_4nRHjjgWbmo,91
94
- ragaai_catalyst-2.1.7.2b0.dist-info/top_level.txt,sha256=HpgsdRgEJMk8nqrU6qdCYk3di7MJkDL0B19lkc7dLfM,16
95
- ragaai_catalyst-2.1.7.2b0.dist-info/RECORD,,
91
+ ragaai_catalyst-2.1.7.3.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
92
+ ragaai_catalyst-2.1.7.3.dist-info/METADATA,sha256=mQ05LSLjmZkiOkRHe2SmSL0SmysTeZWOECduUWhQPuQ,17605
93
+ ragaai_catalyst-2.1.7.3.dist-info/WHEEL,sha256=ck4Vq1_RXyvS4Jt6SI0Vz6fyVs4GWg7AINwpsaGEgPE,91
94
+ ragaai_catalyst-2.1.7.3.dist-info/top_level.txt,sha256=HpgsdRgEJMk8nqrU6qdCYk3di7MJkDL0B19lkc7dLfM,16
95
+ ragaai_catalyst-2.1.7.3.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (79.0.0)
2
+ Generator: setuptools (80.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5