[
  {
    "id": "mistral-medium-2604",
    "displayName": "Mistral Medium 3.5",
    "family": "mistral-medium",
    "contextTokens": 262144,
    "maxOutputTokens": null,
    "capabilities": {
      "text": true,
      "vision": true,
      "audioInput": false,
      "audioOutput": false,
      "imageGeneration": false,
      "video": false,
      "reasoning": true,
      "tools": true,
      "structuredOutput": true,
      "streaming": true,
      "files": true,
      "webSearch": "conversations-api-only"
    },
    "parameters": {
      "temperature": true,
      "topP": true,
      "topK": false,
      "maxTokens": true,
      "reasoningEffort": ["none", "high"],
      "thinkingBudget": false,
      "stop": true,
      "seed": "random_seed",
      "frequencyPenalty": true,
      "presencePenalty": true
    },
    "pricing": {
      "inputPerMillion": 1.5,
      "cachedInputPerMillion": 0.15,
      "outputPerMillion": 7.5
    },
    "status": "active",
    "aliases": [
      "mistral-medium-latest",
      "mistral-medium",
      "mistral-medium-3-5",
      "mistral-medium-3.5",
      "mistral-medium-3",
      "mistral-vibe-cli-latest",
      "mistral-vibe-cli-with-tools",
      "magistral-medium-latest"
    ],
    "notes": "Frontier hybrid-reasoning model (GA 2026-04-28, model card id mistral-medium-3-5-26-04, billing_model_name mistral-medium-3-5, default_model_temperature 1). Reasoning is OFF unless reasoning_effort:'high' is sent (probed: default returns a plain string, no thinking). Only 'none' and 'high' accepted; minimal/low/medium/xhigh/max -> 400 code 3051 'reasoning_effort X is not supported for this model, supported values: [high, none]'. Thinking comes back as content chunks [{type:'thinking', thinking:[{type:'text', text}], closed:true}, {type:'text', text}]; reasoning tokens are counted inside completion_tokens (no separate field). magistral-medium-latest is now just an alias of this model (native Magistral retired 2026-07-31). n=2 accepted. Hidden system prompt ~12 tokens. Rate limit observed on this key: 3000 req/min, 2M tokens/min. Document QnA (document_url) supported per model card."
  },
  {
    "id": "mistral-small-2603",
    "displayName": "Mistral Small 4",
    "family": "mistral-small",
    "contextTokens": 262144,
    "maxOutputTokens": null,
    "capabilities": {
      "text": true,
      "vision": true,
      "audioInput": false,
      "audioOutput": false,
      "imageGeneration": false,
      "video": false,
      "reasoning": true,
      "tools": true,
      "structuredOutput": true,
      "streaming": true,
      "files": true,
      "webSearch": "conversations-api-only"
    },
    "parameters": {
      "temperature": true,
      "topP": true,
      "topK": false,
      "maxTokens": true,
      "reasoningEffort": ["none", "high"],
      "thinkingBudget": false,
      "stop": true,
      "seed": "random_seed",
      "frequencyPenalty": true,
      "presencePenalty": true
    },
    "pricing": {
      "inputPerMillion": 0.15,
      "cachedInputPerMillion": 0.015,
      "outputPerMillion": 0.6
    },
    "status": "active",
    "aliases": ["mistral-small-latest", "mistral-vibe-cli-fast", "magistral-small-latest"],
    "notes": "Best value hybrid-reasoning model (Apache 2.0, 'Mistral Small 4', default_model_temperature 0.3). Same reasoning contract as Medium 3.5: reasoning off by default, reasoning_effort 'high'|'none' only, thinking returned as content chunks. magistral-small-latest aliases here. Vision probed OK (32px PNG ~15 image tokens, 512x512 ~390 tokens). document_url PDF (base64 data URL and public URL) probed OK. json_schema strict + json_object probed OK. Tool calls arrive in ONE stream chunk with full arguments; 9-char alphanumeric ids. Rate limit observed: 2000 req/min, 2M tokens/min. prompt_mode:'reasoning' (legacy Magistral) -> 400 'Reasoning prompt mode is not enabled for this model'."
  },
  {
    "id": "mistral-large-2512",
    "displayName": "Mistral Large 3",
    "family": "mistral-large",
    "contextTokens": 262144,
    "maxOutputTokens": null,
    "capabilities": {
      "text": true,
      "vision": true,
      "audioInput": false,
      "audioOutput": false,
      "imageGeneration": false,
      "video": false,
      "reasoning": false,
      "tools": true,
      "structuredOutput": true,
      "streaming": true,
      "files": true,
      "webSearch": "conversations-api-only"
    },
    "parameters": {
      "temperature": true,
      "topP": true,
      "topK": false,
      "maxTokens": true,
      "reasoningEffort": false,
      "thinkingBudget": false,
      "stop": true,
      "seed": "random_seed",
      "frequencyPenalty": true,
      "presencePenalty": true
    },
    "pricing": {
      "inputPerMillion": 0.5,
      "cachedInputPerMillion": 0.05,
      "outputPerMillion": 1.5
    },
    "status": "active",
    "aliases": ["mistral-large-latest"],
    "notes": "Open-weight MoE (675B total / 41B active, Apache 2.0, released 2025-12-02, default_model_temperature 0.3). NOT a reasoning model: any reasoning_effort -> 400 'reasoning_effort is not enabled for this model'. The ONLY model that rejects n>1 (400 'Invalid value 2 for parameter `n`. Max allowed: 1.'). Cheaper than Medium 3.5 (0.5/1.5 vs 1.5/7.5). No hidden system prompt (prompt_tokens = raw). Fine-tunable. Rate limit observed on this key: only 75 req/min / 1M tokens/min (much lower than the other models). Retired slugs mistral-large-2407 resolve here (response.model = mistral-large-latest); mistral-large-2411 and pixtral-large-* return 400 invalid_model."
  },
  {
    "id": "ministral-14b-2512",
    "displayName": "Ministral 3 14B",
    "family": "ministral-3",
    "contextTokens": 262144,
    "maxOutputTokens": null,
    "capabilities": {
      "text": true,
      "vision": true,
      "audioInput": false,
      "audioOutput": false,
      "imageGeneration": false,
      "video": false,
      "reasoning": false,
      "tools": true,
      "structuredOutput": true,
      "streaming": true,
      "files": null,
      "webSearch": "conversations-api-only"
    },
    "parameters": {
      "temperature": true,
      "topP": true,
      "topK": false,
      "maxTokens": true,
      "reasoningEffort": false,
      "thinkingBudget": false,
      "stop": true,
      "seed": "random_seed",
      "frequencyPenalty": true,
      "presencePenalty": true
    },
    "pricing": {
      "inputPerMillion": 0.2,
      "cachedInputPerMillion": 0.02,
      "outputPerMillion": 0.2
    },
    "status": "active",
    "aliases": ["ministral-14b-latest"],
    "notes": "Edge model family v25.12 (Apache 2.0), text + vision, function calling, fine-tunable. Only a tiny chat probe was run on this size (200 OK); parameters assumed identical to ministral-8b (same family, same listing capabilities). Retired pixtral-12b-2409 is transparently served by ministral-14b-latest. Rate limit observed: 500 req/min, 3.8M tokens/min."
  },
  {
    "id": "ministral-8b-2512",
    "displayName": "Ministral 3 8B",
    "family": "ministral-3",
    "contextTokens": 262144,
    "maxOutputTokens": null,
    "capabilities": {
      "text": true,
      "vision": true,
      "audioInput": false,
      "audioOutput": false,
      "imageGeneration": false,
      "video": false,
      "reasoning": false,
      "tools": true,
      "structuredOutput": true,
      "streaming": true,
      "files": true,
      "webSearch": "conversations-api-only"
    },
    "parameters": {
      "temperature": true,
      "topP": true,
      "topK": false,
      "maxTokens": true,
      "reasoningEffort": false,
      "thinkingBudget": false,
      "stop": true,
      "seed": "random_seed",
      "frequencyPenalty": true,
      "presencePenalty": true
    },
    "pricing": {
      "inputPerMillion": 0.15,
      "cachedInputPerMillion": 0.015,
      "outputPerMillion": 0.15
    },
    "status": "active",
    "aliases": ["ministral-8b-latest"],
    "notes": "Fully probed: chat, streaming, tools (single-chunk tool call), json_schema strict, vision (32px PNG OK), document_url PDF OK, n=2 OK. reasoning_effort -> 400 'not enabled for this model'. Retired open-mistral-7b / ministral-8b-2410 / open-mistral-nemo slugs are served by this model. Rate limit observed: 3800 req/min, 2.5M tokens/min."
  },
  {
    "id": "ministral-3b-2512",
    "displayName": "Ministral 3 3B",
    "family": "ministral-3",
    "contextTokens": 131072,
    "maxOutputTokens": null,
    "capabilities": {
      "text": true,
      "vision": true,
      "audioInput": false,
      "audioOutput": false,
      "imageGeneration": false,
      "video": false,
      "reasoning": false,
      "tools": true,
      "structuredOutput": true,
      "streaming": true,
      "files": null,
      "webSearch": "conversations-api-only"
    },
    "parameters": {
      "temperature": true,
      "topP": true,
      "topK": false,
      "maxTokens": true,
      "reasoningEffort": false,
      "thinkingBudget": false,
      "stop": true,
      "seed": "random_seed",
      "frequencyPenalty": true,
      "presencePenalty": true
    },
    "pricing": {
      "inputPerMillion": 0.1,
      "cachedInputPerMillion": 0.01,
      "outputPerMillion": 0.1
    },
    "status": "active",
    "aliases": ["ministral-3b-latest"],
    "notes": "Smallest/cheapest (a.k.a. 'Tinystral'). 128k context (the only current chat model below 256k). Tiny chat probe OK; max_tokens 200000 (> context) accepted without error (generation just stops naturally). Parameters assumed identical to ministral-8b. Highest rate limit observed: 15000 req/min, 5M tokens/min."
  },
  {
    "id": "codestral-2508",
    "displayName": "Codestral 25.08",
    "family": "codestral",
    "contextTokens": 256000,
    "maxOutputTokens": null,
    "capabilities": {
      "text": true,
      "vision": false,
      "audioInput": false,
      "audioOutput": false,
      "imageGeneration": false,
      "video": false,
      "reasoning": false,
      "tools": true,
      "structuredOutput": true,
      "streaming": true,
      "files": true,
      "webSearch": false
    },
    "parameters": {
      "temperature": true,
      "topP": true,
      "topK": false,
      "maxTokens": true,
      "reasoningEffort": false,
      "thinkingBudget": false,
      "stop": true,
      "seed": "random_seed",
      "frequencyPenalty": true,
      "presencePenalty": true
    },
    "pricing": {
      "inputPerMillion": 0.3,
      "cachedInputPerMillion": 0.03,
      "outputPerMillion": 0.9
    },
    "status": "active",
    "aliases": ["codestral-latest", "mistral-code-latest", "mistral-code-fim-latest"],
    "notes": "Coding model (Premier, released 2025-07-30). The only model with completion_fim=true -> POST /v1/fim/completions {prompt, suffix} probed OK (FIM on any other model -> 400 'FIM is not enabled for this model'). Chat, streaming, tools, json_schema all probed OK. Image input -> 400 code 3051 'Image input is not enabled for this model'. Surprisingly document_url (base64 PDF) worked (server-side OCR). API max_context_length 256000 vs model card '128k' -> prefer the API value. mistral-code-latest / mistral-code-fim-latest are aliases (Mistral Code IDE product). Rate limit observed: 2500 req/min, 2.5M tokens/min."
  },
  {
    "id": "zai-glm-5-2",
    "displayName": "Z.ai GLM 5.2 (third-party, preview)",
    "family": "glm",
    "contextTokens": 1048576,
    "maxOutputTokens": 128000,
    "capabilities": {
      "text": true,
      "vision": false,
      "audioInput": false,
      "audioOutput": false,
      "imageGeneration": false,
      "video": false,
      "reasoning": true,
      "tools": true,
      "structuredOutput": true,
      "streaming": true,
      "files": null,
      "webSearch": "conversations-api-only"
    },
    "parameters": {
      "temperature": true,
      "topP": true,
      "topK": false,
      "maxTokens": true,
      "reasoningEffort": ["none", "minimal", "low", "medium", "high", "xhigh", "max"],
      "thinkingBudget": false,
      "stop": true,
      "seed": "random_seed",
      "frequencyPenalty": true,
      "presencePenalty": true
    },
    "pricing": {
      "inputPerMillion": 1.4,
      "cachedInputPerMillion": 0.14,
      "outputPerMillion": 4.4
    },
    "status": "preview",
    "aliases": ["glm-5-2"],
    "notes": "Third-party model hosted by Mistral 'without Mistral modifications' (Public Preview since 2026-08-06; third-party lifecycle = 1-month deprecation notice). 1M context, 128k max output (docs). Reasoning off by default; EVERY reasoning_effort value is accepted (probed none/minimal/low/medium/high/xhigh/max); 'none' and 'minimal' return a plain string (no thinking), low..max return the same thinking-chunk content shape as the Mistral hybrids. Differences from Mistral models (probed): tool-call ids look like 'chatcmpl-tool-<16 hex>' and arguments are streamed across SEVERAL chunks (standard OpenAI accumulation required); stream chunks carry delta.index and logprobs:null; usage lacks service_tier; default_model_temperature null. Image input -> 400 'Image input is not enabled'. n=2 accepted. Rate limit observed: 3000 req/min, 4M tokens/min. Data leaves the Mistral model family - flag it in the UI as third-party."
  },
  {
    "id": "voxtral-small-2507",
    "displayName": "Voxtral Small 24B",
    "family": "voxtral",
    "contextTokens": 32768,
    "maxOutputTokens": null,
    "capabilities": {
      "text": true,
      "vision": false,
      "audioInput": true,
      "audioOutput": false,
      "imageGeneration": false,
      "video": false,
      "reasoning": false,
      "tools": true,
      "structuredOutput": null,
      "streaming": true,
      "files": null,
      "webSearch": false
    },
    "parameters": {
      "temperature": true,
      "topP": true,
      "topK": false,
      "maxTokens": true,
      "reasoningEffort": false,
      "thinkingBudget": false,
      "stop": true,
      "seed": "random_seed",
      "frequencyPenalty": true,
      "presencePenalty": true
    },
    "pricing": {
      "inputPerMillion": 0.1,
      "cachedInputPerMillion": null,
      "outputPerMillion": 0.4
    },
    "status": "active",
    "aliases": ["voxtral-small-latest"],
    "notes": "Audio-understanding chat model (July 2025, Apache 2.0, default_model_temperature 0.2): accepts input_audio content parts in chat completions (docs; not probed - no audio sample) plus text. Only 32k context. Text-only chat probe OK. Listing capabilities show completion_chat + function_calling but audio:false (listing flag looks wrong vs docs). Docs pricing 0.1 in / 0.4 out per M tokens; audio priced per token via prompt_audio_seconds in usage (docs). Lowest rate limit observed: 1440 req/min, 500k tokens/min. Treat as a niche model, not a default chat choice."
  },
  {
    "id": "labs-leanstral-1-5",
    "displayName": "Leanstral 1.5 (Labs)",
    "family": "labs",
    "contextTokens": 262144,
    "maxOutputTokens": null,
    "capabilities": {
      "text": true,
      "vision": true,
      "audioInput": false,
      "audioOutput": false,
      "imageGeneration": false,
      "video": false,
      "reasoning": true,
      "tools": true,
      "structuredOutput": null,
      "streaming": null,
      "files": null,
      "webSearch": false
    },
    "parameters": {
      "temperature": null,
      "topP": null,
      "topK": false,
      "maxTokens": true,
      "reasoningEffort": null,
      "thinkingBudget": false,
      "stop": null,
      "seed": null,
      "frequencyPenalty": null,
      "presencePenalty": null
    },
    "pricing": {
      "inputPerMillion": 0,
      "cachedInputPerMillion": 0,
      "outputPerMillion": 0
    },
    "status": "labs-retiring-2026-09-30",
    "aliases": ["labs-leanstral-1-5-1"],
    "notes": "Experimental Lean 4 proof-engineering model derived from Mistral Small 4 (free while in Labs; retirement announced for 2026-09-30, 1-month Labs notice policy). Requests return 403 'Model labs-leanstral-1-5 is a Labs model. To use Labs models, an admin must enable them in your organization settings at https://admin.mistral.ai/plateforme/privacy.' unless the org opts in -> nothing else could be probed. Docs: 'We do not recommend using these models in production environments.' Do NOT list in PolyLLM by default; at most show it behind an 'experimental' flag with the 403 message mapped to a clear error."
  }
]
