1
0

models.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. """Particularités de chaque modèle Claude : réglage de la réflexion et tarifs."""
  2. from __future__ import annotations
  3. import re
  4. # « claude-sonnet-5-5 » ou « claude-sonnet-4-5-20250929 » : famille, version, date éventuelle.
  5. _MODEL_ID = re.compile(r"^claude-([a-z]+)-(\d+)(?:-(\d{1,2}))?(?:-\d{8})?$")
  6. # Façon de couper la réflexion préalable (THINKING=off), qui dépend du modèle.
  7. # None : impossible sur ce modèle, seul EFFORT permet alors de la réduire.
  8. _THINKING_OFF: dict[str, dict | None] = {
  9. "claude-sonnet-5-5": {"type": "between_tools"}, # n'existe que sur Sonnet 5.5
  10. "claude-opus-5-5": None,
  11. }
  12. # Haiku 5.5 et les modèles plus anciens (Sonnet 5, Opus 4.8…).
  13. _DEFAULT_THINKING_OFF = {"type": "disabled"}
  14. # Tarifs en dollars par million de tokens (entrée, sortie), pour l'estimation des coûts.
  15. # Haiku 5.5 : tarif des requêtes de moins de 100 000 tokens (0,50 / 2,50 au-delà).
  16. PRICES: dict[str, tuple[float, float]] = {
  17. "claude-sonnet-5-5": (2.0, 10.0),
  18. "claude-haiku-5-5": (0.10, 0.50),
  19. "claude-opus-5-5": (4.0, 20.0),
  20. }
  21. def is_known(model: str) -> bool:
  22. """Modèle connu du bot (tarifs et réglage de la réflexion) : sinon, peut-être une faute de frappe."""
  23. return model in PRICES
  24. def display_name(model: str) -> str:
  25. """Nom lisible du modèle (« Sonnet 5.5 ») ; l'identifiant tel quel s'il n'a pas la forme habituelle."""
  26. if not (match := _MODEL_ID.match(model)):
  27. return model
  28. family, major, minor = match.groups()
  29. return f"{family.capitalize()} {major}{f'.{minor}' if minor else ''}"
  30. def thinking_off(model: str) -> dict | None:
  31. """Paramètre « thinking » à envoyer quand THINKING=off (None : ne rien envoyer)."""
  32. return _THINKING_OFF.get(model, _DEFAULT_THINKING_OFF)