ragaai-catalyst 2.1.5b7__py3-none-any.whl → 2.1.5b9__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/agentic_tracing/tracers/llm_tracer.py +0 -2
- ragaai_catalyst/tracers/agentic_tracing/utils/model_costs.json +132 -27
- ragaai_catalyst/tracers/langchain_callback.py +197 -46
- ragaai_catalyst/tracers/tracer.py +28 -44
- {ragaai_catalyst-2.1.5b7.dist-info → ragaai_catalyst-2.1.5b9.dist-info}/METADATA +1 -1
- {ragaai_catalyst-2.1.5b7.dist-info → ragaai_catalyst-2.1.5b9.dist-info}/RECORD +9 -9
- {ragaai_catalyst-2.1.5b7.dist-info → ragaai_catalyst-2.1.5b9.dist-info}/LICENSE +0 -0
- {ragaai_catalyst-2.1.5b7.dist-info → ragaai_catalyst-2.1.5b9.dist-info}/WHEEL +0 -0
- {ragaai_catalyst-2.1.5b7.dist-info → ragaai_catalyst-2.1.5b9.dist-info}/top_level.txt +0 -0
@@ -150,8 +150,6 @@ class LLMTracerMixin:
|
|
150
150
|
beta_module = openai_module.beta
|
151
151
|
|
152
152
|
# Patch openai.beta.threads
|
153
|
-
import openai
|
154
|
-
openai.api_type = "openai"
|
155
153
|
if hasattr(beta_module, "threads"):
|
156
154
|
threads_obj = beta_module.threads
|
157
155
|
# Patch top-level methods on openai.beta.threads
|
@@ -14,7 +14,8 @@
|
|
14
14
|
"supports_audio_output": true,
|
15
15
|
"supports_prompt_caching": true,
|
16
16
|
"supports_response_schema": true,
|
17
|
-
"supports_system_messages": true
|
17
|
+
"supports_system_messages": true,
|
18
|
+
"deprecation_date": "date when the model becomes deprecated in the format YYYY-MM-DD"
|
18
19
|
},
|
19
20
|
"omni-moderation-latest": {
|
20
21
|
"max_tokens": 32768,
|
@@ -441,7 +442,8 @@
|
|
441
442
|
"mode": "chat",
|
442
443
|
"supports_function_calling": true,
|
443
444
|
"supports_prompt_caching": true,
|
444
|
-
"supports_system_messages": true
|
445
|
+
"supports_system_messages": true,
|
446
|
+
"deprecation_date": "2025-06-06"
|
445
447
|
},
|
446
448
|
"gpt-4-32k": {
|
447
449
|
"max_tokens": 4096,
|
@@ -540,7 +542,8 @@
|
|
540
542
|
"mode": "chat",
|
541
543
|
"supports_vision": true,
|
542
544
|
"supports_prompt_caching": true,
|
543
|
-
"supports_system_messages": true
|
545
|
+
"supports_system_messages": true,
|
546
|
+
"deprecation_date": "2024-12-06"
|
544
547
|
},
|
545
548
|
"gpt-4-1106-vision-preview": {
|
546
549
|
"max_tokens": 4096,
|
@@ -552,7 +555,8 @@
|
|
552
555
|
"mode": "chat",
|
553
556
|
"supports_vision": true,
|
554
557
|
"supports_prompt_caching": true,
|
555
|
-
"supports_system_messages": true
|
558
|
+
"supports_system_messages": true,
|
559
|
+
"deprecation_date": "2024-12-06"
|
556
560
|
},
|
557
561
|
"gpt-3.5-turbo": {
|
558
562
|
"max_tokens": 4097,
|
@@ -1223,7 +1227,8 @@
|
|
1223
1227
|
"litellm_provider": "azure",
|
1224
1228
|
"mode": "chat",
|
1225
1229
|
"supports_function_calling": true,
|
1226
|
-
"supports_parallel_function_calling": true
|
1230
|
+
"supports_parallel_function_calling": true,
|
1231
|
+
"deprecation_date": "2025-03-31"
|
1227
1232
|
},
|
1228
1233
|
"azure/gpt-35-turbo-0613": {
|
1229
1234
|
"max_tokens": 4097,
|
@@ -1234,7 +1239,8 @@
|
|
1234
1239
|
"litellm_provider": "azure",
|
1235
1240
|
"mode": "chat",
|
1236
1241
|
"supports_function_calling": true,
|
1237
|
-
"supports_parallel_function_calling": true
|
1242
|
+
"supports_parallel_function_calling": true,
|
1243
|
+
"deprecation_date": "2025-02-13"
|
1238
1244
|
},
|
1239
1245
|
"azure/gpt-35-turbo-0301": {
|
1240
1246
|
"max_tokens": 4097,
|
@@ -1245,7 +1251,8 @@
|
|
1245
1251
|
"litellm_provider": "azure",
|
1246
1252
|
"mode": "chat",
|
1247
1253
|
"supports_function_calling": true,
|
1248
|
-
"supports_parallel_function_calling": true
|
1254
|
+
"supports_parallel_function_calling": true,
|
1255
|
+
"deprecation_date": "2025-02-13"
|
1249
1256
|
},
|
1250
1257
|
"azure/gpt-35-turbo-0125": {
|
1251
1258
|
"max_tokens": 4096,
|
@@ -1256,7 +1263,8 @@
|
|
1256
1263
|
"litellm_provider": "azure",
|
1257
1264
|
"mode": "chat",
|
1258
1265
|
"supports_function_calling": true,
|
1259
|
-
"supports_parallel_function_calling": true
|
1266
|
+
"supports_parallel_function_calling": true,
|
1267
|
+
"deprecation_date": "2025-03-31"
|
1260
1268
|
},
|
1261
1269
|
"azure/gpt-35-turbo-16k": {
|
1262
1270
|
"max_tokens": 4096,
|
@@ -2042,6 +2050,84 @@
|
|
2042
2050
|
"supports_function_calling": true,
|
2043
2051
|
"supports_vision": true
|
2044
2052
|
},
|
2053
|
+
"xai/grok-2-vision-1212": {
|
2054
|
+
"max_tokens": 32768,
|
2055
|
+
"max_input_tokens": 32768,
|
2056
|
+
"max_output_tokens": 32768,
|
2057
|
+
"input_cost_per_token": 2e-06,
|
2058
|
+
"input_cost_per_image": 2e-06,
|
2059
|
+
"output_cost_per_token": 1e-05,
|
2060
|
+
"litellm_provider": "xai",
|
2061
|
+
"mode": "chat",
|
2062
|
+
"supports_function_calling": true,
|
2063
|
+
"supports_vision": true
|
2064
|
+
},
|
2065
|
+
"xai/grok-2-vision-latest": {
|
2066
|
+
"max_tokens": 32768,
|
2067
|
+
"max_input_tokens": 32768,
|
2068
|
+
"max_output_tokens": 32768,
|
2069
|
+
"input_cost_per_token": 2e-06,
|
2070
|
+
"input_cost_per_image": 2e-06,
|
2071
|
+
"output_cost_per_token": 1e-05,
|
2072
|
+
"litellm_provider": "xai",
|
2073
|
+
"mode": "chat",
|
2074
|
+
"supports_function_calling": true,
|
2075
|
+
"supports_vision": true
|
2076
|
+
},
|
2077
|
+
"xai/grok-2-vision": {
|
2078
|
+
"max_tokens": 32768,
|
2079
|
+
"max_input_tokens": 32768,
|
2080
|
+
"max_output_tokens": 32768,
|
2081
|
+
"input_cost_per_token": 2e-06,
|
2082
|
+
"input_cost_per_image": 2e-06,
|
2083
|
+
"output_cost_per_token": 1e-05,
|
2084
|
+
"litellm_provider": "xai",
|
2085
|
+
"mode": "chat",
|
2086
|
+
"supports_function_calling": true,
|
2087
|
+
"supports_vision": true
|
2088
|
+
},
|
2089
|
+
"xai/grok-vision-beta": {
|
2090
|
+
"max_tokens": 8192,
|
2091
|
+
"max_input_tokens": 8192,
|
2092
|
+
"max_output_tokens": 8192,
|
2093
|
+
"input_cost_per_token": 5e-06,
|
2094
|
+
"input_cost_per_image": 5e-06,
|
2095
|
+
"output_cost_per_token": 1.5e-05,
|
2096
|
+
"litellm_provider": "xai",
|
2097
|
+
"mode": "chat",
|
2098
|
+
"supports_function_calling": true,
|
2099
|
+
"supports_vision": true
|
2100
|
+
},
|
2101
|
+
"xai/grok-2-1212": {
|
2102
|
+
"max_tokens": 131072,
|
2103
|
+
"max_input_tokens": 131072,
|
2104
|
+
"max_output_tokens": 131072,
|
2105
|
+
"input_cost_per_token": 2e-06,
|
2106
|
+
"output_cost_per_token": 1e-05,
|
2107
|
+
"litellm_provider": "xai",
|
2108
|
+
"mode": "chat",
|
2109
|
+
"supports_function_calling": true
|
2110
|
+
},
|
2111
|
+
"xai/grok-2": {
|
2112
|
+
"max_tokens": 131072,
|
2113
|
+
"max_input_tokens": 131072,
|
2114
|
+
"max_output_tokens": 131072,
|
2115
|
+
"input_cost_per_token": 2e-06,
|
2116
|
+
"output_cost_per_token": 1e-05,
|
2117
|
+
"litellm_provider": "xai",
|
2118
|
+
"mode": "chat",
|
2119
|
+
"supports_function_calling": true
|
2120
|
+
},
|
2121
|
+
"xai/grok-2-latest": {
|
2122
|
+
"max_tokens": 131072,
|
2123
|
+
"max_input_tokens": 131072,
|
2124
|
+
"max_output_tokens": 131072,
|
2125
|
+
"input_cost_per_token": 2e-06,
|
2126
|
+
"output_cost_per_token": 1e-05,
|
2127
|
+
"litellm_provider": "xai",
|
2128
|
+
"mode": "chat",
|
2129
|
+
"supports_function_calling": true
|
2130
|
+
},
|
2045
2131
|
"deepseek/deepseek-coder": {
|
2046
2132
|
"max_tokens": 4096,
|
2047
2133
|
"max_input_tokens": 128000,
|
@@ -2353,7 +2439,8 @@
|
|
2353
2439
|
"tool_use_system_prompt_tokens": 264,
|
2354
2440
|
"supports_assistant_prefill": true,
|
2355
2441
|
"supports_prompt_caching": true,
|
2356
|
-
"supports_response_schema": true
|
2442
|
+
"supports_response_schema": true,
|
2443
|
+
"deprecation_date": "2025-03-01"
|
2357
2444
|
},
|
2358
2445
|
"claude-3-5-haiku-20241022": {
|
2359
2446
|
"max_tokens": 8192,
|
@@ -2369,7 +2456,8 @@
|
|
2369
2456
|
"tool_use_system_prompt_tokens": 264,
|
2370
2457
|
"supports_assistant_prefill": true,
|
2371
2458
|
"supports_prompt_caching": true,
|
2372
|
-
"supports_response_schema": true
|
2459
|
+
"supports_response_schema": true,
|
2460
|
+
"deprecation_date": "2025-10-01"
|
2373
2461
|
},
|
2374
2462
|
"claude-3-opus-20240229": {
|
2375
2463
|
"max_tokens": 4096,
|
@@ -2386,7 +2474,8 @@
|
|
2386
2474
|
"tool_use_system_prompt_tokens": 395,
|
2387
2475
|
"supports_assistant_prefill": true,
|
2388
2476
|
"supports_prompt_caching": true,
|
2389
|
-
"supports_response_schema": true
|
2477
|
+
"supports_response_schema": true,
|
2478
|
+
"deprecation_date": "2025-03-01"
|
2390
2479
|
},
|
2391
2480
|
"claude-3-sonnet-20240229": {
|
2392
2481
|
"max_tokens": 4096,
|
@@ -2401,7 +2490,8 @@
|
|
2401
2490
|
"tool_use_system_prompt_tokens": 159,
|
2402
2491
|
"supports_assistant_prefill": true,
|
2403
2492
|
"supports_prompt_caching": true,
|
2404
|
-
"supports_response_schema": true
|
2493
|
+
"supports_response_schema": true,
|
2494
|
+
"deprecation_date": "2025-07-21"
|
2405
2495
|
},
|
2406
2496
|
"claude-3-5-sonnet-20240620": {
|
2407
2497
|
"max_tokens": 8192,
|
@@ -2418,7 +2508,8 @@
|
|
2418
2508
|
"tool_use_system_prompt_tokens": 159,
|
2419
2509
|
"supports_assistant_prefill": true,
|
2420
2510
|
"supports_prompt_caching": true,
|
2421
|
-
"supports_response_schema": true
|
2511
|
+
"supports_response_schema": true,
|
2512
|
+
"deprecation_date": "2025-06-01"
|
2422
2513
|
},
|
2423
2514
|
"claude-3-5-sonnet-20241022": {
|
2424
2515
|
"max_tokens": 8192,
|
@@ -2436,7 +2527,8 @@
|
|
2436
2527
|
"supports_assistant_prefill": true,
|
2437
2528
|
"supports_pdf_input": true,
|
2438
2529
|
"supports_prompt_caching": true,
|
2439
|
-
"supports_response_schema": true
|
2530
|
+
"supports_response_schema": true,
|
2531
|
+
"deprecation_date": "2025-10-01"
|
2440
2532
|
},
|
2441
2533
|
"text-bison": {
|
2442
2534
|
"max_tokens": 2048,
|
@@ -2546,7 +2638,8 @@
|
|
2546
2638
|
"output_cost_per_character": 5e-07,
|
2547
2639
|
"litellm_provider": "vertex_ai-chat-models",
|
2548
2640
|
"mode": "chat",
|
2549
|
-
"source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#foundation_models"
|
2641
|
+
"source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#foundation_models",
|
2642
|
+
"deprecation_date": "2025-04-09"
|
2550
2643
|
},
|
2551
2644
|
"chat-bison-32k": {
|
2552
2645
|
"max_tokens": 8192,
|
@@ -2787,7 +2880,8 @@
|
|
2787
2880
|
"litellm_provider": "vertex_ai-language-models",
|
2788
2881
|
"mode": "chat",
|
2789
2882
|
"supports_function_calling": true,
|
2790
|
-
"source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#foundation_models"
|
2883
|
+
"source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#foundation_models",
|
2884
|
+
"deprecation_date": "2025-04-09"
|
2791
2885
|
},
|
2792
2886
|
"gemini-1.0-ultra": {
|
2793
2887
|
"max_tokens": 8192,
|
@@ -2832,7 +2926,8 @@
|
|
2832
2926
|
"litellm_provider": "vertex_ai-language-models",
|
2833
2927
|
"mode": "chat",
|
2834
2928
|
"supports_function_calling": true,
|
2835
|
-
"source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#foundation_models"
|
2929
|
+
"source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#foundation_models",
|
2930
|
+
"deprecation_date": "2025-04-09"
|
2836
2931
|
},
|
2837
2932
|
"gemini-1.5-pro": {
|
2838
2933
|
"max_tokens": 8192,
|
@@ -2914,7 +3009,8 @@
|
|
2914
3009
|
"supports_function_calling": true,
|
2915
3010
|
"supports_tool_choice": true,
|
2916
3011
|
"supports_response_schema": true,
|
2917
|
-
"source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#foundation_models"
|
3012
|
+
"source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#foundation_models",
|
3013
|
+
"deprecation_date": "2025-05-24"
|
2918
3014
|
},
|
2919
3015
|
"gemini-1.5-pro-preview-0514": {
|
2920
3016
|
"max_tokens": 8192,
|
@@ -3119,7 +3215,8 @@
|
|
3119
3215
|
"supports_function_calling": true,
|
3120
3216
|
"supports_vision": true,
|
3121
3217
|
"supports_response_schema": true,
|
3122
|
-
"source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#foundation_models"
|
3218
|
+
"source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#foundation_models",
|
3219
|
+
"deprecation_date": "2025-05-24"
|
3123
3220
|
},
|
3124
3221
|
"gemini-1.5-flash-preview-0514": {
|
3125
3222
|
"max_tokens": 8192,
|
@@ -3223,7 +3320,8 @@
|
|
3223
3320
|
"mode": "chat",
|
3224
3321
|
"supports_function_calling": true,
|
3225
3322
|
"supports_vision": true,
|
3226
|
-
"source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#foundation_models"
|
3323
|
+
"source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#foundation_models",
|
3324
|
+
"deprecation_date": "2025-04-09"
|
3227
3325
|
},
|
3228
3326
|
"medlm-medium": {
|
3229
3327
|
"max_tokens": 8192,
|
@@ -3929,7 +4027,8 @@
|
|
3929
4027
|
"supports_prompt_caching": true,
|
3930
4028
|
"tpm": 4000000,
|
3931
4029
|
"rpm": 2000,
|
3932
|
-
"source": "https://ai.google.dev/pricing"
|
4030
|
+
"source": "https://ai.google.dev/pricing",
|
4031
|
+
"deprecation_date": "2025-05-24"
|
3933
4032
|
},
|
3934
4033
|
"gemini/gemini-1.5-flash": {
|
3935
4034
|
"max_tokens": 8192,
|
@@ -4205,7 +4304,8 @@
|
|
4205
4304
|
"supports_prompt_caching": true,
|
4206
4305
|
"tpm": 4000000,
|
4207
4306
|
"rpm": 1000,
|
4208
|
-
"source": "https://ai.google.dev/pricing"
|
4307
|
+
"source": "https://ai.google.dev/pricing",
|
4308
|
+
"deprecation_date": "2025-05-24"
|
4209
4309
|
},
|
4210
4310
|
"gemini/gemini-1.5-pro-exp-0801": {
|
4211
4311
|
"max_tokens": 8192,
|
@@ -7341,7 +7441,8 @@
|
|
7341
7441
|
"input_cost_per_token": 5e-06,
|
7342
7442
|
"output_cost_per_token": 5e-06,
|
7343
7443
|
"litellm_provider": "perplexity",
|
7344
|
-
"mode": "chat"
|
7444
|
+
"mode": "chat",
|
7445
|
+
"deprecation_date": "2025-02-22"
|
7345
7446
|
},
|
7346
7447
|
"perplexity/llama-3.1-sonar-large-128k-online": {
|
7347
7448
|
"max_tokens": 127072,
|
@@ -7350,7 +7451,8 @@
|
|
7350
7451
|
"input_cost_per_token": 1e-06,
|
7351
7452
|
"output_cost_per_token": 1e-06,
|
7352
7453
|
"litellm_provider": "perplexity",
|
7353
|
-
"mode": "chat"
|
7454
|
+
"mode": "chat",
|
7455
|
+
"deprecation_date": "2025-02-22"
|
7354
7456
|
},
|
7355
7457
|
"perplexity/llama-3.1-sonar-large-128k-chat": {
|
7356
7458
|
"max_tokens": 131072,
|
@@ -7359,7 +7461,8 @@
|
|
7359
7461
|
"input_cost_per_token": 1e-06,
|
7360
7462
|
"output_cost_per_token": 1e-06,
|
7361
7463
|
"litellm_provider": "perplexity",
|
7362
|
-
"mode": "chat"
|
7464
|
+
"mode": "chat",
|
7465
|
+
"deprecation_date": "2025-02-22"
|
7363
7466
|
},
|
7364
7467
|
"perplexity/llama-3.1-sonar-small-128k-chat": {
|
7365
7468
|
"max_tokens": 131072,
|
@@ -7368,7 +7471,8 @@
|
|
7368
7471
|
"input_cost_per_token": 2e-07,
|
7369
7472
|
"output_cost_per_token": 2e-07,
|
7370
7473
|
"litellm_provider": "perplexity",
|
7371
|
-
"mode": "chat"
|
7474
|
+
"mode": "chat",
|
7475
|
+
"deprecation_date": "2025-02-22"
|
7372
7476
|
},
|
7373
7477
|
"perplexity/llama-3.1-sonar-small-128k-online": {
|
7374
7478
|
"max_tokens": 127072,
|
@@ -7377,7 +7481,8 @@
|
|
7377
7481
|
"input_cost_per_token": 2e-07,
|
7378
7482
|
"output_cost_per_token": 2e-07,
|
7379
7483
|
"litellm_provider": "perplexity",
|
7380
|
-
"mode": "chat"
|
7484
|
+
"mode": "chat",
|
7485
|
+
"deprecation_date": "2025-02-22"
|
7381
7486
|
},
|
7382
7487
|
"perplexity/pplx-7b-chat": {
|
7383
7488
|
"max_tokens": 8192,
|
@@ -48,8 +48,9 @@ class LangchainTracer(BaseCallbackHandler):
|
|
48
48
|
self._original_methods = {}
|
49
49
|
self.additional_metadata = {}
|
50
50
|
self._save_task = None
|
51
|
-
self._current_query = None
|
51
|
+
self._current_query = None
|
52
52
|
self.filepath = None
|
53
|
+
self.model_names = {} # Store model names by component instance
|
53
54
|
logger.setLevel(log_level)
|
54
55
|
|
55
56
|
if not os.path.exists(output_path):
|
@@ -86,7 +87,7 @@ class LangchainTracer(BaseCallbackHandler):
|
|
86
87
|
"retriever_actions": [],
|
87
88
|
"tokens": [],
|
88
89
|
"errors": [],
|
89
|
-
"query": self._current_query,
|
90
|
+
"query": self._current_query,
|
90
91
|
"metadata": {
|
91
92
|
"version": "2.0",
|
92
93
|
"trace_all": self.trace_all,
|
@@ -172,6 +173,15 @@ class LangchainTracer(BaseCallbackHandler):
|
|
172
173
|
kwargs_copy['callbacks'] = [self]
|
173
174
|
elif self not in kwargs_copy['callbacks']:
|
174
175
|
kwargs_copy['callbacks'].append(self)
|
176
|
+
|
177
|
+
# Store model name if available
|
178
|
+
if component_name in ["OpenAI", "ChatOpenAI_LangchainOpenAI", "ChatOpenAI_ChatModels",
|
179
|
+
"ChatVertexAI", "VertexAI", "ChatGoogleGenerativeAI", "ChatAnthropic",
|
180
|
+
"ChatLiteLLM"]:
|
181
|
+
instance = args[0] if args else None
|
182
|
+
model_name = kwargs.get('model_name') or kwargs.get('model')
|
183
|
+
if instance and model_name:
|
184
|
+
self.model_names[id(instance)] = model_name
|
175
185
|
|
176
186
|
# Try different method signatures
|
177
187
|
try:
|
@@ -201,28 +211,57 @@ class LangchainTracer(BaseCallbackHandler):
|
|
201
211
|
|
202
212
|
def _monkey_patch(self):
|
203
213
|
"""Enhanced monkey-patching with comprehensive component support"""
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
"
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
"
|
222
|
-
|
223
|
-
"
|
224
|
-
|
225
|
-
|
214
|
+
components_to_patch = {}
|
215
|
+
|
216
|
+
try:
|
217
|
+
from langchain.llms import OpenAI
|
218
|
+
components_to_patch["OpenAI"] = (OpenAI, "__init__")
|
219
|
+
except ImportError:
|
220
|
+
logger.debug("OpenAI not available for patching")
|
221
|
+
|
222
|
+
try:
|
223
|
+
from langchain_google_vertexai import ChatVertexAI, VertexAI
|
224
|
+
components_to_patch["ChatVertexAI"] = (ChatVertexAI, "__init__")
|
225
|
+
components_to_patch["VertexAI"] = (VertexAI, "__init__")
|
226
|
+
except ImportError:
|
227
|
+
logger.debug("ChatVertexAI/VertexAI not available for patching")
|
228
|
+
|
229
|
+
try:
|
230
|
+
from langchain_google_genai import ChatGoogleGenerativeAI
|
231
|
+
components_to_patch["ChatGoogleGenerativeAI"] = (ChatGoogleGenerativeAI, "__init__")
|
232
|
+
except ImportError:
|
233
|
+
logger.debug("ChatGoogleGenerativeAI not available for patching")
|
234
|
+
|
235
|
+
try:
|
236
|
+
from langchain_anthropic import ChatAnthropic
|
237
|
+
components_to_patch["ChatAnthropic"] = (ChatAnthropic, "__init__")
|
238
|
+
except ImportError:
|
239
|
+
logger.debug("ChatAnthropic not available for patching")
|
240
|
+
|
241
|
+
try:
|
242
|
+
from langchain_community.chat_models import ChatLiteLLM
|
243
|
+
components_to_patch["ChatLiteLLM"] = (ChatLiteLLM, "__init__")
|
244
|
+
except ImportError:
|
245
|
+
logger.debug("ChatLiteLLM not available for patching")
|
246
|
+
|
247
|
+
try:
|
248
|
+
from langchain_openai import ChatOpenAI as ChatOpenAI_LangchainOpenAI
|
249
|
+
components_to_patch["ChatOpenAI_LangchainOpenAI"] = (ChatOpenAI_LangchainOpenAI, "__init__")
|
250
|
+
except ImportError:
|
251
|
+
logger.debug("ChatOpenAI_LangchainOpenAI not available for patching")
|
252
|
+
|
253
|
+
try:
|
254
|
+
from langchain.chat_models import ChatOpenAI as ChatOpenAI_ChatModels
|
255
|
+
components_to_patch["ChatOpenAI_ChatModels"] = (ChatOpenAI_ChatModels, "__init__")
|
256
|
+
except ImportError:
|
257
|
+
logger.debug("ChatOpenAI_ChatModels not available for patching")
|
258
|
+
|
259
|
+
try:
|
260
|
+
from langchain.chains import create_retrieval_chain, RetrievalQA
|
261
|
+
components_to_patch["RetrievalQA"] = (RetrievalQA, "from_chain_type")
|
262
|
+
components_to_patch["create_retrieval_chain"] = (create_retrieval_chain, None)
|
263
|
+
except ImportError:
|
264
|
+
logger.debug("Langchain chains not available for patching")
|
226
265
|
|
227
266
|
for name, (component, method_name) in components_to_patch.items():
|
228
267
|
try:
|
@@ -249,21 +288,48 @@ class LangchainTracer(BaseCallbackHandler):
|
|
249
288
|
|
250
289
|
def _restore_original_methods(self):
|
251
290
|
"""Restore all original methods and functions with enhanced error handling"""
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
291
|
+
# Dynamically import only what we need based on what was patched
|
292
|
+
imported_components = {}
|
293
|
+
|
294
|
+
if self._original_inits or self._original_methods:
|
295
|
+
for name in list(self._original_inits.keys()) + list(self._original_methods.keys()):
|
296
|
+
try:
|
297
|
+
if name == "OpenAI":
|
298
|
+
from langchain.llms import OpenAI
|
299
|
+
imported_components[name] = OpenAI
|
300
|
+
elif name == "ChatVertexAI":
|
301
|
+
from langchain_google_vertexai import ChatVertexAI
|
302
|
+
imported_components[name] = ChatVertexAI
|
303
|
+
elif name == "VertexAI":
|
304
|
+
from langchain_google_vertexai import VertexAI
|
305
|
+
imported_components[name] = VertexAI
|
306
|
+
elif name == "ChatGoogleGenerativeAI":
|
307
|
+
from langchain_google_genai import ChatGoogleGenerativeAI
|
308
|
+
imported_components[name] = ChatGoogleGenerativeAI
|
309
|
+
elif name == "ChatAnthropic":
|
310
|
+
from langchain_anthropic import ChatAnthropic
|
311
|
+
imported_components[name] = ChatAnthropic
|
312
|
+
elif name == "ChatLiteLLM":
|
313
|
+
from langchain_community.chat_models import ChatLiteLLM
|
314
|
+
imported_components[name] = ChatLiteLLM
|
315
|
+
elif name == "ChatOpenAI_LangchainOpenAI":
|
316
|
+
from langchain_openai import ChatOpenAI as ChatOpenAI_LangchainOpenAI
|
317
|
+
imported_components[name] = ChatOpenAI_LangchainOpenAI
|
318
|
+
elif name == "ChatOpenAI_ChatModels":
|
319
|
+
from langchain.chat_models import ChatOpenAI as ChatOpenAI_ChatModels
|
320
|
+
imported_components[name] = ChatOpenAI_ChatModels
|
321
|
+
elif name in ["RetrievalQA", "create_retrieval_chain"]:
|
322
|
+
from langchain.chains import create_retrieval_chain, RetrievalQA
|
323
|
+
imported_components["RetrievalQA"] = RetrievalQA
|
324
|
+
imported_components["create_retrieval_chain"] = create_retrieval_chain
|
325
|
+
except ImportError:
|
326
|
+
logger.debug(f"{name} not available for restoration")
|
262
327
|
|
263
328
|
for name, original in self._original_inits.items():
|
264
329
|
try:
|
265
|
-
|
266
|
-
|
330
|
+
if name in imported_components:
|
331
|
+
component = imported_components[name]
|
332
|
+
component.__init__ = original
|
267
333
|
except Exception as e:
|
268
334
|
logger.error(f"Error restoring {name}: {e}")
|
269
335
|
self.on_error(e, context=f"restore_{name}")
|
@@ -272,10 +338,12 @@ class LangchainTracer(BaseCallbackHandler):
|
|
272
338
|
try:
|
273
339
|
if "." in name:
|
274
340
|
module_name, method_name = name.rsplit(".", 1)
|
275
|
-
|
276
|
-
|
341
|
+
if module_name in imported_components:
|
342
|
+
module = imported_components[module_name]
|
343
|
+
setattr(module, method_name, original)
|
277
344
|
else:
|
278
|
-
|
345
|
+
if name in imported_components:
|
346
|
+
globals()[name] = original
|
279
347
|
except Exception as e:
|
280
348
|
logger.error(f"Error restoring {name}: {e}")
|
281
349
|
self.on_error(e, context=f"restore_{name}")
|
@@ -359,16 +427,99 @@ class LangchainTracer(BaseCallbackHandler):
|
|
359
427
|
}
|
360
428
|
)
|
361
429
|
|
430
|
+
# Calculate latency
|
362
431
|
end_time = datetime.now()
|
363
|
-
|
432
|
+
latency = (end_time - self.current_trace["start_time"]).total_seconds()
|
364
433
|
|
434
|
+
# Check if values are there in llm_output
|
435
|
+
model = ""
|
436
|
+
prompt_tokens = 0
|
437
|
+
completion_tokens = 0
|
438
|
+
total_tokens = 0
|
439
|
+
|
440
|
+
# Try to get model name from llm_output first
|
365
441
|
if response and response.llm_output:
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
442
|
+
try:
|
443
|
+
model = response.llm_output.get("model_name")
|
444
|
+
if not model:
|
445
|
+
model = response.llm_output.get("model", "")
|
446
|
+
except Exception as e:
|
447
|
+
# logger.debug(f"Error getting model name: {e}")
|
448
|
+
model = ""
|
449
|
+
|
450
|
+
# Add model name
|
451
|
+
if not model:
|
452
|
+
try:
|
453
|
+
model = response.llm_output.get("model_name")
|
454
|
+
if not model:
|
455
|
+
model = response.llm_output.get("model", "")
|
456
|
+
except Exception as e:
|
457
|
+
# logger.debug(f"Error getting model name: {e}")
|
458
|
+
model = ""
|
459
|
+
|
460
|
+
|
461
|
+
# Add token usage
|
462
|
+
try:
|
463
|
+
token_usage = response.llm_output.get("token_usage", {})
|
464
|
+
if token_usage=={}:
|
465
|
+
try:
|
466
|
+
token_usage = response.llm_output.get("usage")
|
467
|
+
except Exception as e:
|
468
|
+
# logger.debug(f"Error getting token usage: {e}")
|
469
|
+
token_usage = {}
|
470
|
+
|
471
|
+
if token_usage !={}:
|
472
|
+
prompt_tokens = token_usage.get("prompt_tokens", 0)
|
473
|
+
if prompt_tokens==0:
|
474
|
+
prompt_tokens = token_usage.get("input_tokens", 0)
|
475
|
+
completion_tokens = token_usage.get("completion_tokens", 0)
|
476
|
+
if completion_tokens==0:
|
477
|
+
completion_tokens = token_usage.get("output_tokens", 0)
|
478
|
+
|
479
|
+
total_tokens = prompt_tokens + completion_tokens
|
480
|
+
except Exception as e:
|
481
|
+
# logger.debug(f"Error getting token usage: {e}")
|
482
|
+
prompt_tokens = 0
|
483
|
+
completion_tokens = 0
|
484
|
+
total_tokens = 0
|
485
|
+
|
486
|
+
# Check if values are there in
|
487
|
+
if prompt_tokens == 0 and completion_tokens == 0:
|
488
|
+
try:
|
489
|
+
usage_data = response.generations[0][0].message.usage_metadata
|
490
|
+
prompt_tokens = usage_data.get("input_tokens", 0)
|
491
|
+
completion_tokens = usage_data.get("output_tokens", 0)
|
492
|
+
total_tokens = prompt_tokens + completion_tokens
|
493
|
+
except Exception as e:
|
494
|
+
# logger.debug(f"Error getting usage data: {e}")
|
495
|
+
try:
|
496
|
+
usage_data = response.generations[0][0].generation_info['usage_metadata']
|
497
|
+
prompt_tokens = usage_data.get("prompt_token_count", 0)
|
498
|
+
completion_tokens = usage_data.get("candidates_token_count", 0)
|
499
|
+
total_tokens = prompt_tokens + completion_tokens
|
500
|
+
except Exception as e:
|
501
|
+
# logger.debug(f"Error getting token usage: {e}")
|
502
|
+
prompt_tokens = 0
|
503
|
+
completion_tokens = 0
|
504
|
+
total_tokens = 0
|
505
|
+
|
506
|
+
# If no model name in llm_output, try to get it from stored model names
|
507
|
+
try:
|
508
|
+
if model == "":
|
509
|
+
model = list(self.model_names.values())[0]
|
510
|
+
except Exception as e:
|
511
|
+
model=""
|
512
|
+
|
513
|
+
self.additional_metadata = {
|
514
|
+
'latency': latency,
|
515
|
+
'model_name': model,
|
516
|
+
'tokens': {
|
517
|
+
'prompt': prompt_tokens,
|
518
|
+
'completion': completion_tokens,
|
519
|
+
'total': total_tokens
|
520
|
+
}
|
521
|
+
}
|
522
|
+
|
372
523
|
except Exception as e:
|
373
524
|
self.on_error(e, context="llm_end")
|
374
525
|
|
@@ -283,64 +283,48 @@ class Tracer(AgenticTracing):
|
|
283
283
|
data, additional_metadata = self.langchain_tracer.stop()
|
284
284
|
|
285
285
|
# Add cost if possible
|
286
|
-
|
286
|
+
# import pdb; pdb.set_trace()
|
287
|
+
if additional_metadata['model_name']:
|
287
288
|
try:
|
288
289
|
model_cost_data = self.model_cost_dict[additional_metadata['model_name']]
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
logger.warning("Token information missing in additional_metadata")
|
290
|
+
prompt_cost = additional_metadata["tokens"]["prompt"]*model_cost_data["input_cost_per_token"]
|
291
|
+
completion_cost = additional_metadata["tokens"]["completion"]*model_cost_data["output_cost_per_token"]
|
292
|
+
# additional_metadata.setdefault('cost', {})["prompt_cost"] = prompt_cost
|
293
|
+
# additional_metadata.setdefault('cost', {})["completion_cost"] = completion_cost
|
294
|
+
additional_metadata.setdefault('cost', {})["total_cost"] = prompt_cost + completion_cost
|
295
295
|
except Exception as e:
|
296
296
|
logger.warning(f"Error adding cost: {e}")
|
297
|
-
else:
|
298
|
-
logger.debug("Model name not available in additional_metadata, skipping cost calculation")
|
299
|
-
|
300
|
-
# Safely get total tokens and cost
|
301
|
-
if 'tokens' in additional_metadata and 'total' in additional_metadata['tokens']:
|
302
|
-
additional_metadata["total_tokens"] = additional_metadata["tokens"]["total"]
|
303
|
-
else:
|
304
|
-
additional_metadata["total_tokens"] = 0
|
305
|
-
logger.warning("Total tokens information not available")
|
306
297
|
|
307
|
-
|
298
|
+
# with open(filepath, 'r') as f:
|
299
|
+
# data = json.load(f)
|
300
|
+
additional_metadata["total_tokens"] = additional_metadata["tokens"]["total"]
|
301
|
+
del additional_metadata["tokens"]
|
302
|
+
if "cost" in additional_metadata:
|
308
303
|
additional_metadata["total_cost"] = additional_metadata["cost"]["total_cost"]
|
304
|
+
del additional_metadata["cost"]
|
309
305
|
else:
|
310
306
|
additional_metadata["total_cost"] = 0.0
|
311
|
-
logger.warning("Total cost information not available")
|
312
|
-
|
313
|
-
# Safely remove tokens and cost dictionaries if they exist
|
314
|
-
additional_metadata.pop("tokens", None)
|
315
|
-
additional_metadata.pop("cost", None)
|
316
307
|
|
317
|
-
|
318
|
-
combined_metadata
|
319
|
-
|
320
|
-
combined_metadata.update(user_detail['trace_user_detail']['metadata'])
|
321
|
-
if additional_metadata:
|
322
|
-
combined_metadata.update(additional_metadata)
|
308
|
+
combined_metadata = user_detail['trace_user_detail']['metadata'].copy()
|
309
|
+
combined_metadata.update(additional_metadata)
|
310
|
+
combined_metadata
|
323
311
|
|
324
312
|
langchain_traces = langchain_tracer_extraction(data)
|
325
313
|
final_result = convert_langchain_callbacks_output(langchain_traces)
|
314
|
+
final_result[0]['project_name'] = user_detail['project_name']
|
315
|
+
final_result[0]['trace_id'] = str(uuid.uuid4())
|
316
|
+
final_result[0]['session_id'] = None
|
317
|
+
final_result[0]['metadata'] = combined_metadata
|
318
|
+
final_result[0]['pipeline'] = user_detail['trace_user_detail']['pipeline']
|
319
|
+
|
320
|
+
filepath_3 = os.path.join(os.getcwd(), "final_result.json")
|
321
|
+
with open(filepath_3, 'w') as f:
|
322
|
+
json.dump(final_result, f, indent=2)
|
326
323
|
|
327
|
-
|
328
|
-
|
329
|
-
final_result[0]['project_name'] = user_detail.get('project_name', '')
|
330
|
-
final_result[0]['trace_id'] = str(uuid.uuid4())
|
331
|
-
final_result[0]['session_id'] = None
|
332
|
-
final_result[0]['metadata'] = combined_metadata
|
333
|
-
final_result[0]['pipeline'] = user_detail.get('trace_user_detail', {}).get('pipeline')
|
334
|
-
|
335
|
-
filepath_3 = os.path.join(os.getcwd(), "final_result.json")
|
336
|
-
with open(filepath_3, 'w') as f:
|
337
|
-
json.dump(final_result, f, indent=2)
|
338
|
-
|
339
|
-
print(filepath_3)
|
340
|
-
else:
|
341
|
-
logger.warning("No valid langchain traces found in final_result")
|
324
|
+
|
325
|
+
print(filepath_3)
|
342
326
|
|
343
|
-
additional_metadata_keys =
|
327
|
+
additional_metadata_keys = additional_metadata.keys() if additional_metadata else None
|
344
328
|
|
345
329
|
UploadTraces(json_file_path=filepath_3,
|
346
330
|
project_name=self.project_name,
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: ragaai_catalyst
|
3
|
-
Version: 2.1.
|
3
|
+
Version: 2.1.5b9
|
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,9 +13,9 @@ 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=LfgTes-nHpazssbGKnn8kyLZNr49kIPrlkrqqoTFTfc,301
|
15
15
|
ragaai_catalyst/tracers/distributed.py,sha256=AIRvS5Ur4jbFDXsUkYuCTmtGoHHx3LOG4n5tWOh610U,10330
|
16
|
-
ragaai_catalyst/tracers/langchain_callback.py,sha256=
|
16
|
+
ragaai_catalyst/tracers/langchain_callback.py,sha256=yR6TdzcLzkqerRwIkT7qvtb6v5HLVFiSHvwyvyI8wnE,28940
|
17
17
|
ragaai_catalyst/tracers/llamaindex_callback.py,sha256=ZY0BJrrlz-P9Mg2dX-ZkVKG3gSvzwqBtk7JL_05MiYA,14028
|
18
|
-
ragaai_catalyst/tracers/tracer.py,sha256=
|
18
|
+
ragaai_catalyst/tracers/tracer.py,sha256=Yq2HhgT4785t9573kksJ7ngM3qCLPgZbZ0IpgOHdTTo,19223
|
19
19
|
ragaai_catalyst/tracers/upload_traces.py,sha256=2TWdRTN6FMaX-dqDv8BJWQS0xrCGYKkXEYOi2kK3Z3Y,5487
|
20
20
|
ragaai_catalyst/tracers/agentic_tracing/README.md,sha256=X4QwLb7-Jg7GQMIXj-SerZIgDETfw-7VgYlczOR8ZeQ,4508
|
21
21
|
ragaai_catalyst/tracers/agentic_tracing/__init__.py,sha256=yf6SKvOPSpH-9LiKaoLKXwqj5sez8F_5wkOb91yp0oE,260
|
@@ -32,7 +32,7 @@ ragaai_catalyst/tracers/agentic_tracing/tracers/agent_tracer.py,sha256=--wvhOJ-J
|
|
32
32
|
ragaai_catalyst/tracers/agentic_tracing/tracers/base.py,sha256=88rX7OkOGEyVNECUrc4bYqODyulXve_-99d9ku5hBeQ,37373
|
33
33
|
ragaai_catalyst/tracers/agentic_tracing/tracers/custom_tracer.py,sha256=l3x3uFO5ov93I7UUrUX1M06WVGy2ug2jEZ1G7o315z4,13075
|
34
34
|
ragaai_catalyst/tracers/agentic_tracing/tracers/langgraph_tracer.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
35
|
-
ragaai_catalyst/tracers/agentic_tracing/tracers/llm_tracer.py,sha256=
|
35
|
+
ragaai_catalyst/tracers/agentic_tracing/tracers/llm_tracer.py,sha256=91aWXJGb3GDfyDfJyA7Irnk3XSyfkQaQppW_NMORGJQ,31725
|
36
36
|
ragaai_catalyst/tracers/agentic_tracing/tracers/main_tracer.py,sha256=6hsg-Yw11v4qeELI1CWrdX8BXf-wJrTF5smBI5prgoo,15873
|
37
37
|
ragaai_catalyst/tracers/agentic_tracing/tracers/network_tracer.py,sha256=m8CxYkl7iMiFya_lNwN1ykBc3Pmo-2pR_2HmpptwHWQ,10352
|
38
38
|
ragaai_catalyst/tracers/agentic_tracing/tracers/tool_tracer.py,sha256=4rWL7fIJE5wN0nwh6fMWyh3OrrenZHJkNzyQXikyzQI,13771
|
@@ -48,7 +48,7 @@ ragaai_catalyst/tracers/agentic_tracing/utils/file_name_tracker.py,sha256=515NND
|
|
48
48
|
ragaai_catalyst/tracers/agentic_tracing/utils/generic.py,sha256=WwXT01xmp8MSr7KinuDCSK9a1ifpLcT7ajFkvYviG_A,1190
|
49
49
|
ragaai_catalyst/tracers/agentic_tracing/utils/get_user_trace_metrics.py,sha256=vPZ4dn4EHFW0kqd1GyRpsYXbfrRrd0DXCmh-pzsDBNE,1109
|
50
50
|
ragaai_catalyst/tracers/agentic_tracing/utils/llm_utils.py,sha256=wlXCuaRe81s-7FWdJ_MquXFGRZZfNrZxLIIxl-Ohbqk,15541
|
51
|
-
ragaai_catalyst/tracers/agentic_tracing/utils/model_costs.json,sha256=
|
51
|
+
ragaai_catalyst/tracers/agentic_tracing/utils/model_costs.json,sha256=kQwC8AYTfJCqPm1F_heR7FoEhIpEZgBRWvkHRncfhzU,298689
|
52
52
|
ragaai_catalyst/tracers/agentic_tracing/utils/span_attributes.py,sha256=MqeRNGxzeuh9qTK0NbYMftl9V9Z0V7gMgBoHkrXP56k,1592
|
53
53
|
ragaai_catalyst/tracers/agentic_tracing/utils/system_monitor.py,sha256=H8WNsk4v_5T6OUw4TFOzlDLjQhJwjh1nAMyMAoqMEi4,6946
|
54
54
|
ragaai_catalyst/tracers/agentic_tracing/utils/trace_utils.py,sha256=RciiDdo2riibEoM8X0FKHaXi78y3bWwNkV8U0leqigk,3508
|
@@ -65,8 +65,8 @@ ragaai_catalyst/tracers/utils/__init__.py,sha256=KeMaZtYaTojilpLv65qH08QmpYclfpa
|
|
65
65
|
ragaai_catalyst/tracers/utils/convert_langchain_callbacks_output.py,sha256=ofrNrxf2b1hpjDh_zeaxiYq86azn1MF3kW8-ViYPEg0,1641
|
66
66
|
ragaai_catalyst/tracers/utils/langchain_tracer_extraction_logic.py,sha256=cghjCuUe8w-2MZdh9xgtRGe3y219u26GGzpnuY4Wt6Q,3047
|
67
67
|
ragaai_catalyst/tracers/utils/utils.py,sha256=ViygfJ7vZ7U0CTSA1lbxVloHp4NSlmfDzBRNCJuMhis,2374
|
68
|
-
ragaai_catalyst-2.1.
|
69
|
-
ragaai_catalyst-2.1.
|
70
|
-
ragaai_catalyst-2.1.
|
71
|
-
ragaai_catalyst-2.1.
|
72
|
-
ragaai_catalyst-2.1.
|
68
|
+
ragaai_catalyst-2.1.5b9.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
69
|
+
ragaai_catalyst-2.1.5b9.dist-info/METADATA,sha256=r88NroNJJuoi1skQURXDpKdMc4fo1FciVpxFtruaYuo,12764
|
70
|
+
ragaai_catalyst-2.1.5b9.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
71
|
+
ragaai_catalyst-2.1.5b9.dist-info/top_level.txt,sha256=HpgsdRgEJMk8nqrU6qdCYk3di7MJkDL0B19lkc7dLfM,16
|
72
|
+
ragaai_catalyst-2.1.5b9.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|