Cinq corrections de l'audit FIXME_M9 : - redact_secrets() étendue avec extra_secrets pour masquer les clés brutes ; providers stockent SecretStr jusqu'à l'appel SDK. - _build_prompt() inclut le contenu des messages (tronqué à 500 car.) ; prompt système renforcé contre l'injection. - _validate_output() supprime les emojis et rejette titre/liste/HTML → None. - Tests litellm utilisent importorskip + LITELLM_LOCAL_MODEL_COST_MAP=true. - .env.example désactive l'IA par défaut (AI_ENABLED=false). - Documentation §9.2-§9.5 alignée avec l'implémentation (SDK openai, SecretStr, factory réelle, validation sortie, politique hors réseau). Co-authored-by: opencode/coder <coder@agents.invalid> Co-authored-by: opencode/test-engineer <test-engineer@agents.invalid> Co-authored-by: opencode/tech-writer <tech-writer@agents.invalid>
45 lines
1.6 KiB
Python
45 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
|
|
|
|
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=settings.api_key, base_url=base_url, model=model)
|
|
|
|
return OpenAISynthesisProvider(api_key=settings.api_key, base_url=base_url, model=model)
|