選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

72 行
2.2KB

  1. import 'dart:convert';
  2. import 'package:http/http.dart' as http;
  3. /// Définit un contrat pour tout service capable de générer des idées de posts.
  4. abstract class PostCreationService {
  5. Future<List<String>> generatePostIdeas({
  6. required String base64Image,
  7. required String profession,
  8. required String tone,
  9. });
  10. }
  11. /// L'implémentation Ollama de ce service.
  12. class OllamaPostCreationService implements PostCreationService {
  13. final String _apiUrl = 'http://192.168.20.200:11434/api/generate';
  14. final String _visionModel = 'llava:7b';
  15. @override
  16. Future<List<String>> generatePostIdeas({
  17. required String base64Image,
  18. required String profession,
  19. required String tone,
  20. }) async {
  21. final requestPrompt = """
  22. You are a social media expert.
  23. Act as a "$profession".
  24. Analyze the image.
  25. Generate 3 short and engaging social media post ideas in french with a "$tone" tone.
  26. Your output MUST be a valid JSON array of strings.
  27. Example:
  28. ["", "", ""]
  29. """;
  30. final requestBody = {
  31. 'model': _visionModel,
  32. 'prompt': requestPrompt,
  33. 'images': [base64Image],
  34. 'stream': false,
  35. };
  36. try {
  37. print("[OllamaPostCreationService] 🚀 Appel pour générer des idées...");
  38. final response = await http.post(
  39. Uri.parse(_apiUrl),
  40. headers: {'Content-Type': 'application/json'},
  41. body: jsonEncode(requestBody),
  42. ).timeout(const Duration(minutes: 3));
  43. if (response.statusCode == 200) {
  44. final responseData = jsonDecode(response.body);
  45. final jsonString = (responseData['response'] as String? ?? '').trim();
  46. if (jsonString.isEmpty) return [];
  47. try {
  48. final ideasList = jsonDecode(jsonString) as List;
  49. return ideasList.map((idea) => idea.toString()).toList();
  50. } catch (e) {
  51. print("[OllamaPostCreationService] ❌ Erreur de parsing JSON. Réponse : $jsonString");
  52. return [jsonString]; // Retourne la réponse brute comme une seule idée
  53. }
  54. } else {
  55. throw Exception('Erreur Ollama (generatePostIdeas) ${response.statusCode}: ${response.body}');
  56. }
  57. } catch (e) {
  58. print("[OllamaPostCreationService] ❌ Exception : ${e.toString()}");
  59. rethrow;
  60. }
  61. }
  62. }