¿Qué hace Buscador de Inversores VC?
Toma una URL o descripción de producto. Detecta industria y etapa. Encuentra 5 empresas comparables financiadas. Ejecuta dos pistas de investigación: quién invirtió en esos comparables (Pista A), y qué VCs publican tesis sobre este espacio (Pista B). Devuelve una lista clasificada y fundamentada de inversores con ganchos de contacto.
Política de cero alucinaciones: Cada hecho en el resultado debe ser trazable hasta un resultado de búsqueda específico de Tavily o la página del producto obtenida. Esto aplica a:
- Nombres de empresas comparables: deben aparecer en resultados de búsqueda de Tavily, no en conocimiento de entrenamiento de IA
- Nombres de fondos VC: deben aparecer textualmente en resultados de búsqueda de Tavily
- Tamaños de cheque, enfoque de etapa, empresas en cartera: deben provenir de fragmentos de búsqueda, no de conocimiento de IA
- Resúmenes de fondos y tesis: extraídos solo de fragmentos de búsqueda. Si un detalle no está en los datos de búsqueda, escribe "no encontrado en datos de búsqueda" -- no lo completes con conocimiento de entrenamiento.
Errores Comunes
| El agente querrá... | Por qué está mal |
|---|---|
| Añadir a16z o Sequoia porque son famosos | Un VC famoso sin evidencia es ruido. Solo incluye VCs que aparezcan en resultados de búsqueda de Tavily para este producto específico. Mencionar nombres grandes pierde el tiempo del fundador. |
| Generar empresas comparables desde conocimiento de entrenamiento | Los comparables deben venir de resultados de búsqueda de Tavily (Paso 6). El conocimiento de IA de empresas no es evidencia -- una empresa sugerida de memoria puede tener estado de financiación incorrecto o no ser un verdadero comparable. |
| Continuar cuando las 5 búsquedas de la Pista A devuelvan 0 resultados | Cero resultados en la Pista A significa que los comparables eran incorrectos o demasiado oscuros. Detente, repite el Paso 6 con consultas de búsqueda más amplias y vuelve a intentar. |
| Incluir un VC de la Pista B sin citar el artículo o publicación | Una tesis sin fuente es indistinguible de una alucinación. El fundador no puede verificarla y la lista pierde toda credibilidad. |
| Completar el resumen del fondo desde conocimiento de entrenamiento | Los resúmenes de fondos deben provenir solo del texto de fragmentos de Tavily. Si los fragmentos no describen el fondo, escribe "no encontrado en datos de búsqueda". |
| Detectar etapa a partir de la estética del sitio web | La etapa debe provenir de las señales específicas de CTA detectadas en el Paso 4. |
| Escribir ganchos de contacto genéricos | Cada gancho de contacto debe nombrar el diferenciador de este producto específico y una señal de cartera de VC o cita de tesis de los datos de búsqueda. |
| Omitir la obtención de la URL cuando el usuario también proporciona una descripción | Siempre obtén la URL. La página en vivo a menudo revela señales de etapa que la descripción del usuario omite. |
Paso 1: Verificación de Configuración
echo "TAVILY_API_KEY: ${TAVILY_API_KEY:+set}"
echo "FIRECRAWL_API_KEY: ${FIRECRAWL_API_KEY:-no establecida, se usará extracto de Tavily como respaldo}"
Si falta TAVILY_API_KEY: Detente. Dile al usuario: "TAVILY_API_KEY es necesaria para investigar inversiones y tesis de VC. No hay respaldo para esto. Consíguela en app.tavily.com -- nivel gratuito: 1000 créditos/mes (aproximadamente 125 ejecuciones completas). Añádela a tu archivo .env."
Si solo falta FIRECRAWL_API_KEY: Continúa silenciosamente. Se usará el extracto de Tavily para la obtención de la URL.
Paso 2: Recopilar Entrada
Necesitas:
- URL del producto (requerida, a menos que el usuario pegue directamente una descripción del producto)
- Opcional: pista de etapa objetivo (pre-seed, seed, series-a, series-b) -- si se proporciona, úsala y omite la detección de etapa
- Opcional: preferencia de geografía (US, Europa, global) -- por defecto US si no se especifica
Si el usuario proporciona solo una descripción pegada (sin URL): Omite los Pasos 3-4. Ve directamente al Paso 5 con el texto pegado como product_content. Establece stage_source en user_description.
Si no se proporciona ni URL ni descripción: Pregunta: "¿Cuál es la URL de tu producto o startup? O pega una breve descripción: qué hace, para quién es y en qué etapa estás (pre-seed, seed, Series A)."
Deriva el slug del producto de la URL para el nombre del archivo de salida:
PRODUCT_SLUG=$(python3 -c "
from urllib.parse import urlparse
url = 'URL_AQUI'
host = urlparse(url).netloc.replace('www.', '')
print(host.split('.')[0])
")
Paso 3: Obtener Página del Producto
Principal: Firecrawl (si FIRECRAWL_API_KEY está establecida)
curl -s -X POST https://api.firecrawl.dev/v1/scrape \
-H "Authorization: Bearer $FIRECRAWL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "URL_AQUI", "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'Obtenido: {len(content)} caracteres')
open('/tmp/vc-product-raw.md', 'w').write(content)
"
Respaldo: Extracto de Tavily (si FIRECRAWL_API_KEY no está establecida)
curl -s -X POST https://api.tavily.com/extract \
-H "Content-Type: application/json" \
-d '{"api_key": "$TAVILY_API_KEY", "urls": ["URL_AQUI"]}' \
| python3 -c "
import sys, json
d = json.load(sys.stdin)
content = d.get('results', [{}])[0].get('raw_content', '')
print(f'Obtenido mediante extracto de Tavily: {len(content)} caracteres')
open('/tmp/vc-product-raw.md', 'w').write(content)
"
Punto de control a nivel de paso:
python3 -c "
content = open('/tmp/vc-product-raw.md').read()
if len(content) < 200:
print('ERROR: La página devolvió menos de 200 caracteres.')
else:
print(f'Contenido OK: {len(content)} caracteres')
"
Si el contenido < 200 caracteres: Detén la obtención. Dile al usuario: "La página del producto no devolvió contenido legible. Esto suele significar que el sitio está renderizado con JavaScript y requiere un navegador. Por favor, pega tu descripción del producto directamente: qué hace, para quién es y en qué etapa estás."
Procede al Paso 5 usando la descripción pegada como product_content.
Paso 4: Detectar Señales de Etapa Localmente (Sin API)
Analiza el markdown obtenido con expresiones regulares antes del paso de análisis.
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 de lista de espera o beta', '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 de prueba gratuita o demo', '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 de precios o ventas', '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': 'casos de estudio o recuento de clientes', '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': 'nivel empresarial o vacantes de empleo', 'stage_hint': 'series-a-o-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'texto de financiación: {funding_match.group(0).strip()}', 'stage_hint': 'anunciada'})
if not stage_signals:
dominante = 'desconocida'
elif any(s['stage_hint'] == 'anunciada' for s in stage_signals):
dominante = 'anunciada'
elif any(s['stage_hint'] == 'series-a-o-b' for s in stage_signals):
dominante = 'series-a'
elif any(s['stage_hint'] == 'series-a' for s in stage_signals):
dominante = 'series-a'
elif any(s['stage_hint'] == 'seed' for s in stage_signals):
dominante = 'seed'
else:
dominante = 'pre-seed'
confianza = 'alta' if len(stage_signals) >= 2 else ('media' if len(stage_signals) == 1 else 'baja')
resultado = {'señales': stage_signals, 'etapa_dominante': dominante, 'confianza': confianza}
json.dump(resultado, open('/tmp/vc-stage-signals.json', 'w'), indent=2)
print(f'Etapa: {dominante} (confianza {confianza}) de {len(stage_signals)} señal(es)')
for s in stage_signals:
print(f' - {s["signal"]} -> {s["stage_hint"]}')
PYEOF
Paso 5: Análisis del Producto (Taxonomía, Etapa, ICP)
Imprime el contenido del producto y las señales de etapa:
python3 -c "
import json
content = open('/tmp/vc-product-raw.md').read()[:6000]
signals = json.load(open('/tmp/vc-stage-signals.json'))
print('=== PÁGINA DEL PRODUCTO (primeros 6000 caracteres) ===')
print(content)
print()
print('=== SEÑALES DE ETAPA DETECTADAS ===')
print(json.dumps(signals, indent=2))
"
Instrucciones de IA: Analiza el contenido de la página del producto anterior. Genera la taxonomía, el ICP y la clasificación de etapa solamente -- NO generes empresas comparables todavía (eso se hace mediante búsqueda en vivo en el Paso 6).
Escribe en /tmp/vc-product-analysis.json:
product_name: de la páginaone_line_description: qué hace, para quién, propuesta de valor central. Menos de 20 palabras. Sin lenguaje de marketing.industry_taxonomy:l1(nivel superior: fintech / healthtech / herramientas para desarrolladores / consumo / etc.),l2(sector: tecnología de ventas / software de logística / etc.),l3(nicho específico: prospección saliente / enrutamiento de última milla / etc.). Etiquetas vagas como "tecnología" o "software" por sí solas no son aceptables.icp:buyer_persona(título del puesto),company_type,company_sizedetected_stage: pre-seed / seed / series-a / series-b / desconocidastage_confidence: alta / media / bajastage_evidence: una oración citando exactamente qué CTA o texto en la página impulsó esto. Escribe "no se encontraron señales claras" si es desconocido.geography_bias: US / Europa / global / poco clarocomparable_companies: deja como arreglo vacío[]-- se completará en el Paso 6
python3 << 'PYEOF'
import json
analysis = {
# COMPLETA desde tu análisis anterior
"comparable_companies": []
}
json.dump(analysis, open('/tmp/vc-product-analysis.json', 'w'), indent=2)
print('Análisis del producto escrito.')
PYEOF
Verifica:
python3 -c "
import json
a = json.load(open('/tmp/vc-product-analysis.json'))
print('Producto:', a['product_name'])
print('Industria:', a['industry_taxonomy']['l1'], '>', a['industry_taxonomy']['l2'], '>', a['industry_taxonomy']['l3'])
print('Etapa:', a['detected_stage'], '(' + a['stage_confidence'] + ' confianza)')
"
Paso 5b: Coincidencia Preliminar Curada con Conjunto de Datos de Fondos Verificados
Ejecuta la taxonomía del producto contra un conjunto curado de 25 fondos VC verificados (obtenidos de sitios web de fondos). Produce coincidencias de fondos sin alucinaciones y comparables semilla para la Pista A -- sin consumir créditos de Tavily.
Imprime el análisis del producto para el mapeo de etiquetas:
python3 -c "
import json
a = json.load(open('/tmp/vc-product-analysis.json'))
print('Taxonomía:', a['industry_taxonomy']['l1'], '>', a['industry_taxonomy']['l2'], '>', a['industry_taxonomy']['l3'])
print('Etapa:', a['detected_stage'])
print('Geografía:', a['geography_bias'])
"
Instrucciones de IA: Mapea la taxonomía del producto a las etiquetas estándar utilizadas en el conjunto de datos de fondos. Etiquetas disponibles:
DevTools, Infrastructure, Open Source, B2B SaaS, AI, Data, FinTech, HealthTech, Enterprise, Consumer, Marketplaces, E-commerce, Crypto, DeepTech, Cybersecurity, Generalist
Elige 2-4 etiquetas que describan este producto. Mapea detected_stage a: Pre-seed, Seed, Series A, o Growth. Mapea geography_bias a: US, Europe, India, o Global.
Escribe el contexto del producto:
python3 << 'PYEOF'
import json
# COMPLETA según el análisis de taxonomía anterior
context = {
"extracted_tags": ["EtiquetaA", "EtiquetaB"], # 2-4 etiquetas de la lista anterior
"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('Contexto del producto:', context)
PYEOF
Ejecuta la puntuación contra el conjunto de datos curado integrado:
python3 << 'PYEOF'
import json
context = json.load(open('/tmp/vc-product-context.json'))
VC_FUNDS = [
{"fund_name":"Y Combinator","thesis":"Proporcionamos financiación inicial para startups. Invertimos en equipos profundamente técnicos que construyen empresas masivas en todos los dominios.","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":"Socio desde el día uno para fundadores de developer first, crypto y SaaS. Amamos a los fundadores profundamente técnicos que resuelven problemas difíciles de infraestructura.","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":"El inversor líder en startups developer-first. Ayudamos a fundadores técnicos a lanzar, ganar tracción y construir empresas listas para el enterprise.","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":"Invertimos en fundadores técnicos que construyen la próxima generación de infraestructura de TI, herramientas para desarrolladores y plataformas de datos.","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":"Respaldamos exclusivamente a fundadores en etapa temprana que construyen empresas de Software de Código Abierto Comercial (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
(El contenido se ha truncado para la traducción ya que el original estaba truncado)