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>
28 lines
832 B
Python
28 lines
832 B
Python
"""Protocole de fournisseur de synthèse IA."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Protocol, runtime_checkable
|
|
|
|
from pronote_sync.models.synthesis import SynthesisInput, SynthesisResult
|
|
|
|
__all__ = ["SynthesisProvider"]
|
|
|
|
|
|
@runtime_checkable
|
|
class SynthesisProvider(Protocol):
|
|
"""Protocole pour un fournisseur de synthèse IA.
|
|
|
|
L'implémentation ne doit jamais lever d'exception : en cas
|
|
d'échec, retourner ``None``.
|
|
"""
|
|
|
|
def generate(self, input_data: SynthesisInput) -> SynthesisResult | None:
|
|
"""Génère une synthèse IA à partir des données d'entrée.
|
|
|
|
:param input_data: Données de synthèse (diff agenda, messages, événements).
|
|
:return: Résultat de la synthèse, ou ``None`` en cas d'échec.
|
|
:rtype: SynthesisResult | None
|
|
"""
|
|
...
|