Hai seguito tutorial su Google Gemini, ma ogni volta che provi a generare testo in Python ti ritrovi con errori 403, modelli inesistenti o timeout inspiegabili? Non sei solo. Noi, di Meteora Web, ci siamo passati. L’SDK google-generativeai è potente, ma andare a naso con la configurazione iniziale ti fa perdere ore. Questa guida parte da zero e arriva fino a streaming, safety settings e costi. Ogni riga di codice è testata. Pronto?
Come installare e configurare l’SDK google-generativeai in Python?
Prima di tutto: dimentica l’idea che basti un pip install per fare tutto. L’SDK richiede un ambiente Python 3.9+ e una chiave API attiva. Noi partiamo sempre dal principio: preparare l’ambiente e gestire le credenziali in modo sicuro, senza lasciare token in chiaro nel codice (lo vediamo ancora troppo spesso nei progetti che ci arrivano in revisione).
Passo 1: Ambiente Python e installazione del pacchetto
Crea un virtual environment per isolare le dipendenze – ti evita conflitti con altri progetti. Poi installa il pacchetto:
python3 -m venv venv
git source venv/bin/activate # su Windows: venv\Scripts\activate
pip install google-generativeai
Passo 2: Ottenere la chiave API da Google AI Studio
Vai su Google AI Studio, crea una nuova chiave API (gratuita, con limiti adeguati per test e sviluppo). Salva la chiave in una variabile d’ambiente – mai nel codice. Usa python-dotenv per gestirla in locale.
Sponsored Protocol
pip install python-dotenv
echo "GEMINI_API_KEY=la_tua_chiave_qui" > .env
Passo 3: Configurare l’SDK e primo test
Avvia un prompt Python interattivo o un file test_gemini.py:
import os
import google.generativeai as genai
from dotenv import load_dotenv
load_dotenv()
genai.configure(api_key=os.getenv("GEMINI_API_KEY"))
model = genai.GenerativeModel("gemini-2.0-flash")
response = model.generate_content("Ciao, spiegami cos'è un LLM in una frase.")
print(response.text)
Esegui: python test_gemini.py. Dovresti vedere una risposta. Se ottieni errori 403, controlla che la chiave sia corretta e che il modello sia disponibile. I modelli più recenti (gemini-2.0-flash, gemini-2.0-pro) richiedono una versione aggiornata dell’SDK (verifica con pip show google-generativeai).
Come gestire la generazione di testo con streaming e safety settings?
Una chiamata sincrona va bene per test rapidi. Ma in produzione – chatbot, riassunti automatici, analisi di documenti – devi poter leggere il risultato man mano che arriva (streaming) e controllare cosa il modello non può rispondere (safety).
Streaming – risposte in tempo reale
Usa stream=True nel metodo generate_content. Il modello restituisce un generatore di chunk.
model = genai.GenerativeModel("gemini-2.0-flash")
response = model.generate_content("Racconta la storia di un gatto programmatore.", stream=True)
for chunk in response:
print(chunk.text, end="")
Puoi anche gestire lo streaming in un thread separato per non bloccare l’UI (ad esempio con asyncio). Il beneficio? L’utente vede la risposta mentre viene generata – riduce l’abbandono su chat interattive.
Sponsored Protocol
Safety settings – bloccare contenuti indesiderati
Per difetto, Gemini applica filtri di sicurezza. Ma a volte blocca anche risposte innocue a seconda dell’uso. Puoi abbassare (o alzare) le soglie per categoria (HARM_CATEGORY_HARASSMENT, HARM_CATEGORY_HATE_SPEECH, ecc.).
from google.generativeai.types import HarmCategory, HarmBlockThreshold
safety_settings = {
HarmCategory.HARM_CATEGORY_HARASSMENT: HarmBlockThreshold.BLOCK_ONLY_HIGH,
HarmCategory.HARM_CATEGORY_HATE_SPEECH: HarmBlockThreshold.BLOCK_ONLY_HIGH,
}
model = genai.GenerativeModel("gemini-2.0-flash", safety_settings=safety_settings)
response = model.generate_content("Scrivi una barzelletta politicamente scorretta.")
print(response.text)
Attenzione: abbassare le soglie può esporre a contenuti problematici. Noi di Meteora Web consigliamo di testare sempre in staging e, per applicazioni rivolte a minori, mantenere i blocchi predefiniti.
Come ottimizzare le chiamate API per ridurre costi e latenza?
Paghi per token inviati e ricevuti. Ogni chiamata inutile è denaro bruciato. L’SDK offre parametri per controllare la lunghezza della risposta, ma ci sono anche strategie a monte.
Sponsored Protocol
Parametri di generazione – max_output_tokens, temperature, top_p
Imposta generation_config per limitare la lunghezza e la casualità.
generation_config = {
"max_output_tokens": 200,
"temperature": 0.3,
"top_p": 0.95,
"top_k": 40,
}
model = genai.GenerativeModel("gemini-2.0-flash", generation_config=generation_config)
response = model.generate_content("Spiega in 50 parole cos'è un'API.")
print(response.text)
Riducendo la temperatura (verso 0), ottieni risposte più deterministiche e ripetibili – ideale per task strutturati (es. estrazione dati).
System instruction – contesto senza sprecare token
Invece di ripetere le istruzioni in ogni prompt, usa system_instruction al momento di creare il modello. Il contesto viene applicato a tutte le conversazioni.
model = genai.GenerativeModel(
"gemini-2.0-flash",
system_instruction="Sei un assistente esperto di Python. Rispondi sempre con esempi di codice."
)
response = model.generate_content("Come faccio una richiesta HTTP?")
print(response.text)
Risparmi token nel prompt e garantisci coerenza.
Caching delle risposte – solo per determinate API
Se la risposta non deve cambiare nel breve termine (es. definizione di un termine tecnico), salva il risultato in Redis o in un file JSON con TTL. Gemini non offre caching lato server, ma puoi implementarlo lato client. Noi lo facciamo spesso nei nostri progetti in Laravel con cache sul database.
Sponsored Protocol
Come gestire conversazioni multi-turno con history?
Per chatbot che ricordano il contesto, devi passare la cronologia della conversazione. L’SDK supporta chat_session o la costruzione manuale della lista di messaggi.
Usare chat_session
model = genai.GenerativeModel("gemini-2.0-flash")
chat = model.start_chat(history=[])
response = chat.send_message("Chi ha vinto il mondiale 2006?")
print(response.text)
response = chat.send_message("E nel 2010?")
print(response.text)
Il contesto viene mantenuto automaticamente. Attenzione: la cronologia cresce, quindi imposta un limite di turni (es. 10) per evitare superamenti del token limit.
Costruire manualmente la lista di messaggi
Per controlli più fini (es. modificare un messaggio precedente), costruisci tu stesso la lista:
messages = [
{"role": "user", "parts": ["Ciao"]},
{"role": "model", "parts": ["Ciao! Come posso aiutarti?"]},
{"role": "user", "parts": ["Che tempo fa a Roma?"]},
]
response = model.generate_content(messages)
print(response.text)
Come gestire errori e retry in produzione?
L’API di Gemini può restituire errori per rate limiting, temporanee indisponibilità o contenuti bloccati. Noi di Meteora Web abbiamo una regola: ogni chiamata API deve essere protetta da retry con backoff esponenziale. L’SDK non lo fa in automatico.
Sponsored Protocol
Implementare retry con tenacity
from tenacity import retry, stop_after_attempt, wait_exponential
from google.api_core.exceptions import GoogleAPIError
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10))
def safe_generate(model, prompt):
return model.generate_content(prompt)
try:
response = safe_generate(model, "Ciao")
print(response.text)
except GoogleAPIError as e:
print(f"Errore dopo 3 tentativi: {e}")
In un’app web, integra con un sistema di logging (es. Sentry) per tracciare gli errori persistenti.
Cosa fare adesso
- Installa l’SDK e testa il tuo primo script – usa il codice sopra, sostituisci la chiave API, e verifica che tutto funzioni.
- Aggiungi streaming e safety – trasforma la chiamata sincrona in streaming e regola le soglie in base al tuo caso d’uso.
- Imposta generation_config e system_instruction – taglia i token inutili e guida il modello verso output più prevedibili.
- Inserisci retry – non lasciare l’API scoperta. Usa tenacity per tentativi automatici.
- Progetta la cache – per risposte ripetute, risparmi chiamate e costi.
Questa guida fa parte del pillar Gemini API per Sviluppatori, dove trovi approfondimenti su vision, embedding e altro. Se hai domande o vuoi che analizziamo il tuo progetto, contattaci.