Un hilo r/n8n se quejó de que las API de búsqueda devuelven HTML sin formato que rompe los límites de los tokens o eliminan demasiado contexto. Este tutorial recorre el camino intermedio: fragmentos estructurados a través de Scavio, extractos de página completa solo para los 1 o 2 primeros resultados.
Requisitos previos
- Python 3.10+
- Clave API de Scavio
Guia paso a paso
Paso 1: La búsqueda devuelve 10 fragmentos escritos
Cada fragmento cabe en ~100 tokens.
import requests, os
API_KEY = os.environ['SCAVIO_API_KEY']
def snippets(q):
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY}, json={'query': q}).json()
return r.get('organic_results', [])[:10]Paso 2: LLM elige los 1-2 primeros para leer completamente
Más barato que buscar los 10.
import anthropic
client = anthropic.Anthropic()
def pick(q, snips):
msg = client.messages.create(model='claude-sonnet-4-6', max_tokens=200,
messages=[{'role':'user','content':f'Q: {q}. SNIPPETS: {snips}. Return indices of the top 2 to read fully.'}])
return msg.content[0].textPaso 3: Extraiga esas páginas como rebajas
Markdown son tokens más baratos que HTML.
def fetch(url):
r = requests.post('https://api.scavio.dev/api/v1/extract',
headers={'x-api-key': API_KEY}, json={'url': url, 'format': 'markdown'}).json()
return r.get('markdown', '')[:5000] # token-budget the pagePaso 4: Redactar la respuesta final
Los fragmentos aportan amplitud, las páginas completas aportan profundidad.
def answer(q):
snips = snippets(q)
picks = [int(i) for i in pick(q, snips).split(',') if i.strip().isdigit()]
deep = [fetch(snips[i]['link']) for i in picks[:2]]
return {'snippets': snips, 'deep_reads': deep}Paso 5: Matemáticas de tokens
10 fragmentos ≈ 1K tokens; 2 páginas recortadas ≈ 8K tokens; contexto total ≈ tokens de 9K: cabe en cualquier modelo de contexto de 200K.
// Token budget: well under 16K even for a 32K-context model.Ejemplo en Python
# Per question: 1 search + 2 extracts = 3 credits = $0.013. Plus LLM token cost.Ejemplo en JavaScript
// Same pattern in TS.Salida esperada
Per question, the agent has 10 snippets and 2 full reads in its context. No raw HTML, no manual cleaning, no token overflow.