Prompt giornaliero

Generazione multilingua schedulata, parsing robusto del JSON e puntatore stabile per il client.

Cosa è

Una domanda introspettiva che appare in cima al feed globale ogni mattina, identica per tutti gli utenti, prodotta da Gemini in tutte e sei le lingue supportate. L’idea è offrire uno spunto di scrittura senza imporlo: chi vuole rispondere lo fa, chi non vuole scorre oltre.

Scheduling

exports.generateDailyPrompt = onSchedule({
  schedule: "0 0 * * *",
  timeZone: "Europe/Rome",
  secrets: [GEMINI_API_KEY],
  timeoutSeconds: 120,
  retryCount: 2,
}, async () => { ... });

Europe/Rome è scelta deliberata: l’audience iniziale è italiana, il “giorno nuovo” deve coincidere con la percezione locale e non con UTC. Le altre timezone vedono il cambio di prompt a un’ora che dipende dalla propria — tradeoff accettato in cambio di un’unica fonte di verità.

Generazione in una chiamata

Invece di sei chiamate Gemini (una per lingua), ne viene fatta una sola che restituisce un JSON con tutte le traduzioni:

{
  "it": "...",
  "en": "...",
  "de": "...",
  "es": "...",
  "fr": "...",
  "pt-BR": "..."
}

Vantaggi: un sesto del costo e del tempo, e soprattutto coerenza semantica — il modello non “riparafrasa” la domanda perdendo sfumature tra lingua e lingua.

Robustezza del parsing

Una risposta JSON da un LLM non è affidabile quanto una da un endpoint tipizzato. Due protezioni:

  1. Recovery da JSON troncato — se la response è stata tagliata (es. MAX_TOKENS), un parser tollerante prova a estrarre le chiavi già complete. Meglio cinque lingue su sei che un errore.
  2. Fallback per lingua mancante — se dopo il recovery resta una chiave assente, viene riempita con un testo neutro predefinito e loggata come warning. La UI non mostrerà mai una card vuota.

Se nessuna lingua è recuperabile, la function solleva un errore e il documento dailyPrompts/current resta al giorno precedente — vedi la sezione sotto.

Puntatore stabile

La UI non legge dailyPrompts/2026-04-22, che richiederebbe al client di conoscere la data corrente in Europe/Rome. Legge dailyPrompts/current, aggiornato dalla function in coda alla generazione:

dailyPrompts/
  2026-04-21       ← storico
  2026-04-22       ← storico (oggi)
  current          ← puntatore con la stessa payload di oggi

Se la generazione fallisce, current non viene sovrascritto. Gli utenti vedono il prompt di ieri invece di una card vuota, il che è esattamente il comportamento voluto durante un outage.

Trigger manuale

runDailyPromptNow è un endpoint HTTP autenticato tramite Bearer token verificato lato server. Utile per rigenerare un prompt se il primo non piace o per testare in staging senza attendere mezzanotte. Non è esposto al client e non sostituisce il trigger schedulato — lo affianca.