Utils API
Utility classes and functions.
TokenTracker
from src.token_tracker import TokenTracker, get_tracker, record_tokens
Class Definition
class TokenTracker:
"""
Singleton token usage tracker (thread-safe).
Features:
- Per-module, per-model tracking
- Aggregated statistics
- JSON export
"""
Class Methods
@classmethod
def get_instance(cls) -> 'TokenTracker':
"""Get singleton instance."""
Instance Methods
def record(
self,
module: str,
operation: str,
model: str,
provider: str,
input_tokens: int,
output_tokens: int,
metadata: Optional[Dict] = None
) -> None:
"""
Record token usage.
Args:
module: Module name (persona_formulation, interaction_generation, etc.)
operation: Operation type
model: Model name
provider: Provider name
input_tokens: Input/prompt tokens
output_tokens: Output/completion tokens
metadata: Additional info
"""
def get_statistics(self) -> Dict[str, Any]:
"""
Get aggregated statistics.
Returns:
Dictionary with:
- summary: Total counts
- by_module: Per-module breakdown
- by_model: Per-model breakdown
"""
def export_to_file(
self,
filepath: str,
include_records: bool = True
) -> None:
"""
Export statistics to JSON file.
Args:
filepath: Output file path
include_records: Include individual records
"""
def print_summary(self) -> None:
"""Print formatted summary to console."""
def reset(self) -> None:
"""Clear all records."""
def to_dict(self, include_records: bool = True) -> Dict[str, Any]:
"""Convert to dictionary."""
Convenience Functions
def get_tracker() -> TokenTracker:
"""Get singleton TokenTracker instance."""
def record_tokens(
module: str,
operation: str,
model: str,
provider: str,
input_tokens: int,
output_tokens: int,
metadata: Optional[Dict] = None
) -> None:
"""Record token usage (convenience wrapper)."""
TokenUsage
from src.token_tracker import TokenUsage
Class Definition
@dataclass
class TokenUsage:
"""
Single token usage record.
Attributes:
module: Module name
operation: Operation type
model: Model name
provider: Provider name
input_tokens: Input tokens
output_tokens: Output tokens
timestamp: ISO timestamp
metadata: Additional info
"""
ColoredLogger
from src.colored_logger import ColoredLogger, print_colored
Functions
def print_colored(message: str, color_type: str) -> None:
"""
Print colored message to console.
Args:
message: Text to print
color_type: Color type ('STAGE', 'SUCCESS', 'WARNING', 'ERROR', 'INFO', 'GENERATION')
"""
Color Types
Type |
Color |
Use Case |
|---|---|---|
|
Blue |
Stage headers |
|
Green |
Success messages |
|
Yellow |
Warnings |
|
Red |
Errors |
|
Cyan |
Information |
|
Magenta |
Generation progress |
Config Validation
from src.config_validation import validate_config, validate_config_report
Functions
def validate_config(
config: Dict[str, Any],
config_path: Optional[str] = None
) -> Tuple[Dict[str, Any], List[str]]:
"""
Validate configuration (fail-fast).
Args:
config: Configuration dictionary
config_path: Path to config file (for relative path resolution)
Returns:
Tuple of (validated_config, list_of_issues)
Raises:
ValueError: If critical validation fails
"""
def validate_config_report(
config: Dict[str, Any],
config_path: Optional[str] = None
) -> Tuple[Dict[str, Any], List[ValidationCheck], List[ValidationIssue]]:
"""
Validate with detailed reporting.
Returns:
Tuple of (config, checks, issues)
"""
ValidationCheck
@dataclass
class ValidationCheck:
"""
Validation check result.
Attributes:
name: Check name
status: 'PASS', 'WARN', 'FAIL'
message: Result message
"""
ValidationIssue
@dataclass
class ValidationIssue:
"""
Validation issue.
Attributes:
severity: 'warning' or 'error'
message: Issue description
path: Config path (e.g., 'api.api_key')
"""
Usage Examples
Token Tracking
from src.token_tracker import get_tracker, record_tokens
# Get tracker
tracker = get_tracker()
# Record usage
record_tokens(
module='custom_module',
operation='generate',
model='gpt-4o-mini',
provider='openai',
input_tokens=100,
output_tokens=50
)
# Get statistics
stats = tracker.get_statistics()
print(f"Total tokens: {stats['summary']['total_tokens']}")
# Export
tracker.export_to_file("token_usage.json")
# Print summary
tracker.print_summary()
Colored Output
from src.colored_logger import print_colored
print_colored("[Stage 1] Generating Personas...", 'STAGE')
print_colored("Generated 100 personas", 'SUCCESS')
print_colored("Some queries failed", 'WARNING')
print_colored("API error occurred", 'ERROR')
Config Validation
from src.config_validation import validate_config_report
import yaml
with open("config.yaml") as f:
config = yaml.safe_load(f)
config, checks, issues = validate_config_report(config, "config.yaml")
for check in checks:
print(f"{check.status}: {check.name}")
for issue in issues:
print(f"{issue.severity.upper()}: {issue.message}")
Thread Safety
TokenTracker is thread-safe:
import threading
from src.token_tracker import get_tracker
tracker = get_tracker()
def worker():
for _ in range(100):
tracker.record(
module='test',
operation='op',
model='gpt-4o-mini',
provider='openai',
input_tokens=10,
output_tokens=5
)
threads = [threading.Thread(target=worker) for _ in range(4)]
for t in threads:
t.start()
for t in threads:
t.join()
print(f"Total calls: {tracker.get_statistics()['summary']['total_calls']}")
# Output: Total calls: 400
See Also
Token Tracking - User guide
Configuration - Config options