Resumen
Staying actual on 10+ topics means checking dozens of fuentes diario. Este flujo de trabajo automatiza it: define your topics, ejecutar diario searches, deduplicate contra your existing knowledge base, y almacenar solo genuinely nuevo informacion. Pairs con un local LLM for summarization so your private research stays local. Cost: bajo $1/mes for 20 topics.
Desencadenador
Diario at 7 AM via cron.
Programación
Diario 7 AM
Pasos del flujo de trabajo
Cargar Topic Watchlist
Leer topics de un local archivo de configuracion. Cada topic tiene un consulta de busqueda y un categoria.
Search for Cada Topic
Ejecutar Scavio search for cada topic. Extraer top resultados con titles, fragmentos, y URLs.
Deduplicate Against Knowledge Base
Comparar nuevo resultado URLs contra existing knowledge base entradas. Keep solo genuinely nuevo elementos.
Resumir Nuevo Entries
For cada nuevo entrada, crear un structured resumen con fuente, date, y key facts.
Agregar to Knowledge Base
Add nuevo entradas to el local knowledge base file con marcas de tiempo y categorias.
Implementacion en Python
import requests, os, json
from pathlib import Path
from datetime import date
API_KEY = os.environ["SCAVIO_API_KEY"]
H = {"x-api-key": API_KEY, "Content-Type": "application/json"}
KB_FILE = Path("knowledge_base.json")
TOPICS = [
{"query": "ai agent framework news 2026", "category": "ai"},
{"query": "search api updates 2026", "category": "search"},
{"query": "python 3.14 release notes", "category": "python"},
]
def search_topic(query: str) -> list:
resp = requests.post(
"https://api.scavio.dev/api/v1/search",
headers=H,
json={"query": query, "country_code": "us"},
timeout=15,
)
results = resp.json().get("organic_results", [])[:5]
return [{"title": r.get("title", ""), "url": r.get("link", ""), "snippet": r.get("snippet", "")} for r in results]
def update_kb():
kb = json.loads(KB_FILE.read_text()) if KB_FILE.exists() else {"entries": [], "seen_urls": []}
seen = set(kb["seen_urls"])
new_entries = []
for topic in TOPICS:
results = search_topic(topic["query"])
for r in results:
if r["url"] not in seen:
entry = {
"date": str(date.today()),
"category": topic["category"],
"title": r["title"],
"url": r["url"],
"summary": r["snippet"],
}
new_entries.append(entry)
seen.add(r["url"])
kb["entries"].extend(new_entries)
kb["seen_urls"] = list(seen)
KB_FILE.write_text(json.dumps(kb, indent=2))
return len(new_entries)
added = update_kb()
print(f"Added {added} new entries to knowledge base")Implementacion en JavaScript
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
const fs = await import('fs');
const KB_FILE = 'knowledge_base.json';
const TOPICS = [
{query:'ai agent framework news 2026', category:'ai'},
{query:'search api updates 2026', category:'search'},
{query:'python 3.14 release notes', category:'python'},
];
async function searchTopic(query) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {method:'POST', headers:H, body:JSON.stringify({query, country_code:'us'})});
return ((await r.json()).organic_results || []).slice(0,5).map(r=>({title:r.title||'', url:r.link||'', snippet:r.snippet||''}));
}
async function updateKb() {
let kb = {entries:[], seenUrls:[]};
try { kb = JSON.parse(fs.readFileSync(KB_FILE, 'utf8')); } catch {}
const seen = new Set(kb.seenUrls);
const newEntries = [];
for (const topic of TOPICS) {
const results = await searchTopic(topic.query);
for (const r of results) {
if (!seen.has(r.url)) {
newEntries.push({date:new Date().toISOString().split('T')[0], category:topic.category, title:r.title, url:r.url, summary:r.snippet});
seen.add(r.url);
}
}
}
kb.entries.push(...newEntries);
kb.seenUrls = [...seen];
fs.writeFileSync(KB_FILE, JSON.stringify(kb, null, 2));
return newEntries.length;
}
const added = await updateKb();
console.log('Added '+added+' new entries to knowledge base');Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA