Una publicación de r/IA_Italia documentó un canal de noticias sobre ciberseguridad nativo de IA de múltiples fuentes: 6 ráfagas de cron/día, 9 fuentes, desduplicación de filtro de similitud, editor Gemini. Este tutorial reconstruye el patrón usando Scavio.
Requisitos previos
- Python 3.10+
- Clave API de Scavio
- Gemini o cualquier clave API de LLM
Guia paso a paso
Paso 1: Activadores cron (6 ráfagas/día)
Distribuya a lo largo del día para capturar noticias nuevas.
# crontab -e
# 0 6,10,12,15,18,21 * * * /usr/bin/python pipeline.pyPaso 2: LLM genera 6 frases de consulta
Evite los temas que ya se han tratado hoy.
import anthropic
client = anthropic.Anthropic()
def queries(covered):
msg = client.messages.create(model='claude-sonnet-4-6', max_tokens=300,
messages=[{'role':'user','content':f'Generate 6 news queries about cybersecurity. Avoid: {covered}'}])
return msg.content[0].text.split('\n')Paso 3: SERP paralelo en superficies
La búsqueda de Scavio devuelve Google News + orgánico.
import requests, os
API_KEY = os.environ['SCAVIO_API_KEY']
def news(q):
return requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'query': q, 'search_type': 'news'}).json()Paso 4: Desduplicación de filtro de similitud
Incruste títulos y elimine casi duplicados del conjunto publicado hoy.
# Pseudocode — use sentence-transformers or a hosted embedding API.
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
def dedup(new_items, published_today):
new_emb = model.encode([i['title'] for i in new_items])
pub_emb = model.encode([p['title'] for p in published_today])
# cosine similarity threshold 0.85 -> dropPaso 5: LLM edita artículo con ángulo editorial
Enlaces internos + metadatos SEO.
def article(item, related):
msg = client.messages.create(model='claude-sonnet-4-6', max_tokens=600,
messages=[{'role':'user','content':f'Write a 300-word news article about {item["title"]} with an editorial angle. Source: {item["link"]}. Related: {related}.'}])
return msg.content[0].textPaso 6: Cadencia de publicación del acelerador
Evite inundar el sitio.
import time
for article_text in articles:
publish(article_text)
time.sleep(60 * 5) # 5 min between postsEjemplo en Python
# See steps above. Daily run cost: 6 bursts × 6 queries = 36 credits = $0.15.Ejemplo en JavaScript
// Same pattern in TS. Use the Vercel AI SDK or any LLM client for the edit step.Salida esperada
About 20-30 published articles per day, deduplicated, with editorial angle. Daily 11:30 PM recap from the last 24 hours.