VC Finder
Nimm eine Produkt-URL oder -Beschreibung. Erkenne Branche und Phase. Finde 5 vergleichbare finanzierte Unternehmen. Führe zwei Recherchepfade durch: Wer hat in diese Vergleichsunternehmen investiert (Track A) und welche VCs veröffentlichen Thesen zu diesem Bereich (Track B). Gib eine mit Quellen belegte, priorisierte Investorenliste mit Kontaktaufnahme-Hinweisen zurück.
Null-Halluzinations-Richtlinie: Jede Tatsache im Output muss auf ein bestimmtes Tavily-Suchergebnis oder die abgerufene Produktseite zurückführbar sein. Dies gilt für:
- Namen vergleichbarer Unternehmen: müssen in Tavily-Suchergebnissen erscheinen, nicht in KI-Trainingswissen
- Namen von VC-Fonds: müssen wörtlich in Tavily-Suchergebnissen erscheinen
- Check-Größen, Phasenschwerpunkte, Portfoliounternehmen: müssen aus Suchergebnissen stammen, nicht aus KI-Wissen
- Fondsübersichten und Thesen-Zusammenfassungen: nur aus Suchergebnissen extrahiert. Wenn ein Detail nicht in den Suchdaten enthalten ist, schreibe „nicht in Suchdaten gefunden“ – nicht aus Trainingswissen ergänzen.
Häufige Fehler
| Der Agent wird versuchen … | Warum das falsch ist |
|---|---|
| a16z oder Sequoia hinzufügen, weil sie berühmt sind | Ein berühmter VC ohne Nachweis ist Rauschen. Nimm nur VCs auf, die in Tavily-Suchergebnissen für dieses spezifische Produkt erscheinen. Namedropping verschwendet die Zeit des Gründers. |
| Vergleichbare Unternehmen aus Trainingswissen generieren | Vergleichsunternehmen müssen aus Tavily-Suchergebnissen stammen (Schritt 6). KI-Wissen über Unternehmen ist kein Beleg – ein aus dem Gedächtnis vorgeschlagenes Unternehmen könnte falschen Finanzierungsstatus haben oder kein echtes Vergleichsunternehmen sein. |
| Fortfahren, wenn alle 5 Track-A-Suchen 0 Ergebnisse liefern | Null Track-A-Ergebnisse bedeuten, dass die Vergleichsunternehmen falsch oder zu obskur waren. Stopp, führe Schritt 6 mit breiteren Suchanfragen erneut aus und wiederhole es. |
| Einen Track-B-VC ohne Angabe des Artikels oder Beitrags aufnehmen | Eine These ohne Quelle ist nicht von Halluzination zu unterscheiden. Der Gründer kann sie nicht überprüfen und die Liste verliert jede Glaubwürdigkeit. |
| Fondsübersicht aus Trainingswissen ergänzen | Fondsübersichten müssen nur aus Tavily-Snippet-Text stammen. Wenn die Snippets den Fonds nicht beschreiben, schreibe „nicht in Suchdaten gefunden“. |
| Phase anhand der Website-Ästhetik erkennen | Die Phase muss aus den in Schritt 4 erkannten spezifischen CTA-Signalen stammen. |
| Allgemeine Outreach-Hinweise schreiben | Jeder Outreach-Hinweis muss das Alleinstellungsmerkmal dieses spezifischen Produkts und ein bestimmtes VC-Portfolio-Signal oder These-Zitat aus den Suchdaten nennen. |
| URL-Abruf überspringen, wenn der Nutzer auch eine Beschreibung angibt | Rufe immer die URL ab. Die Live-Seite zeigt oft Phasensignale, die die Beschreibung des Nutzers auslässt. |
Schritt 1: Setup-Prüfung
echo "TAVILY_API_KEY: ${TAVILY_API_KEY:+set}"
echo "FIRECRAWL_API_KEY: ${FIRECRAWL_API_KEY:-nicht gesetzt, Tavily-Extraktion wird als Fallback verwendet}"
Fehlt TAVILY_API_KEY: Stopp. Teile dem Nutzer mit: „TAVILY_API_KEY ist erforderlich, um VC-Investitionen und Thesen zu recherchieren. Dafür gibt es keinen Fallback. Holen Sie ihn unter app.tavily.com – kostenlose Stufe: 1.000 Credits/Monat (ca. 125 vollständige Durchläufe). Fügen Sie ihn Ihrer .env-Datei hinzu.“
Fehlt nur FIRECRAWL_API_KEY: Fahre stillschweigend fort. Die Tavily-Extraktion wird für den URL-Abruf verwendet.
Schritt 2: Eingabe sammeln
Du brauchst:
- Produkt-URL (erforderlich, es sei denn, der Nutzer fügt direkt eine Produktbeschreibung ein)
- Optional: Hinweis zur Zielphase (pre-seed, seed, series-a, series-b) – falls angegeben, verwende sie und überspringe die Phasenerkennung
- Optional: geografische Präferenz (US, Europa, global) – Standard: US, falls nicht angegeben
Stellt der Nutzer nur eine eingefügte Beschreibung (keine URL) zur Verfügung: Überspringe die Schritte 3-4. Gehe direkt zu Schritt 5 mit dem eingefügten Text als product_content. Setze stage_source auf user_description.
Weder URL noch Beschreibung angegeben: Frage: „Wie lautet die URL Ihres Produkts oder Startups? Oder fügen Sie eine kurze Beschreibung ein: Was es tut, für wen es ist und in welcher Phase Sie sich befinden (pre-seed, seed, Series A).“
Leite den Produkt-Slug aus der URL für den Ausgabedateinamen ab:
PRODUCT_SLUG=$(python3 -c "
from urllib.parse import urlparse
url = 'URL_HERE'
host = urlparse(url).netloc.replace('www.', '')
print(host.split('.')[0])
")
Schritt 3: Produktseite abrufen
Primär: Firecrawl (falls FIRECRAWL_API_KEY gesetzt ist)
curl -s -X POST https://api.firecrawl.dev/v1/scrape \
-H "Authorization: Bearer $FIRECRAWL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "URL_HERE", "formats": ["markdown"], "onlyMainContent": true}' \
| python3 -c "
import sys, json
d = json.load(sys.stdin)
content = d.get('data', {}).get('markdown', '') or d.get('markdown', '')
print(f'Abgerufen: {len(content)} Zeichen')
open('/tmp/vc-product-raw.md', 'w').write(content)
"
Fallback: Tavily-Extraktion (falls FIRECRAWL_API_KEY nicht gesetzt ist)
curl -s -X POST https://api.tavily.com/extract \
-H "Content-Type: application/json" \
-d "{\"api_key\": \"$TAVILY_API_KEY\", \"urls\": [\"URL_HERE\"]}" \
| python3 -c "
import sys, json
d = json.load(sys.stdin)
content = d.get('results', [{}])[0].get('raw_content', '')
print(f'Über Tavily extrahiert: {len(content)} Zeichen')
open('/tmp/vc-product-raw.md', 'w').write(content)
"
Kontrollpunkt auf Schrittebene:
python3 -c "
content = open('/tmp/vc-product-raw.md').read()
if len(content) < 200:
print('FEHLER: Seite enthielt weniger als 200 Zeichen.')
else:
print(f'Inhalt OK: {len(content)} Zeichen')
"
Wenn Inhalt < 200 Zeichen: Stoppe das Abrufen. Teile dem Nutzer mit: „Die Produktseite hat keinen lesbaren Inhalt zurückgegeben. Das bedeutet normalerweise, dass die Seite JavaScript-gerendert ist und einen Browser erfordert. Bitte fügen Sie Ihre Produktbeschreibung direkt ein: Was es tut, für wen es ist und in welcher Phase Sie sich befinden.“
Fahre mit Schritt 5 fort, wobei die eingefügte Beschreibung als product_content verwendet wird.
Schritt 4: Phasensignale lokal erkennen (Keine API)
Analysiere das abgerufene Markdown mit Regex vor dem Analyseschritt.
python3 << 'PYEOF'
import re, json
content = open('/tmp/vc-product-raw.md').read().lower()
stage_signals = []
if re.search(r'join\s+(the\s+)?waitlist|sign\s+up\s+for\s+beta|early\s+access|request\s+(an?\s+)?invite|get\s+notified', content):
stage_signals.append({'signal': 'Warteliste oder Beta-CTA', 'stage_hint': 'pre-seed'})
if re.search(r'start\s+(your\s+)?free\s+trial|try\s+(it\s+)?for\s+free|request\s+a?\s+demo|book\s+a?\s+demo|schedule\s+a?\s+demo', content):
stage_signals.append({'signal': 'Kostenlose Testversion oder Demo-CTA', 'stage_hint': 'seed'})
if re.search(r'contact\s+sales|talk\s+to\s+(our\s+)?sales|see\s+pricing|view\s+pricing|plans\s+and\s+pricing', content):
stage_signals.append({'signal': 'Preis- oder Vertriebs-CTA', 'stage_hint': 'series-a'})
if re.search(r'case\s+stud(y|ies)|customer\s+stor(y|ies)|trusted\s+by\s+[\d,]+|used\s+by\s+[\d,]+', content):
stage_signals.append({'signal': 'Fallstudien oder Kundenzahlen', 'stage_hint': 'series-a'})
if re.search(r'enterprise\s+(plan|pricing|tier)|we.?re\s+hiring|join\s+our\s+team|open\s+positions', content):
stage_signals.append({'signal': 'Enterprise-Tarif oder Stellenangebote', 'stage_hint': 'series-a-or-b'})
funding_match = re.search(
r'raised\s+\$[\d,.]+\s*[mk]?|series\s+[abc]\s+round|seed\s+round|(\$[\d,.]+\s*[mk]?\s+(?:seed|series\s+[abc]))',
content
)
if funding_match:
stage_signals.append({'signal': f'Finanzierungstext: {funding_match.group(0).strip()}', 'stage_hint': 'announced'})
if not stage_signals:
dominant = 'unknown'
elif any(s['stage_hint'] == 'announced' for s in stage_signals):
dominant = 'announced'
elif any(s['stage_hint'] == 'series-a-or-b' for s in stage_signals):
dominant = 'series-a'
elif any(s['stage_hint'] == 'series-a' for s in stage_signals):
dominant = 'series-a'
elif any(s['stage_hint'] == 'seed' for s in stage_signals):
dominant = 'seed'
else:
dominant = 'pre-seed'
confidence = 'hoch' if len(stage_signals) >= 2 else ('mittel' if len(stage_signals) == 1 else 'niedrig')
result = {'signals': stage_signals, 'dominant_stage': dominant, 'confidence': confidence}
json.dump(result, open('/tmp/vc-stage-signals.json', 'w'), indent=2)
print(f'Phase: {dominant} ({confidence} Konfidenz) von {len(stage_signals)} Signal(en)')
for s in stage_signals:
print(f' - {s["signal"]} -> {s["stage_hint"]}')
PYEOF
Schritt 5: Produktanalyse (Taxonomie, Phase, ICP)
Gib den Produktinhalt und die Phasensignale aus:
python3 -c "
import json
content = open('/tmp/vc-product-raw.md').read()[:6000]
signals = json.load(open('/tmp/vc-stage-signals.json'))
print('=== PRODUKTSEITE (erste 6000 Zeichen) ===')
print(content)
print()
print('=== ERKANNTE PHASENSIGNALE ===')
print(json.dumps(signals, indent=2))
"
KI-Anweisungen: Analysiere den obigen Produktseiteninhalt. Generiere nur die Taxonomie, den ICP und die Phasenklassifizierung – generiere NOCH KEINE vergleichbaren Unternehmen (das erfolgt über die Live-Suche in Schritt 6).
Schreibe nach /tmp/vc-product-analysis.json:
product_name: von der Seiteone_line_description: Was es tut, für wen, zentrales Wertversprechen. Unter 20 Wörtern. Keine Marketingsprache.industry_taxonomy:l1(übergeordnet: fintech / healthtech / developer tools / consumer / etc.),l2(Sektor: sales technology / logistics software / etc.),l3(spezifische Nische: outbound prospecting / last-mile routing / etc.). Vage Bezeichnungen wie „Technologie“ oder „Software“ allein sind nicht akzeptabel.icp:buyer_persona(Berufsbezeichnung),company_type,company_sizedetected_stage: pre-seed / seed / series-a / series-b / unknownstage_confidence: hoch / mittel / niedrigstage_evidence: Ein Satz, der genau zitiert, welcher CTA oder Text auf der Seite dazu geführt hat. Schreibe „keine klaren Signale gefunden“, wenn unbekannt.geography_bias: US / Europa / global / unklarcomparable_companies: leeres Array[]– wird in Schritt 6 gefüllt
python3 << 'PYEOF'
import json
analysis = {
# FÜLLE basierend auf deiner obigen Analyse
"comparable_companies": []
}
json.dump(analysis, open('/tmp/vc-product-analysis.json', 'w'), indent=2)
print('Produktanalyse geschrieben.')
PYEOF
Überprüfen:
python3 -c "
import json
a = json.load(open('/tmp/vc-product-analysis.json'))
print('Produkt:', a['product_name'])
print('Branche:', a['industry_taxonomy']['l1'], '>', a['industry_taxonomy']['l2'], '>', a['industry_taxonomy']['l3'])
print('Phase:', a['detected_stage'], '(' + a['stage_confidence'] + ' Konfidenz)')
"
Schritt 5b: Kuratierter Vorababgleich mit verifiziertem Fondsdatensatz
Führe die Produkttaxonomie mit einem kuratierten Datensatz von 25 verifizierten VC-Fonds (von Fonds-Websites bezogen) ab. Liefert null-halluzinierte Fondsübereinstimmungen und Saat-Vergleichsunternehmen für Track A – kein Tavily-Credits-Verbrauch.
Gib die Produktanalyse für das Tag-Mapping aus:
python3 -c "
import json
a = json.load(open('/tmp/vc-product-analysis.json'))
print('Taxonomie:', a['industry_taxonomy']['l1'], '>', a['industry_taxonomy']['l2'], '>', a['industry_taxonomy']['l3'])
print('Phase:', a['detected_stage'])
print('Geografie:', a['geography_bias'])
"
KI-Anweisungen: Ordne die Produkttaxonomie den im Fondsdatensatz verwendeten Standard-Tags zu. Verfügbare Tags: DevTools, Infrastructure, Open Source, B2B SaaS, AI, Data, FinTech, HealthTech, Enterprise, Consumer, Marketplaces, E-commerce, Crypto, DeepTech, Cybersecurity, Generalist
Wähle 2-4 Tags aus, die dieses Produkt beschreiben. Ordne detected_stage zu: Pre-seed, Seed, Series A oder Growth. Ordne geography_bias zu: US, Europe, India oder Global.
Schreibe den Produktkontext:
python3 << 'PYEOF'
import json
# FÜLLE basierend auf obiger Taxonomieanalyse
context = {
"extracted_tags": ["TagA", "TagB"], # 2-4 Tags aus der obigen Liste
"stage_hint": "Seed", # Pre-seed / Seed / Series A / Growth
"geography_hint": "US" # US / Europe / India / Global
}
json.dump(context, open('/tmp/vc-product-context.json', 'w'), indent=2)
print('Produktkontext:', context)
PYEOF
Führe die Bewertung gegen den eingebetteten kuratierten Datensatz aus:
python3 << 'PYEOF'
import json
context = json.load(open('/tmp/vc-product-context.json'))
VC_FUNDS = [
{"fund_name":"Y Combinator","thesis":"Wir bieten Startups Seed-Finanzierung. Wir investieren in tief technische Teams, die massive Unternehmen in allen Bereichen aufbauen.","check_size":"$500k","stage_focus":["Pre-seed","Seed"],"industry_tags":["Generalist","B2B SaaS","DevTools","AI"],"geography_focus":["Global"],"notable_portfolio":["Stripe","Airbnb","GitLab"],"website":"https://www.ycombinator.com"},
{"fund_name":"boldstart ventures","thesis":"Der Partner von Tag eins für Developer-first-, Crypto- und SaaS-Gründer. Wir lieben tief technische Gründer, die schwierige Infrastrukturprobleme lösen.","check_size":"$1M - $3M","stage_focus":["Pre-seed","Seed"],"industry_tags":["DevTools","Infrastructure","Crypto"],"geography_focus":["Global","US"],"notable_portfolio":["Snyk","Blockdaemon","Superhuman"],"website":"https://boldstart.vc"},
{"fund_name":"Heavybit","thesis":"Der führende Investor in Developer-first-Startups. Wir helfen technischen Gründern beim Launch, der Gewinnung von Traktion und dem Aufbau unternehmenstauglicher Unternehmen.","check_size":"$1M - $5M","stage_focus":["Seed","Series A"],"industry_tags":["DevTools","Infrastructure","Open Source"],"geography_focus":["Global","US"],"notable_portfolio":["PagerDuty","Sanity","Netlify"],"website":"https://www.heavybit.com"},
{"fund_name":"Amplify Partners","thesis":"Wir investieren in technische Gründer, die die nächste Generation von IT-Infrastruktur, Entwicklertools und Datenplattformen aufbauen.","check_size":"$2M - $8M","stage_focus":["Seed","Series A"],"industry_tags":["DevTools","Infrastructure","AI","Data"],"geography_focus":["US"],"notable_portfolio":["Datadog","OCTO","dbt Labs"],"website":"https://www.amplifypartners.com"},
{"fund_name":"OSS Capital","thesis":"Wir unterstützen ausschließlich frühe Gründer von Commercial Open Source Software (COSS)-Unternehmen.","check_size":"$500k - $2M","stage_focus":["Pre-seed","Seed","Series A"],"industry_tags":["Open Source","DevTools"],"geography_focus":["Global"],"notable_portfolio":["Cal.com","Appsmith","Hoppscotch"],"website":"https://oss.capital"},
{"fund_name":"Se
…
[zur Übersetzung gekürzt]