Cleanup and update mistral models based on their documentation (#55443)

Gabriel Linder created

Self-Review Checklist:

- [x] I've reviewed my own diff for quality, security, and reliability
- [ ] Unsafe blocks (if any) have justifying comments
- [ ] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [ ] Performance impact has been considered and is acceptable

Release Notes:

- Mistral: Added Ministral 3 models and removed deprecated models

---------

Signed-off-by: Gabriel Linder <linder.gabriel@gmail.com>

Change summary

crates/language_models/src/provider/mistral.rs |  2 
crates/mistral/src/mistral.rs                  | 77 +++++++------------
2 files changed, 29 insertions(+), 50 deletions(-)

Detailed changes

crates/language_models/src/provider/mistral.rs 🔗

@@ -1021,7 +1021,7 @@ mod tests {
             speed: None,
         };
 
-        let (mistral_request, _) = into_mistral(request, mistral::Model::Pixtral12BLatest, None);
+        let (mistral_request, _) = into_mistral(request, mistral::Model::MistralSmallLatest, None);
 
         assert_eq!(mistral_request.messages.len(), 1);
         assert!(matches!(

crates/mistral/src/mistral.rs 🔗

@@ -58,23 +58,19 @@ pub enum Model {
 
     #[serde(rename = "magistral-medium-latest", alias = "magistral-medium-latest")]
     MagistralMediumLatest,
-    #[serde(rename = "magistral-small-latest", alias = "magistral-small-latest")]
-    MagistralSmallLatest,
 
     #[serde(rename = "open-mistral-nemo", alias = "open-mistral-nemo")]
     OpenMistralNemo,
-    #[serde(rename = "open-codestral-mamba", alias = "open-codestral-mamba")]
-    OpenCodestralMamba,
 
     #[serde(rename = "devstral-medium-latest", alias = "devstral-medium-latest")]
     DevstralMediumLatest,
-    #[serde(rename = "devstral-small-latest", alias = "devstral-small-latest")]
-    DevstralSmallLatest,
 
-    #[serde(rename = "pixtral-12b-latest", alias = "pixtral-12b-latest")]
-    Pixtral12BLatest,
-    #[serde(rename = "pixtral-large-latest", alias = "pixtral-large-latest")]
-    PixtralLargeLatest,
+    #[serde(rename = "ministral-3b-latest", alias = "ministral-3b-latest")]
+    Ministral3bLatest,
+    #[serde(rename = "ministral-8b-latest", alias = "ministral-8b-latest")]
+    Ministral8bLatest,
+    #[serde(rename = "ministral-14b-latest", alias = "ministral-14b-latest")]
+    Ministral14bLatest,
 
     #[serde(rename = "custom")]
     Custom {
@@ -102,13 +98,8 @@ impl Model {
             "mistral-medium-latest" => Ok(Self::MistralMediumLatest),
             "mistral-small-latest" => Ok(Self::MistralSmallLatest),
             "magistral-medium-latest" => Ok(Self::MagistralMediumLatest),
-            "magistral-small-latest" => Ok(Self::MagistralSmallLatest),
             "open-mistral-nemo" => Ok(Self::OpenMistralNemo),
-            "open-codestral-mamba" => Ok(Self::OpenCodestralMamba),
             "devstral-medium-latest" => Ok(Self::DevstralMediumLatest),
-            "devstral-small-latest" => Ok(Self::DevstralSmallLatest),
-            "pixtral-12b-latest" => Ok(Self::Pixtral12BLatest),
-            "pixtral-large-latest" => Ok(Self::PixtralLargeLatest),
             invalid_id => anyhow::bail!("invalid model id '{invalid_id}'"),
         }
     }
@@ -120,13 +111,11 @@ impl Model {
             Self::MistralMediumLatest => "mistral-medium-latest",
             Self::MistralSmallLatest => "mistral-small-latest",
             Self::MagistralMediumLatest => "magistral-medium-latest",
-            Self::MagistralSmallLatest => "magistral-small-latest",
             Self::OpenMistralNemo => "open-mistral-nemo",
-            Self::OpenCodestralMamba => "open-codestral-mamba",
             Self::DevstralMediumLatest => "devstral-medium-latest",
-            Self::DevstralSmallLatest => "devstral-small-latest",
-            Self::Pixtral12BLatest => "pixtral-12b-latest",
-            Self::PixtralLargeLatest => "pixtral-large-latest",
+            Self::Ministral3bLatest => "ministral-3b-latest",
+            Self::Ministral8bLatest => "ministral-8b-latest",
+            Self::Ministral14bLatest => "ministral-14b-latest",
             Self::Custom { name, .. } => name,
         }
     }
@@ -138,13 +127,11 @@ impl Model {
             Self::MistralMediumLatest => "mistral-medium-latest",
             Self::MistralSmallLatest => "mistral-small-latest",
             Self::MagistralMediumLatest => "magistral-medium-latest",
-            Self::MagistralSmallLatest => "magistral-small-latest",
             Self::OpenMistralNemo => "open-mistral-nemo",
-            Self::OpenCodestralMamba => "open-codestral-mamba",
             Self::DevstralMediumLatest => "devstral-medium-latest",
-            Self::DevstralSmallLatest => "devstral-small-latest",
-            Self::Pixtral12BLatest => "pixtral-12b-latest",
-            Self::PixtralLargeLatest => "pixtral-large-latest",
+            Self::Ministral3bLatest => "ministral-3b-latest",
+            Self::Ministral8bLatest => "ministral-8b-latest",
+            Self::Ministral14bLatest => "ministral-14b-latest",
             Self::Custom {
                 name, display_name, ..
             } => display_name.as_ref().unwrap_or(name),
@@ -153,18 +140,16 @@ impl Model {
 
     pub fn max_token_count(&self) -> u64 {
         match self {
-            Self::CodestralLatest => 256000,
+            Self::CodestralLatest => 128000,
             Self::MistralLargeLatest => 256000,
             Self::MistralMediumLatest => 128000,
-            Self::MistralSmallLatest => 32000,
+            Self::MistralSmallLatest => 256000,
             Self::MagistralMediumLatest => 128000,
-            Self::MagistralSmallLatest => 128000,
-            Self::OpenMistralNemo => 131000,
-            Self::OpenCodestralMamba => 256000,
+            Self::OpenMistralNemo => 128000,
             Self::DevstralMediumLatest => 256000,
-            Self::DevstralSmallLatest => 256000,
-            Self::Pixtral12BLatest => 128000,
-            Self::PixtralLargeLatest => 128000,
+            Self::Ministral3bLatest => 256000,
+            Self::Ministral8bLatest => 256000,
+            Self::Ministral14bLatest => 256000,
             Self::Custom { max_tokens, .. } => *max_tokens,
         }
     }
@@ -185,31 +170,25 @@ impl Model {
             | Self::MistralMediumLatest
             | Self::MistralSmallLatest
             | Self::MagistralMediumLatest
-            | Self::MagistralSmallLatest
             | Self::OpenMistralNemo
-            | Self::OpenCodestralMamba
             | Self::DevstralMediumLatest
-            | Self::DevstralSmallLatest
-            | Self::Pixtral12BLatest
-            | Self::PixtralLargeLatest => true,
+            | Self::Ministral3bLatest
+            | Self::Ministral8bLatest
+            | Self::Ministral14bLatest => true,
             Self::Custom { supports_tools, .. } => supports_tools.unwrap_or(false),
         }
     }
 
     pub fn supports_images(&self) -> bool {
         match self {
-            Self::Pixtral12BLatest
-            | Self::PixtralLargeLatest
+            Self::MistralLargeLatest
             | Self::MistralMediumLatest
-            | Self::MistralSmallLatest => true,
-            Self::CodestralLatest
-            | Self::MistralLargeLatest
+            | Self::MistralSmallLatest
             | Self::MagistralMediumLatest
-            | Self::MagistralSmallLatest
-            | Self::OpenMistralNemo
-            | Self::OpenCodestralMamba
-            | Self::DevstralMediumLatest
-            | Self::DevstralSmallLatest => false,
+            | Self::Ministral3bLatest
+            | Self::Ministral8bLatest
+            | Self::Ministral14bLatest => true,
+            Self::CodestralLatest | Self::OpenMistralNemo | Self::DevstralMediumLatest => false,
             Self::Custom {
                 supports_images, ..
             } => supports_images.unwrap_or(false),
@@ -218,7 +197,7 @@ impl Model {
 
     pub fn supports_thinking(&self) -> bool {
         match self {
-            Self::MagistralMediumLatest | Self::MagistralSmallLatest => true,
+            Self::MagistralMediumLatest => true,
             Self::Custom {
                 supports_thinking, ..
             } => supports_thinking.unwrap_or(false),