import type { CatalogEntry } from "@/lib/ai/registry/catalog"; import type { ModelPricing } from "@/lib/ai/core/types"; /** * Mistral documented augmentation. The listing already carries capabilities/limits/aliases; this * file adds pricing (mistral.ai/pricing, audited 2026-09-08 — see docs/provider-research/mistral.md) * and per-model quirks. Keys are billing model names (the `name` field) or ids. */ const MISTRAL_PRICING_BASE: Record = { "mistral-medium-2604": { inputPerMillion: 1.5, outputPerMillion: 7.5, cachedInputPerMillion: 0.15 }, "mistral-small-2603": { inputPerMillion: 0.15, outputPerMillion: 0.6, cachedInputPerMillion: 0.015 }, "mistral-large-2512": { inputPerMillion: 0.5, outputPerMillion: 1.5, cachedInputPerMillion: 0.05 }, "ministral-14b-2512": { inputPerMillion: 0.2, outputPerMillion: 0.2, cachedInputPerMillion: 0.02 }, "ministral-8b-2512": { inputPerMillion: 0.15, outputPerMillion: 0.15, cachedInputPerMillion: 0.015 }, "ministral-3b-2512": { inputPerMillion: 0.1, outputPerMillion: 0.1, cachedInputPerMillion: 0.01 }, "codestral-2508": { inputPerMillion: 0.3, outputPerMillion: 0.9, cachedInputPerMillion: 0.03 }, "zai-glm-5-2": { inputPerMillion: 1.4, outputPerMillion: 4.4, cachedInputPerMillion: 0.14 }, "voxtral-small-2507": { inputPerMillion: 0.1, outputPerMillion: 0.4 }, "labs-leanstral-1-5": { inputPerMillion: 0, outputPerMillion: 0, cachedInputPerMillion: 0 }, }; /** Aliases (`*-latest`, marketing names) bill as their base model. */ export const MISTRAL_PRICING: Record = { ...MISTRAL_PRICING_BASE, "mistral-medium-latest": MISTRAL_PRICING_BASE["mistral-medium-2604"], "mistral-medium": MISTRAL_PRICING_BASE["mistral-medium-2604"], "mistral-medium-3-5": MISTRAL_PRICING_BASE["mistral-medium-2604"], "mistral-medium-3.5": MISTRAL_PRICING_BASE["mistral-medium-2604"], "mistral-medium-3": MISTRAL_PRICING_BASE["mistral-medium-2604"], "mistral-vibe-cli-latest": MISTRAL_PRICING_BASE["mistral-medium-2604"], "mistral-vibe-cli-with-tools": MISTRAL_PRICING_BASE["mistral-medium-2604"], "magistral-medium-latest": MISTRAL_PRICING_BASE["mistral-medium-2604"], "mistral-small-latest": MISTRAL_PRICING_BASE["mistral-small-2603"], "mistral-vibe-cli-fast": MISTRAL_PRICING_BASE["mistral-small-2603"], "magistral-small-latest": MISTRAL_PRICING_BASE["mistral-small-2603"], "mistral-large-latest": MISTRAL_PRICING_BASE["mistral-large-2512"], "ministral-14b-latest": MISTRAL_PRICING_BASE["ministral-14b-2512"], "ministral-8b-latest": MISTRAL_PRICING_BASE["ministral-8b-2512"], "ministral-3b-latest": MISTRAL_PRICING_BASE["ministral-3b-2512"], "codestral-latest": MISTRAL_PRICING_BASE["codestral-2508"], "mistral-code-latest": MISTRAL_PRICING_BASE["codestral-2508"], "mistral-code-fim-latest": MISTRAL_PRICING_BASE["codestral-2508"], "glm-5-2": MISTRAL_PRICING_BASE["zai-glm-5-2"], "voxtral-small-latest": MISTRAL_PRICING_BASE["voxtral-small-2507"], "labs-leanstral-1-5-1": MISTRAL_PRICING_BASE["labs-leanstral-1-5"], }; export function mistralPricingFor(id: string, name?: string): ModelPricing | null { const hit = MISTRAL_PRICING[id] ?? (name ? MISTRAL_PRICING[name] : undefined) ?? MISTRAL_PRICING[id.replace(/-latest$/, "")]; return hit ? { ...hit, source: "mistral-pricing-page", asOf: "2026-09-08" } : null; } export const MISTRAL_CATALOG = new Map(); /** Listed by /v1/models but not chat models (OCR, embeddings, moderation, audio, FIM-only). */ export const MISTRAL_NON_CHAT = /embed|ocr|moderation|voxtral|transcribe|tts|fim/i;