Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

87 lines
2.9KB

  1. // lib/repositories/ai_repository.dart
  2. import 'dart:convert'; // <-- IMPORT NÉCESSAIRE POUR jsonDecode
  3. import '../domain/app_filter.dart';
  4. import '../services/gemini_service.dart';
  5. import '../services/stable_diffusion_service.dart';
  6. import '../services/ollama_service.dart'; // <-- VOTRE FICHIER DE SERVICE PRINCIPAL
  7. /// Le AiRepository est le point d'entrée centralisé pour toutes les opérations d'IA.
  8. class AiRepository {
  9. final ImageAnalysisService _imageAnalyzer = OllamaImageAnalysisService();
  10. final PostCreationService _postCreator = OllamaPostCreationService();
  11. final TextImprovementService _textImprover = OllamaTextImprovementService();
  12. final StableDiffusionService stableDiffusionService = StableDiffusionService();
  13. final GeminiService geminiService = GeminiService();
  14. // --- CORRECTION MAJEURE ICI ---
  15. /// Étape 1: Analyse l'image, parse le JSON et retourne un objet structuré.
  16. Future<ImageAnalysisResult> analyzeImage(String base64Image) async {
  17. print("[AiRepository] Délégation de l'analyse à l'ImageAnalyzer...");
  18. // 1. On récupère la chaîne JSON brute depuis le service.
  19. final String jsonString = await _imageAnalyzer.analyzeImage(base64Image);
  20. print("[AiRepository] Parsing de la réponse JSON : $jsonString");
  21. // 2. On parse cette chaîne JSON pour en faire un objet Map.
  22. final Map<String, dynamic> jsonMap = jsonDecode(jsonString);
  23. // 3. On extrait les valeurs du Map. Le nom de la clé 'description' vient du prompt que vous avez écrit.
  24. final String prompt = jsonMap['description'] as String? ?? 'No description found.';
  25. final List<String> filterIds = (jsonMap['filters'] as List<dynamic>? ?? []).cast<String>();
  26. // 4. On retourne le Record (l'objet structuré) que l'UI attend.
  27. return (prompt: prompt, filterIds: filterIds);
  28. }
  29. // --- FIN DE LA CORRECTION ---
  30. // ... (dans la classe AiRepository)
  31. Stream<String> editImage(
  32. String base64Image,
  33. String prompt,
  34. int width,
  35. int height, {
  36. List<ImageFilter> filtersToApply = const [],
  37. }) {
  38. // --- CORRECTION ---
  39. // Puisque stableDiffusionService.editImage retourne déjà le bon type (Stream<String>),
  40. // on le retourne directement.
  41. return stableDiffusionService.editImage(
  42. base64Image,
  43. prompt,
  44. width,
  45. height,
  46. );
  47. // --- FIN DE LA CORRECTION ---
  48. }
  49. // ... (le reste de la classe est inchangé)
  50. Future<List<String>> generatePostIdeas({
  51. required String base64Image,
  52. required String profession,
  53. required String tone,
  54. }) {
  55. return _postCreator.generatePostIdeas(
  56. base64Image: base64Image,
  57. profession: profession,
  58. tone: tone,
  59. );
  60. }
  61. Future<String> improvePostText({
  62. required String originalText,
  63. required String userInstruction,
  64. }) {
  65. return _textImprover.improveText(
  66. originalText: originalText,
  67. userInstruction: userInstruction,
  68. );
  69. }
  70. }