Synthèse optionnelle via SDK openai (client injectable, prompt système FR, max 800 car., timeout 30 s, temp 0.3). Mode dégradé strict : generate() ne lève jamais, retourne None si clé absente/timeout/erreur. Provider litellm optionnel (extra ai-litellm) réutilisant le prompt OpenAI. Factory get_synthesis_provider() selon AISettings. 23 tests sans réseau, couverture synthesis/ 93%. Co-authored-by: opencode/coder <coder@agents.invalid> Co-authored-by: opencode/test-engineer <test-engineer@agents.invalid>
46 lines
1.6 KiB
Python
46 lines
1.6 KiB
Python
"""Factory de sélection du fournisseur de synthèse IA."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
|
|
from pronote_sync.config.settings import AISettings
|
|
from pronote_sync.synthesis.openai import OpenAISynthesisProvider
|
|
from pronote_sync.synthesis.provider import SynthesisProvider
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
__all__ = ["get_synthesis_provider", "SynthesisProvider", "OpenAISynthesisProvider"]
|
|
|
|
|
|
def get_synthesis_provider(settings: AISettings) -> SynthesisProvider | None:
|
|
"""Sélectionne le fournisseur de synthèse IA selon la configuration.
|
|
|
|
Retourne ``None`` lorsque la synthèse IA est désactivée ou qu'aucune clé
|
|
API n'est configurée. Pour le provider ``litellm``, le paquet ``litellm``
|
|
(extra ``ai-litellm``) est requis : s'il est absent, un avertissement est
|
|
journalisé et ``None`` est retourné.
|
|
|
|
:param settings: Paramètres IA.
|
|
:return: Le fournisseur configuré, ou ``None`` si désactivé ou sans clé API.
|
|
:rtype: SynthesisProvider | None
|
|
"""
|
|
if not settings.enabled:
|
|
return None
|
|
if not settings.api_key:
|
|
return None
|
|
|
|
api_key = settings.api_key.get_secret_value()
|
|
base_url = settings.base_url
|
|
model = settings.model or "gpt-4o-mini"
|
|
|
|
if settings.provider == "litellm":
|
|
try:
|
|
from pronote_sync.synthesis.litellm import LiteLLMSynthesisProvider
|
|
except ImportError:
|
|
logger.warning("Extra 'ai-litellm' requis pour le provider litellm")
|
|
return None
|
|
return LiteLLMSynthesisProvider(api_key=api_key, base_url=base_url, model=model)
|
|
|
|
return OpenAISynthesisProvider(api_key=api_key, base_url=base_url, model=model)
|