ragaai-catalyst 2.1.1b0__py3-none-any.whl → 2.1.1b2__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/README.md +97 -0
- ragaai_catalyst/tracers/agentic_tracing/__init__.py +4 -2
- ragaai_catalyst/tracers/agentic_tracing/data/__init__.py +0 -0
- ragaai_catalyst/tracers/agentic_tracing/{data_structure.py → data/data_structure.py} +14 -1
- ragaai_catalyst/tracers/agentic_tracing/tests/__init__.py +0 -0
- ragaai_catalyst/tracers/agentic_tracing/tracers/__init__.py +0 -0
- ragaai_catalyst/tracers/agentic_tracing/{agent_tracer.py → tracers/agent_tracer.py} +2 -4
- ragaai_catalyst/tracers/agentic_tracing/{base.py → tracers/base.py} +5 -6
- ragaai_catalyst/tracers/agentic_tracing/{llm_tracer.py → tracers/llm_tracer.py} +30 -246
- ragaai_catalyst/tracers/agentic_tracing/{agentic_tracing.py → tracers/main_tracer.py} +3 -4
- ragaai_catalyst/tracers/agentic_tracing/{tool_tracer.py → tracers/tool_tracer.py} +3 -3
- ragaai_catalyst/tracers/agentic_tracing/upload/__init__.py +0 -0
- ragaai_catalyst/tracers/agentic_tracing/utils/llm_utils.py +229 -43
- ragaai_catalyst/tracers/tracer.py +11 -12
- {ragaai_catalyst-2.1.1b0.dist-info → ragaai_catalyst-2.1.1b2.dist-info}/METADATA +1 -1
- ragaai_catalyst-2.1.1b2.dist-info/RECORD +60 -0
- ragaai_catalyst/tracers/agentic_tracing/utils/data_classes.py +0 -61
- ragaai_catalyst-2.1.1b0.dist-info/RECORD +0 -56
- /ragaai_catalyst/tracers/agentic_tracing/{examples → tests}/FinancialAnalysisSystem.ipynb +0 -0
- /ragaai_catalyst/tracers/agentic_tracing/{examples → tests}/GameActivityEventPlanner.ipynb +0 -0
- /ragaai_catalyst/tracers/agentic_tracing/{examples → tests}/TravelPlanner.ipynb +0 -0
- /ragaai_catalyst/tracers/agentic_tracing/{sample.py → tests/ai_travel_agent.py} +0 -0
- /ragaai_catalyst/tracers/agentic_tracing/{unique_decorator_test.py → tests/unique_decorator_test.py} +0 -0
- /ragaai_catalyst/tracers/agentic_tracing/{network_tracer.py → tracers/network_tracer.py} +0 -0
- /ragaai_catalyst/tracers/agentic_tracing/{user_interaction_tracer.py → tracers/user_interaction_tracer.py} +0 -0
- /ragaai_catalyst/tracers/agentic_tracing/{upload_agentic_traces.py → upload/upload_agentic_traces.py} +0 -0
- /ragaai_catalyst/tracers/agentic_tracing/{upload_code.py → upload/upload_code.py} +0 -0
- /ragaai_catalyst/tracers/agentic_tracing/{file_name_tracker.py → utils/file_name_tracker.py} +0 -0
- /ragaai_catalyst/tracers/agentic_tracing/{unique_decorator.py → utils/unique_decorator.py} +0 -0
- /ragaai_catalyst/tracers/agentic_tracing/{zip_list_of_unique_files.py → utils/zip_list_of_unique_files.py} +0 -0
- {ragaai_catalyst-2.1.1b0.dist-info → ragaai_catalyst-2.1.1b2.dist-info}/WHEEL +0 -0
- {ragaai_catalyst-2.1.1b0.dist-info → ragaai_catalyst-2.1.1b2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,97 @@
|
|
1
|
+
# Agentic Tracing
|
2
|
+
|
3
|
+
This module provides tracing functionality for agentic AI systems, helping track and analyze various aspects of AI agent behavior including LLM interactions, tool usage, and network activities.
|
4
|
+
|
5
|
+
## Directory Structure
|
6
|
+
|
7
|
+
```
|
8
|
+
agentic_tracing/
|
9
|
+
├── tracers/ # Core tracing implementations
|
10
|
+
│ ├── main_tracer.py # Main tracing functionality
|
11
|
+
│ ├── agent_tracer.py # Agent behavior tracing
|
12
|
+
│ ├── base.py # Base tracing classes
|
13
|
+
│ ├── llm_tracer.py # Language model interaction tracing
|
14
|
+
│ ├── network_tracer.py # Network activity tracing
|
15
|
+
│ ├── tool_tracer.py # Tool usage tracing
|
16
|
+
│ ├── user_interaction_tracer.py # User interaction tracing
|
17
|
+
│ └── __init__.py # Tracer module initialization
|
18
|
+
├── data/ # Data structures and classes
|
19
|
+
│ ├── data_classes.py # Data class definitions
|
20
|
+
│ └── __init__.py # Data module initialization
|
21
|
+
├── utils/ # Utility functions and helpers
|
22
|
+
│ ├── api_utils.py # API-related utilities
|
23
|
+
│ ├── file_name_tracker.py # Tracks file names and paths
|
24
|
+
│ ├── generic.py # Generic utility functions
|
25
|
+
│ ├── llm_utils.py # LLM-specific utilities
|
26
|
+
│ ├── model_costs.json # Model cost configurations
|
27
|
+
│ ├── trace_utils.py # General tracing utilities
|
28
|
+
│ ├── unique_decorator.py # Unique ID generation
|
29
|
+
│ ├── zip_list_of_unique_files.py # File handling utilities
|
30
|
+
│ └── __init__.py # Utils module initialization
|
31
|
+
├── tests/ # Test suites and examples
|
32
|
+
│ ├── ai_travel_agent.py # Travel agent test implementation
|
33
|
+
│ ├── unique_decorator_test.py # Tests for unique decorator
|
34
|
+
│ ├── TravelPlanner.ipynb # Travel planner example notebook
|
35
|
+
│ ├── FinancialAnalysisSystem.ipynb # Financial analysis example
|
36
|
+
│ ├── GameActivityEventPlanner.ipynb # Game event planner example
|
37
|
+
│ └── __init__.py # Tests module initialization
|
38
|
+
├── upload/ # Upload functionality
|
39
|
+
│ ├── upload_code.py # Code upload utilities
|
40
|
+
│ └── __init__.py # Upload module initialization
|
41
|
+
└── __init__.py # Package initialization
|
42
|
+
```
|
43
|
+
|
44
|
+
## Components
|
45
|
+
|
46
|
+
### Tracers
|
47
|
+
Different types of tracers for various aspects of agent behavior:
|
48
|
+
- Main Tracer: Core tracing functionality for managing and coordinating different trace types
|
49
|
+
- Agent Tracer: Tracks agent behavior, decisions, and state changes
|
50
|
+
- Base Tracer: Provides base classes and common functionality for all tracers
|
51
|
+
- LLM Tracer: Monitors language model interactions, including:
|
52
|
+
- Token usage tracking
|
53
|
+
- Cost calculation
|
54
|
+
- Input/output monitoring
|
55
|
+
- Model parameter tracking
|
56
|
+
- Network Tracer: Tracks network activities and API calls
|
57
|
+
- Tool Tracer: Monitors tool usage and execution
|
58
|
+
- User Interaction Tracer: Tracks user interactions and feedback
|
59
|
+
|
60
|
+
### Data
|
61
|
+
Core data structures and classes:
|
62
|
+
- Data Classes: Defines structured data types for:
|
63
|
+
- LLM calls
|
64
|
+
- Network requests
|
65
|
+
- Tool executions
|
66
|
+
- Trace components
|
67
|
+
- Agent states
|
68
|
+
- User interactions
|
69
|
+
|
70
|
+
### Utils
|
71
|
+
Helper functions and utilities:
|
72
|
+
- API Utils: Handles API-related operations and configurations
|
73
|
+
- LLM Utils: Utilities for handling LLM-specific operations:
|
74
|
+
- Model name extraction
|
75
|
+
- Token usage calculation
|
76
|
+
- Cost computation
|
77
|
+
- Parameter sanitization
|
78
|
+
- Generic Utils: Common utility functions used across modules
|
79
|
+
- Trace Utils: General tracing utilities
|
80
|
+
- File Name Tracker: Manages file paths and names
|
81
|
+
- Unique Decorator: Generates unique identifiers for trace components
|
82
|
+
- Model Costs: Configuration for different model pricing
|
83
|
+
- Zip List of Unique Files: Handles file compression and unique file management
|
84
|
+
|
85
|
+
### Tests
|
86
|
+
Test suites and example implementations:
|
87
|
+
- AI Travel Agent: Test implementation of a travel planning agent
|
88
|
+
- Unique Decorator Tests: Unit tests for unique ID generation
|
89
|
+
- Example Notebooks:
|
90
|
+
- Travel Planner: Example of travel planning implementation
|
91
|
+
- Financial Analysis: Example of financial system analysis
|
92
|
+
- Game Event Planner: Example of game activity planning
|
93
|
+
|
94
|
+
### Upload
|
95
|
+
Components for uploading and managing trace data:
|
96
|
+
- Code Upload: Handles uploading of traced code and execution data
|
97
|
+
- Supports various data formats and trace types
|
@@ -1,3 +1,5 @@
|
|
1
|
-
from .
|
1
|
+
from .tracers.main_tracer import AgenticTracing
|
2
|
+
from .utils.file_name_tracker import TrackName
|
3
|
+
from .utils.unique_decorator import generate_unique_hash_simple, mydecorator
|
2
4
|
|
3
|
-
__all__ = ['AgenticTracing']
|
5
|
+
__all__ = ['AgenticTracing', 'TrackName', 'generate_unique_hash_simple', 'mydecorator']
|
File without changes
|
@@ -1,4 +1,4 @@
|
|
1
|
-
from dataclasses import dataclass
|
1
|
+
from dataclasses import dataclass, field
|
2
2
|
from typing import List, Dict, Optional, Any, Union
|
3
3
|
from datetime import datetime
|
4
4
|
import uuid
|
@@ -159,6 +159,19 @@ class ToolInfo:
|
|
159
159
|
version: str
|
160
160
|
memory_used: int
|
161
161
|
|
162
|
+
@dataclass
|
163
|
+
class LLMCall:
|
164
|
+
name: str
|
165
|
+
model_name: str
|
166
|
+
input_prompt: str
|
167
|
+
output_response: str
|
168
|
+
tool_call: Dict
|
169
|
+
token_usage: Dict[str, int]
|
170
|
+
cost: Dict[str, float]
|
171
|
+
start_time: float = field(default=0)
|
172
|
+
end_time: float = field(default=0)
|
173
|
+
duration: float = field(default=0)
|
174
|
+
|
162
175
|
class Component:
|
163
176
|
def __init__(self, id: str, hash_id: str, type: str, name: str, start_time: str, end_time: str, parent_id: int, info: Dict[str, Any], data: Dict[str, Any], network_calls: Optional[List[NetworkCall]] = None, interactions: Optional[List[Union[Interaction, Dict]]] = None, error: Optional[Dict[str, Any]] = None):
|
164
177
|
self.id = id
|
File without changes
|
File without changes
|
@@ -3,12 +3,10 @@ import uuid
|
|
3
3
|
from datetime import datetime
|
4
4
|
import psutil
|
5
5
|
from typing import Optional, Any, Dict, List
|
6
|
-
from .unique_decorator import mydecorator
|
7
|
-
from .unique_decorator import generate_unique_hash_simple
|
8
|
-
|
6
|
+
from ..utils.unique_decorator import mydecorator, generate_unique_hash_simple
|
9
7
|
import contextvars
|
10
8
|
import asyncio
|
11
|
-
from .file_name_tracker import TrackName
|
9
|
+
from ..utils.file_name_tracker import TrackName
|
12
10
|
|
13
11
|
|
14
12
|
class AgentTracerMixin:
|
@@ -10,18 +10,17 @@ import uuid
|
|
10
10
|
import sys
|
11
11
|
import tempfile
|
12
12
|
|
13
|
-
from .data_structure import (
|
13
|
+
from ..data.data_structure import (
|
14
14
|
Trace, Metadata, SystemInfo, OSInfo, EnvironmentInfo,
|
15
15
|
Resources, CPUResource, MemoryResource, DiskResource, NetworkResource,
|
16
16
|
ResourceInfo, MemoryInfo, DiskInfo, NetworkInfo,
|
17
17
|
Component,
|
18
18
|
)
|
19
19
|
|
20
|
-
from .upload_agentic_traces import UploadAgenticTraces
|
21
|
-
from .upload_code import upload_code
|
22
|
-
|
23
|
-
from .
|
24
|
-
from .zip_list_of_unique_files import zip_list_of_unique_files
|
20
|
+
from ..upload.upload_agentic_traces import UploadAgenticTraces
|
21
|
+
from ..upload.upload_code import upload_code
|
22
|
+
from ..utils.file_name_tracker import TrackName
|
23
|
+
from ..utils.zip_list_of_unique_files import zip_list_of_unique_files
|
25
24
|
|
26
25
|
class TracerJSONEncoder(json.JSONEncoder):
|
27
26
|
def default(self, obj):
|
@@ -3,15 +3,27 @@ import asyncio
|
|
3
3
|
import psutil
|
4
4
|
import wrapt
|
5
5
|
import functools
|
6
|
+
import json
|
7
|
+
import os
|
8
|
+
import time
|
6
9
|
from datetime import datetime
|
7
10
|
import uuid
|
8
11
|
import contextvars
|
9
12
|
import traceback
|
10
13
|
|
11
|
-
from .
|
12
|
-
|
13
|
-
|
14
|
-
|
14
|
+
from ..utils.llm_utils import (
|
15
|
+
extract_model_name,
|
16
|
+
extract_parameters,
|
17
|
+
extract_token_usage,
|
18
|
+
extract_input_data,
|
19
|
+
calculate_llm_cost,
|
20
|
+
sanitize_api_keys,
|
21
|
+
sanitize_input,
|
22
|
+
extract_llm_output,
|
23
|
+
)
|
24
|
+
from ..utils.trace_utils import load_model_costs
|
25
|
+
from ..utils.unique_decorator import generate_unique_hash_simple
|
26
|
+
from ..utils.file_name_tracker import TrackName
|
15
27
|
|
16
28
|
|
17
29
|
class LLMTracerMixin:
|
@@ -237,148 +249,6 @@ class LLMTracerMixin:
|
|
237
249
|
setattr(obj, method_name, wrapped_method)
|
238
250
|
self.patches.append((obj, method_name, original_method))
|
239
251
|
|
240
|
-
def _extract_model_name(self, args, kwargs, result):
|
241
|
-
"""Extract model name from kwargs or result"""
|
242
|
-
# First try direct model parameter
|
243
|
-
model = kwargs.get("model", "")
|
244
|
-
|
245
|
-
if not model:
|
246
|
-
# Try to get from instance
|
247
|
-
instance = kwargs.get("self", None)
|
248
|
-
if instance:
|
249
|
-
# Try model_name first (Google format)
|
250
|
-
if hasattr(instance, "model_name"):
|
251
|
-
model = instance.model_name
|
252
|
-
# Try model attribute
|
253
|
-
elif hasattr(instance, "model"):
|
254
|
-
model = instance.model
|
255
|
-
|
256
|
-
# TODO: This way isn't scalable. The necessity for normalising model names needs to be fixed. We shouldn't have to do this
|
257
|
-
# Normalize Google model names
|
258
|
-
if model and isinstance(model, str):
|
259
|
-
model = model.lower()
|
260
|
-
if "gemini-1.5-flash" in model:
|
261
|
-
return "gemini-1.5-flash"
|
262
|
-
if "gemini-1.5-pro" in model:
|
263
|
-
return "gemini-1.5-pro"
|
264
|
-
if "gemini-pro" in model:
|
265
|
-
return "gemini-pro"
|
266
|
-
|
267
|
-
if 'to_dict' in dir(result):
|
268
|
-
result = result.to_dict()
|
269
|
-
if 'model_version' in result:
|
270
|
-
model = result['model_version']
|
271
|
-
|
272
|
-
return model or "default"
|
273
|
-
|
274
|
-
def _extract_parameters(self, kwargs):
|
275
|
-
"""Extract all non-null parameters from kwargs"""
|
276
|
-
parameters = {k: v for k, v in kwargs.items() if v is not None}
|
277
|
-
|
278
|
-
# Remove contents key in parameters (Google LLM Response)
|
279
|
-
if 'contents' in parameters:
|
280
|
-
del parameters['contents']
|
281
|
-
|
282
|
-
# Remove messages key in parameters (OpenAI message)
|
283
|
-
if 'messages' in parameters:
|
284
|
-
del parameters['messages']
|
285
|
-
|
286
|
-
if 'generation_config' in parameters:
|
287
|
-
generation_config = parameters['generation_config']
|
288
|
-
# If generation_config is already a dict, use it directly
|
289
|
-
if isinstance(generation_config, dict):
|
290
|
-
config_dict = generation_config
|
291
|
-
else:
|
292
|
-
# Convert GenerationConfig to dictionary if it has a to_dict method, otherwise try to get its __dict__
|
293
|
-
config_dict = getattr(generation_config, 'to_dict', lambda: generation_config.__dict__)()
|
294
|
-
parameters.update(config_dict)
|
295
|
-
del parameters['generation_config']
|
296
|
-
|
297
|
-
return parameters
|
298
|
-
|
299
|
-
def _extract_token_usage(self, result):
|
300
|
-
"""Extract token usage from result"""
|
301
|
-
# Handle coroutines
|
302
|
-
if asyncio.iscoroutine(result):
|
303
|
-
# Get the current event loop
|
304
|
-
loop = asyncio.get_event_loop()
|
305
|
-
# Run the coroutine in the current event loop
|
306
|
-
result = loop.run_until_complete(result)
|
307
|
-
|
308
|
-
|
309
|
-
# Handle standard OpenAI/Anthropic format
|
310
|
-
if hasattr(result, "usage"):
|
311
|
-
usage = result.usage
|
312
|
-
return {
|
313
|
-
"prompt_tokens": getattr(usage, "prompt_tokens", 0),
|
314
|
-
"completion_tokens": getattr(usage, "completion_tokens", 0),
|
315
|
-
"total_tokens": getattr(usage, "total_tokens", 0)
|
316
|
-
}
|
317
|
-
|
318
|
-
# Handle Google GenerativeAI format with usage_metadata
|
319
|
-
if hasattr(result, "usage_metadata"):
|
320
|
-
metadata = result.usage_metadata
|
321
|
-
return {
|
322
|
-
"prompt_tokens": getattr(metadata, "prompt_token_count", 0),
|
323
|
-
"completion_tokens": getattr(metadata, "candidates_token_count", 0),
|
324
|
-
"total_tokens": getattr(metadata, "total_token_count", 0)
|
325
|
-
}
|
326
|
-
|
327
|
-
# Handle Vertex AI format
|
328
|
-
if hasattr(result, "text"):
|
329
|
-
# For LangChain ChatVertexAI
|
330
|
-
total_tokens = getattr(result, "token_count", 0)
|
331
|
-
if not total_tokens and hasattr(result, "_raw_response"):
|
332
|
-
# Try to get from raw response
|
333
|
-
total_tokens = getattr(result._raw_response, "token_count", 0)
|
334
|
-
return {
|
335
|
-
# TODO: This implementation is incorrect. Vertex AI does provide this breakdown
|
336
|
-
"prompt_tokens": 0, # Vertex AI doesn't provide this breakdown
|
337
|
-
"completion_tokens": total_tokens,
|
338
|
-
"total_tokens": total_tokens
|
339
|
-
}
|
340
|
-
|
341
|
-
return { # TODO: Passing 0 in case of not recorded is not correct. This needs to be fixes. Discuss before making changes to this
|
342
|
-
"prompt_tokens": 0,
|
343
|
-
"completion_tokens": 0,
|
344
|
-
"total_tokens": 0
|
345
|
-
}
|
346
|
-
|
347
|
-
def _extract_input_data(self, args, kwargs, result):
|
348
|
-
return {
|
349
|
-
'args': args,
|
350
|
-
'kwargs': kwargs
|
351
|
-
}
|
352
|
-
|
353
|
-
def _calculate_cost(self, token_usage, model_name):
|
354
|
-
# TODO: Passing default cost is a faulty logic & implementation and should be fixed
|
355
|
-
"""Calculate cost based on token usage and model"""
|
356
|
-
if not isinstance(token_usage, dict):
|
357
|
-
token_usage = {
|
358
|
-
"prompt_tokens": 0,
|
359
|
-
"completion_tokens": 0,
|
360
|
-
"total_tokens": token_usage if isinstance(token_usage, (int, float)) else 0
|
361
|
-
}
|
362
|
-
|
363
|
-
# TODO: This is a temporary fix. This needs to be fixed
|
364
|
-
|
365
|
-
# Get model costs, defaulting to Vertex AI PaLM2 costs if unknown
|
366
|
-
model_cost = self.model_costs.get(model_name, {
|
367
|
-
"input_cost_per_token": 0.0,
|
368
|
-
"output_cost_per_token": 0.0
|
369
|
-
})
|
370
|
-
|
371
|
-
input_cost = (token_usage.get("prompt_tokens", 0)) * model_cost.get("input_cost_per_token", 0.0)
|
372
|
-
output_cost = (token_usage.get("completion_tokens", 0)) * model_cost.get("output_cost_per_token", 0.0)
|
373
|
-
total_cost = input_cost + output_cost
|
374
|
-
|
375
|
-
# TODO: Return the value as it is, no need to round
|
376
|
-
return {
|
377
|
-
"input_cost": round(input_cost, 10),
|
378
|
-
"output_cost": round(output_cost, 10),
|
379
|
-
"total_cost": round(total_cost, 10)
|
380
|
-
}
|
381
|
-
|
382
252
|
def create_llm_component(self, component_id, hash_id, name, llm_type, version, memory_used, start_time, end_time, input_data, output_data, cost={}, usage={}, error=None, parameters={}):
|
383
253
|
# Update total metrics
|
384
254
|
self.total_tokens += usage.get("total_tokens", 0)
|
@@ -449,10 +319,11 @@ class LLMTracerMixin:
|
|
449
319
|
memory_used = max(0, end_memory - start_memory)
|
450
320
|
|
451
321
|
# Extract token usage and calculate cost
|
452
|
-
|
453
|
-
|
454
|
-
cost =
|
455
|
-
parameters =
|
322
|
+
model_name = extract_model_name(args, kwargs, result)
|
323
|
+
token_usage = extract_token_usage(result)
|
324
|
+
cost = calculate_llm_cost(token_usage, model_name, self.model_costs)
|
325
|
+
parameters = extract_parameters(kwargs)
|
326
|
+
input_data = extract_input_data(args, kwargs, result)
|
456
327
|
|
457
328
|
# End tracking network calls for this component
|
458
329
|
self.end_component(component_id)
|
@@ -461,9 +332,6 @@ class LLMTracerMixin:
|
|
461
332
|
if name is None:
|
462
333
|
name = original_func.__name__
|
463
334
|
|
464
|
-
# Create input data with ground truth
|
465
|
-
input_data = self._extract_input_data(args, kwargs, result)
|
466
|
-
|
467
335
|
# Create LLM component
|
468
336
|
llm_component = self.create_llm_component(
|
469
337
|
component_id=component_id,
|
@@ -511,7 +379,7 @@ class LLMTracerMixin:
|
|
511
379
|
memory_used=0,
|
512
380
|
start_time=start_time,
|
513
381
|
end_time=end_time,
|
514
|
-
input_data=
|
382
|
+
input_data=extract_input_data(args, kwargs, None),
|
515
383
|
output_data=None,
|
516
384
|
error=error_component
|
517
385
|
)
|
@@ -548,10 +416,11 @@ class LLMTracerMixin:
|
|
548
416
|
memory_used = max(0, end_memory - start_memory)
|
549
417
|
|
550
418
|
# Extract token usage and calculate cost
|
551
|
-
|
552
|
-
|
553
|
-
cost =
|
554
|
-
parameters =
|
419
|
+
model_name = extract_model_name(args, kwargs, result)
|
420
|
+
token_usage = extract_token_usage(result)
|
421
|
+
cost = calculate_llm_cost(token_usage, model_name, self.model_costs)
|
422
|
+
parameters = extract_parameters(kwargs)
|
423
|
+
input_data = extract_input_data(args, kwargs, result)
|
555
424
|
|
556
425
|
# End tracking network calls for this component
|
557
426
|
self.end_component(component_id)
|
@@ -559,9 +428,6 @@ class LLMTracerMixin:
|
|
559
428
|
name = self.current_llm_call_name.get()
|
560
429
|
if name is None:
|
561
430
|
name = original_func.__name__
|
562
|
-
|
563
|
-
# Create input data with ground truth
|
564
|
-
input_data = self._extract_input_data(args, kwargs, result)
|
565
431
|
|
566
432
|
# Create LLM component
|
567
433
|
llm_component = self.create_llm_component(
|
@@ -579,7 +445,7 @@ class LLMTracerMixin:
|
|
579
445
|
usage=token_usage,
|
580
446
|
parameters=parameters
|
581
447
|
)
|
582
|
-
|
448
|
+
self.llm_data = llm_component
|
583
449
|
self.add_component(llm_component)
|
584
450
|
return result
|
585
451
|
|
@@ -612,11 +478,11 @@ class LLMTracerMixin:
|
|
612
478
|
memory_used=memory_used,
|
613
479
|
start_time=start_time,
|
614
480
|
end_time=end_time,
|
615
|
-
input_data=
|
481
|
+
input_data=extract_input_data(args, kwargs, None),
|
616
482
|
output_data=None,
|
617
483
|
error=error_component
|
618
484
|
)
|
619
|
-
|
485
|
+
self.llm_data = llm_component
|
620
486
|
self.add_component(llm_component, is_error=True)
|
621
487
|
raise
|
622
488
|
|
@@ -728,85 +594,3 @@ class LLMTracerMixin:
|
|
728
594
|
except Exception as e:
|
729
595
|
print(f"Error unpatching {method_name}: {str(e)}")
|
730
596
|
self.patches = []
|
731
|
-
|
732
|
-
def _sanitize_api_keys(self, data):
|
733
|
-
"""Remove sensitive information from data"""
|
734
|
-
if isinstance(data, dict):
|
735
|
-
return {k: self._sanitize_api_keys(v) for k, v in data.items()
|
736
|
-
if not any(sensitive in k.lower() for sensitive in ['key', 'token', 'secret', 'password'])}
|
737
|
-
elif isinstance(data, list):
|
738
|
-
return [self._sanitize_api_keys(item) for item in data]
|
739
|
-
elif isinstance(data, tuple):
|
740
|
-
return tuple(self._sanitize_api_keys(item) for item in data)
|
741
|
-
return data
|
742
|
-
|
743
|
-
def _sanitize_input(self, args, kwargs):
|
744
|
-
"""Convert input arguments to text format.
|
745
|
-
|
746
|
-
Args:
|
747
|
-
args: Input arguments that may contain nested dictionaries
|
748
|
-
|
749
|
-
Returns:
|
750
|
-
str: Text representation of the input arguments
|
751
|
-
"""
|
752
|
-
if isinstance(args, dict):
|
753
|
-
return str({k: self._sanitize_input(v, {}) for k, v in args.items()})
|
754
|
-
elif isinstance(args, (list, tuple)):
|
755
|
-
return str([self._sanitize_input(item, {}) for item in args])
|
756
|
-
return str(args)
|
757
|
-
|
758
|
-
def extract_llm_output(result):
|
759
|
-
"""Extract output from LLM response"""
|
760
|
-
class OutputResponse:
|
761
|
-
def __init__(self, output_response):
|
762
|
-
self.output_response = output_response
|
763
|
-
|
764
|
-
# Handle coroutines
|
765
|
-
if asyncio.iscoroutine(result):
|
766
|
-
# For sync context, run the coroutine
|
767
|
-
if not asyncio.get_event_loop().is_running():
|
768
|
-
result = asyncio.run(result)
|
769
|
-
else:
|
770
|
-
# We're in an async context, but this function is called synchronously
|
771
|
-
# Return a placeholder and let the caller handle the coroutine
|
772
|
-
return OutputResponse("Coroutine result pending")
|
773
|
-
|
774
|
-
# Handle Google GenerativeAI format
|
775
|
-
if hasattr(result, "result"):
|
776
|
-
candidates = getattr(result.result, "candidates", [])
|
777
|
-
output = []
|
778
|
-
for candidate in candidates:
|
779
|
-
content = getattr(candidate, "content", None)
|
780
|
-
if content and hasattr(content, "parts"):
|
781
|
-
for part in content.parts:
|
782
|
-
if hasattr(part, "text"):
|
783
|
-
output.append({
|
784
|
-
"content": part.text,
|
785
|
-
"role": getattr(content, "role", "assistant"),
|
786
|
-
"finish_reason": getattr(candidate, "finish_reason", None)
|
787
|
-
})
|
788
|
-
return OutputResponse(output)
|
789
|
-
|
790
|
-
# Handle Vertex AI format
|
791
|
-
if hasattr(result, "text"):
|
792
|
-
return OutputResponse([{
|
793
|
-
"content": result.text,
|
794
|
-
"role": "assistant"
|
795
|
-
}])
|
796
|
-
|
797
|
-
# Handle OpenAI format
|
798
|
-
if hasattr(result, "choices"):
|
799
|
-
return OutputResponse([{
|
800
|
-
"content": choice.message.content,
|
801
|
-
"role": choice.message.role
|
802
|
-
} for choice in result.choices])
|
803
|
-
|
804
|
-
# Handle Anthropic format
|
805
|
-
if hasattr(result, "completion"):
|
806
|
-
return OutputResponse([{
|
807
|
-
"content": result.completion,
|
808
|
-
"role": "assistant"
|
809
|
-
}])
|
810
|
-
|
811
|
-
# Default case
|
812
|
-
return OutputResponse(str(result))
|
@@ -14,7 +14,7 @@ from .agent_tracer import AgentTracerMixin
|
|
14
14
|
from .network_tracer import NetworkTracer
|
15
15
|
from .user_interaction_tracer import UserInteractionTracer
|
16
16
|
|
17
|
-
from .data_structure import (
|
17
|
+
from ..data.data_structure import (
|
18
18
|
Trace, Metadata, SystemInfo, OSInfo, EnvironmentInfo,
|
19
19
|
Resources, CPUResource, MemoryResource, DiskResource, NetworkResource,
|
20
20
|
ResourceInfo, MemoryInfo, DiskInfo, NetworkInfo,
|
@@ -22,9 +22,8 @@ from .data_structure import (
|
|
22
22
|
NetworkCall, Interaction, Error
|
23
23
|
)
|
24
24
|
|
25
|
-
|
26
|
-
from
|
27
|
-
from ..upload_traces import UploadTraces
|
25
|
+
from ....ragaai_catalyst import RagaAICatalyst
|
26
|
+
from ragaai_catalyst.tracers.upload_traces import UploadTraces
|
28
27
|
|
29
28
|
class AgenticTracing(BaseTracer, LLMTracerMixin, ToolTracerMixin, AgentTracerMixin):
|
30
29
|
def __init__(self, user_detail, auto_instrument_llm: bool = True):
|
@@ -1,12 +1,12 @@
|
|
1
|
-
import functools
|
2
1
|
import uuid
|
3
2
|
from datetime import datetime
|
4
3
|
import psutil
|
4
|
+
import functools
|
5
5
|
from typing import Optional, Any, Dict, List
|
6
|
-
from .unique_decorator import generate_unique_hash_simple
|
6
|
+
from ..utils.unique_decorator import generate_unique_hash_simple, mydecorator
|
7
7
|
import contextvars
|
8
8
|
import asyncio
|
9
|
-
from .file_name_tracker import TrackName
|
9
|
+
from ..utils.file_name_tracker import TrackName
|
10
10
|
|
11
11
|
|
12
12
|
class ToolTracerMixin:
|
File without changes
|
@@ -1,4 +1,4 @@
|
|
1
|
-
from .
|
1
|
+
from ..data.data_structure import LLMCall
|
2
2
|
from .trace_utils import (
|
3
3
|
calculate_cost,
|
4
4
|
convert_usage_to_dict,
|
@@ -7,22 +7,237 @@ from .trace_utils import (
|
|
7
7
|
from importlib import resources
|
8
8
|
import json
|
9
9
|
import os
|
10
|
+
import asyncio
|
11
|
+
import psutil
|
10
12
|
|
11
13
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
14
|
+
def extract_model_name(args, kwargs, result):
|
15
|
+
"""Extract model name from kwargs or result"""
|
16
|
+
# First try direct model parameter
|
17
|
+
model = kwargs.get("model", "")
|
18
|
+
|
19
|
+
if not model:
|
20
|
+
# Try to get from instance
|
21
|
+
instance = kwargs.get("self", None)
|
22
|
+
if instance:
|
23
|
+
# Try model_name first (Google format)
|
24
|
+
if hasattr(instance, "model_name"):
|
25
|
+
model = instance.model_name
|
26
|
+
# Try model attribute
|
27
|
+
elif hasattr(instance, "model"):
|
28
|
+
model = instance.model
|
29
|
+
|
30
|
+
# Normalize Google model names
|
31
|
+
if model and isinstance(model, str):
|
32
|
+
model = model.lower()
|
33
|
+
if "gemini-1.5-flash" in model:
|
34
|
+
return "gemini-1.5-flash"
|
35
|
+
if "gemini-1.5-pro" in model:
|
36
|
+
return "gemini-1.5-pro"
|
37
|
+
if "gemini-pro" in model:
|
38
|
+
return "gemini-pro"
|
22
39
|
|
40
|
+
if 'to_dict' in dir(result):
|
41
|
+
result = result.to_dict()
|
42
|
+
if 'model_version' in result:
|
43
|
+
model = result['model_version']
|
44
|
+
|
45
|
+
return model or "default"
|
46
|
+
|
47
|
+
|
48
|
+
def extract_parameters(kwargs):
|
49
|
+
"""Extract all non-null parameters from kwargs"""
|
50
|
+
parameters = {k: v for k, v in kwargs.items() if v is not None}
|
51
|
+
|
52
|
+
# Remove contents key in parameters (Google LLM Response)
|
53
|
+
if 'contents' in parameters:
|
54
|
+
del parameters['contents']
|
55
|
+
|
56
|
+
# Remove messages key in parameters (OpenAI message)
|
57
|
+
if 'messages' in parameters:
|
58
|
+
del parameters['messages']
|
59
|
+
|
60
|
+
if 'generation_config' in parameters:
|
61
|
+
generation_config = parameters['generation_config']
|
62
|
+
# If generation_config is already a dict, use it directly
|
63
|
+
if isinstance(generation_config, dict):
|
64
|
+
config_dict = generation_config
|
65
|
+
else:
|
66
|
+
# Convert GenerationConfig to dictionary if it has a to_dict method, otherwise try to get its __dict__
|
67
|
+
config_dict = getattr(generation_config, 'to_dict', lambda: generation_config.__dict__)()
|
68
|
+
parameters.update(config_dict)
|
69
|
+
del parameters['generation_config']
|
70
|
+
|
71
|
+
return parameters
|
72
|
+
|
73
|
+
|
74
|
+
def extract_token_usage(result):
|
75
|
+
"""Extract token usage from result"""
|
76
|
+
# Handle coroutines
|
77
|
+
if asyncio.iscoroutine(result):
|
78
|
+
# Get the current event loop
|
79
|
+
loop = asyncio.get_event_loop()
|
80
|
+
# Run the coroutine in the current event loop
|
81
|
+
result = loop.run_until_complete(result)
|
82
|
+
|
83
|
+
# Handle standard OpenAI/Anthropic format
|
84
|
+
if hasattr(result, "usage"):
|
85
|
+
usage = result.usage
|
86
|
+
return {
|
87
|
+
"prompt_tokens": getattr(usage, "prompt_tokens", 0),
|
88
|
+
"completion_tokens": getattr(usage, "completion_tokens", 0),
|
89
|
+
"total_tokens": getattr(usage, "total_tokens", 0)
|
90
|
+
}
|
91
|
+
|
92
|
+
# Handle Google GenerativeAI format with usage_metadata
|
93
|
+
if hasattr(result, "usage_metadata"):
|
94
|
+
metadata = result.usage_metadata
|
95
|
+
return {
|
96
|
+
"prompt_tokens": getattr(metadata, "prompt_token_count", 0),
|
97
|
+
"completion_tokens": getattr(metadata, "candidates_token_count", 0),
|
98
|
+
"total_tokens": getattr(metadata, "total_token_count", 0)
|
99
|
+
}
|
100
|
+
|
101
|
+
# Handle Vertex AI format
|
102
|
+
if hasattr(result, "text"):
|
103
|
+
# For LangChain ChatVertexAI
|
104
|
+
total_tokens = getattr(result, "token_count", 0)
|
105
|
+
if not total_tokens and hasattr(result, "_raw_response"):
|
106
|
+
# Try to get from raw response
|
107
|
+
total_tokens = getattr(result._raw_response, "token_count", 0)
|
108
|
+
return {
|
109
|
+
"prompt_tokens": 0, # Vertex AI doesn't provide this breakdown
|
110
|
+
"completion_tokens": total_tokens,
|
111
|
+
"total_tokens": total_tokens
|
112
|
+
}
|
113
|
+
|
114
|
+
return {
|
115
|
+
"prompt_tokens": 0,
|
116
|
+
"completion_tokens": 0,
|
117
|
+
"total_tokens": 0
|
118
|
+
}
|
119
|
+
|
120
|
+
|
121
|
+
def extract_input_data(args, kwargs, result):
|
122
|
+
"""Extract input data from function call"""
|
123
|
+
return {
|
124
|
+
'args': args,
|
125
|
+
'kwargs': kwargs
|
126
|
+
}
|
127
|
+
|
128
|
+
|
129
|
+
def calculate_llm_cost(token_usage, model_name, model_costs):
|
130
|
+
"""Calculate cost based on token usage and model"""
|
131
|
+
if not isinstance(token_usage, dict):
|
132
|
+
token_usage = {
|
133
|
+
"prompt_tokens": 0,
|
134
|
+
"completion_tokens": 0,
|
135
|
+
"total_tokens": token_usage if isinstance(token_usage, (int, float)) else 0
|
136
|
+
}
|
137
|
+
|
138
|
+
# Get model costs, defaulting to default costs if unknown
|
139
|
+
model_cost = model_costs.get(model_name, {
|
140
|
+
"input_cost_per_token": 0.0,
|
141
|
+
"output_cost_per_token": 0.0
|
142
|
+
})
|
143
|
+
|
144
|
+
input_cost = (token_usage.get("prompt_tokens", 0)) * model_cost.get("input_cost_per_token", 0.0)
|
145
|
+
output_cost = (token_usage.get("completion_tokens", 0)) * model_cost.get("output_cost_per_token", 0.0)
|
146
|
+
total_cost = input_cost + output_cost
|
147
|
+
|
148
|
+
return {
|
149
|
+
"input_cost": round(input_cost, 10),
|
150
|
+
"output_cost": round(output_cost, 10),
|
151
|
+
"total_cost": round(total_cost, 10)
|
152
|
+
}
|
153
|
+
|
154
|
+
|
155
|
+
def sanitize_api_keys(data):
|
156
|
+
"""Remove sensitive information from data"""
|
157
|
+
if isinstance(data, dict):
|
158
|
+
return {k: sanitize_api_keys(v) for k, v in data.items()
|
159
|
+
if not any(sensitive in k.lower() for sensitive in ['key', 'token', 'secret', 'password'])}
|
160
|
+
elif isinstance(data, list):
|
161
|
+
return [sanitize_api_keys(item) for item in data]
|
162
|
+
elif isinstance(data, tuple):
|
163
|
+
return tuple(sanitize_api_keys(item) for item in data)
|
164
|
+
return data
|
165
|
+
|
166
|
+
|
167
|
+
def sanitize_input(args, kwargs):
|
168
|
+
"""Convert input arguments to text format.
|
169
|
+
|
170
|
+
Args:
|
171
|
+
args: Input arguments that may contain nested dictionaries
|
172
|
+
|
173
|
+
Returns:
|
174
|
+
str: Text representation of the input arguments
|
175
|
+
"""
|
176
|
+
if isinstance(args, dict):
|
177
|
+
return str({k: sanitize_input(v, {}) for k, v in args.items()})
|
178
|
+
elif isinstance(args, (list, tuple)):
|
179
|
+
return str([sanitize_input(item, {}) for item in args])
|
180
|
+
return str(args)
|
23
181
|
|
24
182
|
|
25
183
|
def extract_llm_output(result):
|
184
|
+
"""Extract output from LLM response"""
|
185
|
+
class OutputResponse:
|
186
|
+
def __init__(self, output_response):
|
187
|
+
self.output_response = output_response
|
188
|
+
|
189
|
+
# Handle coroutines
|
190
|
+
if asyncio.iscoroutine(result):
|
191
|
+
# For sync context, run the coroutine
|
192
|
+
if not asyncio.get_event_loop().is_running():
|
193
|
+
result = asyncio.run(result)
|
194
|
+
else:
|
195
|
+
# We're in an async context, but this function is called synchronously
|
196
|
+
# Return a placeholder and let the caller handle the coroutine
|
197
|
+
return OutputResponse("Coroutine result pending")
|
198
|
+
|
199
|
+
# Handle Google GenerativeAI format
|
200
|
+
if hasattr(result, "result"):
|
201
|
+
candidates = getattr(result.result, "candidates", [])
|
202
|
+
output = []
|
203
|
+
for candidate in candidates:
|
204
|
+
content = getattr(candidate, "content", None)
|
205
|
+
if content and hasattr(content, "parts"):
|
206
|
+
for part in content.parts:
|
207
|
+
if hasattr(part, "text"):
|
208
|
+
output.append({
|
209
|
+
"content": part.text,
|
210
|
+
"role": getattr(content, "role", "assistant"),
|
211
|
+
"finish_reason": getattr(candidate, "finish_reason", None)
|
212
|
+
})
|
213
|
+
return OutputResponse(output)
|
214
|
+
|
215
|
+
# Handle Vertex AI format
|
216
|
+
if hasattr(result, "text"):
|
217
|
+
return OutputResponse([{
|
218
|
+
"content": result.text,
|
219
|
+
"role": "assistant"
|
220
|
+
}])
|
221
|
+
|
222
|
+
# Handle OpenAI format
|
223
|
+
if hasattr(result, "choices"):
|
224
|
+
return OutputResponse([{
|
225
|
+
"content": choice.message.content,
|
226
|
+
"role": choice.message.role
|
227
|
+
} for choice in result.choices])
|
228
|
+
|
229
|
+
# Handle Anthropic format
|
230
|
+
if hasattr(result, "completion"):
|
231
|
+
return OutputResponse([{
|
232
|
+
"content": result.completion,
|
233
|
+
"role": "assistant"
|
234
|
+
}])
|
235
|
+
|
236
|
+
# Default case
|
237
|
+
return OutputResponse(str(result))
|
238
|
+
|
239
|
+
|
240
|
+
def extract_llm_data(args, kwargs, result):
|
26
241
|
# Initialize variables
|
27
242
|
model_name = None
|
28
243
|
output_response = ""
|
@@ -32,15 +247,7 @@ def extract_llm_output(result):
|
|
32
247
|
cost = {}
|
33
248
|
|
34
249
|
# Try to get model_name from result or result.content
|
35
|
-
model_name =
|
36
|
-
if hasattr(result, "model"):
|
37
|
-
model_name = result.model
|
38
|
-
elif hasattr(result, "content"):
|
39
|
-
try:
|
40
|
-
content_dict = json.loads(result.content)
|
41
|
-
model_name = content_dict.get("model", None)
|
42
|
-
except (json.JSONDecodeError, TypeError):
|
43
|
-
model_name = None
|
250
|
+
model_name = extract_model_name(args, kwargs, result)
|
44
251
|
|
45
252
|
# Try to get choices from result or result.content
|
46
253
|
choices = None
|
@@ -136,34 +343,13 @@ def extract_llm_output(result):
|
|
136
343
|
else:
|
137
344
|
usage = {}
|
138
345
|
|
139
|
-
token_usage =
|
346
|
+
token_usage = extract_token_usage(result)
|
140
347
|
|
141
348
|
# Load model costs
|
142
349
|
model_costs = load_model_costs()
|
143
350
|
|
144
351
|
# Calculate cost
|
145
|
-
|
146
|
-
model_config = model_costs[model_name]
|
147
|
-
input_cost_per_token = model_config.get("input_cost_per_token", 0.0)
|
148
|
-
output_cost_per_token = model_config.get("output_cost_per_token", 0.0)
|
149
|
-
reasoning_cost_per_token = model_config.get(
|
150
|
-
"reasoning_cost_per_token", output_cost_per_token
|
151
|
-
)
|
152
|
-
else:
|
153
|
-
# Default costs or log a warning
|
154
|
-
print(
|
155
|
-
f"Warning: Model '{model_name}' not found in config. Using default costs."
|
156
|
-
)
|
157
|
-
input_cost_per_token = 0.0
|
158
|
-
output_cost_per_token = 0.0
|
159
|
-
reasoning_cost_per_token = 0.0
|
160
|
-
|
161
|
-
cost = calculate_cost(
|
162
|
-
token_usage,
|
163
|
-
input_cost_per_token=input_cost_per_token,
|
164
|
-
output_cost_per_token=output_cost_per_token,
|
165
|
-
reasoning_cost_per_token=reasoning_cost_per_token,
|
166
|
-
)
|
352
|
+
cost = calculate_llm_cost(token_usage, model_name, model_costs)
|
167
353
|
|
168
354
|
llm_data = LLMCall(
|
169
355
|
name="",
|
@@ -9,19 +9,18 @@ from concurrent.futures import ThreadPoolExecutor
|
|
9
9
|
|
10
10
|
from opentelemetry.sdk import trace as trace_sdk
|
11
11
|
from opentelemetry.sdk.trace.export import SimpleSpanProcessor
|
12
|
-
from .exporters.file_span_exporter import FileSpanExporter
|
13
|
-
from .exporters.raga_exporter import RagaExporter
|
14
|
-
from .instrumentators import (
|
12
|
+
from ragaai_catalyst.tracers.exporters.file_span_exporter import FileSpanExporter
|
13
|
+
from ragaai_catalyst.tracers.exporters.raga_exporter import RagaExporter
|
14
|
+
from ragaai_catalyst.tracers.instrumentators import (
|
15
15
|
LangchainInstrumentor,
|
16
16
|
OpenAIInstrumentor,
|
17
17
|
LlamaIndexInstrumentor,
|
18
18
|
)
|
19
|
-
from .utils import get_unique_key
|
20
|
-
# from .llamaindex_callback import LlamaIndexTracer
|
21
|
-
from
|
22
|
-
from .
|
23
|
-
from .agentic_tracing.
|
24
|
-
from .agentic_tracing.llm_tracer import LLMTracerMixin
|
19
|
+
from ragaai_catalyst.tracers.utils import get_unique_key
|
20
|
+
# from ragaai_catalyst.tracers.llamaindex_callback import LlamaIndexTracer
|
21
|
+
from ragaai_catalyst import RagaAICatalyst
|
22
|
+
from ragaai_catalyst.tracers.agentic_tracing import AgenticTracing, TrackName
|
23
|
+
from ragaai_catalyst.tracers.agentic_tracing.tracers.llm_tracer import LLMTracerMixin
|
25
24
|
|
26
25
|
logger = logging.getLogger(__name__)
|
27
26
|
|
@@ -114,7 +113,7 @@ class Tracer(AgenticTracing):
|
|
114
113
|
self._upload_task = None
|
115
114
|
elif tracer_type == "llamaindex":
|
116
115
|
self._upload_task = None
|
117
|
-
from .llamaindex_callback import LlamaIndexTracer
|
116
|
+
from ragaai_catalyst.tracers.llamaindex_callback import LlamaIndexTracer
|
118
117
|
|
119
118
|
else:
|
120
119
|
self._upload_task = None
|
@@ -176,7 +175,7 @@ class Tracer(AgenticTracing):
|
|
176
175
|
print(f"Tracer started for project: {self.project_name}")
|
177
176
|
return self
|
178
177
|
elif self.tracer_type == "llamaindex":
|
179
|
-
from .llamaindex_callback import LlamaIndexTracer
|
178
|
+
from ragaai_catalyst.tracers.llamaindex_callback import LlamaIndexTracer
|
180
179
|
return LlamaIndexTracer(self._pass_user_data()).start()
|
181
180
|
else:
|
182
181
|
super().start()
|
@@ -194,7 +193,7 @@ class Tracer(AgenticTracing):
|
|
194
193
|
self._upload_task = self._run_async(self._upload_traces())
|
195
194
|
return "Trace upload initiated. Use get_upload_status() to check the status."
|
196
195
|
elif self.tracer_type == "llamaindex":
|
197
|
-
from .llamaindex_callback import LlamaIndexTracer
|
196
|
+
from ragaai_catalyst.tracers.llamaindex_callback import LlamaIndexTracer
|
198
197
|
return LlamaIndexTracer(self._pass_user_data()).stop()
|
199
198
|
else:
|
200
199
|
super().stop()
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: ragaai_catalyst
|
3
|
-
Version: 2.1.
|
3
|
+
Version: 2.1.1b2
|
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
|
@@ -0,0 +1,60 @@
|
|
1
|
+
ragaai_catalyst/__init__.py,sha256=BdIJ_UUre0uEnRTsLw_hE0C0muWk6XWNZqdVOel22R4,537
|
2
|
+
ragaai_catalyst/_version.py,sha256=JKt9KaVNOMVeGs8ojO6LvIZr7ZkMzNN-gCcvryy4x8E,460
|
3
|
+
ragaai_catalyst/dataset.py,sha256=On-iOhD5R7iLusph6dLAGS1dOnNtb1koiKxKjTH90pE,10660
|
4
|
+
ragaai_catalyst/evaluation.py,sha256=34H2bYZNSrcu0jMQgDZw1OLVbQU80PaVLo2avju8POM,20311
|
5
|
+
ragaai_catalyst/experiment.py,sha256=8KvqgJg5JVnt9ghhGDJvdb4mN7ETBX_E5gNxBT0Nsn8,19010
|
6
|
+
ragaai_catalyst/guard_executor.py,sha256=llPbE3DyVtrybojXknzBZj8-dtUrGBQwi9-ZiPJxGRo,3762
|
7
|
+
ragaai_catalyst/guardrails_manager.py,sha256=DILMOAASK57FH9BLq_8yC1AQzRJ8McMFLwCXgYwNAd4,11904
|
8
|
+
ragaai_catalyst/internal_api_completion.py,sha256=DdICI5yfEudiOAIC8L4oxH0Qz7kX-BZCdo9IWsi2gNo,2965
|
9
|
+
ragaai_catalyst/prompt_manager.py,sha256=W8ypramzOprrJ7-22d5vkBXIuIQ8v9XAzKDGxKsTK28,16550
|
10
|
+
ragaai_catalyst/proxy_call.py,sha256=CHxldeceZUaLU-to_hs_Kf1z_b2vHMssLS_cOBedu78,5499
|
11
|
+
ragaai_catalyst/ragaai_catalyst.py,sha256=FdqMzwuQLqS2-3JJDsTQ8uh2itllOxfPrRUjb8Kwmn0,17428
|
12
|
+
ragaai_catalyst/synthetic_data_generation.py,sha256=uDV9tNwto2xSkWg5XHXUvjErW-4P34CTrxaJpRfezyA,19250
|
13
|
+
ragaai_catalyst/utils.py,sha256=TlhEFwLyRU690HvANbyoRycR3nQ67lxVUQoUOfTPYQ0,3772
|
14
|
+
ragaai_catalyst/tracers/__init__.py,sha256=yxepo7iVjTNI_wFdk3Z6Ghu64SazVyszCPEHYrX5WQk,50
|
15
|
+
ragaai_catalyst/tracers/llamaindex_callback.py,sha256=vPE7MieKjfwLrLUnnPs20Df0xNYqoCCj-Mt2NbiuiKU,14023
|
16
|
+
ragaai_catalyst/tracers/tracer.py,sha256=ecr90nRvd6iHRc9HaVm79HM0fB875QwS6YNh6HHSCD8,12637
|
17
|
+
ragaai_catalyst/tracers/upload_traces.py,sha256=hs0PEmit3n3_uUqrdbwcBdyK5Nbkik3JQVwJMEwYTd4,4796
|
18
|
+
ragaai_catalyst/tracers/agentic_tracing/README.md,sha256=X4QwLb7-Jg7GQMIXj-SerZIgDETfw-7VgYlczOR8ZeQ,4508
|
19
|
+
ragaai_catalyst/tracers/agentic_tracing/__init__.py,sha256=yf6SKvOPSpH-9LiKaoLKXwqj5sez8F_5wkOb91yp0oE,260
|
20
|
+
ragaai_catalyst/tracers/agentic_tracing/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
21
|
+
ragaai_catalyst/tracers/agentic_tracing/data/data_structure.py,sha256=fv1h5IvVZDj7IYrozW2NL9tdoL2CWWWOPey_LTduNuI,7708
|
22
|
+
ragaai_catalyst/tracers/agentic_tracing/tests/FinancialAnalysisSystem.ipynb,sha256=0qZxjWqYCTAVvdo3Tsp544D8Am48wfeMQ9RKpKgAL8g,34291
|
23
|
+
ragaai_catalyst/tracers/agentic_tracing/tests/GameActivityEventPlanner.ipynb,sha256=QCMFJYbGX0fd9eMW4PqyQLZjyWuTXo7n1nqO_hMLf0s,4225
|
24
|
+
ragaai_catalyst/tracers/agentic_tracing/tests/TravelPlanner.ipynb,sha256=fU3inXoemJbdTkGAQl_N1UwVEZ10LrKv4gCEpbQ4ISg,43481
|
25
|
+
ragaai_catalyst/tracers/agentic_tracing/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
26
|
+
ragaai_catalyst/tracers/agentic_tracing/tests/ai_travel_agent.py,sha256=S4rCcKzU_5SB62BYEbNn_1VbbTdG4396N8rdZ3ZNGcE,5654
|
27
|
+
ragaai_catalyst/tracers/agentic_tracing/tests/unique_decorator_test.py,sha256=Xk1cLzs-2A3dgyBwRRnCWs7Eubki40FVonwd433hPN8,4805
|
28
|
+
ragaai_catalyst/tracers/agentic_tracing/tracers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
29
|
+
ragaai_catalyst/tracers/agentic_tracing/tracers/agent_tracer.py,sha256=_9yGrHLw9TnKkYaNkWHQaLFQgsi945CClDTpf6JhINk,21372
|
30
|
+
ragaai_catalyst/tracers/agentic_tracing/tracers/base.py,sha256=lxr62VIbULd9vqCT30nvuWfokvbm7LLWlsu84m0YQfk,14043
|
31
|
+
ragaai_catalyst/tracers/agentic_tracing/tracers/llm_tracer.py,sha256=19SYo8FXNhsJgR4w5t2o8A-hfS2wMuHS4XshmasVDXM,23806
|
32
|
+
ragaai_catalyst/tracers/agentic_tracing/tracers/main_tracer.py,sha256=urY3AWI01JAlGe2rjg-K0EV0CFHti4_SUOAXp23ROk4,10246
|
33
|
+
ragaai_catalyst/tracers/agentic_tracing/tracers/network_tracer.py,sha256=6FTA15xMnum9omM_0Jd9cMIuWdKu1gR5Tc8fOXAkP8E,10068
|
34
|
+
ragaai_catalyst/tracers/agentic_tracing/tracers/tool_tracer.py,sha256=RuxmiOT8DUzpy5oFNjImQDNjYDQ0kJO3Jkv-S1RukEE,8788
|
35
|
+
ragaai_catalyst/tracers/agentic_tracing/tracers/user_interaction_tracer.py,sha256=wsCwTK7tM_L3mdNrcg5Mq3D1k07XCHZkhOB26kz_rLY,1472
|
36
|
+
ragaai_catalyst/tracers/agentic_tracing/upload/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
37
|
+
ragaai_catalyst/tracers/agentic_tracing/upload/upload_agentic_traces.py,sha256=ydaWAbrSS5B6ijabzTnUVxlW8m6eX5dsEJnzl06ZDFU,7539
|
38
|
+
ragaai_catalyst/tracers/agentic_tracing/upload/upload_code.py,sha256=u9bRWcM5oDezJupEQoHUXrKz7YvZJK9IZf10ejBWoa4,4254
|
39
|
+
ragaai_catalyst/tracers/agentic_tracing/utils/__init__.py,sha256=XdB3X_ufe4RVvGorxSqAiB9dYv4UD7Hvvuw3bsDUppY,60
|
40
|
+
ragaai_catalyst/tracers/agentic_tracing/utils/api_utils.py,sha256=JyNCbfpW-w4O9CjtemTqmor2Rh1WGpQwhRaDSRmBxw8,689
|
41
|
+
ragaai_catalyst/tracers/agentic_tracing/utils/file_name_tracker.py,sha256=515NNDQJTyy3O-2rdlUYUoWL9qSwLIfvV3sMB9BtHp8,1366
|
42
|
+
ragaai_catalyst/tracers/agentic_tracing/utils/generic.py,sha256=WwXT01xmp8MSr7KinuDCSK9a1ifpLcT7ajFkvYviG_A,1190
|
43
|
+
ragaai_catalyst/tracers/agentic_tracing/utils/llm_utils.py,sha256=7r9UrXEdftoMWsE0fy0ps9dcPq0o5M4pMYmr7VXs7yc,12238
|
44
|
+
ragaai_catalyst/tracers/agentic_tracing/utils/model_costs.json,sha256=6wnDtkBH-uwJeZm9FtyeXuUWux8u-skT3lmrtFwsReI,286298
|
45
|
+
ragaai_catalyst/tracers/agentic_tracing/utils/trace_utils.py,sha256=9cFzfFqIA968bUG7LNTjdN7zbdEXUtcvRKg883ade2c,2586
|
46
|
+
ragaai_catalyst/tracers/agentic_tracing/utils/unique_decorator.py,sha256=DQHjcEuqEKsNSWaNs7SoOaq50yK4Jsl966S7mBnV-zA,5723
|
47
|
+
ragaai_catalyst/tracers/agentic_tracing/utils/zip_list_of_unique_files.py,sha256=faFat_OAUnVJGnauMVo6yeHhTv-_njgyXGOtUwYJ8kE,7568
|
48
|
+
ragaai_catalyst/tracers/exporters/__init__.py,sha256=kVA8zp05h3phu4e-iHSlnznp_PzMRczB7LphSsZgUjg,138
|
49
|
+
ragaai_catalyst/tracers/exporters/file_span_exporter.py,sha256=RgGteu-NVGprXKkynvyIO5yOjpbtA41R3W_NzCjnkwE,6445
|
50
|
+
ragaai_catalyst/tracers/exporters/raga_exporter.py,sha256=pU9EH6Fn1Z757bpM3VaXPDHuJ5wyUrMObGaACiztvTU,18014
|
51
|
+
ragaai_catalyst/tracers/instrumentators/__init__.py,sha256=FgnMQupoRTzmVsG9YKsLQera2Pfs-AluZv8CxwavoyQ,253
|
52
|
+
ragaai_catalyst/tracers/instrumentators/langchain.py,sha256=yMN0qVF0pUVk6R5M1vJoUXezDo1ejs4klCFRlE8x4vE,574
|
53
|
+
ragaai_catalyst/tracers/instrumentators/llamaindex.py,sha256=SMrRlR4xM7k9HK43hakE8rkrWHxMlmtmWD-AX6TeByc,416
|
54
|
+
ragaai_catalyst/tracers/instrumentators/openai.py,sha256=14R4KW9wQCR1xysLfsP_nxS7cqXrTPoD8En4MBAaZUU,379
|
55
|
+
ragaai_catalyst/tracers/utils/__init__.py,sha256=KeMaZtYaTojilpLv65qH08QmpYclfpacDA0U3wg6Ybw,64
|
56
|
+
ragaai_catalyst/tracers/utils/utils.py,sha256=ViygfJ7vZ7U0CTSA1lbxVloHp4NSlmfDzBRNCJuMhis,2374
|
57
|
+
ragaai_catalyst-2.1.1b2.dist-info/METADATA,sha256=UB7mp3eF5vyYOqsU8WF9zDnqbV136KQDib5SPnifJE4,1801
|
58
|
+
ragaai_catalyst-2.1.1b2.dist-info/WHEEL,sha256=A3WOREP4zgxI0fKrHUG8DC8013e3dK3n7a6HDbcEIwE,91
|
59
|
+
ragaai_catalyst-2.1.1b2.dist-info/top_level.txt,sha256=HpgsdRgEJMk8nqrU6qdCYk3di7MJkDL0B19lkc7dLfM,16
|
60
|
+
ragaai_catalyst-2.1.1b2.dist-info/RECORD,,
|
@@ -1,61 +0,0 @@
|
|
1
|
-
from dataclasses import dataclass, field
|
2
|
-
from typing import Dict, List, Any, Optional
|
3
|
-
|
4
|
-
|
5
|
-
@dataclass
|
6
|
-
class ProjectInfo:
|
7
|
-
project_name: str
|
8
|
-
start_time: float
|
9
|
-
end_time: float = field(default=0)
|
10
|
-
duration: float = field(default=0)
|
11
|
-
total_cost: float = field(default=0)
|
12
|
-
total_tokens: int = field(default=0)
|
13
|
-
|
14
|
-
|
15
|
-
@dataclass
|
16
|
-
class SystemInfo:
|
17
|
-
project_id: int
|
18
|
-
os_name: str
|
19
|
-
os_version: str
|
20
|
-
python_version: str
|
21
|
-
cpu_info: str
|
22
|
-
memory_total: float
|
23
|
-
installed_packages: str
|
24
|
-
|
25
|
-
|
26
|
-
@dataclass
|
27
|
-
class LLMCall:
|
28
|
-
name: str
|
29
|
-
model_name: str
|
30
|
-
input_prompt: str
|
31
|
-
output_response: str
|
32
|
-
tool_call: Dict
|
33
|
-
token_usage: Dict[str, int]
|
34
|
-
cost: Dict[str, float]
|
35
|
-
start_time: float = field(default=0)
|
36
|
-
end_time: float = field(default=0)
|
37
|
-
duration: float = field(default=0)
|
38
|
-
|
39
|
-
|
40
|
-
@dataclass
|
41
|
-
class ToolCall:
|
42
|
-
name: str
|
43
|
-
input_parameters: Dict[str, Any]
|
44
|
-
output: Any
|
45
|
-
start_time: float
|
46
|
-
end_time: float
|
47
|
-
duration: float
|
48
|
-
errors: Optional[str] = None
|
49
|
-
|
50
|
-
|
51
|
-
@dataclass
|
52
|
-
class AgentCall:
|
53
|
-
name: str
|
54
|
-
input_parameters: Dict[str, Any]
|
55
|
-
output: Any
|
56
|
-
start_time: float
|
57
|
-
end_time: float
|
58
|
-
duration: float
|
59
|
-
tool_calls: List[Dict[str, Any]]
|
60
|
-
llm_calls: List[Dict[str, Any]]
|
61
|
-
errors: Optional[str] = None
|
@@ -1,56 +0,0 @@
|
|
1
|
-
ragaai_catalyst/__init__.py,sha256=BdIJ_UUre0uEnRTsLw_hE0C0muWk6XWNZqdVOel22R4,537
|
2
|
-
ragaai_catalyst/_version.py,sha256=JKt9KaVNOMVeGs8ojO6LvIZr7ZkMzNN-gCcvryy4x8E,460
|
3
|
-
ragaai_catalyst/dataset.py,sha256=On-iOhD5R7iLusph6dLAGS1dOnNtb1koiKxKjTH90pE,10660
|
4
|
-
ragaai_catalyst/evaluation.py,sha256=34H2bYZNSrcu0jMQgDZw1OLVbQU80PaVLo2avju8POM,20311
|
5
|
-
ragaai_catalyst/experiment.py,sha256=8KvqgJg5JVnt9ghhGDJvdb4mN7ETBX_E5gNxBT0Nsn8,19010
|
6
|
-
ragaai_catalyst/guard_executor.py,sha256=llPbE3DyVtrybojXknzBZj8-dtUrGBQwi9-ZiPJxGRo,3762
|
7
|
-
ragaai_catalyst/guardrails_manager.py,sha256=DILMOAASK57FH9BLq_8yC1AQzRJ8McMFLwCXgYwNAd4,11904
|
8
|
-
ragaai_catalyst/internal_api_completion.py,sha256=DdICI5yfEudiOAIC8L4oxH0Qz7kX-BZCdo9IWsi2gNo,2965
|
9
|
-
ragaai_catalyst/prompt_manager.py,sha256=W8ypramzOprrJ7-22d5vkBXIuIQ8v9XAzKDGxKsTK28,16550
|
10
|
-
ragaai_catalyst/proxy_call.py,sha256=CHxldeceZUaLU-to_hs_Kf1z_b2vHMssLS_cOBedu78,5499
|
11
|
-
ragaai_catalyst/ragaai_catalyst.py,sha256=FdqMzwuQLqS2-3JJDsTQ8uh2itllOxfPrRUjb8Kwmn0,17428
|
12
|
-
ragaai_catalyst/synthetic_data_generation.py,sha256=uDV9tNwto2xSkWg5XHXUvjErW-4P34CTrxaJpRfezyA,19250
|
13
|
-
ragaai_catalyst/utils.py,sha256=TlhEFwLyRU690HvANbyoRycR3nQ67lxVUQoUOfTPYQ0,3772
|
14
|
-
ragaai_catalyst/tracers/__init__.py,sha256=yxepo7iVjTNI_wFdk3Z6Ghu64SazVyszCPEHYrX5WQk,50
|
15
|
-
ragaai_catalyst/tracers/llamaindex_callback.py,sha256=vPE7MieKjfwLrLUnnPs20Df0xNYqoCCj-Mt2NbiuiKU,14023
|
16
|
-
ragaai_catalyst/tracers/tracer.py,sha256=dGYQfo0RXms6w-sAJf04gqTo1zOXTqreGXaJlnvK48A,12463
|
17
|
-
ragaai_catalyst/tracers/upload_traces.py,sha256=hs0PEmit3n3_uUqrdbwcBdyK5Nbkik3JQVwJMEwYTd4,4796
|
18
|
-
ragaai_catalyst/tracers/agentic_tracing/__init__.py,sha256=6QyQI8P7aNFHTantNJOP1ZdSNrDKBLhlg_gGNj7tm1c,73
|
19
|
-
ragaai_catalyst/tracers/agentic_tracing/agent_tracer.py,sha256=oLe5QtrndaO-sBAHvxUPfj9GB_EwQbi0T3JwjcqmvtY,21388
|
20
|
-
ragaai_catalyst/tracers/agentic_tracing/agentic_tracing.py,sha256=yqWu_xnKfLE6nVYM0TqaAYLI_tzy5Z2wZwgA9-Gjppo,10218
|
21
|
-
ragaai_catalyst/tracers/agentic_tracing/base.py,sha256=jRf_-5EIfCzGbaSQtkqgiDQAH4ymoKUrg9A8YqB08jk,14008
|
22
|
-
ragaai_catalyst/tracers/agentic_tracing/data_structure.py,sha256=wkZctMTUQUViqKrHhdZiMERSBVfwURAJ-lFlQUou638,7395
|
23
|
-
ragaai_catalyst/tracers/agentic_tracing/file_name_tracker.py,sha256=515NNDQJTyy3O-2rdlUYUoWL9qSwLIfvV3sMB9BtHp8,1366
|
24
|
-
ragaai_catalyst/tracers/agentic_tracing/llm_tracer.py,sha256=BpazvaHy9YBsnizQMIEZoRlan7DiM7pCUO9u-RSYiXo,32721
|
25
|
-
ragaai_catalyst/tracers/agentic_tracing/network_tracer.py,sha256=6FTA15xMnum9omM_0Jd9cMIuWdKu1gR5Tc8fOXAkP8E,10068
|
26
|
-
ragaai_catalyst/tracers/agentic_tracing/sample.py,sha256=S4rCcKzU_5SB62BYEbNn_1VbbTdG4396N8rdZ3ZNGcE,5654
|
27
|
-
ragaai_catalyst/tracers/agentic_tracing/tool_tracer.py,sha256=Yc4x82rk0hCANwXUt4M66Qv_4OdpsXsjlq6OIOef1io,8763
|
28
|
-
ragaai_catalyst/tracers/agentic_tracing/unique_decorator.py,sha256=DQHjcEuqEKsNSWaNs7SoOaq50yK4Jsl966S7mBnV-zA,5723
|
29
|
-
ragaai_catalyst/tracers/agentic_tracing/unique_decorator_test.py,sha256=Xk1cLzs-2A3dgyBwRRnCWs7Eubki40FVonwd433hPN8,4805
|
30
|
-
ragaai_catalyst/tracers/agentic_tracing/upload_agentic_traces.py,sha256=ydaWAbrSS5B6ijabzTnUVxlW8m6eX5dsEJnzl06ZDFU,7539
|
31
|
-
ragaai_catalyst/tracers/agentic_tracing/upload_code.py,sha256=u9bRWcM5oDezJupEQoHUXrKz7YvZJK9IZf10ejBWoa4,4254
|
32
|
-
ragaai_catalyst/tracers/agentic_tracing/user_interaction_tracer.py,sha256=wsCwTK7tM_L3mdNrcg5Mq3D1k07XCHZkhOB26kz_rLY,1472
|
33
|
-
ragaai_catalyst/tracers/agentic_tracing/zip_list_of_unique_files.py,sha256=faFat_OAUnVJGnauMVo6yeHhTv-_njgyXGOtUwYJ8kE,7568
|
34
|
-
ragaai_catalyst/tracers/agentic_tracing/examples/FinancialAnalysisSystem.ipynb,sha256=0qZxjWqYCTAVvdo3Tsp544D8Am48wfeMQ9RKpKgAL8g,34291
|
35
|
-
ragaai_catalyst/tracers/agentic_tracing/examples/GameActivityEventPlanner.ipynb,sha256=QCMFJYbGX0fd9eMW4PqyQLZjyWuTXo7n1nqO_hMLf0s,4225
|
36
|
-
ragaai_catalyst/tracers/agentic_tracing/examples/TravelPlanner.ipynb,sha256=fU3inXoemJbdTkGAQl_N1UwVEZ10LrKv4gCEpbQ4ISg,43481
|
37
|
-
ragaai_catalyst/tracers/agentic_tracing/utils/__init__.py,sha256=XdB3X_ufe4RVvGorxSqAiB9dYv4UD7Hvvuw3bsDUppY,60
|
38
|
-
ragaai_catalyst/tracers/agentic_tracing/utils/api_utils.py,sha256=JyNCbfpW-w4O9CjtemTqmor2Rh1WGpQwhRaDSRmBxw8,689
|
39
|
-
ragaai_catalyst/tracers/agentic_tracing/utils/data_classes.py,sha256=gFOadWzUORETaH3Y_HerHXs_aVFEt5ry2NQ36domW58,1267
|
40
|
-
ragaai_catalyst/tracers/agentic_tracing/utils/generic.py,sha256=WwXT01xmp8MSr7KinuDCSK9a1ifpLcT7ajFkvYviG_A,1190
|
41
|
-
ragaai_catalyst/tracers/agentic_tracing/utils/llm_utils.py,sha256=7lHJ84kbe7kn4Hbd6MT8KeSl-We7nc_yq2xkfgxgl2E,5769
|
42
|
-
ragaai_catalyst/tracers/agentic_tracing/utils/model_costs.json,sha256=6wnDtkBH-uwJeZm9FtyeXuUWux8u-skT3lmrtFwsReI,286298
|
43
|
-
ragaai_catalyst/tracers/agentic_tracing/utils/trace_utils.py,sha256=9cFzfFqIA968bUG7LNTjdN7zbdEXUtcvRKg883ade2c,2586
|
44
|
-
ragaai_catalyst/tracers/exporters/__init__.py,sha256=kVA8zp05h3phu4e-iHSlnznp_PzMRczB7LphSsZgUjg,138
|
45
|
-
ragaai_catalyst/tracers/exporters/file_span_exporter.py,sha256=RgGteu-NVGprXKkynvyIO5yOjpbtA41R3W_NzCjnkwE,6445
|
46
|
-
ragaai_catalyst/tracers/exporters/raga_exporter.py,sha256=pU9EH6Fn1Z757bpM3VaXPDHuJ5wyUrMObGaACiztvTU,18014
|
47
|
-
ragaai_catalyst/tracers/instrumentators/__init__.py,sha256=FgnMQupoRTzmVsG9YKsLQera2Pfs-AluZv8CxwavoyQ,253
|
48
|
-
ragaai_catalyst/tracers/instrumentators/langchain.py,sha256=yMN0qVF0pUVk6R5M1vJoUXezDo1ejs4klCFRlE8x4vE,574
|
49
|
-
ragaai_catalyst/tracers/instrumentators/llamaindex.py,sha256=SMrRlR4xM7k9HK43hakE8rkrWHxMlmtmWD-AX6TeByc,416
|
50
|
-
ragaai_catalyst/tracers/instrumentators/openai.py,sha256=14R4KW9wQCR1xysLfsP_nxS7cqXrTPoD8En4MBAaZUU,379
|
51
|
-
ragaai_catalyst/tracers/utils/__init__.py,sha256=KeMaZtYaTojilpLv65qH08QmpYclfpacDA0U3wg6Ybw,64
|
52
|
-
ragaai_catalyst/tracers/utils/utils.py,sha256=ViygfJ7vZ7U0CTSA1lbxVloHp4NSlmfDzBRNCJuMhis,2374
|
53
|
-
ragaai_catalyst-2.1.1b0.dist-info/METADATA,sha256=qAtdLG3fZX-NLrkgejCFS-aIna4O_suzsle3OKByqew,1801
|
54
|
-
ragaai_catalyst-2.1.1b0.dist-info/WHEEL,sha256=A3WOREP4zgxI0fKrHUG8DC8013e3dK3n7a6HDbcEIwE,91
|
55
|
-
ragaai_catalyst-2.1.1b0.dist-info/top_level.txt,sha256=HpgsdRgEJMk8nqrU6qdCYk3di7MJkDL0B19lkc7dLfM,16
|
56
|
-
ragaai_catalyst-2.1.1b0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
/ragaai_catalyst/tracers/agentic_tracing/{unique_decorator_test.py → tests/unique_decorator_test.py}
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
/ragaai_catalyst/tracers/agentic_tracing/{file_name_tracker.py → utils/file_name_tracker.py}
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|