Los modos de 'investigación profunda' disponibles en el mercado se quedan cortos para proyectos de libros. El agente de investigación profunda adecuado recorre SERP, Reddit y YouTube, sigue las citas, sopesa las fuentes y mantiene una lista de citas actualizada. Este tutorial conecta a Scavio más Claude en un ciclo de investigación de varios pasos con citas de DuckDB.
Requisitos previos
- Python 3.10+
- Clave API de Scavio
- Clave API antrópica
- DuckDB (pip instala duckdb)
Guia paso a paso
Paso 1: Generar el plan de investigación
Claude divide el tema en 5 subpreguntas.
import anthropic
client = anthropic.Anthropic()
def plan(topic):
msg = client.messages.create(
model='claude-sonnet-4-6', max_tokens=1024,
messages=[{'role':'user','content':f'Break into 5 sub-questions: {topic}'}])
return msg.content[0].text.split('\n')Paso 2: Búsqueda por subpregunta
Scavio multisuperficie para cada subpregunta.
import requests, os
API_KEY = os.environ['SCAVIO_API_KEY']
def multi_search(q):
serp = requests.post('https://api.scavio.dev/api/v1/google',
headers={'x-api-key': API_KEY}, json={'query': q}).json()
rdt = requests.post('https://api.scavio.dev/api/v1/reddit/search',
headers={'x-api-key': API_KEY}, json={'query': q}).json()
yt = requests.post('https://api.scavio.dev/api/v1/youtube/search',
headers={'x-api-key': API_KEY}, json={'query': q}).json()
return {'serp': serp.get('organic_results',[])[:5], 'reddit': rdt.get('posts',[])[:5], 'youtube': yt.get('videos',[])[:3]}Paso 3: Obtener fuentes principales
Extracto de Scavio para las URL con mayor puntuación.
def fetch(url):
r = requests.post('https://api.scavio.dev/api/v1/extract',
headers={'x-api-key': API_KEY}, json={'url': url})
return r.json().get('content', '')[:5000]Paso 4: Almacenar citas
La tabla DuckDB rastrea cada fuente citada por el agente.
import duckdb
db = duckdb.connect('research.duckdb')
db.execute('CREATE TABLE IF NOT EXISTS cites(topic TEXT, sub TEXT, url TEXT, surface TEXT, snippet TEXT)')
def cite(topic, sub, url, surface, snippet):
db.execute('INSERT INTO cites VALUES (?, ?, ?, ?, ?)', (topic, sub, url, surface, snippet))Paso 5: Redactar el escrito
Claude escribe un informe estructurado con notas a pie de página.
def brief(topic, plan_items):
sources = db.execute('SELECT * FROM cites WHERE topic=?', (topic,)).fetchall()
msg = client.messages.create(
model='claude-sonnet-4-6', max_tokens=2048,
messages=[{'role':'user','content':f'Write a brief on {topic} with footnotes from sources: {sources[:30]}'}])
return msg.content[0].textEjemplo en Python
# Combine all steps into one entry function
def deep_research(topic):
items = plan(topic)
for sub in items:
results = multi_search(sub)
for r in results['serp'] + results['reddit']:
cite(topic, sub, r.get('link') or r.get('url',''), 'web', r.get('snippet','')[:200])
return brief(topic, items)
print(deep_research('history of llm agent architectures 2022-2026'))Ejemplo en JavaScript
const API_KEY = process.env.SCAVIO_API_KEY;
export async function multiSearch(q) {
const headers = { 'x-api-key': API_KEY, 'Content-Type': 'application/json' };
const [serp, rdt, yt] = await Promise.all([
fetch('https://api.scavio.dev/api/v1/google', { method:'POST', headers, body: JSON.stringify({ query: q }) }).then(r => r.json()),
fetch('https://api.scavio.dev/api/v1/reddit/search', { method:'POST', headers, body: JSON.stringify({ query: q }) }).then(r => r.json()),
fetch('https://api.scavio.dev/api/v1/youtube/search', { method:'POST', headers, body: JSON.stringify({ query: q }) }).then(r => r.json())
]);
return { serp, rdt, yt };
}Salida esperada
A structured research brief with 30+ citations across SERP, Reddit threads, and YouTube videos. DuckDB stores every source for follow-up queries.