ragaai-catalyst 2.1.5b35__py3-none-any.whl → 2.1.5b37__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.
@@ -0,0 +1,266 @@
1
+ import json
2
+ import sys
3
+ from datetime import datetime
4
+ from typing import final
5
+ import pytz
6
+ import uuid
7
+ from ragaai_catalyst.tracers.agentic_tracing.utils.llm_utils import calculate_llm_cost, get_model_cost
8
+
9
+ def convert_time_format(original_time_str, target_timezone_str="Asia/Kolkata"):
10
+ """
11
+ Converts a UTC time string to a specified timezone format.
12
+
13
+ Args:
14
+ original_time_str (str): The original time string in UTC format (e.g., "2025-02-28T22:05:57.945146Z").
15
+ target_timezone_str (str): The target timezone to convert the time to (default is "Asia/Kolkata").
16
+
17
+ Returns:
18
+ str: The converted time string in the specified timezone format.
19
+ """
20
+ # Parse the original time string into a datetime object
21
+ utc_time = datetime.strptime(original_time_str, "%Y-%m-%dT%H:%M:%S.%fZ")
22
+ # Set the timezone to UTC
23
+ utc_time = utc_time.replace(tzinfo=pytz.UTC)
24
+ # Convert the UTC time to the target timezone
25
+ target_timezone = pytz.timezone(target_timezone_str)
26
+ target_time = utc_time.astimezone(target_timezone)
27
+ # Format the datetime object to the desired string format
28
+ formatted_time = target_time.strftime("%Y-%m-%dT%H:%M:%S.%f%z")
29
+ # Add a colon in the timezone offset for better readability
30
+ formatted_time = formatted_time[:-2] + ':' + formatted_time[-2:]
31
+ return formatted_time
32
+
33
+
34
+ def get_uuid(name):
35
+ """Generate a random UUID (not based on name)."""
36
+ return str(uuid.uuid5(uuid.NAMESPACE_DNS, name))
37
+
38
+ def get_spans(input_trace, custom_model_cost):
39
+ data=[]
40
+ span_type_mapping={"AGENT":"agent","LLM":"llm","TOOL":"tool"}
41
+ span_name_occurrence = {}
42
+ for span in input_trace:
43
+ final_span = {}
44
+ span_type=span_type_mapping.get(span["attributes"]["openinference.span.kind"],"custom")
45
+ final_span["id"] = span["context"]["span_id"]
46
+ if span["name"] not in span_name_occurrence:
47
+ span_name_occurrence[span['name']]=0
48
+ else:
49
+ span_name_occurrence[span['name']]+=1
50
+ final_span["name"] = span["name"]+"."+str(span_name_occurrence[span['name']])
51
+ final_span["hash_id"] = get_uuid(final_span["name"])
52
+ final_span["source_hash_id"] = None
53
+ final_span["type"] = span_type
54
+ final_span["start_time"] = convert_time_format(span['start_time'])
55
+ final_span["end_time"] = convert_time_format(span['end_time'])
56
+ final_span["parent_id"] = span["parent_id"]
57
+ final_span["extra_info"] = None
58
+ '''Handle Error if any'''
59
+ if span["status"]["status_code"].lower() == "error":
60
+ final_span["error"] = span["status"]
61
+ else:
62
+ final_span["error"] = None
63
+ # ToDo: Find final trace format for sending error description
64
+ final_span["metrics"] = []
65
+ final_span["feedback"] = None
66
+ final_span["data"]={}
67
+ final_span["info"]={}
68
+ final_span["metrics"] =[]
69
+ final_span["extra_info"]={}
70
+ if span_type=="agent":
71
+ if "input.value" in span["attributes"]:
72
+ try:
73
+ final_span["data"]["input"] = json.loads(span["attributes"]["input.value"])
74
+ except Exception as e:
75
+ final_span["data"]["input"] = span["attributes"]["input.value"]
76
+ else:
77
+ final_span["data"]["input"] = ""
78
+ if "output.value" in span["attributes"]:
79
+ try:
80
+ final_span["data"]["output"] = json.loads(span["attributes"]["output.value"])
81
+ except Exception as e:
82
+ final_span["data"]["output"] = span["attributes"]["output.value"]
83
+ else:
84
+ final_span["data"]["output"] = ""
85
+
86
+ elif span_type=="tool":
87
+ available_fields = list(span['attributes'].keys())
88
+ tool_fields = [key for key in available_fields if 'tool' in key]
89
+ if "input.value" in span["attributes"]:
90
+ try:
91
+ final_span["data"]["input"] = json.loads(span["attributes"]["input.value"])
92
+ except Exception as e:
93
+ final_span["data"]["input"] = span["attributes"]["input.value"]
94
+ else:
95
+ final_span["data"]["input"] = ""
96
+ if "output.value" in span["attributes"]:
97
+ try:
98
+ final_span["data"]["output"] = json.loads(span["attributes"]["output.value"])
99
+ except Exception as e:
100
+ final_span["data"]["output"] = span["attributes"]["output.value"]
101
+ else:
102
+ final_span["data"]["output"] = ""
103
+ input_data={}
104
+ for key in tool_fields:
105
+ input_data[key] = span['attributes'].get(key, None)
106
+ final_span["info"].update(input_data)
107
+
108
+ elif span_type=="llm":
109
+ available_fields = list(span['attributes'].keys())
110
+ input_fields = [key for key in available_fields if 'input' in key]
111
+ input_data = {}
112
+ for key in input_fields:
113
+ if 'mime_type' not in key:
114
+ try:
115
+ input_data[key] = json.loads(span['attributes'][key])
116
+ except json.JSONDecodeError as e:
117
+ input_data[key] = span['attributes'].get(key, None)
118
+ final_span["data"]["input"] = input_data
119
+
120
+ output_fields = [key for key in available_fields if 'output' in key]
121
+ output_data = {}
122
+ output_data['content'] = {}
123
+ for key in output_fields:
124
+ if 'mime_type' not in key:
125
+ try:
126
+ output_data['content'][key] = json.loads(span['attributes'][key])
127
+ except json.JSONDecodeError as e:
128
+ output_data['content'][key] = span['attributes'].get(key, None)
129
+ final_span["data"]["output"] = [output_data]
130
+
131
+ if "llm.model_name" in span["attributes"]:
132
+ final_span["info"]["model"] = span["attributes"]["llm.model_name"]
133
+ else:
134
+ final_span["info"]["model"] = None
135
+ if "llm.invocation_parameters" in span["attributes"]:
136
+ try:
137
+ final_span["info"].update(**json.loads(span["attributes"]["llm.invocation_parameters"]))
138
+ except json.JSONDecodeError as e:
139
+ print(f"Error in parsing: {e}")
140
+
141
+ try:
142
+ final_span["extra_info"]["llm_parameters"] = json.loads(span["attributes"]["llm.invocation_parameters"])
143
+ except json.JSONDecodeError as e:
144
+ final_span["extra_info"]["llm_parameters"] = span["attributes"]["llm.invocation_parameters"]
145
+ else:
146
+ final_span["extra_info"]["llm_parameters"] = None
147
+
148
+ else:
149
+ if "input.value" in span["attributes"]:
150
+ try:
151
+ final_span["data"]["input"] = json.loads(span["attributes"]["input.value"])
152
+ except Exception as e:
153
+ final_span["data"]["input"] = span["attributes"]["input.value"]
154
+ if "output.value" in span["attributes"]:
155
+ try:
156
+ final_span["data"]["output"] = json.loads(span["attributes"]["output.value"])
157
+ except Exception as e:
158
+ final_span["data"]["output"] = span["attributes"]["output.value"]
159
+
160
+ final_span["info"]["cost"] = {}
161
+ final_span["info"]["token"] = {}
162
+
163
+ if "model" in final_span["info"]:
164
+ model_name = final_span["info"]["model"]
165
+
166
+ model_costs = {
167
+ "default": {"input_cost_per_token": 0.0, "output_cost_per_token": 0.0}
168
+ }
169
+ try:
170
+ model_costs = get_model_cost()
171
+ except Exception as e:
172
+ pass
173
+
174
+ if "resource" in span:
175
+ final_span["info"].update(span["resource"])
176
+ if "llm.token_count.prompt" in span['attributes']:
177
+ final_span["info"]["token"]["prompt_tokens"] = span['attributes']['llm.token_count.prompt']
178
+ if "llm.token_count.completion" in span['attributes']:
179
+ final_span["info"]["token"]["completion_tokens"] = span['attributes']['llm.token_count.completion']
180
+ if "llm.token_count.total" in span['attributes']:
181
+ final_span["info"]["token"]["total_tokens"] = span['attributes']['llm.token_count.total']
182
+
183
+ if "info" in final_span:
184
+ if "token" in final_span["info"]:
185
+ if "prompt_tokens" in final_span["info"]["token"]:
186
+ token_usage = {
187
+ "prompt_tokens": final_span["info"]["token"]["prompt_tokens"],
188
+ "completion_tokens": final_span["info"]["token"]["completion_tokens"],
189
+ "total_tokens": final_span["info"]["token"]["total_tokens"]
190
+ }
191
+ final_span["info"]["cost"] = calculate_llm_cost(token_usage=token_usage, model_name=model_name, model_costs=model_costs, model_custom_cost=custom_model_cost)
192
+ data.append(final_span)
193
+ return data
194
+
195
+ def convert_json_format(input_trace, custom_model_cost):
196
+ """
197
+ Converts a JSON from one format to UI format.
198
+
199
+ Args:
200
+ input_trace (str): The input JSON string.
201
+
202
+ Returns:
203
+ final_trace: The converted JSON, or None if an error occurs.
204
+ """
205
+ final_trace = {
206
+ "id": input_trace[0]["context"]["trace_id"],
207
+ "trace_name": "",
208
+ "project_name": "",
209
+ "start_time": convert_time_format(min(item["start_time"] for item in input_trace)), # Find the minimum start_time of all spans
210
+ "end_time": convert_time_format(max(item["end_time"] for item in input_trace)) # Find the maximum end_time of all spans
211
+ }
212
+ final_trace["metadata"] = {
213
+ "tokens": {
214
+ "prompt_tokens": 0.0,
215
+ "completion_tokens": 0.0,
216
+ "total_tokens": 0.0
217
+ },
218
+ "cost": {
219
+ "input_cost": 0.0,
220
+ "output_cost": 0.0,
221
+ "total_cost": 0.0
222
+ }
223
+ }
224
+ final_trace["replays"]={"source":None}
225
+ final_trace["data"]=[{}]
226
+ final_trace["data"][0]["spans"] = get_spans(input_trace, custom_model_cost)
227
+ final_trace["network_calls"] =[]
228
+ final_trace["interactions"] = []
229
+
230
+ for itr in final_trace["data"][0]["spans"]:
231
+ if itr["type"]=="llm":
232
+ if "token" in itr["info"]:
233
+ if "prompt_tokens" in itr["info"]["token"]:
234
+ final_trace["metadata"]["tokens"]["prompt_tokens"] += itr["info"]["token"]['prompt_tokens']
235
+ final_trace["metadata"]["cost"]["input_cost"] += itr["info"]["cost"]['input_cost']
236
+ if "completion_tokens" in itr["info"]["token"]:
237
+ final_trace["metadata"]["tokens"]["completion_tokens"] += itr["info"]["token"]['completion_tokens']
238
+ final_trace["metadata"]["cost"]["output_cost"] += itr["info"]["cost"]['output_cost']
239
+ if "token" in itr["info"]:
240
+ if "total_tokens" in itr["info"]["token"]:
241
+ final_trace["metadata"]["tokens"]["total_tokens"] += itr["info"]["token"]['total_tokens']
242
+ final_trace["metadata"]["cost"]["total_cost"] += itr["info"]["cost"]['total_cost']
243
+
244
+ # get the total tokens, cost
245
+ final_trace["metadata"]["total_cost"] = final_trace["metadata"]["cost"]["total_cost"]
246
+ final_trace["metadata"]["total_tokens"] = final_trace["metadata"]["tokens"]["total_tokens"]
247
+
248
+ return final_trace
249
+
250
+ if __name__ == "__main__":
251
+ if len(sys.argv) != 3:
252
+ print("Usage: python convert.py <input_openinference_trace_path> <output_trace_path>")
253
+ print("Example: python convert.py sample_openinference_trace/test.json output.json")
254
+ sys.exit(1)
255
+ input_file_path = sys.argv[1]
256
+ output_file_path = sys.argv[2]
257
+ with open(input_file_path,'r') as fin:
258
+ input_trace=[]
259
+ for line in fin:
260
+ data=json.loads(line)
261
+ input_trace.append(data)
262
+ payload = convert_json_format(input_trace)
263
+ print(payload)
264
+ with open(output_file_path,"w") as fout:
265
+ json.dump(payload,fout)
266
+ fout.write("\n")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: ragaai_catalyst
3
- Version: 2.1.5b35
3
+ Version: 2.1.5b37
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,>=3.9
@@ -38,6 +38,10 @@ Requires-Dist: ipynbname
38
38
  Requires-Dist: tiktoken>=0.7.0
