Localizador de VCs
Pegue uma URL de produto ou descrição. Detecte o setor e o estágio. Encontre 5 empresas financiadas comparáveis. Execute duas trilhas de pesquisa: quem investiu nessas comparáveis (Track A) e quais VCs publicam teses sobre este espaço (Track B). Retorne uma lista de investidores ranqueada, com fontes e ganchos de abordagem.
Política de zero alucinação: Cada fato na saída deve ser rastreável a um resultado de pesquisa específico do Tavily ou à página do produto buscada. Isso se aplica a:
- Nomes de empresas comparáveis: devem aparecer nos resultados de pesquisa do Tavily, não no conhecimento de treinamento da IA
- Nomes de fundos de VC: devem aparecer exatamente como nos resultados de pesquisa do Tavily
- Tamanhos de cheques, foco em estágio, empresas do portfólio: devem vir de trechos da pesquisa, não do conhecimento da IA
- Visões gerais e resumos de teses de fundos: extraídos apenas dos trechos da pesquisa. Se um detalhe não estiver nos dados da pesquisa, escreva "não encontrado nos dados da pesquisa" — não preencha com conhecimento de treinamento.
Erros Comuns
| O agente vai querer... | Por que isso está errado |
|---|---|
| Adicionar a16z ou Sequoia porque são famosos | Um VC famoso sem evidência é ruído. Inclua apenas VCs que apareçam nos resultados do Tavily para este produto específico. Citar nomes famosos desperdiça o tempo do fundador. |
| Gerar empresas comparáveis a partir do conhecimento de treinamento | As comparáveis devem vir dos resultados de pesquisa do Tavily (Etapa 6). O conhecimento da IA sobre empresas não é evidência — uma empresa sugerida da memória pode ter status de financiamento errado ou não ser uma comparável verdadeira. |
| Continuar quando todas as 5 pesquisas da Track A retornarem 0 resultados | Zero resultados na Track A significa que as comparáveis estavam erradas ou eram muito obscuras. Pare, refaça a Etapa 6 com consultas de pesquisa mais amplas e tente novamente. |
| Incluir um VC da Track B sem citar o artigo ou post | Tese sem fonte é indistinguível de alucinação. O fundador não pode verificá-la e a lista perde toda a credibilidade. |
| Preencher visão geral do fundo a partir do conhecimento de treinamento | As visões gerais dos fundos devem vir apenas do texto dos trechos do Tavily. Se os trechos não descreverem o fundo, escreva "não encontrado nos dados da pesquisa". |
| Detectar estágio pela estética do site | O estágio deve vir dos sinais específicos de CTA detectados na Etapa 4. |
| Escrever ganchos de abordagem genéricos | Cada gancho de abordagem deve nomear o diferencial deste produto específico e um sinal de portfólio específico de VC ou citação de tese dos dados da pesquisa. |
| Pular a busca da URL quando o usuário também fornece uma descrição | Sempre busque a URL. A página ao vivo geralmente revela sinais de estágio que a descrição do usuário omite. |
Etapa 1: Verificação de Configuração
echo "TAVILY_API_KEY: ${TAVILY_API_KEY:+set}"
echo "FIRECRAWL_API_KEY: ${FIRECRAWL_API_KEY:-não definido, extract do Tavily será usado como fallback}"
Se TAVILY_API_KEY estiver faltando: Pare. Diga ao usuário: "TAVILY_API_KEY é necessário para pesquisar investimentos de VC e teses. Não há fallback para isso. Obtenha em app.tavily.com — camada gratuita: 1000 créditos/mês (cerca de 125 execuções completas). Adicione ao seu arquivo .env."
Se apenas FIRECRAWL_API_KEY estiver faltando: Continue silenciosamente. O extract do Tavily será usado para a busca da URL.
Etapa 2: Coletar Entrada
Você precisa de:
- URL do produto (obrigatório, a menos que o usuário cole uma descrição do produto diretamente)
- Opcional: sugestão de estágio alvo (pré-seed, seed, série-a, série-b) — se fornecida, use-a e pule a detecção de estágio
- Opcional: preferência de geografia (EUA, Europa, global) — o padrão é EUA se não especificado
Se o usuário fornecer apenas uma descrição colada (sem URL): Pule as Etapas 3-4. Vá diretamente para a Etapa 5 com o texto colado como product_content. Defina stage_source como user_description.
Se nem URL nem descrição forem fornecidos: Pergunte: "Qual é a URL do seu produto ou startup? Ou cole uma breve descrição: o que faz, para quem é e em que estágio você está (pré-seed, seed, Série A)."
Derive o slug do produto da URL para o nome do arquivo de saída:
PRODUCT_SLUG=$(python3 -c "
from urllib.parse import urlparse
url = 'URL_HERE'
host = urlparse(url).netloc.replace('www.', '')
print(host.split('.')[0])
")
Etapa 3: Buscar Página do Produto
Primário: Firecrawl (se FIRECRAWL_API_KEY estiver definida)
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'Buscado: {len(content)} caracteres')
open('/tmp/vc-product-raw.md', 'w').write(content)
"
Fallback: Extract do Tavily (se FIRECRAWL_API_KEY não estiver definida)
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'Buscado via extract do Tavily: {len(content)} caracteres')
open('/tmp/vc-product-raw.md', 'w').write(content)
"
Ponto de verificação da etapa:
python3 -c "
content = open('/tmp/vc-product-raw.md').read()
if len(content) < 200:
print('ERRO: A página retornou menos de 200 caracteres.')
else:
print(f'Conteúdo OK: {len(content)} caracteres')
"
Se conteúdo < 200 caracteres: Pare a busca. Diga ao usuário: "A página do produto não retornou conteúdo legível. Isso geralmente significa que o site é renderizado por JavaScript e requer um navegador. Por favor, cole sua descrição do produto diretamente: o que faz, para quem é e em que estágio você está."
Siga para a Etapa 5 usando a descrição colada como product_content.
Etapa 4: Detectar Sinais de Estágio Localmente (Sem API)
Analise o markdown buscado com regex antes da etapa de análise.
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 ou 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 trial gratuito ou demonstração', '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 preços ou vendas', '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': 'estudos de caso ou contagem 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': 'plano enterprise ou vagas de emprego', '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'texto de financiamento: {funding_match.group(0).strip()}', 'stage_hint': 'anunciado'})
if not stage_signals:
dominant = 'desconhecido'
elif any(s['stage_hint'] == 'anunciado' for s in stage_signals):
dominant = 'anunciado'
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'
confianca = 'alta' if len(stage_signals) >= 2 else ('média' if len(stage_signals) == 1 else 'baixa')
resultado = {'sinais': stage_signals, 'estagio_dominante': dominant, 'confianca': confianca}
json.dump(resultado, open('/tmp/vc-stage-signals.json', 'w'), indent=2)
print(f'Estágio: {dominant} (confiança {confianca}) de {len(stage_signals)} sinal(is)')
for s in stage_signals:
print(f' - {s["signal"]} -> {s["stage_hint"]}')
PYEOF
Etapa 5: Análise do Produto (Taxonomia, Estágio, ICP)
Imprima o conteúdo do produto e os sinais de estágio:
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 DO PRODUTO (primeiros 6000 caracteres) ===')
print(content)
print()
print('=== SINAIS DE ESTÁGIO DETECTADOS ===')
print(json.dumps(signals, indent=2))
"
Instruções para IA: Analise o conteúdo da página do produto acima. Gere apenas a taxonomia, ICP e classificação de estágio — NÃO gere empresas comparáveis ainda (isso é feito via pesquisa ao vivo na Etapa 6).
Escreva em /tmp/vc-product-analysis.json:
product_name: a partir da páginaone_line_description: o que faz, para quem, proposta de valor central. Menos de 20 palavras. Sem linguagem de marketing.industry_taxonomy:l1(nível superior: fintech / healthtech / ferramentas para desenvolvedores / consumo / etc.),l2(setor: tecnologia de vendas / software de logística / etc.),l3(nicho específico: prospecção outbound / roteamento de última milha / etc.). Rótulos vagos como "tecnologia" ou "software" sozinhos não são aceitáveis.icp:buyer_persona(cargo),company_type,company_sizedetected_stage: pre-seed / seed / series-a / series-b / desconhecidostage_confidence: alta / média / baixastage_evidence: uma frase citando exatamente qual CTA ou texto na página impulsionou isso. Escreva "nenhum sinal claro encontrado" se desconhecido.geography_bias: EUA / Europa / global / incertocomparable_companies: deixe como array vazio[]— será preenchido na Etapa 6
python3 << 'PYEOF'
import json
analise = {
# PREENCHA com sua análise acima
"comparable_companies": []
}
json.dump(analise, open('/tmp/vc-product-analysis.json', 'w'), indent=2)
print('Análise do produto escrita.')
PYEOF
Verifique:
python3 -c "
import json
a = json.load(open('/tmp/vc-product-analysis.json'))
print('Produto:', a['product_name'])
print('Setor:', a['industry_taxonomy']['l1'], '>', a['industry_taxonomy']['l2'], '>', a['industry_taxonomy']['l3'])
print('Estágio:', a['detected_stage'], '(' + a['stage_confidence'] + ' confiança)')
"
Etapa 5b: Pré-Correspondência Curada Contra Conjunto de Fundos Verificados
Execute a taxonomia do produto contra um conjunto curado de 25 fundos de VC verificados (obtidos de sites de fundos). Produz correspondências de fundos sem alucinação e comparáveis de semente para a Track A — sem consumir créditos do Tavily.
Imprima a análise do produto para mapeamento de tags:
python3 -c "
import json
a = json.load(open('/tmp/vc-product-analysis.json'))
print('Taxonomia:', a['industry_taxonomy']['l1'], '>', a['industry_taxonomy']['l2'], '>', a['industry_taxonomy']['l3'])
print('Estágio:', a['detected_stage'])
print('Geografia:', a['geography_bias'])
"
Instruções para IA: Mapeie a taxonomia do produto para as tags padrão usadas no conjunto de fundos. Tags disponíveis:
DevTools, Infraestrutura, Código Aberto, B2B SaaS, IA, Dados, FinTech, HealthTech, Enterprise, Consumo, Marketplaces, E-commerce, Cripto, DeepTech, Cibersegurança, Generalista
Escolha 2-4 tags que descrevam este produto. Mapeie detected_stage para: Pré-seed, Seed, Série A ou Crescimento. Mapeie geography_bias para: EUA, Europa, Índia ou Global.
Escreva o contexto do produto:
python3 << 'PYEOF'
import json
# PREENCHA com base na análise de taxonomia acima
contexto = {
"extracted_tags": ["TagA", "TagB"], # 2-4 tags da lista acima
"stage_hint": "Seed", # Pré-seed / Seed / Série A / Crescimento
"geography_hint": "EUA" # EUA / Europa / Índia / Global
}
json.dump(contexto, open('/tmp/vc-product-context.json', 'w'), indent=2)
print('Contexto do produto:', contexto)
PYEOF
Execute a pontuação contra o conjunto de dados curado incorporado:
python3 << 'PYEOF'
import json
contexto = json.load(open('/tmp/vc-product-context.json'))
VC_FUNDS = [
{"fund_name":"Y Combinator","thesis":"Fornecemos financiamento inicial para startups. Investimos em equipes profundamente técnicas que constroem empresas massivas em todos os domínios.","check_size":"$500k","stage_focus":["Pré-seed","Seed"],"industry_tags":["Generalista","B2B SaaS","DevTools","IA"],"geography_focus":["Global"],"notable_portfolio":["Stripe","Airbnb","GitLab"],"website":"https://www.ycombinator.com"},
{"fund_name":"boldstart ventures","thesis":"Parceiro desde o primeiro dia para fundadores de developer-first, cripto e SaaS. Amamos fundadores profundamente técnicos resolvendo problemas difíceis de infraestrutura.","check_size":"$1M - $3M","stage_focus":["Pré-seed","Seed"],"industry_tags":["DevTools","Infraestrutura","Cripto"],"geography_focus":["Global","EUA"],"notable_portfolio":["Snyk","Blockdaemon","Superhuman"],"website":"https://boldstart.vc"},
{"fund_name":"Heavybit","thesis":"O principal investidor em startups developer-first. Ajudamos fundadores técnicos a lançar, ganhar tração e construir empresas prontas para enterprise.","check_size":"$1M - $5M","stage_focus":["Seed","Série A"],"industry_tags":["DevTools","Infraestrutura","Código Aberto"],"geography_focus":["Global","EUA"],"notable_portfolio":["PagerDuty","Sanity","Netlify"],"website":"https://www.heavybit.com"},
{"fund_name":"Amplify Partners","thesis":"Investimos em fundadores técnicos que constroem a próxima geração de infraestrutura de TI, ferramentas para desenvolvedores e plataformas de dados.","check_size":"$2M - $8M","stage_focus":["Seed","Série A"],"industry_tags":["DevTools","Infraestrutura","IA","Dados"],"geography_focus":["EUA"],"notable_portfolio":["Datadog","OCTO","dbt Labs"],"website":"https://www.amplifypartners.com"},
{"fund_name":"OSS Capital","thesis":"Apoiamos exclusivamente fundadores em estágio inicial que constroem empresas de Software de Código Aberto Comercial (COSS).","check_size":"$500k - $2M","stage_focus":["Pré-seed","Seed","Série A"],"industry_tags":["Código Aberto","DevTools"],"geography_focus":["Global"],"notable_portfolio":["Cal.com","Appsmith","Hoppscotch"],"website":"https://oss.capital"}
# ... (restante do conjunto de dados permanece igual)
]
# ... (lógica de pontuação permanece igual)
PYEOF