/**
 * Task-class (utility-tier) model routing — AI cost-control Phase 2.
 *
 * Background utility AI calls — image caption/OCR, conversation-title
 * generation, event summary/extraction — do NOT need the user's primary
 * (often expensive, e.g. Opus) model. This re-points them to a curated cheap
 * VISION-capable model of the SAME provider (same API key, no new credentials).
 * Interactive chat is never routed through here.
 *
 * Curated, NOT catalog-cheapest: sorting the catalog by raw cost picks weak
 * legacy/nano models (e.g. Claude 3 Haiku, gpt-*-nano) that tank caption/OCR
 * quality. The cheap-but-capable tier we actually want is hand-picked in the
 * `PROVIDER_MODELS` table (core/secrets/registry.ts) — the SAME table that
 * backs the recommendations dropdown — and read here via `utilityModelFor`.
 * A provider whose entry has `utility: null` (or no entry) keeps its primary;
 * that gap is observable via the usage ledger (feature+modelId) on
 * /api/admin/ai-usage rather than being silently swallowed.
 *
 * Fail-safe by construction: every uncertain branch returns the primary
 * unchanged, so a bad lookup, an unknown provider, or a catalog gap can never
 * break or silently disable a feature — at worst it just doesn't save money.
 */
export interface ModelCoords {
    provider: string;
    modelId: string;
    apiKey: string;
}
/**
 * Re-point a background utility call to the provider's curated cheap vision
 * model when that's STRICTLY cheaper than the primary. Returns the primary
 * unchanged in every other case (unknown provider, already on the tier, the
 * curated model isn't vision-capable, or either price is unknown). Same
 * provider + same apiKey — never crosses providers or needs new credentials.
 *
 * Kill switch: STUDIOGRAPH_DISABLE_UTILITY_ROUTING=1.
 */
export declare function resolveUtilityModelConfig(primary: ModelCoords): ModelCoords;