39
39
  Requires-Dist: tomli>=2.0.0
40
40
  Requires-Dist: rich>=13.9.4
41
+ Requires-Dist: openinference-instrumentation-llama-index
42
+ Requires-Dist: opentelemetry-sdk
43
+ Requires-Dist: opentelemetry-exporter-otlp
44
+ Requires-Dist: opentelemetry-proto>=1.12.0
41
45
  Provides-Extra: dev
42
46
  Requires-Dist: pytest; extra == "dev"
43
47
  Requires-Dist: pytest-cov; 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=KooENtkX0Hp0S_d_1WI3iH3qNVt-ZcnwOKVlydv4dUk,33518
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=iO5m4ev0ruXjp-YjRMuN_mhr0Cd499Phz6ZYlfJ1yak,22889
34
+ ragaai_catalyst/tracers/tracer.py,sha256=ZA57OqwDZblU9iPR4Lj5t7gEeqLUmOi_Wa10NxMGQsc,27825
35
35
  ragaai_catalyst/tracers/upload_traces.py,sha256=OKsc-Obf8bJvKBprt3dqj8GQQNkoX3kT_t8TBDi9YDQ,5670
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
@@ -45,7 +45,7 @@ ragaai_catalyst/tracers/agentic_tracing/tests/ai_travel_agent.py,sha256=S4rCcKzU
45
45
  ragaai_catalyst/tracers/agentic_tracing/tests/unique_decorator_test.py,sha256=Xk1cLzs-2A3dgyBwRRnCWs7Eubki40FVonwd433hPN8,4805
