Source code for mindroot.coreplugins.usage.handlers

from typing import Optional
from .models import UsageEvent
from .storage import UsageStorage
from loguru import logger
import traceback

[docs] class UsageTracker: def __init__(self, storage: UsageStorage): self.storage = storage
[docs] async def get_cost(self, plugin_id: str, cost_type_id: str, model_id: Optional[str] = None) -> float: """Get the cost for a specific usage type and optional model""" costs = await self.storage.load_costs() try: plugin_costs = costs[plugin_id] type_costs = plugin_costs[cost_type_id] # Try model-specific cost first if model_id and 'model_specific' in type_costs: if model_id in type_costs['model_specific']: return type_costs['model_specific'][model_id] # Fall back to default cost return type_costs.get('default', 0.0) except Exception as e: trace = traceback.format_exc() logger.error(f"Error getting cost: {e}\n\n{trace}") return 0.0
[docs] async def track_usage(self, event: UsageEvent): """Track a usage event and store it with calculated cost""" unit_cost = await self.get_cost(event.plugin_id, event.cost_type_id, event.model_id) total_cost = unit_cost * event.quantity await self.storage.store_event(event, total_cost)
[docs] async def get_usage(self, username: str, start_date=None, end_date=None): """Get usage records for a user""" return await self.storage.get_usage(username, start_date, end_date)
[docs] async def get_total_cost(self, username: str, start_date=None, end_date=None): """Get total cost for a user""" return await self.storage.get_total_cost(username, start_date, end_date)