import type { ThinkingLevel } from "@earendil-works/pi-ai"; export type CostTier = "cheap" | "standard" | "premium" | "unknown"; export type ModelProfile = "deep" | "fast" | "coder" | "balanced" | "vision" | "frontier"; /** * Per-profile capability sub-scores. Used to pick the right Pareto axis per task: * coding tasks compare on `coding`, agentic/deep tasks on `agentic`, everything else * falls back to the synthetic `intelligence` index. Values are facts (benchmark scores), * transcribed offline — we ship only the derived constants for the models we route to, * never a third-party dataset. See docs/routing-redesign.md §6. */ export interface CanonicalScores { /** coding_index (~0–80). Axis for the `coder` profile. */ coding?: number; /** terminalbench v2 (0–1). Axis for the `deep`/agentic profile; scaled ×100 at use. */ agentic?: number; /** instruction-following (ifbench, 0–1). Informational. */ ifbench?: number; } export interface CanonicalMeta { key: string; /** Alternate provider or benchmark slugs that should resolve to this canonical key. */ aliases?: string[]; /** Synthetic intelligence index (~3–60). Axis for the `balanced` profile and the floor scale. */ intelligence: number; /** List price, $/1M tokens, blended 3:1 input:output. NOT marginal/subscription cost. */ priceBlended: number; scores?: CanonicalScores; /** Output tokens/sec. Axis for the `fast` profile. */ tps?: number; /** Pi-normalized effort used for the benchmark row, when the source reports one. */ benchmarkEffort?: ThinkingLevel; costTier: CostTier; profiles: ModelProfile[]; frontier: boolean; /** Provenance of the numeric fields. */ source?: string; } /** * Curated frontier + recent-two-generation models across major labs. Most rows are AA-backed; a few * Ramp-only rows exist so fresh benchmarked models can resolve under the default `ramp` source * without pretending to have Artificial Analysis scores. * * The numeric fields (intelligence/priceBlended/scores/tps) drive the data-driven Pareto routing in * router-core under `aa`; costTier/profiles/frontier remain as display hints and pool-bucketing only. * * `key` matches the provider model id (substring, longest-match wins), so dotted vendor naming * is intentional. Add models you actually have access to; unmatched keys are simply inert. */ export declare const CANONICAL_MODELS: CanonicalMeta[]; /** * Per-model/effort results from the Ramp SWE-Bench run (mini-swe-agent harness, 79 tasks): real agentic * resolve-rate and measured per-task cost (API list pricing, prompt-cache included). This is a * SEPARATE source from the Artificial Analysis numbers above — the router consumes one or the other * (`capabilitySource`), never a merge: mixing real outcomes and synthetic scores on one scale is * meaningless. Keyed by canonical model key plus Pi-normalized effort. A model absent here has no Ramp * result and is therefore not auto-routed when `capabilitySource` is `ramp` (reach it via * `modelOverrides` or a forced route). * * Caveat: the current table has one published effort row per model across 79 tasks, billed at API * list (no subscription), no vision and no throughput metric. It is a real-task coding slice, not a * universal capability score. */ export interface RampMeta { /** Canonical model key; matches a `CanonicalMeta.key` above. */ key: string; /** Pi-normalized effort used for this measured run. Provider values like `max` map through model metadata. */ effort: ThinkingLevel; /** SWE-bench resolve rate, 0–100. The capability axis for every profile under the `ramp` source. */ resolveRate: number; /** Mean measured cost per task, USD (API list pricing). The Pareto cost axis under `ramp`. */ costPerTask: number; /** Mean tool-call turns to complete. Informational (shown in `/router`). */ turns: number; source: string; } export declare const RAMP_MODELS: RampMeta[]; export declare function findRampModel(canonicalKey: string | null | undefined): RampMeta | undefined; export declare function findRampModels(canonicalKey: string | null | undefined): RampMeta[];