46
46
  ragaai_catalyst/tracers/agentic_tracing/tracers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
47
  ragaai_catalyst/tracers/agentic_tracing/tracers/agent_tracer.py,sha256=LzbsHvELwBmH8ObFomJRhiQ98b6MEi18irm0DPiplt0,29743
48
- ragaai_catalyst/tracers/agentic_tracing/tracers/base.py,sha256=_C2j97NEH1x3Hnn63LowcS39IdfIUmwbDiwWFLlOgcc,54275
48
+ ragaai_catalyst/tracers/agentic_tracing/tracers/base.py,sha256=Kmy1kgwy19e7MuMMq9GPUq9VXpJV2bXeaIhx8UxX5Sc,54251
49
49
  ragaai_catalyst/tracers/agentic_tracing/tracers/custom_tracer.py,sha256=OBJJjFSvwRjCGNJyqX3yIfC1W05ZN2QUXasCJ4gmCjQ,13930
50
50
  ragaai_catalyst/tracers/agentic_tracing/tracers/langgraph_tracer.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
51
  ragaai_catalyst/tracers/agentic_tracing/tracers/llm_tracer.py,sha256=z-qzmCQCkhyW0aLDUR_rNq4pmxhAaVhNY-kZQsox-Ws,50221
@@ -54,7 +54,7 @@ ragaai_catalyst/tracers/agentic_tracing/tracers/network_tracer.py,sha256=m8CxYkl
54
54
  ragaai_catalyst/tracers/agentic_tracing/tracers/tool_tracer.py,sha256=xxrliKPfdfbIZRZqMnUewsaTD8_Hv0dbuoBivNZGD4U,21674
