Si Hermes falla al leer enlaces de Reddit y LinkedIn, la solución es dejar de raspar páginas en crudo y llamar a una API de búsqueda estructurada. El camino preinstalado web_extract y ddg se rompe porque descarga HTML como lo haría un navegador, y Reddit, LinkedIn y casi todas las páginas con muro de pago ahora bloquean eso con detección de bots, muros de login y límites de tasa. Scavio accede a esos destinos a través de un backend mantenido y le entrega al agente JSON ya parseado, así que el agente nunca toca el HTML. Aquí conectamos los endpoints de Google SERP y Reddit de Scavio a una herramienta de Hermes con una sola clave de API. Nota honesta de entrada: si solo necesitas el texto de un artículo de una URL cualquiera, los 1.000 créditos gratis al mes de Tavily son la opción más sencilla. Scavio gana su sitio cuando el agente necesita Google SERP más hilos estructurados de Reddit más YouTube o Amazon desde una única clave. 50 créditos gratis al registrarte, luego 0,005 $ por crédito.
Requisitos previos
- Un agente Hermes en marcha (habitualmente con Gemini o DeepSeek vía OpenRouter)
- Una clave de API de Scavio del panel (50 créditos gratis al registrarte, luego 0,005 $/crédito)
- Python 3.9+ o Node 18+ con un cliente HTTP (requests / fetch)
- Poder registrar una herramienta personalizada en tu configuración de Hermes
Guia paso a paso
Paso 1: Entiende por qué se rompe el scraper preinstalado
web_extract y ddg descargan HTML en crudo e intentan parsearlo en el cliente. Reddit y LinkedIn responden con un muro de login o un reto de bot a ese tipo de petición, ddg limita las descargas automáticas y las páginas con muro de pago sirven un fragmento vacío. Una API de búsqueda estructurada no choca con ese muro para destinos públicos e indexados: llega a la fuente por un backend mantenido, gestiona la capa anti-bot y devuelve campos parseados. El agente recibe un objeto limpio en lugar de HTML roto que tendría que raspar.
# The failing path (do not use):
# Hermes -> web_extract(url) -> raw HTML -> regex/parse -> often empty or blocked
#
# The reliable path:
# Hermes -> scavio_tool(query) -> https://api.scavio.dev -> parsed JSONPaso 2: Guarda la clave de API como variable de entorno
Nunca escribas la clave directa en el archivo de la herramienta. Expórtala una vez para que tanto la llamada a Google como la de Reddit la lean. Todos los endpoints REST de Scavio se autentican con la cabecera Authorization: Bearer {API_KEY}.
export SCAVIO_API_KEY="sk_your_key_here"Paso 3: Llama al endpoint de Google SERP
POST a /api/v1/google. El valor por defecto light_request:true cuesta 1 crédito. Pon light_request:false (2 créditos) para obtener resultados orgánicos, people-also-ask, knowledge graph, búsquedas relacionadas y noticias en una sola respuesta. Esto sustituye la descarga de ddg que dejó de devolver resultados.
curl -X POST https://api.scavio.dev/api/v1/google \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "hermes agent web scraping", "light_request": false}'Paso 4: Llama al endpoint de búsqueda de Reddit
POST a /api/v1/reddit/search (1 crédito) para encontrar hilos. Cuando el agente necesite la discusión completa, POST a /api/v1/reddit/post (2 créditos) para obtener el post más su árbol de comentarios en JSON. Este es el acceso a enlaces que Hermes no conseguía con web_extract.
curl -X POST https://api.scavio.dev/api/v1/reddit/search \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "hermes agent setup"}'Paso 5: Regístralo como herramienta de Hermes
Envuelve las dos llamadas en una función y exponla al agente. La función recibe una consulta, llama a Google para contexto web y a Reddit para discusión de la comunidad, y devuelve un único dict limpio. Usa el ejemplo de Python o JS de abajo tal cual. Scavio también ofrece una integración oficial de Hermes si prefieres no escribir la herramienta a mano.
# See the full Python example below — paste it as your tool implementationEjemplo en Python
import os
import requests
SCAVIO_API_KEY = os.environ["SCAVIO_API_KEY"]
BASE = "https://api.scavio.dev/api/v1"
HEADERS = {
"Authorization": f"Bearer {SCAVIO_API_KEY}",
"Content-Type": "application/json",
}
def google_search(query: str) -> dict:
r = requests.post(
f"{BASE}/google",
headers=HEADERS,
json={"query": query, "light_request": False},
timeout=30,
)
r.raise_for_status()
return r.json()
def reddit_search(query: str) -> dict:
r = requests.post(
f"{BASE}/reddit/search",
headers=HEADERS,
json={"query": query},
timeout=30,
)
r.raise_for_status()
return r.json()
def web_research(query: str) -> dict:
"""Hermes tool: reliable web + Reddit data as clean JSON."""
return {
"web": google_search(query),
"reddit": reddit_search(query),
}
if __name__ == "__main__":
data = web_research("hermes agent web scraping")
print("organic results:", len(data["web"].get("results", [])))
print("reddit threads:", len(data["reddit"].get("results", [])))
Ejemplo en JavaScript
const SCAVIO_API_KEY = process.env.SCAVIO_API_KEY;
const BASE = "https://api.scavio.dev/api/v1";
const HEADERS = {
Authorization: `Bearer ${SCAVIO_API_KEY}`,
"Content-Type": "application/json",
};
async function googleSearch(query) {
const r = await fetch(`${BASE}/google`, {
method: "POST",
headers: HEADERS,
body: JSON.stringify({ query, light_request: false }),
});
if (!r.ok) throw new Error(`Google ${r.status}`);
return r.json();
}
async function redditSearch(query) {
const r = await fetch(`${BASE}/reddit/search`, {
method: "POST",
headers: HEADERS,
body: JSON.stringify({ query }),
});
if (!r.ok) throw new Error(`Reddit ${r.status}`);
return r.json();
}
// Hermes tool: reliable web + Reddit data as clean JSON
export async function webResearch(query) {
const [web, reddit] = await Promise.all([
googleSearch(query),
redditSearch(query),
]);
return { web, reddit };
}
webResearch("hermes agent web scraping").then((data) => {
console.log("organic results:", (data.web.results || []).length);
console.log("reddit threads:", (data.reddit.results || []).length);
});
Salida esperada
organic results: 9
reddit threads: 8
# La llamada a Google con light_request:false devuelve resultados orgánicos más búsquedas relacionadas, people-also-ask (questions), knowledge_graph y news_results en una respuesta. La llamada a Reddit devuelve hilos parseados que el agente lee directamente, sin raspar HTML.