/**
 * Model registry — the single source of truth for human-friendly model names.
 *
 * Across the framework a model is referred to three ways:
 *   1. Wire id (Promptfoo provider id): "anthropic:messages:claude-opus-4-6"
 *      — the load-bearing value. Persisted in reports, hashed into eval
 *      fingerprints, emitted to Promptfoo YAML, parsed in many places. NEVER
 *      reformat it.
 *   2. API model id (bare): "claude-opus-4-6" — what the vendor SDK expects.
 *   3. Display name (friendly): "Claude Opus 4.6" — what users should read.
 *
 * This module owns representation (3) and the mapping between the three. It is
 * display-only: nothing here changes a wire value. Authoring friendly names
 * here (rather than re-typing them at each call site or per eval config) keeps
 * one source of truth so labels can't drift.
 *
 * Lookup is lenient by design. It accepts a full wire id, a bare model name,
 * or an agentic-prefixed id ("agentic:naive:claude-opus-4-6") — the model is
 * always resolvable from the trailing colon-segment. Dated revision pins
 * ("...claude-opus-4-5-20251101") fall back to their family entry. An
 * unrecognized model degrades to its bare trailing segment — never the
 * provider-prefixed string.
 *
 * This package is the leaf of the dependency graph (zero runtime deps, no
 * import from @sanity/ailf-core), so the lenient parse below intentionally
 * does NOT reuse core's validated `parseModelId`. The display parse is
 * best-effort and must not throw.
 */
/** Supported provider prefixes, plus a catch-all for unrecognized ids. */
export type ModelProvider = "anthropic" | "google" | "openai" | "unknown";
/** One model's identity across the three representations. */
export interface ModelDescriptor {
    /** Canonical wire id (Promptfoo provider id). The frozen value. */
    readonly id: string;
    /** Provider the wire id routes to. */
    readonly provider: ModelProvider;
    /** Bare model name the vendor SDK/API expects. */
    readonly apiModelId: string;
    /** Full human-friendly name. e.g. "Claude Opus 4.6". */
    readonly displayName: string;
    /** Compact name for tables/badges. e.g. "Opus 4.6". */
    readonly shortName: string;
    /** Vendor display name. e.g. "Anthropic". */
    readonly vendor: string;
    /**
     * Extra strings that also resolve to this descriptor — bare base names or
     * alternate wire forms. The trailing-segment and date-strip fallbacks below
     * usually make this unnecessary, but it pins exact historical ids.
     */
    readonly aliases?: readonly string[];
}
/**
 * Registry of models the framework evaluates. The display names here are the
 * single source of truth — `packages/eval/config/models.ts` derives its
 * `label` fields from this map (via `modelDisplayName`) rather than re-typing
 * them. Add a model here when enrolling it in `config/models.ts`.
 *
 * Role context (e.g. "(grader)") is NOT baked into `displayName` — it belongs
 * to the call site that knows the role, so the same model reads identically
 * wherever it appears.
 */
export declare const MODEL_REGISTRY: readonly ModelDescriptor[];
/**
 * Resolve any reference to a model — full wire id, bare name, agentic-prefixed
 * id, or dated pin — to its descriptor. Unknown models degrade gracefully to a
 * derived descriptor whose names are the bare trailing segment.
 */
export declare function modelDescriptor(idOrName: string): ModelDescriptor;
/** Full friendly name for a model reference. "—" when absent. */
export declare function modelDisplayName(idOrName: string): string;
/** Compact name for a model reference, for tables/badges. "—" when absent. */
export declare function modelShortName(idOrName: string): string;
