1. Übersicht
Die KI- und Technologielandschaft entwickelt sich so schnell, dass niemand den Überblick behalten kann. Täglich werden neue Modelle, Publikationen und Produkte veröffentlicht. Ein Digest-Agent, der die Schlagzeilen des Tages abruft, prägnante Zusammenfassungen schreibt und jeden Morgen ein PDF generiert, würde das Problem lösen. Bisher musste man dafür jedoch ein Framework auswählen, Tools in Python definieren, eine Orchestrierungsschleife schreiben, einen Container erstellen und in Cloud Run bereitstellen. All das, bevor der Agent eine einzige Webanfrage gestellt hatte.
Verwaltete KI-Agenten in der Gemini API ändern die Gleichung. Sie schreiben zwei Markdown-Konfigurationsdateien und ein vorgefertigtes Renderer-Skript, führen einen API-Aufruf aus und eine echte Ubuntu-Sandbox wird gestartet, durchsucht das Web, schreibt Ihre Zusammenfassungen und generiert eine PDF-Datei. Keine Container. Keine Bereitstellung. Kein Orchestrierungscode.
In diesem Codelab erstellen Sie genau diesen Agenten: von einer leeren Funktion bis zu einem funktionierenden Tages-Digest, jeweils ein Konzept nach dem anderen.
Umfang
- Ersten verwalteten Agenten in einer echten Linux-Sandbox erstellen und ausführen
- Agent mit detaillierten Anweisungen anpassen
- PDF-Ausgabe des Agents herunterladen
- Unterhaltung fortsetzen, um die Zusammenfassung zu optimieren, ohne das Web neu abzurufen
- Agent-Konfiguration speichern und bei zukünftigen Ausführungen per ID aufrufen
Voraussetzungen
- Python 3.10 und höher
- Ein Gemini API-Schlüssel mit aktivierter Abrechnung: aistudio.google.com/api-keys
- API-Guthaben im Wert von etwa 1 $ (jeder vollständige Lauf kostet 0,30–1,30 $)
2. Was sind verwaltete KI-Agenten in der Gemini API?
Drei Ebenen von KI-Systemen
Bevor wir uns den Code ansehen, hier eine Übersicht, wie sich Managed Agents im Vergleich zu den beiden Alternativen einordnen:
Level | Beschreibung | Wer verwaltet die Infrastruktur? |
Standard-LLM | Sie geben einen Prompt ein und das Modell antwortet mit Text. Keine Hände, kein Gedächtnis, kein Internet. | N/A: Kann nichts selbstständig tun |
Selbst gehosteter Agent | Sie verbinden ADK/LangChain/AutoGen + Docker + Tools + Speicher. | Sie: alles (oder eine verwaltete Plattform wie Agent Engine) |
Verwalteter Agent | Sie geben ihm ein Ziel vor. Google stellt eine sichere Sandbox bereit. Der Agent schreibt Code, führt ihn aus, liest Fehler, sucht im Web und behebt Fehler selbstständig. | Google: alles |
In diesem Codelab geht es um die dritte Zeile. Sie stellen eine Aufgabe und Konfigurationsdateien bereit. Google kümmert sich um alles Weitere.
Was Sie mit ADK + Cloud Run entwickeln können
Wenn Sie einen Nachrichten-Digest-Agenten erstellen möchten, der im Web surft, Python ausführt und ein PDF generiert, benötigen Sie mit ADK + Cloud Run Folgendes:
# 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
Das ist vor der ersten Ausführung des Agents. Sie sind weiterhin für die Sandbox-Isolation (damit der Agent Ihren Server nicht beschädigen kann), die Paketinstallation, die Statusverwaltung zwischen Tool-Aufrufen und die Streaminginfrastruktur zuständig, um Ereignisse an einen Client zu senden.
Was durch Managed Agents ersetzt wird
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,
},
],
},
)
Voraussetzungen für ADK + Cloud Run | Was Managed Agents für Sie erledigen |
Container-Image + Dockerfile + CI/CD | Vollständig verwaltete Ubuntu-Sandbox (Python 3.12, Node 22, 4 CPUs / 16 GB RAM) |
Cloud Run-Bereitstellung + Skalierung | Wird pro Interaktion bereitgestellt, läuft nach 7 Tagen Inaktivität automatisch ab |
Sandbox-Isolation | Isoliert pro Interaktion |
Benutzerdefiniertes PDF-Tool + | Agent installiert Pakete in der Sandbox |
SSE-Streaminginfrastruktur |
|
Tool-Definitionen in Python | Integrierte Tools: Websuche, Codeausführung, Dateisystem |
Statusverwaltung zwischen Tool-Aufrufen | In den Reasoning Loop des Agents integriert |
Sie schreiben Konfigurationsdateien (AGENTS.md, SKILL.md, ein vorgefertigtes Skript) und führen einen API-Aufruf aus. Google kümmert sich um alles Weitere.
So funktioniert die 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
Die Sandbox bleibt 7 Tage lang inaktiv. Sie können den Vorgang mit environment_id fortsetzen, um die Ausgabe zu optimieren, Folgeaufgaben auszuführen oder den Vorgang in einen gespeicherten benannten Agenten zu verzweigen.
3. Erstelle ein
Option A: Cloud Shell (empfohlen)
Klicken Sie auf den Button unten, um dieses Codelab in Google Cloud Shell zu öffnen. Alle Abhängigkeiten sind vorinstalliert.
Option B: Lokale Einrichtung
git clone https://github.com/Saoussen-CH/tech-digest-managed-agent.git
cd tech-digest-managed-agent
Installieren Sie uv, falls erforderlich:
curl -LsSf https://astral.sh/uv/install.sh | sh
API-Schlüssel konfigurieren
cp .env.example .env
cloudshell edit .env
Schlüssel festlegen:
GEMINI_API_KEY=your-key-here
Abhängigkeiten installieren
uv sync
4. Ersten Agent-Aufruf starten
Startdatei öffnen
cloudshell edit run_digest.py
run_digest() hat jetzt eine TODO-Aufgabe und drei weitere für den nächsten Schritt. Zwei Helfer sind bereits oben vorausgefüllt:
load_source(path): Liest eine Datei aus.agents/relativ zum Skript. Sie verwenden sie in der nächsten Übung, um die redaktionelle Stimme, das PDF-Playbook und den Renderer in die Sandbox einzubinden.run_stream(stream): Verarbeitet den Ereignisstream und gibt(environment_id, interaction_id)zurück. Sie müssen die Ereignisschleife nicht selbst schreiben.
Angaben
TODO 1:Ersetzen Sie pass durch (ignorieren Sie TODOs 3 und 4 vorerst – sie sind für den nächsten Schritt):
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}")
Funktionsweise der einzelnen Teile
genai.Client() liest GEMINI_API_KEY aus der Umgebung. Alles andere läuft über diesen Client.
interactions.create() ist der Hauptanruf. Dazu sind vier Parameter erforderlich:
agent=BASE_AGENT: Wählt den Antigravity-Agenten (antigravity-preview-05-2026) aus, einen verwalteten Agenten für allgemeine Zwecke, der auf Gemini 3.5 Flash basiert. Es enthält drei integrierte Tools, die standardmäßig aktiviert sind:code_execution(Bash, Python, Node.js ausführen),google_searchundurl_context(Webseiten abrufen und lesen). Dateisystemtools (read_file,write_file,list_files) werden automatisch aktiviert, wenn Sie den Parameterenvironmentübergeben. Mit einem Aufruf wird eine vollständig verwaltete Ubuntu-Umgebung mit vorinstalliertem Python 3.12, Node.js 22, git, pip und curl bereitgestellt. Es gibt keinen Container, der erstellt werden muss, und keine Bereitstellung, die ausgeführt werden muss.input: Die Aufgabe für diesen Lauf. Der Agent durchsucht Hacker News und analysiert die Ergebnisse.environment="remote": Stellt eine neue Cloud-Sandbox für diese Interaktion bereit.stream=True: Gibt ein iterierbares Objekt mit Ereignissen zurück, anstatt zu blockieren. Ohne diesen Parameter wartet der Aufruf 30–90 Sekunden und gibt die gesamte Ausgabe auf einmal alsinteraction.output_textzurück. Beim Streaming sehen Sie den Grund für die Aktion des Agents und die Aktion selbst in Echtzeit. Streaming ist hier keine erweiterte Funktion, sondern die richtige Standardeinstellung, da eine 90 Sekunden lange Blackbox kein Signal dafür liefert, ob der Kundenservicemitarbeiter arbeitet oder feststeckt.
Was Sie gerade bereitgestellt haben:Bei jedem interactions.create()-Aufruf wird eine dedizierte Sandbox gestartet:
Komponente | Spezifikation |
Betriebssystem | Isolierte Ubuntu Linux-Umgebung |
Vorinstallierte Laufzeiten | Python 3.12, Node.js 22, Bash |
Compute | 4 CPU-Kerne, 16 GB RAM |
Kontextverwaltung | Die automatische Verdichtung wird bei etwa 135.000 Tokens ausgelöst. |
Netzwerk | Ausgehender Webzugriff über den Proxy für ausgehenden Traffic |
Der Agent kann beliebige Pakete mit pip oder npm installieren, Dateien lesen und schreiben sowie ausgehende Webanfragen stellen. Ihre Maschine und Ihre Anmeldedaten werden nicht berührt.
environment_id ist ein Handle für die gerade ausgeführte Sandbox. Nach interaction.completed wird die Sandbox nicht heruntergefahren, sondern bleibt bis zu 7 Tage lang aktiv. Über environment_id gelangen Sie wieder dorthin. Übergeben Sie sie an einen zweiten interactions.create()-Aufruf und der Agent wird im selben Dateisystem mit denselben Dateien und installierten Paketen fortgesetzt, als wäre er nie unterbrochen worden. Im nächsten Schritt wird die Variable verwendet, um das PDF herunterzuladen, ohne den Agenten noch einmal auszuführen. Im Schritt danach wird sie verwendet, um die Unterhaltung fortzusetzen.
interaction_id ist ein Handle für den gerade abgeschlossenen Unterhaltungsabschnitt. Übergeben Sie sie als previous_interaction_id im nächsten Aufruf. Der KI-Agent hat dann den vollständigen Kontext dessen, was er in diesem Zug gesagt und getan hat.
Bestätigen
uv run python run_digest.py
Sie sollten die Live-Ausgabe sehen, während der Agent arbeitet:
[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
Die API gibt auch bei environment="remote" einen echten environment_id zurück. Die Sandbox wurde ausgeführt. Es fehlt die Konfiguration: keine Stimme, kein Skill, kein PDF-Generator. Der KI-Agent hat nur Geschichten als Text ausgegeben und dann aufgehört. Im nächsten Schritt werden diese hinzugefügt.
Jede Ausgaberow entspricht einem Ereignis aus run_stream():
| Beschreibung | Was |
| Agent ruft eine URL ab |
|
| KI-Agent führt Code in der Sandbox aus |
|
| Agent sucht im Web |
|
| Dateitools und andere |
|
| Supportmitarbeiter schreibt Text | direkt an stdout gestreamt |
5. Agent anpassen
Der Agent hatte keine Anweisungen: keine Stimme, keine Funktion, kein PDF-Generator. In diesem Schritt laden Sie die Konfigurationsdateien aus .agents/ und stellen sie in der Sandbox bereit.
Was soll geändert werden?
Nehmen Sie vier Änderungen an run_digest.py vor:
TODO 2:Fügen Sie unter load_source() die drei Konstanten auf Modulebene hinzu (diese befinden sich außerhalb von run_digest(), oben in der Datei):
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")
Öffnen Sie jede Datei, um zu sehen, was Sie laden: AGENTS.md legt die redaktionelle Stimme und die Workflowregeln fest, SKILL.md ist das schrittweise PDF-Playbook und generate_pdf.py ist der vorgefertigte Renderer, den der Agent ausführt.
Nehmen Sie nun zwei weitere Änderungen in run_digest() vor:
TODO 3:Ändern Sie environment von "remote" in das Quellen-Dictionary und legen Sie input auf "" fest:
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:Fügen Sie diese Zeilen direkt nach print(f"\nDone. environment_id={environment_id}") ein:
set_key(".env", "ENVIRONMENT_ID", environment_id)
set_key(".env", "INTERACTION_ID", interaction_id)
(set_key wird bereits oben in run_digest.py importiert.)
Dadurch werden beide IDs in .env geschrieben. Im nächsten Schritt kann das PDF also heruntergeladen werden, ohne dass der Agent noch einmal ausgeführt werden muss.
Funktionsweise der einzelnen Quellen
Jede Quelle ist eine Datei, die beim Start in das Sandbox-Dateisystem eingebunden wird, bevor der Agent ausgeführt wird. Die target-Pfade stimmen mit den Pfaden überein, unter denen das Antigravity-Harness die Dateien erwartet:
.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
Pfad zu | Variable | Was das Geschirr damit macht |
|
| Automatisch geladen als dauerhafte Anweisungen: redaktioneller Stil, Workflow, Ausführungsregeln |
|
| Automatisch erkannt und als benannter Skill registriert; der Agent ruft ihn über den Namen auf |
|
| Vordefinierter PDF-Renderer: Der Agent schreibt |
Bestätigen
uv run python run_digest.py
Die Ausführung dauert jetzt 1–3 Minuten. Sie sollten sehen, dass der Agent Konfigurationsdateien liest, Zusammenfassungen schreibt und die PDF-Datei speichert:
[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 ist jetzt ein echter Wert: Die Sandbox wurde mit Ihren Konfigurationsdateien ausgeführt und der Agent hat digest.pdf erstellt. Im nächsten Schritt wird sie heruntergeladen.
6. PDF herunterladen
Der Agent hat digest.pdf in /workspace/digest.pdf in der Sandbox geschrieben. Der Umgebungs-Snapshot ist als TAR-Archiv über die Gemini Files API verfügbar.
Installieren Sie requests, falls erforderlich:
uv pip install requests
Was muss ausgefüllt werden?
Öffnen Sie download_pdf.py. Es enthält zwei TODOs.
TODO 1:Füllen Sie den requests.get()-Aufruf aus:
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()
Die URL verweist auf den Sandbox-Snapshot. params={"alt": "media"} gibt Rohbytes anstelle von Metadaten zurück. Mit Ihrem vorhandenen GEMINI_API_KEY wird auch die Files API authentifiziert.
TODO 2:Suchen Sie das PDF im TAR-Archiv und extrahieren Sie es:
member = next(m for m in tar.getmembers() if m.name.endswith("workspace/digest.pdf"))
tar.extract(member, path=tmp, filter="data")
Das Tar-Pfadpräfix variiert je nach Ausführung. Suchen Sie daher nach dem Suffix, anstatt den genauen Pfad fest zu codieren. filter="data" unterdrückt die Python 3.13-Warnung zur Einstellung der Unterstützung für unsichere tar-Extraktion.
Bestätigen
uv run python download_pdf.py
Saved digest.pdf (48,231 bytes)
Öffnen Sie digest.pdf im selben Verzeichnis. Sie enthält die formatierte Zusammenfassung, die der Agent aus Live-Webseiten generiert hat.
7. Unterhaltung fortsetzen
Sie haben bereits digest.pdf. Wenn Sie nur die Datei haben wollten, sind Sie fertig. In diesem Schritt geht es um etwas anderes: Der KI-Agent wird aufgefordert, das Kurzfassungsergebnis zu ändern, ohne die Webseiten noch einmal abzurufen.
Die Sandbox ist noch aktiv. Der KI-Agent hat weiterhin /workspace/digest.pdf und erinnert sich an jede Geschichte, die er zusammengefasst hat. Mit einem zweiten interactions.create()-Aufruf wird eine Follow-up-Nachricht in dieselbe Sandbox gesendet. Hier wird darum gebeten, unter jedem Beitrag eine Anmerkung zum Thema „Warum das wichtig ist“ hinzuzufügen. Das PDF wird dann aktualisiert, ohne dass die Inhalte neu abgerufen oder zusammengefasst werden müssen.
Was muss ausgefüllt werden?
Öffnen Sie refine_digest.py. Es gibt drei TODOs.
TODO 1 und 2:Füllen Sie die beiden Parameter für mehrere Durchgänge in interactions.create() aus:
environment=environment_id,
previous_interaction_id=interaction_id,
environment=environment_id setzt dieselbe Sandbox mit ihren Dateien und Paketen fort. previous_interaction_id=interaction_id stellt dem Agenten den Unterhaltungsverlauf zur Verfügung. Ansonsten ändert sich nichts im Vergleich zum ersten Aufruf.
TODO 3:Speichern Sie den neuen interaction_id nach der Ereignisschleife wieder in .env:
set_key(".env", "INTERACTION_ID", interaction_id)
Bei jedem interactions.create()-Aufruf wird ein neues interaction_id erstellt. Wenn Sie sie zurückschreiben, wird diese Optimierung beim nächsten Lauf als previous_interaction_id übergeben und die Turns werden richtig verkettet. Die Sandbox-ID ändert sich nie. Daher muss ENVIRONMENT_ID nicht aktualisiert werden.
Die beiden Parameter, die die Funktion für mehrere aufeinanderfolgende Anfragen ermöglichen
ID | Was wird beibehalten? | Analogie |
| Dateien, installierte Pakete, Systemstatus: alles im Linux-Dateisystem | Zwischen Besprechungen am selben Schreibtisch bleiben |
| Unterhaltungsverlauf: Was der Agent in früheren Runden gesagt und getan hat | Erinnern Sie sich an das, was im letzten Meeting besprochen wurde. |
Sie können eine der beiden IDs unabhängig voneinander übergeben:
environment_id: Dateien und Pakete wiederverwenden, aber eine neue Unterhaltung starten. Nützlich für eine neue Aufgabe im selben Arbeitsbereich.previous_interaction_id: Der Kontext der Unterhaltung wird fortgesetzt, aber in einer neuen Sandbox (Dateien sind nicht mehr vorhanden).- Beide: volle Kontinuität, die in diesem Schritt verwendet wird.
Ohne environment_id: leere Sandbox, kein PDF. Ohne previous_interaction_id: kein Kontext, der Kundenservicemitarbeiter kann keinen bestimmten Abschnitt optimieren.
Bestätigen
uv run python refine_digest.py
Der Stream sollte schnell sein, da der Kundenservicemitarbeiter nichts neu abruft. Danach:
Refinement done.
Saved digest_v2.pdf (52,418 bytes)
Öffnen Sie digest_v2.pdf und vergleichen Sie sie mit digest.pdf. Jeder Geschichte sollte nun eine Zeile „Warum das wichtig ist“ hinzugefügt werden.
8. Verwaltete Agent-Konfiguration beibehalten
Bisher wurden bei jedem Aufruf AGENTS.md, SKILL.md und generate_pdf.py inline übergeben. Das funktioniert, aber Ihr Aufrufcode überträgt bei jeder Ausführung den gesamten Dateiinhalt. agents.create() speichert die Konfiguration in einem benannten Agent auf Google-Seite. Beim nächsten Aufruf wird nur die Agenten-ID übergeben:
Inline calls: send sources on every call
Named agent: bake once → invoke by ID, no sources
Was muss ausgefüllt werden?
Öffnen Sie save_agent.py. Es enthält einen TODO-Kommentar (TODO 1).
Die Konstanten werden direkt aus run_digest.py importiert (keine Duplizierung):
from run_digest import BASE_AGENT, AGENTS_MD, SKILL_MD, GENERATE_PDF_PY
TODO 1:Füllen Sie den agents.create()-Aufruf aus:
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 (nicht environment) ist der Hauptunterschied zum Inline-Aufruf im vorherigen Schritt: Die Quellen werden auf der Seite von Google gespeichert und bei jedem zukünftigen Aufruf automatisch eingebunden. Führen Sie sie nur einmal aus, nicht bei jeder Zusammenfassung.
Bestätigen: Agent speichern
uv run python save_agent.py
Saved: my-digest
my-digest: Daily tech digest with editorial voice and PDF generation.
Gespeicherten Agent aufrufen
Öffnen Sie invoke_agent.py. Der gespeicherte Agent wird anhand der ID ohne Quellen aufgerufen:
stream = client.interactions.create(
agent="my-digest",
input="",
stream=True,
environment="remote",
)
Vergleichen Sie dies mit dem Inline-Aufruf: agent=BASE_AGENT wird durch "my-digest" ersetzt und der vollständige environment-Block mit drei Inline-Quellen wird durch environment="remote" ersetzt. Die Konfiguration ist bereits auf Google-Seite integriert.
Überprüfen: Gespeicherten Agenten aufrufen
uv run python invoke_agent.py
Sie sollten denselben Livestream wie beim Inline-Lauf sehen, aber der Aufruf enthält keine Quelldateien. Nach dem Lauf werden ENVIRONMENT_ID und INTERACTION_ID in .env aktualisiert, sodass Sie wie gewohnt mit refine_digest.py fortfahren können.
[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. Bereinigen
Die Sandbox läuft nach 7 Tagen Inaktivität automatisch ab. Es gibt keine Server, die beendet werden können. Es sind keine Container zum Löschen vorhanden.
Wenn Sie eine Agent-Konfiguration gespeichert haben, löschen Sie sie:
uv run python delete_agent.py
10. Zusammenfassung
Sie haben einen verwalteten Agent von Grund auf erstellt, jeweils ein Konzept nach dem anderen. Das haben Sie in den einzelnen Übungen gelernt:
Training | Konzept | Key API |
Ersten Anruf starten | Eine echte Linux-Sandbox bereitstellen und ihre Ereignisse live streamen |
|
Agent anpassen | Konfigurationsdateien bereitstellen; IDs im selben Lauf in |
|
PDF herunterladen | PDF herunterladen, ohne den Agenten noch einmal auszuführen | Gemini Files API |
Unterhaltung fortsetzen | Unterhaltung fortsetzen, ohne das Web neu abzurufen |
|
KI-Agentenkonfiguration beibehalten | Agent-Konfiguration beibehalten; Aufruf über ID, keine Quellen erforderlich |
|
Schlüsselmuster
- Ein Aufruf, eine Sandbox:
interactions.create()übernimmt die gesamte Infrastruktur (keine Container zum Bereitstellen, keine Pakete zur lokalen Installation) - Progressives Streaming:
stream=Trueverwandelt eine 90-sekündige Blackbox in einen Live-Feed von Tool-Aufrufen und Textblöcken. - Inline-Quellen:
AGENTS.md,SKILL.mdund vorgefertigte Skripts ohne Upload- oder Bereitstellungsschritt in die Sandbox einbinden - Automatische Erkennung von Harness: Dateien, die in
.agents/platziert werden, werden automatisch erkannt (keine SDK-Konfiguration erforderlich). - Zweidimensionaler Status:
environment_idverfolgt Dateien und Pakete,previous_interaction_idverfolgt den Unterhaltungskontext. Beide können unabhängig voneinander übergeben werden. - Snapshot-Download: Die Umgebung ist ein vollständiges Dateisystem-Tar, auf das über die Gemini Files API zugegriffen werden kann.
- Benannte Agents:
agents.create()wird dauerhaft konfiguriert. Bei zukünftigen Aufrufen werden nur die Agent-ID undenvironment="remote"ohne Quellen übergeben.
ADK + Cloud Run im Vergleich zu verwalteten Agents: der Unterschied auf einen Blick
Funktion | ADK + Cloud Run | Verwaltete KI-Agenten in der Gemini API |
Sandbox bereitstellen |
|
|
Tools definieren | Beim Agenten registrierte Python-Funktionen | Integrierte Tools: Websuche, Codeausführung, Dateisystem |
Pakete installieren |
| KI-Agent führt |
Stream-Ereignisse | Benutzerdefinierte SSE-Infrastruktur |
|
Sitzung fortsetzen | Sitzungsdatenbank + Kontextinjektion |
|
Konfigurationsdateien | Im Agent hartcodiert oder beim Start eingefügt | Eingebunden über |
Zu verwaltende Infrastruktur | Container, Cloud Run, IAM, Secrets | Keine |