Spaces:
Build error
Build error
Claude commited on
fix: recognize mistral-small-latest as multimodal (vision-capable)
Browse filesMistral 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
|
|
|
|
| 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
|
| 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 |
|