generateDescriptionFromEntry static method
- DiaryEntry entry,
- 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';
}
}