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.
- ragaai_catalyst/tracers/upload_traces.py +3 -0
- ragaai_catalyst/tracers/utils/convert_langchain_callbacks_output.py +1 -0
- ragaai_catalyst/tracers/utils/rag_trace_json_converter.py +63 -88
- {ragaai_catalyst-2.1.7.2b0.dist-info → ragaai_catalyst-2.1.7.3.dist-info}/METADATA +1 -1
- {ragaai_catalyst-2.1.7.2b0.dist-info → ragaai_catalyst-2.1.7.3.dist-info}/RECORD +8 -8
- {ragaai_catalyst-2.1.7.2b0.dist-info → ragaai_catalyst-2.1.7.3.dist-info}/WHEEL +1 -1
- {ragaai_catalyst-2.1.7.2b0.dist-info → ragaai_catalyst-2.1.7.3.dist-info}/licenses/LICENSE +0 -0
- {ragaai_catalyst-2.1.7.2b0.dist-info → ragaai_catalyst-2.1.7.3.dist-info}/top_level.txt +0 -0
@@ -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"}
|
@@ -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.
|
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.
|
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.
|
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.
|
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.
|
327
|
+
logger.error("Empty or None message provided to token counter")
|
305
328
|
return 0
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
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
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
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
|
-
|
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
|
-
|
362
|
+
else:
|
363
|
+
logger.debug(f"Using default token counter for: {model}.")
|
351
364
|
|
352
|
-
|
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.
|
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=
|
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=
|
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=
|
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.
|
92
|
-
ragaai_catalyst-2.1.7.
|
93
|
-
ragaai_catalyst-2.1.7.
|
94
|
-
ragaai_catalyst-2.1.7.
|
95
|
-
ragaai_catalyst-2.1.7.
|
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,,
|
File without changes
|
File without changes
|