generateDescriptionFromEntry static method

Future<String> generateDescriptionFromEntry(
  1. DiaryEntry entry,
  2. String location
)

Generates a diary description using the Gemini API from a DiaryEntry.

The description is based on the diary's title, date, user location, and associated photo URLs. Each image is processed to enrich the final description.

Returns:

  • A String containing the generated description.
  • If the generation fails (e.g., due to network errors or invalid response), a fallback error message is returned instead.

Notes:

  • This method does not throw exceptions; it returns user-friendly error strings instead.

Implementation

static Future<String> generateDescriptionFromEntry(
  DiaryEntry entry,
  String location,
) async {
  // Define output schema
  final jsonSchema = Schema.object(
    properties: {'description': Schema.string()},
  );

  // Prompt testuale
  final prompt = TextPart('''
Crea una descrizione (in inglese, non italiano) per una voce di diario di viaggio con queste informazioni:
Titolo: ${entry.title}
Descrizione: ${entry.description}
Località: La posizione è: $location
Data: ${entry.date.toIso8601String()}
Descrivi l’esperienza in modo personale ed emotivo, coerente con le immagini, descrivendole una per una.
Massimo 1500 caratteri.
Parti direttamente con la descrizione, senza frasi introduttive o date e luogo all'inizio con poi la descrizione.
Fornisci la risposta come JSON con un solo campo chiamato "description".
''');

  final parts = <Part>[prompt];

  for (final url in entry.photoUrls) {
    final file = File(url);
    if (await file.exists()) {
      final bytes = await file.readAsBytes();
      final mimeType = lookupMimeType(url) ?? 'image/jpeg';
      parts.add(InlineDataPart(mimeType, bytes));
    }
  }

  final model = FirebaseAI.googleAI().generativeModel(
    model: 'gemini-2.0-flash-001',
    generationConfig: GenerationConfig(
      responseMimeType: 'application/json',
      responseSchema: jsonSchema,
    ),
  );
  try {
    final response = await model.generateContent([Content.multi(parts)]);

    final rawText = response.text!;
    final jsonResponse = jsonDecode(rawText);
    if (jsonResponse case {'description': final String description}) {
      return description;
    } else {
      return 'Could not generate description.';
    }
  } on SocketException {
    return 'No connection. Could not generate a description.';
  } catch (e) {
    return 'Error during the generation of a description';
  }
}