// lib/repositories/ai_repository.dart import 'dart:convert'; // <-- IMPORT NÉCESSAIRE POUR jsonDecode import '../domain/app_filter.dart'; import '../services/gemini_service.dart'; import '../services/stable_diffusion_service.dart'; import '../services/ollama_service.dart'; // <-- VOTRE FICHIER DE SERVICE PRINCIPAL /// Le AiRepository est le point d'entrée centralisé pour toutes les opérations d'IA. class AiRepository { final ImageAnalysisService _imageAnalyzer = OllamaImageAnalysisService(); final PostCreationService _postCreator = OllamaPostCreationService(); final TextImprovementService _textImprover = OllamaTextImprovementService(); final StableDiffusionService stableDiffusionService = StableDiffusionService(); final GeminiService geminiService = GeminiService(); // --- CORRECTION MAJEURE ICI --- /// Étape 1: Analyse l'image, parse le JSON et retourne un objet structuré. Future analyzeImage(String base64Image) async { print("[AiRepository] Délégation de l'analyse à l'ImageAnalyzer..."); // 1. On récupère la chaîne JSON brute depuis le service. final String jsonString = await _imageAnalyzer.analyzeImage(base64Image); print("[AiRepository] Parsing de la réponse JSON : $jsonString"); // 2. On parse cette chaîne JSON pour en faire un objet Map. final Map jsonMap = jsonDecode(jsonString); // 3. On extrait les valeurs du Map. Le nom de la clé 'description' vient du prompt que vous avez écrit. final String prompt = jsonMap['description'] as String? ?? 'No description found.'; final List filterIds = (jsonMap['filters'] as List? ?? []).cast(); // 4. On retourne le Record (l'objet structuré) que l'UI attend. return (prompt: prompt, filterIds: filterIds); } // --- FIN DE LA CORRECTION --- // ... (dans la classe AiRepository) Stream editImage( String base64Image, String prompt, int width, int height, { List filtersToApply = const [], }) { // --- CORRECTION --- // Puisque stableDiffusionService.editImage retourne déjà le bon type (Stream), // on le retourne directement. return stableDiffusionService.editImage( base64Image, prompt, width, height, ); // --- FIN DE LA CORRECTION --- } // ... (le reste de la classe est inchangé) Future> generatePostIdeas({ required String base64Image, required String profession, required String tone, }) { return _postCreator.generatePostIdeas( base64Image: base64Image, profession: profession, tone: tone, ); } Future improvePostText({ required String originalText, required String userInstruction, }) { return _textImprover.improveText( originalText: originalText, userInstruction: userInstruction, ); } }