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.
Files changed (32) hide show
  1. ragaai_catalyst/tracers/agentic_tracing/README.md +97 -0
  2. ragaai_catalyst/tracers/agentic_tracing/__init__.py +4 -2
  3. ragaai_catalyst/tracers/agentic_tracing/data/__init__.py +0 -0
  4. ragaai_catalyst/tracers/agentic_tracing/{data_structure.py → data/data_structure.py} +14 -1
  5. ragaai_catalyst/tracers/agentic_tracing/tests/__init__.py +0 -0
  6. ragaai_catalyst/tracers/agentic_tracing/tracers/__init__.py +0 -0
  7. ragaai_catalyst/tracers/agentic_tracing/{agent_tracer.py → tracers/agent_tracer.py} +2 -4
  8. ragaai_catalyst/tracers/agentic_tracing/{base.py → tracers/base.py} +5 -6
  9. ragaai_catalyst/tracers/agentic_tracing/{llm_tracer.py → tracers/llm_tracer.py} +30 -246
  10. ragaai_catalyst/tracers/agentic_tracing/{agentic_tracing.py → tracers/main_tracer.py} +3 -4
  11. ragaai_catalyst/tracers/agentic_tracing/{tool_tracer.py → tracers/tool_tracer.py} +3 -3
  12. ragaai_catalyst/tracers/agentic_tracing/upload/__init__.py +0 -0
  13. ragaai_catalyst/tracers/agentic_tracing/utils/llm_utils.py +229 -43
  14. ragaai_catalyst/tracers/tracer.py +11 -12
  15. {ragaai_catalyst-2.1.1b0.dist-info → ragaai_catalyst-2.1.1b2.dist-info}/METADATA +1 -1
  16. ragaai_catalyst-2.1.1b2.dist-info/RECORD +60 -0
  17. ragaai_catalyst/tracers/agentic_tracing/utils/data_classes.py +0 -61
  18. ragaai_catalyst-2.1.1b0.dist-info/RECORD +0 -56
  19. /ragaai_catalyst/tracers/agentic_tracing/{examples → tests}/FinancialAnalysisSystem.ipynb +0 -0
  20. /ragaai_catalyst/tracers/agentic_tracing/{examples → tests}/GameActivityEventPlanner.ipynb +0 -0
  21. /ragaai_catalyst/tracers/agentic_tracing/{examples → tests}/TravelPlanner.ipynb +0 -0
  22. /ragaai_catalyst/tracers/agentic_tracing/{sample.py → tests/ai_travel_agent.py} +0 -0
  23. /ragaai_catalyst/tracers/agentic_tracing/{unique_decorator_test.py → tests/unique_decorator_test.py} +0 -0
  24. /ragaai_catalyst/tracers/agentic_tracing/{network_tracer.py → tracers/network_tracer.py} +0 -0
  25. /ragaai_catalyst/tracers/agentic_tracing/{user_interaction_tracer.py → tracers/user_interaction_tracer.py} +0 -0
  26. /ragaai_catalyst/tracers/agentic_tracing/{upload_agentic_traces.py → upload/upload_agentic_traces.py} +0 -0
  27. /ragaai_catalyst/tracers/agentic_tracing/{upload_code.py → upload/upload_code.py} +0 -0
  28. /ragaai_catalyst/tracers/agentic_tracing/{file_name_tracker.py → utils/file_name_tracker.py} +0 -0
  29. /ragaai_catalyst/tracers/agentic_tracing/{unique_decorator.py → utils/unique_decorator.py} +0 -0
  30. /ragaai_catalyst/tracers/agentic_tracing/{zip_list_of_unique_files.py → utils/zip_list_of_unique_files.py} +0 -0
  31. {ragaai_catalyst-2.1.1b0.dist-info → ragaai_catalyst-2.1.1b2.dist-info}/WHEEL +0 -0
  32. {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 .agentic_tracing import AgenticTracing
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']
@@ -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
@@ -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 .file_name_tracker import TrackName
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 .unique_decorator import generate_unique_hash_simple
12
- from .utils.trace_utils import load_model_costs
13
- from .utils.llm_utils import extract_llm_output
14
- from .file_name_tracker import TrackName
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
- token_usage = self._extract_token_usage(result)
453
- model_name = self._extract_model_name(args, kwargs, result)
454
- cost = self._calculate_cost(token_usage, model_name)
455
- parameters = self._extract_parameters(kwargs)
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=self._extract_input_data(args, kwargs, None),
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
- token_usage = self._extract_token_usage(result)
552
- model_name = self._extract_model_name(args, kwargs, result)
553
- cost = self._calculate_cost(token_usage, model_name)
554
- parameters = self._extract_parameters(kwargs)
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=self._extract_input_data(args, kwargs, None),
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 ...ragaai_catalyst import RagaAICatalyst
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:
@@ -1,4 +1,4 @@
1
- from .data_classes import LLMCall
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
- # Load the Json configuration
13
- try:
14
- current_dir = os.path.dirname(os.path.abspath(__file__))
15
- model_costs_path = os.path.join(current_dir, "model_costs.json")
16
- with open(model_costs_path, "r") as file:
17
- config = json.load(file)
18
- except FileNotFoundError:
19
- from importlib.resources import files
20
- with (files("") / "model_costs.json").open("r") as file:
21
- config = json.load(file)
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 = None
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 = convert_usage_to_dict(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
- if model_name in model_costs:
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 ..ragaai_catalyst import RagaAICatalyst
22
- from .agentic_tracing.agentic_tracing import AgenticTracing
23
- from .agentic_tracing.file_name_tracker import TrackName
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.1b0
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,,