/** * TokenCostGuard * * Tracks LLM API token usage and cost per session/user. * Enforces financial circuit breaking with hard cost ceilings. * * Addresses OWASP LLM10: Unbounded Consumption — insufficient controls * on resource usage leading to excessive API costs, denial-of-service, * or financial exploitation. * * Real-world context: * - A single runaway agent loop can burn $10K+ in API costs in minutes * - Deloitte 2026: only 20% of orgs have mature governance for AI spending * - LLMjacking: stolen credentials used to run up bills on victim accounts */ export interface TokenCostGuardConfig { /** Max tokens per session before blocking (default: 100000) */ maxTokensPerSession?: number; /** Max tokens per user across all sessions (default: 500000) */ maxTokensPerUser?: number; /** Max cost in dollars per session (default: 10.0) */ maxCostPerSession?: number; /** Max cost in dollars per user (default: 50.0) */ maxCostPerUser?: number; /** Cost per 1K input tokens in dollars (default: 0.003) */ inputTokenCostPer1K?: number; /** Cost per 1K output tokens in dollars (default: 0.015) */ outputTokenCostPer1K?: number; /** Max single request token count (default: 32000) */ maxTokensPerRequest?: number; /** Alert threshold as percentage of budget (default: 0.8 = 80%) */ alertThreshold?: number; /** Session budget window in milliseconds (default: 3600000 = 1 hour) */ budgetWindowMs?: number; } export interface TokenUsage { inputTokens: number; outputTokens: number; totalTokens: number; estimatedCost: number; } export interface TokenCostResult { allowed: boolean; reason?: string; violations: string[]; usage: { session: TokenUsage; user: TokenUsage; request: TokenUsage; }; budget: { session_remaining_tokens: number; session_remaining_cost: number; user_remaining_tokens: number; user_remaining_cost: number; alert: boolean; alert_message?: string; }; } export declare class TokenCostGuard { private config; private sessionUsage; private userUsage; constructor(config?: TokenCostGuardConfig); /** * Track token usage for a request and check against budgets */ trackUsage(sessionId: string, userId: string, inputTokens: number, outputTokens: number, requestId?: string): TokenCostResult; /** * Get current budget status without recording usage */ getBudget(sessionId: string, userId: string): TokenCostResult["budget"]; /** * Reset session budget */ resetSession(sessionId: string): void; /** * Reset user budget */ resetUser(userId: string): void; /** * Destroy and release all resources */ destroy(): void; private calculateCost; private getOrCreateUsage; private cleanEntries; }