55
55
  ragaai_catalyst/tracers/agentic_tracing/tracers/user_interaction_tracer.py,sha256=bhSUhNQCuJXKjgJAXhjKEYjnHMpYN90FSZdR84fNIKU,4614
56
56
  ragaai_catalyst/tracers/agentic_tracing/upload/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
- ragaai_catalyst/tracers/agentic_tracing/upload/trace_uploader.py,sha256=pklyXsz1_tKsU-Kon0ZxsV11BGRLV66bCh8UG9tfrhc,26454
57
+ ragaai_catalyst/tracers/agentic_tracing/upload/trace_uploader.py,sha256=Buk0OXjdkku0tuuFzGeqKRtwSeIBe3LpA1oa14qS7v4,12380
58
58
  ragaai_catalyst/tracers/agentic_tracing/upload/upload_agentic_traces.py,sha256=icycLgfA0734xxoM1rTMG_iIrI3iM94th8RQggJ7sSw,8541
59
59
  ragaai_catalyst/tracers/agentic_tracing/upload/upload_code.py,sha256=aw_eHhUYRbR_9IbIkNjYb7NOsmETD3k1p4a6gxaGI7Q,6462
60
60
  ragaai_catalyst/tracers/agentic_tracing/upload/upload_local_metric.py,sha256=m1O8lKpxKwtHofXLW3fTHX5yfqDW5GxoveARlg5cTw4,2571
