Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

57 rindas
1.8KB

  1. import 'dart:convert';
  2. import 'package:http/http.dart' as http;
  3. /// Définit un contrat pour tout service capable d'analyser une image
  4. /// et de la décrire sous forme de texte.
  5. abstract class ImageAnalysisService {
  6. /// Prend une image en base64 et retourne une description textuelle (prompt).
  7. Future<String> analyzeImage(String base64Image);
  8. }
  9. /// L'implémentation Ollama de ce service.
  10. class OllamaImageAnalysisService implements ImageAnalysisService {
  11. final String _apiUrl = 'http://192.168.20.200:11434/api/generate';
  12. final String _visionModel = 'llava:7b';
  13. @override
  14. Future<String> analyzeImage(String base64Image) async {
  15. print(
  16. "[OllamaImageAnalysisService] 🚀 Lancement de l'analyse de l'image...");
  17. final requestPrompt = '''
  18. As a professional photographe and instagram, describe this imange and give ideas to improve quality to publish on social network.
  19. ''';
  20. final requestBody = {
  21. 'model': _visionModel,
  22. 'prompt': requestPrompt,
  23. 'images': [base64Image],
  24. 'stream': false,
  25. };
  26. try {
  27. final response = await http.post(
  28. Uri.parse(_apiUrl),
  29. headers: {'Content-Type': 'application/json'},
  30. body: jsonEncode(requestBody),
  31. ).timeout(const Duration(minutes: 2));
  32. if (response.statusCode == 200) {
  33. final body = jsonDecode(response.body);
  34. final generatedPrompt = (body['response'] as String? ?? '')
  35. .trim()
  36. .replaceAll('\n', ' ');
  37. print(
  38. "[OllamaImageAnalysisService] ✅ Analyse terminée : $generatedPrompt");
  39. return generatedPrompt;
  40. } else {
  41. throw Exception(
  42. 'Erreur Ollama (analyzeImage) ${response.statusCode}: ${response
  43. .body}');
  44. }
  45. } catch (e) {
  46. print("[OllamaImageAnalysisService] ❌ Exception : ${e.toString()}");
  47. rethrow;
  48. }
  49. }
  50. }