Claude commited on
Commit
9448ccc
·
unverified ·
1 Parent(s): 2e30fe9

fix: recognize mistral-small-latest as multimodal (vision-capable)

Browse files

Mistral Small 25.01+ supports vision input but was classified as
text-only because _model_supports_vision() only checked for 'pixtral',
'vision', or 'ocr' in the model ID. Added 'mistral-small' and
'mistral-medium' to the known vision model substrings, so images are
now correctly sent to the Mistral API for analysis.

https://claude.ai/code/session_01Sxmf2zTTcjaQeZXCeXaCxr

backend/app/services/ai/provider_mistral.py CHANGED
@@ -72,18 +72,26 @@ def _is_ocr_model(model_id: str) -> bool:
72
  return "ocr" in model_id.lower()
73
 
74
 
 
 
 
 
 
 
 
75
  def _model_supports_vision(model_id: str, model_obj: object = None) -> bool:
76
  """Détecte si un modèle Mistral supporte les entrées image.
77
 
78
  Utilise capabilities.vision si disponible (objet SDK v1.x),
79
- sinon se rabat sur la présence de 'pixtral', 'vision' ou 'ocr' dans l'ID.
 
80
  """
81
  if model_obj is not None:
82
  caps = getattr(model_obj, "capabilities", None)
83
  if caps is not None:
84
  return bool(getattr(caps, "vision", False))
85
  mid = model_id.lower()
86
- return "pixtral" in mid or "vision" in mid or "ocr" in mid
87
 
88
 
89
  class MistralProvider(AIProvider):
 
72
  return "ocr" in model_id.lower()
73
 
74
 
75
+
76
+ # Modèles Mistral connus pour supporter la vision (multimodaux).
77
+ # Mistral Small 25.01+ et Mistral Medium sont multimodaux.
78
+ # Cette liste sert de fallback quand capabilities.vision n'est pas exposé par le SDK.
79
+ _VISION_MODEL_SUBSTRINGS = ("pixtral", "vision", "ocr", "mistral-small", "mistral-medium")
80
+
81
+
82
  def _model_supports_vision(model_id: str, model_obj: object = None) -> bool:
83
  """Détecte si un modèle Mistral supporte les entrées image.
84
 
85
  Utilise capabilities.vision si disponible (objet SDK v1.x),
86
+ sinon se rabat sur la présence de sous-chaînes connues dans l'ID du modèle.
87
+ Mistral Small (25.01+) et Mistral Medium sont multimodaux.
88
  """
89
  if model_obj is not None:
90
  caps = getattr(model_obj, "capabilities", None)
91
  if caps is not None:
92
  return bool(getattr(caps, "vision", False))
93
  mid = model_id.lower()
94
+ return any(sub in mid for sub in _VISION_MODEL_SUBSTRINGS)
95
 
96
 
97
  class MistralProvider(AIProvider):
backend/tests/test_provider_mistral.py CHANGED
@@ -96,9 +96,15 @@ def test_vision_detection_pixtral_by_name():
96
  assert _model_supports_vision("pixtral-12b-2409") is True
97
 
98
 
 
 
 
 
 
 
 
99
  def test_vision_detection_text_models_by_name():
100
  assert _model_supports_vision("mistral-large-latest") is False
101
- assert _model_supports_vision("mistral-small-latest") is False
102
  assert _model_supports_vision("codestral-latest") is False
103
 
104
 
 
96
  assert _model_supports_vision("pixtral-12b-2409") is True
97
 
98
 
99
+ def test_vision_detection_multimodal_models_by_name():
100
+ """Mistral Small 25.01+ et Mistral Medium sont multimodaux."""
101
+ assert _model_supports_vision("mistral-small-latest") is True
102
+ assert _model_supports_vision("mistral-small-2501") is True
103
+ assert _model_supports_vision("mistral-medium-latest") is True
104
+
105
+
106
  def test_vision_detection_text_models_by_name():
107
  assert _model_supports_vision("mistral-large-latest") is False
 
108
  assert _model_supports_vision("codestral-latest") is False
109
 
110