@@ -73,9 +73,11 @@ ragaai_catalyst/tracers/agentic_tracing/utils/system_monitor.py,sha256=H8WNsk4v_
73
73
  ragaai_catalyst/tracers/agentic_tracing/utils/trace_utils.py,sha256=go7FVnofviATDph-j8sk2juv09CGSRt1Vq4U868Fhd8,2259
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
- ragaai_catalyst/tracers/exporters/__init__.py,sha256=kVA8zp05h3phu4e-iHSlnznp_PzMRczB7LphSsZgUjg,138
76
+ ragaai_catalyst/tracers/exporters/__init__.py,sha256=wQbaqyeIjVZxYprHCKZ9BeiqxeXYBKjzEgP79LWNxCU,293
77
+ ragaai_catalyst/tracers/exporters/dynamic_trace_exporter.py,sha256=dAT2WIvkQLl8RrXdhDwm0NxhxytV6PP4ZViYJ6jlOQg,4553
77
78
  ragaai_catalyst/tracers/exporters/file_span_exporter.py,sha256=RgGteu-NVGprXKkynvyIO5yOjpbtA41R3W_NzCjnkwE,6445
78
79
  ragaai_catalyst/tracers/exporters/raga_exporter.py,sha256=6xvjWXyh8XPkHKSLLmAZUQSvwuyY17ov8pv2VdfI0qA,17875
80
+ ragaai_catalyst/tracers/exporters/ragaai_trace_exporter.py,sha256=OhPnquuOOxoCtx7cGYdnsQJZ8lNnl0alm3A2Wc4Bl2g,4814
79
81
  ragaai_catalyst/tracers/instrumentators/__init__.py,sha256=FgnMQupoRTzmVsG9YKsLQera2Pfs-AluZv8CxwavoyQ,253
80
82
  ragaai_catalyst/tracers/instrumentators/langchain.py,sha256=yMN0qVF0pUVk6R5M1vJoUXezDo1ejs4klCFRlE8x4vE,574
81
83
  ragaai_catalyst/tracers/instrumentators/llamaindex.py,sha256=SMrRlR4xM7k9HK43hakE8rkrWHxMlmtmWD-AX6TeByc,416
@@ -86,9 +88,10 @@ ragaai_catalyst/tracers/utils/convert_llama_instru_callback.py,sha256=8qLo7x4Zsn
86
88
  ragaai_catalyst/tracers/utils/extraction_logic_llama_index.py,sha256=ZhPs0YhVtB82-Pq9o1BvCinKE_WPvVxPTEcZjlJbFYM,2371
87
89
  ragaai_catalyst/tracers/utils/langchain_tracer_extraction_logic.py,sha256=XS2_x2qneqEx9oAighLg-LRiueWcESLwIC2r7eJT-Ww,3117
88
90
  ragaai_catalyst/tracers/utils/model_prices_and_context_window_backup.json,sha256=C3uwkibJ08C9sOX-54kulZYmJlIpZ-SQpfE6HNGrjbM,343502
91
+ ragaai_catalyst/tracers/utils/trace_json_converter.py,sha256=5zeJRD3gY_arfXWGZR4cqAvRhfC_wQUabm_7peiNMdY,12268
89
92
  ragaai_catalyst/tracers/utils/utils.py,sha256=ViygfJ7vZ7U0CTSA1lbxVloHp4NSlmfDzBRNCJuMhis,2374
90
- ragaai_catalyst-2.1.5b35.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
91
- ragaai_catalyst-2.1.5b35.dist-info/METADATA,sha256=lNh8SY9ADk3KBvTywahh147oPxI96bSdsTfj_g7wHoA,21884
92
- ragaai_catalyst-2.1.5b35.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
93
- ragaai_catalyst-2.1.5b35.dist-info/top_level.txt,sha256=HpgsdRgEJMk8nqrU6qdCYk3di7MJkDL0B19lkc7dLfM,16
94
- ragaai_catalyst-2.1.5b35.dist-info/RECORD,,
93
+ ragaai_catalyst-2.1.5b37.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
94
+ ragaai_catalyst-2.1.5b37.dist-info/METADATA,sha256=B7m2Fu7d9nCZWJmZlM8uXUB7mo3VahUb8s4QuwLbNqw,22060
95
+ ragaai_catalyst-2.1.5b37.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
96
+ ragaai_catalyst-2.1.5b37.dist-info/top_level.txt,sha256=HpgsdRgEJMk8nqrU6qdCYk3di7MJkDL0B19lkc7dLfM,16
97
+ ragaai_catalyst-2.1.5b37.dist-info/RECORD,,