import { type UsageTokens } from "@tokenometer/core"; import type { ModelCandidate, RouteDecision, RouteRequest } from "./types.ts"; export type BudgetState = "ok" | "warn" | "exhausted"; export type BudgetStepSource = "actual" | "estimated"; export interface BudgetAwareRouterOptions { maxBudgetUsd: number; /** Fraction of budget at which routing enters warn/degraded mode. Default 0.8. */ warnAt?: number; /** Optional lower quality bar used once the chain reaches warnAt. */ degradedQualityBar?: number; } export interface BudgetStepRecord { source: BudgetStepSource; model: ModelCandidate; totalUsd: number; inputUsd: number; cachedInputUsd: number; outputUsd: number; usage?: UsageTokens; } export interface BudgetSnapshot { maxBudgetUsd: number; spentUsd: number; remainingUsd: number; percentUsed: number; state: BudgetState; steps: BudgetStepRecord[]; } export interface BudgetRouteStepRequest extends Omit { /** Optional per-step cap. The effective cap is min(remaining budget, this value). */ maxStepCostUsd?: number; } export interface BudgetRouteStepResult { decision: RouteDecision; snapshotBefore: BudgetSnapshot; effectiveQualityBar: number; maxCostUsd: number; } export interface RecordActualUsageInput { model: ModelCandidate; usage: UsageTokens; } export declare class BudgetAwareRouter { readonly maxBudgetUsd: number; readonly warnAt: number; readonly degradedQualityBar?: number; private spentUsd; private steps; constructor(options: BudgetAwareRouterOptions); routeStep(request: BudgetRouteStepRequest): BudgetRouteStepResult; recordActualUsage(input: RecordActualUsageInput): BudgetStepRecord; recordEstimatedStep(decision: RouteDecision): BudgetStepRecord; getSnapshot(): BudgetSnapshot; reset(): void; private record; } //# sourceMappingURL=budget-router.d.ts.map