diff --git a/TODO.md b/TODO.md index 490c194..79df3c3 100644 --- a/TODO.md +++ b/TODO.md @@ -173,12 +173,12 @@ Comparer l'agenda réel et l'agenda théorique pour générer les ajouts/suppres Générer une synthèse optionnelle via un fournisseur IA, avec mode dégradé strict. -- [ ] Créer `synthesis/provider.py` : protocole `SynthesisProvider.generate → Optional[SynthesisResult]` (ne lève jamais d'exception). -- [ ] Créer `synthesis/openai.py` : `OpenAISynthesisProvider` (httpx, prompt système FR, max 800 car., timeout 30 s, temp 0.3). -- [ ] Créer `synthesis/litellm.py` : `LiteLLMSynthesisProvider` (optionnel, extra `ai-litellm`). -- [ ] Créer `synthesis/__init__.py` : factory `get_synthesis_provider(settings)` (OpenAI par défaut, litellm si `AI_PROVIDER=litellm`). -- [ ] Mode dégradé : clé absente / timeout / exception → retour `None` (le pipeline continue sans synthèse). -- [ ] Respecter les contraintes (3-5 phrases, ton sobre, pas d'emoji dans le texte IA). +- [x] Créer `synthesis/provider.py` : protocole `SynthesisProvider.generate → Optional[SynthesisResult]` (ne lève jamais d'exception). +- [x] Créer `synthesis/openai.py` : `OpenAISynthesisProvider` (httpx, prompt système FR, max 800 car., timeout 30 s, temp 0.3). +- [x] Créer `synthesis/litellm.py` : `LiteLLMSynthesisProvider` (optionnel, extra `ai-litellm`). +- [x] Créer `synthesis/__init__.py` : factory `get_synthesis_provider(settings)` (OpenAI par défaut, litellm si `AI_PROVIDER=litellm`). +- [x] Mode dégradé : clé absente / timeout / exception → retour `None` (le pipeline continue sans synthèse). +- [x] Respecter les contraintes (3-5 phrases, ton sobre, pas d'emoji dans le texte IA). ### Critères d'acceptation - `generate` retourne une synthèse ≤ 800 car. conforme au prompt système.