Serverbasierter KI-Analyse-Agent: REST-API nimmt natürlichsprachliche Anfragen entgegen, ein autonomer Agent plant und führt mehrstufige Web-Analysen aus und liefert strukturierte JSON-Reports.
Alle Systemkomponenten und ihre Verbindungen auf einen Blick.
Von der API-Anfrage bis zum fertigen JSON-Report: jeder Schritt, jede Entscheidung.
Was innerhalb eines einzigen Agent-Runs passiert: von der Prompt-Konstruktion bis zur JSON-Ausgabe.
Das Prompt-Template (prompts/{job_type}.md) wird geladen, alle Platzhalter wie {domain} oder {region} werden durch echte Werte ersetzt. Ein Placeholder-Check warnt wenn Platzhalter unreplaced bleiben — das würde Claude mit dem Literal-String {domain} arbeiten lassen.
Claude liest den System-Prompt mit den Schrittanweisungen und wählt autonom welches Tool als nächstes aufgerufen wird. Bei competitor_analysis: DataForSEO zuerst (Pflicht), dann web_search, dann fetch_url für Detailseiten.
Der Worker führt das Tool aus — alle 11 Tools sind Python-Funktionen die echte externe APIs aufrufen. Das Ergebnis (bis zu 50k Zeichen) wird als tool_result in den nächsten Turn zurückgegeben.
Nach allen Tool-Calls schreibt Claude stop_reason: end_turn und gibt das finale JSON-Objekt aus. Der balanced-brace parser extrahiert es zuverlässig — auch wenn Claude Text drum herum schreibt oder es in Code-Fences verpackt.
Alle verfügbaren Tools, ihre API-Basis, Trigger-Bedingungen und Verfügbarkeit.
| Tool | API / Technologie | Hauptparameter | Wann Claude es nutzt | Key-Pflicht |
|---|---|---|---|---|
web_search |
Exa.ai Neural Search | search_depth neural/keywordcategory company/news/...max_age_hours, livecrawlinclude_domains |
Fast immer — semantische Suche, aktuelle Daten, Branchenrecherche | EXA_API_KEY |
fetch_url |
Scrapling + httpx fallback | url, extract_text |
Seiteninhalt lesen, Meta-Tags, Strukturdaten extrahieren | kein Key |
browser_fetch |
Camoufox / Botasaurus / Zendriver | mode: camoufox/botasaurus/zendriverwait_for_selector |
JS-gerenderte Seiten (SPAs, Preiskalkulatoren, Cloudflare-geschützt) | kein Key |
get_domain_rank |
DataForSEO Labs API | domain, location_code |
Domain-Authority, Traffic-Schätzung — PFLICHT als Schritt 0 in SEO-Analysen | DATAFORSEO_LOGIN DATAFORSEO_PASSWORD |
get_ranked_keywords |
DataForSEO Labs API | domain, location_code, limit |
Welche Keywords rankt ein Wettbewerber? Keyword-Lücken identifizieren. | DATAFORSEO_* |
get_keyword_volume |
DataForSEO Labs API | keywords: list, location_code |
Monatliches Suchvolumen — füllt monthly_searches in Keyword-Gap-Reports |
DATAFORSEO_* |
serper_search |
Serper.dev Google API | query, gl (Land), type: news/web |
Google News Dual-Source — parallel zu web_search in press_monitoring | SERPER_API_KEY |
get_reviews |
Scrapling (Trustpilot / HolidayCheck / App Store) | url, platform |
sentiment_analysis, review_analysis — Kundenstimmen ohne API-Key | kein Key |
get_pagespeed |
Google PageSpeed Insights API | url, strategy: mobile/desktop |
Core Web Vitals — technische SEO-Analyse | optional PAGESPEED_API_KEY |
gau_urls |
GAU Binary (Wayback Machine + CommonCrawl + OTX) | domain, providers |
Alle historischen URLs einer Domain — gelöschte Seiten als Content-Lücken | kein Key (Binary nötig) |
tavily_search |
Tavily API | query, max_results |
Fallback-Suche / alternative Perspektive zu web_search | TAVILY_API_KEY |
Jeder Job-Typ bekommt das kostenoptimale Modell. MODEL_OVERRIDE in .env überschreibt das Routing für Tests.
Freie natürlichsprachliche Anfragen: der Agent interpretiert, plant, führt aus — ohne vorstrukturierten Input.
POST /api/jobs
{
"type": "chat",
"input": {
"message": "Was sind die wichtigsten SEO-Chancen für costakreuzfahrten.de?",
"context": "Kreuzfahrt-Branche, Markt DE/AT"
},
"priority": "high"
}
Alle Schutzmaßnahmen auf API-, Daten- und Infrastruktur-Ebene.
X-API-Key Header — jeder Request validiert. Ziel v2: JWT mit tenant_id für Multi-Tenant-Isolation.
Pydantic-Schema pro Job-Typ. Fehlende Pflichtfelder → 422-Fehler bevor der Job startet. Verhindert Prompt-Bruch durch leere Platzhalter.
webhook_url wird gegen private IPs (10.x, 192.168.x, 172.16-31.x), localhost und HTTP geblockt. Nur https:// zu öffentlichen Adressen erlaubt.
User-kontrollierte Inputs (Domain-Inhalte, Nachrichten) werden in <user_data>-Tags gewrappt. Trennt Instruktionen klar von Nutzerdaten.
MAX_TOKENS_PER_JOB=500000 (konfigurierbar). Verhindert unkontrollierte Kosten durch fehlerhafte Inputs oder Endlos-Tool-Chains.
MAX_JOBS_IN_QUEUE=50. Bei Überschreitung: HTTP 429 mit klarer Fehlermeldung. Verhindert Kosten-Explosion durch massenhafte Job-Einreichung.
Explizite Allowlist via ALLOWED_ORIGINS Env-Var. Kein Wildcard * in Produktion.
Beim Worker-Start: alle Jobs mit Status running werden auf failed gesetzt. Verhindert ewiges Hängen nach Worker-Crash.
Abgebrochene Jobs (Redis-Status: cancelled) werden vor Ausführung übersprungen. RQ-Queue wird nicht blockiert.
Aktueller Stand (lokal) und Ziel-Deployment (Production).