Der Code-Export in AI Studio, erste API-Integration und drei sofort umsetzbare Automationsideen
SerieGoogle AI / Gemini im Freelancer-Alltag
Teil 6 von 16
Ein Prompt im Playground spart dir einmal fünf Minuten. Derselbe Prompt als API-Aufruf spart dir diese fünf Minuten hundertmal – ohne manuellen Eingriff.
Das ist die Kernthese dieses Artikels. Der eigentliche Hebel ist nicht besserer Output, sondern Wiederholbarkeit, Struktur und Einbindung in bestehende Prozesse. Wer das versteht, hört auf, Prompts als Einzelabfragen zu denken, und fängt an, sie als Bausteine in Workflows zu behandeln.
Der Hebel besteht aus drei Teilen
Wiederholbarkeit – derselbe Prompt läuft für beliebig viele Inputs. Hundert Produkte, hundert Feedback-Texte, hundert Seiten. Einmal definiert, immer verfügbar.
Strukturierbarkeit – Ergebnisse kommen nicht als Freitext, sondern als JSON. Maschinenlesbar, direkt weiterverarbeitbar, kein Parsen von freiem Text nötig.
Integrierbarkeit – der Output fließt direkt in CSV, CMS, Datenbank oder Webhook. Gemini wird Teil eines Systems, nicht Endpunkt.
Diese drei Punkte zusammen machen den Unterschied zwischen „ich nutze KI gelegentlich” und „KI ist Teil meines Produktivitäts-Stacks”.
Warum die API der eigentliche Hebel ist
AI Studio ist exzellent für die Entwicklung. Für die Produktion braucht es die API.
Das Modell ist dasselbe. Der Unterschied ist die Kontrolle. Im Playground führt man einen Prompt einmal aus, kopiert das Ergebnis, geht zum nächsten. Über die API führt man denselben Prompt für viele Eingaben automatisiert aus.
Für Freelancer bedeutet das: Aufgaben, die bisher manuelle Wiederholung erforderten, werden zu einmaligen Setup-Kosten. Aber „einmal einrichten und dann läuft es” ist eine zu vereinfachte Vorstellung. Der erste funktionierende API-Aufruf ist schnell gebaut. Der eigentliche Produktionsnutzen entsteht erst mit Parametrisierung, Fehlerbehandlung und klaren Ausgabeformaten.
Kostenvergleich: Je nach Nutzungsprofil kann die API wirtschaftlicher sein als ein pauschales Abo – vor allem bei Workloads, die unregelmäßig, aber gut automatisierbar sind. Wer täglich intensiv arbeitet, ist mit einem Abo oft günstiger. Wer in Batches denkt, profitiert von Pay-per-use.
| Aspekt | AI Studio Playground | Gemini API |
|---|---|---|
| Nutzung | Manuell, interaktiv | Automatisiert, programmatisch |
| Skalierung | Prompt für Prompt | Batch-Verarbeitung möglich |
| Integration | Keine | Direkt in eigene Systeme |
| Output | Für Menschen lesbar | Für Systeme weiterverarbeitbar |
| Fehlerhandling | Manuell | Automatisierbar |
| Kosten | Pro-Abo oder Free Tier | Pay-per-use + Free Tier |
| Eignung | Entwicklung, Tests | Produktion, Automatisierungen |
Der Code-Export: Was er kann – und was nicht
In AI Studio, wenn ein Prompt geöffnet ist: oben rechts der Button „Get code”. Ein Klick öffnet Tabs für Python, JavaScript und curl.
Ein typischer Export:
import google.generativeai as genai
genai.configure(api_key="YOUR_API_KEY")
model = genai.GenerativeModel(
model_name="gemini-2.5-pro",
system_instruction="Du bist ein SEO-Analyst. Antworte ausschließlich als JSON.",
)
chat_session = model.start_chat(history=[])
response = chat_session.send_message("Analysiere diese URL: https://example.com/produkt")
print(response.text)
Was der Export gut kann:
- Modellkonfiguration übernehmen (Name, Temperature, Generation-Config)
- System Instruction vollständig sichtbar machen
- Prompt-Struktur als Code zeigen
- Schnellen Start ermöglichen
Was der Export nicht löst:
- Secrets-Management (API-Key steht als Platzhalter drin)
- Validierung des Outputs
- Logging
- Retry-Logik bei temporären Fehlern
- Batch-Verarbeitung
- Parameterübergabe (alles ist hardcoded)
- Monitoring
Das ist der Ausgangspunkt – kein finales Produktionsskript. Die Anpassung für echte Nutzung ist der nächste Schritt.
API-Key einrichten
Den API-Key findet man in AI Studio unter „Get API key” im linken Menü.
Einrichten in einer .env-Datei:
# .env (niemals committen!)
GEMINI_API_KEY=AIzaSy...dein_key_hier
.gitignore prüfen:
.env
.env.local
*.env
Im Python-Skript laden:
import os
from dotenv import load_dotenv
import google.generativeai as genai
load_dotenv()
genai.configure(api_key=os.environ["GEMINI_API_KEY"])
pip install python-dotenv google-generativeai
Dein erster API-Aufruf – mit Fehlerbehandlung
Vom Export zum lauffähigen, robusten Skript. Der Happy Path ist schnell gebaut – aber JSON kann trotz Vorgabe fehlerhaft zurückkommen, die Response kann leer sein, Felder können fehlen. Das muss abgefangen werden.
Python – vollständiges Beispiel mit Fehlerbehandlung:
import os
import json
from dotenv import load_dotenv
import google.generativeai as genai
load_dotenv()
genai.configure(api_key=os.environ["GEMINI_API_KEY"])
model = genai.GenerativeModel(
model_name="gemini-2.5-flash",
system_instruction="""Du bist ein SEO-Analyst. Analysiere den gegebenen Seitentitel
und erstelle SEO-Metadaten als JSON mit den Feldern:
- meta_title (string, max. 60 Zeichen)
- meta_description (string, max. 155 Zeichen)
- focus_keyword (string)
Kein Text außerhalb des JSON-Objekts.""",
generation_config=genai.GenerationConfig(
response_mime_type="application/json",
temperature=0.1,
)
)
def generate_seo_meta(page_title: str) -> dict | None:
try:
response = model.generate_content(
f"Erstelle SEO-Metadaten für diese Seite: {page_title}"
)
except Exception as e:
print(f"API-Fehler: {e}")
return None
try:
result = json.loads(response.text)
except json.JSONDecodeError:
print(f"Ungültiges JSON: {response.text[:200]}")
return None
# Felder prüfen
required_fields = ["meta_title", "meta_description", "focus_keyword"]
for field in required_fields:
if field not in result:
print(f"Fehlendes Feld: {field}")
return None
return result
# Test
result = generate_seo_meta("Ergonomische Bürostühle für das Home Office")
if result:
print(f"Title: {result['meta_title']}")
print(f"Description: {result['meta_description']}")
print(f"Keyword: {result['focus_keyword']}")
else:
print("Verarbeitung fehlgeschlagen – manuell prüfen")
JavaScript – Node.js-Version:
import { GoogleGenerativeAI } from "@google/generative-ai";
import "dotenv/config";
const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);
const model = genAI.getGenerativeModel({
model: "gemini-2.5-flash",
systemInstruction: `Du bist ein SEO-Analyst. Analysiere den gegebenen Seitentitel
und erstelle SEO-Metadaten als JSON:
meta_title (max. 60 Zeichen), meta_description (max. 155 Zeichen), focus_keyword.
Kein Text außerhalb des JSON-Objekts.`,
generationConfig: {
responseMimeType: "application/json",
temperature: 0.1,
},
});
async function generateSeoMeta(pageTitle) {
try {
const result = await model.generateContent(
`Erstelle SEO-Metadaten für diese Seite: ${pageTitle}`
);
const text = result.response.text();
return JSON.parse(text);
} catch (err) {
console.error("Fehler:", err.message);
return null;
}
}
const meta = await generateSeoMeta("Ergonomische Bürostühle für das Home Office");
if (meta) {
console.log(meta.meta_title);
console.log(meta.meta_description);
}
npm install @google/generative-ai dotenv
Prompt wird Funktion
Das ist die eigentliche mentale Umstellung.
Im Playground ist ein Prompt Text. Du tippst, das Modell antwortet, du liest. In der API wird derselbe Prompt Teil einer Funktion mit Eingaben, Ausgaben und Fehlerfällen.
# Im Playground:
"Erstelle SEO-Metadaten für: Ergonomische Bürostühle"
# In der API:
def generate_seo_meta(page_title: str) -> dict | None:
...
Der Prompt ist jetzt parametrisiert, reproduzierbar, testbar. Er kann für hundert verschiedene Inputs aufgerufen werden, sein Verhalten ist dokumentiert, sein Output validierbar. Das ist kein technischer Schritt – das ist eine andere Art, über Prompts nachzudenken.
Drei sofort umsetzbare Automationsideen
Idee 1: SEO-Meta-Tags automatisch generieren
Anwendungsfall: Du bekommst eine Liste von Seitentiteln oder URLs. Jede braucht einen optimierten Meta-Title und eine Meta-Description. Manuell kostet das Stunden.
Für wen: E-Commerce-Freelancer, SEO-Agenturen, Content-Projekte mit vielen Seiten.
Grenzen: Ähnliche Eingaben führen zu ähnlichen Formulierungen – Duplicate-Content-Risiko bei großen Batches. Brand-Ton muss ggf. nachgeschärft werden. Outputs sollten nicht ungeprüft live gehen.
import os
import json
import csv
import time
from dotenv import load_dotenv
import google.generativeai as genai
load_dotenv()
genai.configure(api_key=os.environ["GEMINI_API_KEY"])
model = genai.GenerativeModel(
model_name="gemini-2.5-flash",
system_instruction="""Du bist ein SEO-Texter für deutschsprachige Websites.
Antworte ausschließlich als JSON-Objekt mit:
- meta_title: SEO-Seitentitel, max. 60 Zeichen, Keyword vorn
- meta_description: Überzeugende Beschreibung, max. 155 Zeichen, Call-to-Action
- focus_keyword: Haupt-Keyword der Seite (1-3 Wörter)""",
generation_config=genai.GenerationConfig(
response_mime_type="application/json",
temperature=0.2,
)
)
def process_pages(input_csv: str, output_csv: str):
results = []
with open(input_csv, newline="", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
try:
response = model.generate_content(
f"Seite: {row['title']}\nURL-Pfad: {row['url']}"
)
meta = json.loads(response.text)
results.append({
"url": row["url"],
"original_title": row["title"],
**meta
})
print(f"OK: {row['url']}")
except Exception as e:
print(f"Fehler bei {row['url']}: {e}")
results.append({"url": row["url"], "original_title": row["title"], "error": str(e)})
time.sleep(0.5) # Rate-Limit-Puffer
if results:
with open(output_csv, "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=results[0].keys())
writer.writeheader()
writer.writerows(results)
process_pages("seiten.csv", "seo-meta-output.csv")
Input seiten.csv:
title,url
Ergonomische Bürostühle im Test,/buerostuehle/ergonomisch/
Home Office Schreibtische höhenverstellbar,/schreibtische/hoehenverstellbar/
Idee 2: Kundenfeedback automatisch kategorisieren
Anwendungsfall: Du sammelst Kundenfeedback über ein Formular, per E-Mail oder aus Bewertungsplattformen. Die manuelle Einordnung ist repetitiv und fehleranfällig.
Für wen: Shops, SaaS-Produkte, Dienstleister mit regelmäßigem Feedback-Volumen.
Grenzen: Kategorien sind ein Modell der Realität, keine Wahrheit. Grenzfälle landen schnell in ungenauen Kategorien. Ideal für Vorsortierung – nicht für endgültige Entscheidungen ohne menschliche Prüfung.
import os
import json
from dotenv import load_dotenv
import google.generativeai as genai
load_dotenv()
genai.configure(api_key=os.environ["GEMINI_API_KEY"])
model = genai.GenerativeModel(
model_name="gemini-2.5-flash",
system_instruction="""Du kategorisierst Kundenfeedback. Antworte als JSON mit:
- category: eine von [Produktqualität, Lieferung, Kundenservice, Preis-Leistung, Benutzerfreundlichkeit, Sonstiges]
- sentiment: eine von [positiv, neutral, negativ]
- urgency: eine von [niedrig, mittel, hoch]
- summary: Kernaussage in max. 15 Wörtern
- action_needed: true wenn unmittelbare Reaktion nötig, sonst false""",
generation_config=genai.GenerationConfig(
response_mime_type="application/json",
temperature=0.0,
)
)
def categorize_feedback(feedback_text: str) -> dict | None:
try:
response = model.generate_content(feedback_text)
return json.loads(response.text)
except Exception as e:
print(f"Fehler: {e}")
return None
feedbacks = [
"Das Paket ist nach 10 Tagen immer noch nicht angekommen. Ich brauche es dringend für nächste Woche.",
"Super Produkt, genau wie beschrieben. Schnelle Lieferung.",
"Der Aufbau war okay, aber die Anleitung könnte besser sein.",
]
for text in feedbacks:
result = categorize_feedback(text)
if result:
flag = "[!]" if result["action_needed"] else " "
print(f"{flag} {result['category']} | {result['sentiment']} | {result['summary']}")
Beispiel-Output:
[!] Lieferung | negativ | Paket nach 10 Tagen nicht angekommen
Produktqualität | positiv | Produkt wie beschrieben, schnelle Lieferung
Benutzerfreundlichkeit | neutral | Aufbau okay, Anleitung verbesserungswürdig
Idee 3: Produktdaten aus Briefings extrahieren
Anwendungsfall: Du bekommst unstrukturierte Briefings – Texte, E-Mails, Notizen – und musst daraus strukturierte Aufgaben oder Produktdaten ableiten. Manuell bedeutet das Lesen, Interpretieren, Übertragen in ein System.
Für wen: Projektmanager, Agenturen, alle die strukturierte Daten aus unstrukturiertem Input brauchen.
Grenzen: Bei vagen Briefings interpretiert das Modell. Ergebnis immer gegen das Original prüfen.
import os
import json
from dotenv import load_dotenv
import google.generativeai as genai
load_dotenv()
genai.configure(api_key=os.environ["GEMINI_API_KEY"])
model = genai.GenerativeModel(
model_name="gemini-2.5-flash",
system_instruction="""Du extrahierst strukturierte Aufgaben aus Briefing-Texten.
Antworte als JSON mit:
- project_name: Erkannter oder erschlossener Projektname
- deadline: Frist im Format YYYY-MM-DD oder null
- tasks: Array aus Objekten mit {title, priority (hoch/mittel/niedrig), assignee oder null}
- open_questions: Array mit Strings (ungeklärte Punkte)
- budget_mentioned: true/false""",
generation_config=genai.GenerationConfig(
response_mime_type="application/json",
temperature=0.1,
)
)
def extract_from_briefing(briefing_text: str) -> dict | None:
try:
response = model.generate_content(briefing_text)
return json.loads(response.text)
except Exception as e:
print(f"Fehler: {e}")
return None
briefing = """
Hallo Team, wir brauchen bis Ende November die neue Landingpage für das Winter-Angebot.
Thomas kümmert sich um das Design, Sarah macht die Texte. Budget haben wir noch nicht
final abgestimmt. Wichtig: Mobile muss perfekt sein, das ist Priorität. Außerdem brauchen
wir noch die Abstimmung mit dem Kunden zu den Bildern.
"""
result = extract_from_briefing(briefing)
if result:
print(f"Projekt: {result['project_name']}")
print(f"Deadline: {result['deadline']}")
for task in result["tasks"]:
print(f"- [{task['priority']}] {task['title']} ({task.get('assignee', 'offen')})")
if result["open_questions"]:
print("Offene Punkte:", result["open_questions"])
Was für Produktion noch fehlt
Der Code oben ist funktional. Produktionsreif ist er noch nicht. Das ist kein Vorwurf – das ist der normale Stand nach einem ersten funktionierenden Skript. Was fast immer noch dazukommt:
Parametrisierung statt Hardcoding – System Instructions, Modellnamen, Temperatur sollten konfigurierbar sein, nicht im Code vergraben.
Logging – Welcher Input hat welchen Output erzeugt? Bei Fehleranalysen unerlässlich.
Retry bei temporären Fehlern – Gemini-API kann kurz nicht antworten. Ein einfaches Retry-Muster mit Pause verhindert, dass ein Batch bei einer Verbindungsunterbrechung abbricht.
Validierung des Outputs – JSON-Mode produziert valides JSON, aber nicht notwendigerweise vollständige oder sinnvolle Felder. Immer prüfen.
Rate-Limit-Handling – Zu viele Anfragen in kurzer Zeit führen zu 429-Fehlern. time.sleep() ist die einfachste Lösung, Exponential Backoff die robustere.
Trennung von Prompt und Anwendungscode – System Instructions in separate Dateien oder Konfiguration auslagern, nicht tief im Code.
Ein einfaches Retry-Muster:
import time
def call_with_retry(fn, max_retries=3, delay=2):
for attempt in range(max_retries):
try:
return fn()
except Exception as e:
if attempt < max_retries - 1:
print(f"Versuch {attempt + 1} fehlgeschlagen: {e}. Retry in {delay}s...")
time.sleep(delay)
delay *= 2
else:
raise
return None
Typische Anfängerfehler
API-Key direkt im Code – nach einem versehentlichen Commit öffentlich. Immer .env.
JSON ungeprüft parsen – json.loads(response.text) ohne try/except. Schlägt fehl, wenn das Modell mal Prosa statt JSON zurückgibt.
System Instruction zu lang – zählt bei jedem Aufruf als Input-Token. 50 Wörter statt 500 Wörter kann bei großen Batches spürbar Kosten sparen.
Modell zu groß für simple Tasks – Gemini 2.5 Pro für eine einfache Klassifikation ist Overkill. Flash ist für strukturierte Extraktionen und Kategorisierungen schneller und günstiger.
Kein Fallback bei Fehlern – ein Skript ohne Fehlerbehandlung, das bei 50 von 100 Produkten einen Exception wirft und dann den Rest überspringt, liefert stilles Halbresultat.
Modellwahl für Aufgaben
Nicht jede Aufgabe braucht dasselbe Modell. Die Wahl hat direkte Auswirkung auf Kosten und Latenz.
| Aufgabe | Empfehlung | Begründung |
|---|---|---|
| Klassifikation, Kategorisierung | Flash | Einfache Entscheidungslogik, schnell, günstig |
| Strukturierte Extraktion (JSON) | Flash | Klar definiertes Format, kein komplexes Reasoning nötig |
| Längere Inhaltsgenerierung | Pro | Höhere Ausgabequalität bei komplexen Inhalten |
| Multimodale Eingaben (Bild, PDF) | Pro | Bessere Verarbeitungstiefe |
| Code-Generierung | Pro | Konsistentere Qualität bei komplexen Aufgaben |
Für Freelancer gilt: mit Flash anfangen. Wenn die Qualität nicht ausreicht, auf Pro wechseln. Nicht umgekehrt.
Kosten als Denkmodell
Statt fester Euro-Schätzungen ist ein Denkmodell robuster – Preise ändern sich, Nutzungsprofile variieren.
Kosten entstehen durch vier Faktoren:
Modellwahl – der größte Hebel. Flash ist deutlich günstiger als Pro.
Eingabelänge – lange System Instructions, große PDFs, ausführliche Prompts. Zählen bei jedem Aufruf. Eine kompakte System Instruction ist besser als eine ausführliche.
Ausgabelänge – kurze JSON-Felder kosten weniger als lange Fließtext-Antworten. JSON-Schema eng halten.
Anzahl der Aufrufe – kurze Klassifikation günstig, aber bei tausend Aufrufen täglich summiert sich auch das.
Was Kosten still in die Höhe treibt: Chat-Sessions, bei denen die gesamte History bei jedem Request mitgesendet wird. Bei langen Gesprächen wächst der Token-Verbrauch mit jeder Runde.
# Token-Verbrauch schätzen vor dem Ausführen
model = genai.GenerativeModel("gemini-2.5-flash")
count = model.count_tokens("Dein Prompt hier")
print(f"Tokens: {count.total_tokens}")
Wann sich die API noch nicht lohnt
Einmalige Ad-hoc-Aufgaben – wenn etwas nur einmal gemacht wird, ist der manuelle Weg im Playground oft schneller als ein Skript aufzusetzen.
Explorative kreative Arbeit – Brainstorming, Ideenfindung, iterative Überarbeitungen. Der interaktive Playground ist dafür besser geeignet als eine Funktion mit festen Inputs und Outputs.
Prompt noch instabil – wenn unklar ist, ob der Prompt für alle Inputs zuverlässig funktioniert, ist ein Skript verfrüht. Erst im Playground stabilisieren, dann automatisieren.
Kein klarer Input/Output – wenn nicht klar ist, was genau rein und raus soll, fehlt die Grundlage für eine Funktion.
Die einfache Regel: Sobald dieselbe Aufgabe mehr als ein paar Mal wiederkehrt, lohnt sich der Schritt von der manuellen Abfrage zur API.
Skalierung: Schleife vor Architektur
„Skalierung” klingt nach verteilten Systemen, Job-Queues, Microservices. Für Freelancer bedeutet es meist etwas viel Nüchterneres: 50 Inputs sauber nacheinander verarbeiten, mit Fehlerbehandlung und Logging.
Kleine robuste Skripte schlagen überkomplexe Setups fast immer. Die Investition in eine einfache Schleife mit try/except und time.sleep() bringt mehr als eine vorzeitige Architektur.
Wenn die Schleife nicht mehr reicht, ist der nächste Schritt eine einfache Queue – nicht sofort eine verteilte Infrastruktur.
Vom Export zur eigenen Integration
Vom funktionierenden Skript zum verlässlichen Prozess
Zwischen “läuft auf meinem Rechner” und “kann jede Woche verlässlich laufen” liegt in der Praxis der entscheidende Schritt. Genau dort scheitern viele erste API-Integrationen nicht technisch, sondern organisatorisch.
Ein belastbarer Prozess braucht vier Eigenschaften:
Idempotenz – derselbe Input darf nicht versehentlich doppelt verarbeitet werden, nur weil ein Cronjob erneut läuft oder ein Request wiederholt wird.
Nachvollziehbarkeit – du musst später sehen können, welcher Input zu welchem Output geführt hat, mit welchem Prompt und welchem Modell.
Teilfehlertoleranz – wenn Eintrag 17 von 100 scheitert, darf der Rest nicht verloren gehen. Ein Batch braucht eine Fehlerliste, nicht nur einen Abbruch.
Saubere Übergabepunkte – das Modell sollte nicht direkt “irgendwo hinschreiben”, sondern zuerst ein geprüftes Zwischenformat liefern: JSON, CSV oder eine Queue.
Für Freelancer reicht dafür oft schon eine sehr nüchterne Struktur:
- Input-Datei oder Datenbankeinträge mit Statusfeld
- Verarbeitung in kleinen Batches
- Ergebnis separat speichern
- Fehler protokollieren und später erneut laufen lassen
Das ist keine Enterprise-Architektur. Es ist nur der Unterschied zwischen einem netten Demo-Skript und einem Workflow, den du einem Kunden oder dir selbst dauerhaft zumuten kannst.
Einordnung
Der Wechsel vom Playground zur API ist technisch oft klein, organisatorisch aber entscheidend.
Im Playground ist Gemini ein Werkzeug, das man bedient. Über die API wird es Teil eines Systems, das für einen arbeitet. Prompts werden zu Funktionen. Ergebnisse werden zu Daten. Wiederholung wird zu Automation.
Der richtige Zeitpunkt für die API ist nicht dann, wenn ein Prompt funktioniert, sondern dann, wenn du denselben Prompt wiederholt brauchst.
Für Freelancer ist das der Punkt, an dem KI aufhört, ein nettes Extra zu sein, und anfängt, Arbeitsstunden einzusparen – nicht gelegentlich, sondern strukturell.
Die nächste Stufe sind Mini-Automatisierungen: kleine, fokussierte Skripte, die echte Workflows automatisieren – von der Content-Pipeline bis zur Client-Kommunikation. Darum geht es im nächsten Artikel dieser Serie.