VC Finder
Prenez une URL de produit ou une description. Détectez le secteur et le stade. Trouvez 5 sociétés comparables financées. Exécutez deux pistes de recherche : qui a investi dans ces comparables (Piste A), et quels VC publient des thèses sur ce domaine (Piste B). Renvoyez une liste d'investisseurs classée et sourcée avec des accroches de prospection.
Politique zéro hallucination : Chaque fait dans la sortie doit être traçable jusqu'à un résultat de recherche Tavily spécifique ou la page produit récupérée. Ceci s'applique à :
- Les noms d'entreprises comparables : doivent apparaître dans les résultats de recherche Tavily, pas dans la connaissance de l'IA
- Les noms de fonds VC : doivent apparaître textuellement dans les résultats de recherche Tavily
- Les montants des chèques, le focus de stade, les sociétés du portefeuille : doivent provenir d'extraits de recherche, pas de la connaissance de l'IA
- Les aperçus des fonds et les résumés de thèse : extraits uniquement des extraits de recherche. Si un détail ne figure pas dans les données de recherche, écrivez « non trouvé dans les données de recherche » – ne le complétez pas à partir de la connaissance de l'IA.
Erreurs courantes
| L'agent voudra... | Pourquoi c'est faux |
|---|---|
| Ajouter a16z ou Sequoia parce qu'ils sont célèbres | Un VC célèbre sans preuve est du bruit. N'incluez que les VC qui apparaissent dans les résultats de recherche Tavily pour ce produit spécifique. Mentionner des noms célèbres fait perdre du temps au fondateur. |
| Générer des sociétés comparables à partir de la connaissance de l'IA | Les comparables doivent provenir des résultats de recherche Tavily (Étape 6). La connaissance de l'IA sur les sociétés n'est pas une preuve – une société suggérée de mémoire peut avoir un statut de financement erroné ou ne pas être un véritable comparable. |
| Continuer lorsque les 5 recherches de la Piste A renvoient 0 résultat | Zéro résultat Piste A signifie que les comparables étaient erronés ou trop obscurs. Arrêtez-vous, relancez l'Étape 6 avec des requêtes de recherche plus larges, et réessayez. |
| Inclure un VC de la Piste B sans citer l'article ou le post | Une thèse sans source est impossible à distinguer d'une hallucination. Le fondateur ne peut pas la vérifier et la liste perd toute crédibilité. |
| Compléter un aperçu du fonds à partir de la connaissance de l'IA | Les aperçus des fonds doivent provenir uniquement du texte des extraits Tavily. Si les extraits ne décrivent pas le fonds, écrivez « non trouvé dans les données de recherche ». |
| Détecter le stade à partir de l'esthétique du site Web | Le stade doit provenir des signaux d'appel à l'action (CTA) spécifiques détectés à l'Étape 4. |
| Écrire des accroches de prospection génériques | Chaque accroche de prospection doit nommer le différenciateur de ce produit spécifique et un signal de portefeuille VC spécifique ou une citation de thèse provenant des données de recherche. |
| Sauter la récupération de l'URL lorsque l'utilisateur fournit également une description | Récupérez toujours l'URL. La page en direct révèle souvent des signaux de stade que la description de l'utilisateur omet. |
Étape 1 : Vérification de la configuration
echo "TAVILY_API_KEY: ${TAVILY_API_KEY:+set}"
echo "FIRECRAWL_API_KEY: ${FIRECRAWL_API_KEY:-non défini, l'extraction Tavily sera utilisée comme solution de repli}"
Si TAVILY_API_KEY est manquant : Arrêtez-vous. Dites à l'utilisateur : « TAVILY_API_KEY est requis pour rechercher les investissements et les thèses des VC. Il n'y a pas de solution de repli pour cela. Obtenez-le sur app.tavily.com – niveau gratuit : 1000 crédits par mois (environ 125 exécutions complètes). Ajoutez-le à votre fichier .env. »
Si seul FIRECRAWL_API_KEY est manquant : Continuez silencieusement. L'extraction Tavily sera utilisée pour la récupération d'URL.
Étape 2 : Recueillir les informations
Vous avez besoin de :
- URL du produit (obligatoire, sauf si l'utilisateur colle directement une description du produit)
- Optionnel : indication du stade cible (pre-seed, seed, series-a, series-b) – si fourni, utilisez-le et ignorez la détection du stade
- Optionnel : préférence géographique (US, Europe, global) – par défaut US si non spécifié
Si l'utilisateur fournit seulement une description collée (pas d'URL) : Sautez les Étape 3-4. Allez directement à l'Étape 5 avec le texte collé comme product_content. Définissez stage_source à user_description.
Si ni l'URL ni la description ne sont fournies : Demandez : « Quelle est l'URL de votre produit ou startup? Ou collez une courte description : ce qu'il fait, pour qui il est, et à quel stade vous êtes (pre-seed, seed, Series A). »
Dérivez le slug du produit à partir de l'URL pour le nom du fichier de sortie :
PRODUCT_SLUG=$(python3 -c "
from urllib.parse import urlparse
url = 'URL_ICI'
host = urlparse(url).netloc.replace('www.', '')
print(host.split('.')[0])
")
Étape 3 : Récupérer la page produit
Principal : Firecrawl (si FIRECRAWL_API_KEY est défini)
curl -s -X POST https://api.firecrawl.dev/v1/scrape \
-H "Authorization: Bearer $FIRECRAWL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "URL_ICI", "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'Récupéré : {len(content)} caractères')
open('/tmp/vc-product-raw.md', 'w').write(content)
"
Solution de repli : Extraction Tavily (si FIRECRAWL_API_KEY n'est pas défini)
curl -s -X POST https://api.tavily.com/extract \
-H "Content-Type: application/json" \
-d "{\"api_key\": \"$TAVILY_API_KEY\", \"urls\": [\"URL_ICI\"]}" \
| python3 -c "
import sys, json
d = json.load(sys.stdin)
content = d.get('results', [{}])[0].get('raw_content', '')
print(f'Récupéré via l\'extraction Tavily : {len(content)} caractères')
open('/tmp/vc-product-raw.md', 'w').write(content)
"
Point de contrôle au niveau de l'étape :
python3 -c "
content = open('/tmp/vc-product-raw.md').read()
if len(content) < 200:
print('ERREUR : La page a renvoyé moins de 200 caractères.')
else:
print(f'Contenu OK : {len(content)} caractères')
"
Si contenu < 200 caractères : Arrêtez la récupération. Dites à l'utilisateur : « La page produit n'a renvoyé aucun contenu lisible. Cela signifie généralement que le site est rendu en JavaScript et nécessite un navigateur. Veuillez coller votre description de produit directement : ce qu'il fait, pour qui il est, et à quel stade vous êtes. »
Passez à l'Étape 5 en utilisant la description collée comme product_content.
Étape 4 : Détecter les signaux de stade localement (pas d'API)
Analysez le markdown récupéré avec des expressions régulières avant l'étape d'analyse.
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': 'CTA liste d\'attente ou bêta', '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': 'CTA essai gratuit ou démo', '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': 'CTA prix ou vente', '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': 'Études de cas ou nombre de clients', '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': 'Niveau entreprise ou offres d\'emploi', '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'texte de financement : {funding_match.group(0).strip()}', 'stage_hint': 'annoncé'})
if not stage_signals:
dominant = 'inconnu'
elif any(s['stage_hint'] == 'annoncé' for s in stage_signals):
dominant = 'annoncé'
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 = 'haute' if len(stage_signals) >= 2 else ('moyenne' if len(stage_signals) == 1 else 'faible')
result = {'signals': stage_signals, 'dominant_stage': dominant, 'confidence': confidence}
json.dump(result, open('/tmp/vc-stage-signals.json', 'w'), indent=2)
print(f'Stade : {dominant} (confiance {confidence}) à partir de {len(stage_signals)} signal(aux)')
for s in stage_signals:
print(f' - {s["signal"]} -> {s["stage_hint"]}')
PYEOF
Étape 5 : Analyse du produit (Taxonomie, Stade, ICP)
Affichez le contenu du produit et les signaux de stade :
python3 -c "
import json
content = open('/tmp/vc-product-raw.md').read()[:6000]
signals = json.load(open('/tmp/vc-stage-signals.json'))
print('=== PAGE PRODUIT (6000 premiers caractères) ===')
print(content)
print()
print('=== SIGNAUX DE STADE DÉTECTÉS ===')
print(json.dumps(signals, indent=2))
"
Instructions d'IA : Analysez le contenu de la page produit ci-dessus. Générez la taxonomie, l'ICP et la classification du stade seulement – ne générez PAS encore de sociétés comparables (cela sera fait via une recherche en direct à l'Étape 6).
Écrivez dans /tmp/vc-product-analysis.json :
product_name: depuis la pageone_line_description: ce qu'il fait, pour qui, proposition de valeur principale. Moins de 20 mots. Pas de langage marketing.industry_taxonomy:l1(haut niveau : fintech / healthtech / developer tools / consumer / etc.),l2(secteur : sales technology / logistics software / etc.),l3(niche spécifique : outbound prospecting / last-mile routing / etc.). Les étiquettes vagues comme « technology » ou « software » seules ne sont pas acceptables.icp:buyer_persona(titre de poste),company_type,company_sizedetected_stage: pre-seed / seed / series-a / series-b / inconnustage_confidence: haute / moyenne / faiblestage_evidence: une phrase citant exactement quel CTA ou texte sur la page a conduit à cela. Écrivez « aucun signal clair trouvé » si inconnu.geography_bias: US / Europe / global / unclearcomparable_companies: laissez un tableau vide[]– sera rempli à l'Étape 6
python3 << 'PYEOF'
import json
analysis = {
# REMPLISSEZ à partir de votre analyse ci-dessus
"comparable_companies": []
}
json.dump(analysis, open('/tmp/vc-product-analysis.json', 'w'), indent=2)
print('Analyse du produit écrite.')
PYEOF
Vérifiez :
python3 -c "
import json
a = json.load(open('/tmp/vc-product-analysis.json'))
print('Produit :', a['product_name'])
print('Secteur :', a['industry_taxonomy']['l1'], '>', a['industry_taxonomy']['l2'], '>', a['industry_taxonomy']['l3'])
print('Stade :', a['detected_stage'], '(' + a['stage_confidence'] + ') confiance')
"
Étape 5b : Pré-correspondance organisée avec l'ensemble de données de fonds vérifiés
Exécutez la taxonomie du produit par rapport à un ensemble de données organisé de 25 fonds VC vérifiés (provenant des sites Web des fonds). Produit des correspondances de fonds sans hallucination et des comparables d'amorçage pour la Piste A – aucun crédit Tavily consommé.
Affichez l'analyse du produit pour le mappage des balises :
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('Stade :', a['detected_stage'])
print('Géographie :', a['geography_bias'])
"
Instructions d'IA : Mappez la taxonomie du produit aux balises standard utilisées dans l'ensemble de données des fonds. Balises disponibles :
DevTools, Infrastructure, Open Source, B2B SaaS, AI, Data, FinTech, HealthTech, Enterprise, Consumer, Marketplaces, E-commerce, Crypto, DeepTech, Cybersecurity, Generalist
Choisissez 2 à 4 balises qui décrivent ce produit. Mappez detected_stage à : Pre-seed, Seed, Series A, ou Growth. Mappez geography_bias à : US, Europe, India, ou Global.
Écrivez le contexte du produit :
python3 << 'PYEOF'
import json
# REMPLISSEZ en fonction de l'analyse de la taxonomie ci-dessus
context = {
"extracted_tags": ["TagA", "TagB"], # 2-4 balises de la liste ci-dessus
"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('Contexte du produit :', context)
PYEOF
Exécutez le scoring par rapport à l'ensemble de données organisé intégré :
python3 << 'PYEOF'
import json
context = json.load(open('/tmp/vc-product-context.json'))
VC_FUNDS = [
{"fund_name":"Y Combinator","thesis":"Nous fournissons un financement de démarrage pour les startups. Nous investissons dans des équipes profondément techniques qui construisent de grandes entreprises dans tous les domaines.","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":"Partenaire dès le premier jour pour les fondateurs axés sur le développement, la crypto et le SaaS. Nous aimons les fondateurs profondément techniques qui résolvent des problèmes d'infrastructure difficiles.","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":"L'investisseur de premier plan dans les startups axées sur les développeurs. Nous aidons les fondateurs techniques à lancer, gagner en traction et construire des entreprises prêtes pour l'entreprise.","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":"Nous investissons dans des fondateurs techniques qui construisent la prochaine génération d'infrastructure informatique, d'outils pour développeurs et de plateformes de données.","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":"Nous soutenons exclusivement les fondateurs en phase de démarrage qui construisent des sociétés de logiciels open source commerciaux (COSS).","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"}
]
...
PYEOF