1. Panoramica
Il panorama dell'AI e della tecnologia si muove più velocemente di quanto chiunque possa tenere traccia. Ogni giorno vengono rilasciati nuovi modelli, articoli e prodotti. Un agente di riepilogo che recupera i titoli di oggi, scrive riepiloghi concisi e genera un PDF ogni mattina risolverebbe il problema, ma in passato la creazione di un agente di questo tipo richiedeva la scelta di un framework, la definizione di strumenti in Python, la scrittura di un ciclo di orchestrazione, il packaging di un container e il deployment su Cloud Run. Tutto questo prima che l'agente avesse effettuato una sola richiesta web.
Managed Agents nell'API Gemini cambia l'equazione. Scrivi due file di configurazione Markdown e uno script di rendering predefinito, effettua una chiamata API e viene avviata una sandbox Ubuntu reale, che naviga sul web, scrive i riepiloghi e genera un PDF. Nessun contenitore. Nessun deployment. Nessun codice di orchestrazione.
In questo codelab creerai esattamente questo agente: da una funzione vuota a un riepilogo giornaliero funzionante, un concetto alla volta.
Cosa creerai
- Crea ed esegui il tuo primo agente gestito in una sandbox Linux reale
- Personalizzare l'agente con istruzioni dettagliate
- Scarica l'output PDF dell'agente
- Continua la conversazione per perfezionare il riepilogo senza recuperare nuovamente il web
- Salva la configurazione dell'agente e richiamala per ID nelle esecuzioni future
Che cosa ti serve
- Python 3.10+
- Una chiave API Gemini con la fatturazione abilitata: aistudio.google.com/api-keys
- ~1 $ di credito API (ogni esecuzione completa costa 0,30-1,30 $)
2. Che cosa sono gli agenti gestiti nell'API Gemini?
Tre livelli di sistemi AI
Prima di passare al codice, ecco dove si inseriscono gli agenti gestiti rispetto alle due alternative:
Livello | Descrizione | Chi gestisce l'infrastruttura? |
LLM standard | Tu inserisci un prompt e lui risponde con un testo. Nessuna mano, nessuna memoria, nessun internet. | N/A: non può fare nulla da solo |
Agente self-hosted | Colleghi ADK/LangChain/AutoGen + Docker + strumenti + memoria. | Tu: tutto (o una piattaforma gestita come Agent Engine) |
Agente gestito | Assegni un obiettivo. Google esegue il provisioning di una sandbox sicura. L'agente scrive il codice, lo esegue, legge gli errori, esegue ricerche sul web e corregge i bug in modo autonomo. | Google: tutto |
Questo codelab riguarda la terza riga. Fornisci un file di attività e di configurazione. Google si occupa di tutto il resto.
Cosa creeresti con ADK + Cloud Run
Per creare un agente di riepilogo delle notizie che naviga sul web, esegue Python e genera un PDF, avresti bisogno di tutto questo con ADK + Cloud Run:
# agent.py: define tools and wire up the agent
from google.adk.agents import LlmAgent
from google.adk.tools import google_search, built_in_code_execution
agent = LlmAgent(
name="digest-agent",
model=MODEL,
instruction=AGENTS_MD, # your editorial voice and rules
tools=[google_search, built_in_code_execution],
)
# app.py: serve the agent over HTTP
from google.adk.runners import FastApiRunner
runner = FastApiRunner(agent=agent)
app = runner.app
# pdf_tool.py: custom tool, install reportlab, render PDF
# scraper.py: custom tool, fetch each news source
# streaming.py: wire agent events to your SSE endpoint
# Dockerfile: package everything
FROM python:3.12
COPY . /app
RUN pip install google-adk reportlab requests
CMD ["uvicorn", "app:app", "--host", "0.0.0.0"]
# Deploy to Cloud Run
gcloud run deploy digest-agent \
--image gcr.io/your-project/digest-agent \
--set-secrets GEMINI_API_KEY=gemini-key:latest \
--memory 2Gi
Prima che l'agente venga eseguito per la prima volta. Mantieni l'isolamento della sandbox (in modo che l'agente non possa danneggiare il server), l'installazione dei pacchetti, la gestione dello stato tra le chiamate agli strumenti e l'infrastruttura di streaming per inviare eventi a un client.
Con cosa lo sostituisce Managed Agents
from google import genai
client = genai.Client()
stream = client.interactions.create(
agent="antigravity-preview-05-2026",
input="",
stream=True,
environment={
"type": "remote",
"sources": [ # your config files, mounted at startup
{
"type": "inline",
"target": ".agents/AGENTS.md",
"content": AGENTS_MD,
},
{
"type": "inline",
"target": ".agents/skills/digest-pdf/SKILL.md",
"content": SKILL_MD,
},
{
"type": "inline",
"target": ".agents/skills/digest-pdf/scripts/generate_pdf.py",
"content": GENERATE_PDF_PY,
},
],
},
)
Requisiti di ADK + Cloud Run | Cosa gestiscono gli agenti gestiti per te |
Immagine container + Dockerfile + CI/CD | Sandbox Ubuntu completamente gestita (Python 3.12, Node 22, 4 CPU / 16 GB di RAM) |
Deployment e scalabilità di Cloud Run | Fornito per interazione, scade automaticamente dopo 7 giorni di inattività |
Isolamento della sandbox | Isolato per interazione |
Strumento PDF personalizzato + | L'agente installa i pacchetti all'interno della sandbox |
Infrastruttura di streaming SSE |
|
Definizioni degli strumenti in Python | Strumenti integrati: navigazione web, esecuzione del codice, file system |
Gestione dello stato tra le chiamate di strumenti | Integrato nel ciclo di ragionamento dell'agente |
Scrivi i file di configurazione (AGENTS.md, SKILL.md, uno script predefinito) ed esegui una chiamata API. Google si occupa di tutto il resto.
Come funziona la sandbox
interactions.create() call
│
▼
Google provisions Ubuntu sandbox (Python 3.12, Node 22, 4 CPU / 16 GB RAM)
│
▼
Agent reasoning loop:
plan → fetch URLs → run Python → write files → reason → repeat
│
▼
Events stream back in real time: tool calls, text chunks, completion
│
▼
interaction.completed → environment_id + interaction_id
La sandbox viene mantenuta per 7 giorni di inattività. Puoi riprenderlo con environment_id per perfezionare l'output, eseguire attività di follow-up o creare una copia in un agente denominato salvato.
3. Configura
Opzione A: Cloud Shell (consigliata)
Fai clic sul pulsante di seguito per aprire questo codelab in Google Cloud Shell. Tutte le dipendenze sono preinstallate.
Opzione B: configurazione locale
git clone https://github.com/Saoussen-CH/tech-digest-managed-agent.git
cd tech-digest-managed-agent
Installa uv, se necessario:
curl -LsSf https://astral.sh/uv/install.sh | sh
Configura la chiave API
cp .env.example .env
cloudshell edit .env
Imposta la chiave:
GEMINI_API_KEY=your-key-here
Installa le dipendenze
uv sync
4. Effettuare la prima chiamata all'agente
Aprire il file iniziale
cloudshell edit run_digest.py
run_digest() ha un TODO da compilare ora e altri tre per il passaggio successivo. Sopra sono già precompilati due helper:
load_source(path): legge un file da.agents/rispetto allo script. Lo utilizzerai nel prossimo esercizio per montare la linea editoriale, la guida pratica PDF e il renderer nella sandbox.run_stream(stream): elabora il flusso di eventi e restituisce(environment_id, interaction_id). Non devi scrivere personalmente il ciclo di eventi.
Cosa aggiungere
DA FARE 1: sostituisci pass con (ignora i DA FARE 3 e 4 per ora, li vedremo nel passaggio successivo):
from google import genai
client = genai.Client()
stream = client.interactions.create(
agent=BASE_AGENT,
input="Fetch the Hacker News front page and list the top 5 stories.",
stream=True,
environment="remote",
)
environment_id, interaction_id = run_stream(stream)
print(f"\nDone. environment_id={environment_id}")
A cosa serve ogni parte
genai.Client() legge GEMINI_API_KEY dall'ambiente. Tutto il resto passa attraverso questo client.
interactions.create() è la chiamata principale. Perché funzioni, sono necessari quattro parametri:
agent=BASE_AGENT: seleziona l'agente Antigravity (antigravity-preview-05-2026), un agente gestito per uso generico basato su Gemini 3.5 Flash. Viene fornito con tre strumenti integrati attivati per impostazione predefinita:code_execution(esegui Bash, Python, Node.js),google_searcheurl_context(recupera e leggi pagine web). Gli strumenti del file system (read_file,write_file,list_files) vengono attivati automaticamente quando passi il parametroenvironment. Una chiamata esegue il provisioning di un ambiente Ubuntu completamente gestito con Python 3.12, Node.js 22, git, pip e curl preinstallati. Nessun container da creare, nessun deployment da eseguire.input: l'attività per questa esecuzione. L'agente sfoglia Hacker News e ragiona sui risultati.environment="remote": esegue il provisioning di una nuova sandbox cloud per questa interazione.stream=True: restituisce un iterabile di eventi anziché bloccare. Senza, la chiamata attende 30-90 secondi e restituisce tutto l'output contemporaneamente comeinteraction.output_text. Con lo streaming, vedi il motivo dell'agente e agisci in tempo reale. Lo streaming non è una funzionalità avanzata: è l'impostazione predefinita corretta, perché una scatola nera di 90 secondi non ti dà alcun segnale se l'agente sta lavorando o è bloccato.
Elementi appena sottoposti a provisioning:ogni chiamata interactions.create() avvia una sandbox dedicata:
Componente | Specifica |
Sistema operativo | Ambiente Ubuntu Linux isolato |
Runtime preinstallati | Python 3.12, Node.js 22, Bash |
Computing | 4 core CPU, 16 GB di RAM |
Gestione del contesto | La compressione automatica viene attivata a circa 135.000 token |
Networking | Accesso web in uscita tramite il proxy in uscita |
L'agente può installare qualsiasi pacchetto con pip o npm, leggere e scrivere file ed effettuare richieste web in uscita. Il tuo computer e le tue credenziali non vengono mai toccati.
environment_id è un handle della sandbox appena eseguita. Dopo interaction.completed, la sandbox non viene chiusa, ma rimane attiva per un massimo di 7 giorni. Il environment_id ti consente di tornare alla pagina. Passa a una seconda interactions.create() chiamata e l'agente riprende lo stesso file system, con gli stessi file e pacchetti installati, come se non avesse mai interrotto la chiamata. Il passaggio successivo lo utilizza per scaricare il PDF senza eseguire nuovamente l'agente, mentre il passaggio successivo lo utilizza per continuare la conversazione.
interaction_id è un handle del turno di conversazione appena completato. Passalo come previous_interaction_id nella chiamata successiva e l'agente avrà piena memoria di ciò che ha detto e fatto in questo turno.
Verifica
uv run python run_digest.py
Dovresti vedere l'output in tempo reale mentre l'agente lavora:
[agent started]
[tool] run_code
Here are the top 5 stories currently on the Hacker News front page, retrieved via the official Hacker News API:
1. **Qwen 3.6 27B is the sweet spot for local development** — 471 points
2. **.self: A new top-level domain designed to support self-hosting** — 116 points
...
Done. environment_id=e3de58774073f75a6ef42924c6ce2e88
L'API restituisce un environment_id reale anche con environment="remote". La sandbox è stata eseguita. Ciò che manca è la configurazione: nessuna voce, nessuna skill, nessun generatore di PDF. L'agente ha stampato le storie come testo e si è fermato. Il passaggio successivo aggiunge questi dati.
Ogni riga di output corrisponde a un evento di run_stream():
| Descrizione | Cosa stampa |
| agente che recupera un URL |
|
| agente che esegue il codice nella sandbox |
|
| agente che cerca sul web |
|
| strumenti per i file e altri |
|
| L'agente sta scrivendo | trasmesso in streaming direttamente a stdout |
5. Personalizzare l'agente
L'agente non aveva istruzioni: nessuna voce, nessuna skill, nessun generatore di PDF. In questo passaggio carichi i file di configurazione da .agents/ e li monti nella sandbox.
Cosa modificare
Apporta quattro modifiche a run_digest.py:
TODO 2: sotto load_source(), aggiungi le tre costanti a livello di modulo (si trovano al di fuori di run_digest(), nella parte superiore del file):
AGENTS_MD = load_source(".agents/AGENTS.md")
SKILL_MD = load_source(".agents/skills/digest-pdf/SKILL.md")
GENERATE_PDF_PY = load_source(".agents/skills/digest-pdf/scripts/generate_pdf.py")
Apri ogni file per vedere cosa stai caricando: AGENTS.md imposta le regole di workflow e la linea editoriale; SKILL.md è la guida pratica PDF passo passo; generate_pdf.py è il renderer predefinito che verrà eseguito dall'agente.
Ora apporta altre due modifiche all'interno di run_digest():
TODO 3: modifica environment da "remote" al dizionario delle origini e imposta input su "":
environment={
"type": "remote",
"sources": [
{
"type": "inline",
"target": ".agents/AGENTS.md",
"content": AGENTS_MD,
},
{
"type": "inline",
"target": ".agents/skills/digest-pdf/SKILL.md",
"content": SKILL_MD,
},
{
"type": "inline",
"target": ".agents/skills/digest-pdf/scripts/generate_pdf.py",
"content": GENERATE_PDF_PY,
},
],
},
TODO 4: aggiungi queste righe subito dopo print(f"\nDone. environment_id={environment_id}"):
set_key(".env", "ENVIRONMENT_ID", environment_id)
set_key(".env", "INTERACTION_ID", interaction_id)
(set_key è già stato importato nella parte superiore di run_digest.py.)
In questo modo, entrambi gli ID vengono scritti in .env durante l'esecuzione, quindi il passaggio successivo può scaricare il PDF senza eseguire nuovamente l'agente.
A cosa serve ogni origine
Ogni origine è un file montato nel file system della sandbox all'avvio prima dell'esecuzione dell'agente. I percorsi target corrispondono a quelli in cui la pettorina Antigravity prevede di trovarli:
.agents/
├── AGENTS.md ← auto-loaded as global instructions
└── skills/
└── digest-pdf/
├── SKILL.md ← auto-discovered and registered as a skill
└── scripts/
└── generate_pdf.py ← pre-built renderer the agent can run
Percorso | Variabile | Cosa fa la pettorina |
|
| Caricamento automatico come istruzioni persistenti: linea editoriale, workflow, regole di esecuzione |
|
| Rilevata e registrata automaticamente come competenza denominata; l'agente la richiama per nome |
|
| Renderer PDF predefinito; l'agente scrive |
Verifica
uv run python run_digest.py
L'esecuzione ora richiede 1-3 minuti. Dovresti vedere l'agente leggere i file di configurazione, scrivere i riepiloghi e salvare il PDF:
[agent started]
[tool] read_file (/.agents/skills/digest-pdf/SKILL.md)
[tool] list_files (/.agents/skills/digest-pdf/scripts)
[tool] read_file (/.agents/skills/digest-pdf/scripts/generate_pdf.py)
[tool] run_code
[tool] write_file (/workspace/summaries.json)
[tool] run_code
[tool] delete_file (/tmp/test_scrape.py)
I have successfully generated today's tech news digest and saved the formatted document to /workspace/digest.pdf.
Done. environment_id=4129ffd75574e308748e9425d7ec828f
environment_id ora è un valore reale: la sandbox è stata eseguita con i file di configurazione e l'agente ha creato digest.pdf. Il passaggio successivo consiste nel scaricarlo.
6. Scarica il PDF
L'agente ha scritto digest.pdf a /workspace/digest.pdf all'interno della sandbox. Lo snapshot dell'ambiente è disponibile come archivio tar tramite l'API Gemini Files.
Installa requests, se necessario:
uv pip install requests
Cosa compilare
Apri download_pdf.py. Ha due cose da fare.
TODO 1: compila la chiamata requests.get():
r = requests.get(
f"https://generativelanguage.googleapis.com/v1beta/files/environment-{environment_id}:download",
params={"alt": "media"},
headers={"x-goog-api-key": api_key},
allow_redirects=True,
)
r.raise_for_status()
L'URL indirizza lo snapshot della sandbox. params={"alt": "media"} restituisce byte non elaborati anziché metadati. Il tuo GEMINI_API_KEY esistente autentica anche l'API Files.
TODO 2: trova ed estrai il PDF dall'archivio tar:
member = next(m for m in tar.getmembers() if m.name.endswith("workspace/digest.pdf"))
tar.extract(member, path=tmp, filter="data")
Il prefisso del percorso tar varia a seconda delle esecuzioni, quindi esegui la ricerca per suffisso anziché codificare il percorso esatto. filter="data" sopprime l'avviso di ritiro di Python 3.13 relativo all'estrazione di tar non sicura.
Verifica
uv run python download_pdf.py
Saved digest.pdf (48,231 bytes)
Apri digest.pdf nella stessa directory. Contiene il riepilogo formattato generato dall'agente dalle pagine web pubblicate.
7. Continua la conversazione
Hai già digest.pdf. Se volevi solo il file, hai finito. Questo passaggio riguarda un'altra operazione: chiedere all'agente di modificare il riepilogo senza recuperare nuovamente i contenuti web.
La sandbox è ancora attiva. L'agente ha ancora /workspace/digest.pdf e ricorda ogni storia che ha riassunto. Una seconda chiamata interactions.create() invia un messaggio di follow-up nella stessa sandbox. Qui chiedi di aggiungere una nota "Perché è importante" sotto ogni storia e il PDF viene aggiornato sul posto, senza recupero e riepilogo.
Cosa compilare
Apri refine_digest.py. Ha tre cose da fare.
TODO 1 e 2: compila i due parametri multi-turn all'interno di interactions.create():
environment=environment_id,
previous_interaction_id=interaction_id,
environment=environment_id ripristina la stessa sandbox con i relativi file e pacchetti. previous_interaction_id=interaction_id fornisce all'agente la cronologia delle conversazioni. Nessun altro elemento cambia rispetto alla prima chiamata.
TODO 3: mantieni il nuovo interaction_id di nuovo su .env dopo il ciclo di eventi:
set_key(".env", "INTERACTION_ID", interaction_id)
Ogni chiamata interactions.create() produce un nuovo interaction_id. La riscrittura significa che l'esecuzione successiva passa questo perfezionamento come previous_interaction_id, concatenando correttamente i turni. L'ID sandbox non cambia mai, quindi non è necessario aggiornare ENVIRONMENT_ID.
I due parametri che consentono il funzionamento della conversazione multi-turno
ID | Che cosa conserva | Analogia |
| File, pacchetti installati, stato del sistema: tutto ciò che si trova nel file system Linux | Mantenere la stessa scrivania tra una riunione e l'altra |
| Cronologia della conversazione: cosa ha detto e fatto l'agente nei turni precedenti | Ricordare cosa è stato discusso nell'ultima riunione |
Puoi superare la verifica di uno dei due ID in modo indipendente:
environment_id: riutilizza file e pacchetti, ma inizia una nuova conversazione. Utile per una nuova attività nello stesso spazio di lavoro.previous_interaction_id: continua il contesto della conversazione, ma in una nuova sandbox (i file non sono più presenti).- Entrambi: continuità completa, che è ciò che utilizza questo passaggio.
Senza environment_id: sandbox vuota, nessun PDF. Senza previous_interaction_id: nessun contesto, l'agente non può perfezionare una sezione specifica.
Verifica
uv run python refine_digest.py
Lo streaming dovrebbe essere veloce, l'agente non recupera nulla. Al termine:
Refinement done.
Saved digest_v2.pdf (52,418 bytes)
Apri digest_v2.pdf e confrontalo con digest.pdf. Ogni storia dovrebbe ora avere una riga "Perché è importante".
8. Persistenza di una configurazione dell'agente gestita
Tutte le chiamate finora hanno superato AGENTS.md, SKILL.md e generate_pdf.py inline. Funziona, ma il codice di chiamata trasporta l'intero contenuto del file a ogni esecuzione. agents.create() incorpora la configurazione in un agente denominato salvato sul lato di Google. La chiamata successiva passa solo l'ID agente:
Inline calls: send sources on every call
Named agent: bake once → invoke by ID, no sources
Cosa compilare
Apri save_agent.py. Contiene un TODO (TODO 1).
Tieni presente che le costanti vengono importate direttamente da run_digest.py (senza duplicazione):
from run_digest import BASE_AGENT, AGENTS_MD, SKILL_MD, GENERATE_PDF_PY
TODO 1: compila la chiamata agents.create():
agent = client.agents.create(
id="my-digest",
base_agent=BASE_AGENT,
description="Daily tech digest with editorial voice and PDF generation.",
base_environment={
"type": "remote",
"sources": [
{
"type": "inline",
"target": ".agents/AGENTS.md",
"content": AGENTS_MD,
},
{
"type": "inline",
"target": ".agents/skills/digest-pdf/SKILL.md",
"content": SKILL_MD,
},
{
"type": "inline",
"target": ".agents/skills/digest-pdf/scripts/generate_pdf.py",
"content": GENERATE_PDF_PY,
},
],
},
)
base_environment (non environment) è la differenza principale rispetto alla chiamata inline nel passaggio precedente: le origini vengono archiviate lato Google e montate automaticamente a ogni invocazione futura. Esegui una volta, non a ogni esecuzione del riepilogo.
Verifica: salva l'agente
uv run python save_agent.py
Saved: my-digest
my-digest: Daily tech digest with editorial voice and PDF generation.
Richiamare l'agente salvato
Apri invoke_agent.py. Chiama l'agente salvato per ID senza origini:
stream = client.interactions.create(
agent="my-digest",
input="",
stream=True,
environment="remote",
)
Confronta questo risultato con la chiamata inline: agent=BASE_AGENT viene sostituito da "my-digest" e l'intero blocco environment con tre fonti inline viene sostituito da environment="remote". La configurazione è già integrata nel sistema di Google.
Verifica: richiama l'agente salvato
uv run python invoke_agent.py
Dovresti vedere lo stesso live streaming dell'esecuzione in linea, ma la chiamata non contiene file di origine. Dopo la corsa, ENVIRONMENT_ID e INTERACTION_ID in .env vengono aggiornati in modo da poter continuare con refine_digest.py come prima.
[agent started]
[tool] read_file
[tool] write_file
[tool] run_code
I have successfully created today's tech news digest.
Done. environment_id=9a1c3e02-...
9. Elimina
La sandbox scade automaticamente dopo 7 giorni di inattività. Nessun server da arrestare. Nessun contenitore da eliminare.
Se hai salvato una configurazione dell'agente, eliminala:
uv run python delete_agent.py
10. Riepilogo
Hai creato un agente gestito da zero, un concetto alla volta. Ecco cosa insegnava ogni esercizio:
Esercizio | Concetto | API Key |
Effettuare la prima chiamata | Esegui il provisioning di una sandbox Linux reale e trasmetti in streaming i relativi eventi in diretta |
|
Personalizzare l'agente | Monta i file di configurazione; mantieni gli ID in |
|
Scarica il PDF | Scaricare il PDF senza eseguire di nuovo l'agente | API Gemini Files |
Continua la conversazione | Continua la conversazione senza recuperare nuovamente il web |
|
Mantieni configurazione agente | Persistenza della configurazione dell'agente; richiamo per ID, senza bisogno di origini |
|
Pattern chiave
- Una chiamata, una sandbox:
interactions.create()gestisce tutta l'infrastruttura (nessun container da eseguire il deployment, nessun pacchetto da installare localmente) - Streaming progressivo:
stream=Truetrasforma una scatola nera di 90 secondi in un feed pubblicato di chiamate agli strumenti e blocchi di testo - Origini inline: monta
AGENTS.md,SKILL.mde script predefiniti nella sandbox senza alcun passaggio di caricamento o deployment - Rilevamento automatico dell'imbracatura: i file inseriti in
.agents/vengono rilevati automaticamente (non è richiesta alcuna configurazione dell'SDK) - Stato bidimensionale:
environment_idtiene traccia di file e pacchetti;previous_interaction_idtiene traccia del contesto della conversazione; entrambi possono essere passati in modo indipendente - Download dello snapshot: l'ambiente è un tar del file system completo, accessibile tramite l'API Gemini Files
- Agenti denominati:
agents.create()incorpora la configurazione in modo permanente; le chiamate future trasmettono solo l'ID agente eenvironment="remote", senza origini
ADK + Cloud Run e agenti gestiti: la differenza in sintesi
Capacità | ADK + Cloud Run | Managed Agents nell'API Gemini |
Esegui il provisioning di una sandbox |
|
|
Definisci gli strumenti | Funzioni Python registrate con l'agente | Funzionalità integrate: navigazione web, esecuzione di codice, file system |
Installa pacchetti |
| L'agente viene eseguito |
Eventi di streaming | Infrastruttura SSE personalizzata |
|
Continuare una sessione | Database della sessione + inserimento del contesto |
|
File di configurazione | Codificati nell'agente o inseriti all'avvio | Montato tramite |
Infrastruttura da gestire | Container, Cloud Run, IAM, secret | Nessuno |