El problema
OpenWebUI viene con un interruptor de búsqueda web, pero los motores de búsqueda predeterminados (SearXNG, Tavily) devuelven resultados inconsistentes o fallan silenciosamente cuando las instancias autohospedadas alcanzan los límites de velocidad. Los usuarios ven errores "No pude encontrar información" en mitad de la conversación. La herramienta de búsqueda parece funcionar en las indicaciones de prueba, pero falla bajo una carga multiusuario real porque la instancia subyacente de SearXNG no tiene SLA y los límites de nivel gratuito de Tavily son 1000 consultas/mes.
La solucion de Scavio
Reemplace el motor de búsqueda predeterminado en OpenWebUI con la API de Scavio a través de una herramienta de función personalizada o canal RAG. Scavio devuelve JSON estructurado con resultados orgánicos, descripciones generales de IA y datos de gráficos de conocimiento en cada llamada. El punto final maneja la limitación de velocidad, los reintentos y la mitigación anti-bot en el lado del servidor, por lo que OpenWebUI obtiene resultados limpios independientemente del número de usuarios simultáneos. Configure una cadena alternativa: Scavio primaria, SearXNG secundaria.
Antes
Antes del cambio, la búsqueda de OpenWebUI fallaba entre el 15% y el 25% del tiempo durante las horas pico. Los usuarios perdieron la confianza en la palanca de búsqueda y dejaron de usarla, y de forma predeterminada copiaron las consultas en una pestaña separada del navegador.
Después
Después de cambiar a Scavio, los errores de búsqueda cayeron por debajo del 1%. Los usuarios confían en la palanca de búsqueda para preguntas en tiempo real y el administrador ya no mantiene una instancia de SearXNG Docker.
Para quien es
Autohospedadores de OpenWebUI que necesitan una base de búsqueda web confiable. Los equipos que ejecutan OpenWebUI para el trabajo de conocimiento interno y no pueden tolerar fallas de búsqueda intermitentes.
Beneficios clave
- La tasa de falla inferior al 1% reemplaza el 15-25% de falla con SearXNG
- La respuesta JSON estructurada se asigna directamente al formato de contexto OpenWebUI
- No hay una instancia de SearXNG Docker para mantener o depurar
- Gratis 250 consultas/mes cubre uso personal, $30/mes cubre equipos
- La extracción de la descripción general de la IA proporciona a OpenWebUI un contexto de base más rico
Ejemplo en Python
import requests
API_KEY = "your_scavio_api_key"
SEARXNG_URL = "http://localhost:8888/search" # fallback
def openwebui_search(query: str) -> list[dict]:
"""Primary: Scavio. Fallback: SearXNG."""
try:
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": query, "ai_overview": True},
timeout=10,
)
res.raise_for_status()
data = res.json()
results = []
if data.get("ai_overview"):
results.append({"title": "AI Overview", "snippet": data["ai_overview"]["text"], "link": ""})
for r in data.get("organic", [])[:5]:
results.append({"title": r.get("title", ""), "snippet": r.get("snippet", ""), "link": r.get("link", "")})
return results
except Exception:
# Fallback to SearXNG
res = requests.get(SEARXNG_URL, params={"q": query, "format": "json"}, timeout=10)
return [{"title": r["title"], "snippet": r.get("content", ""), "link": r["url"]} for r in res.json().get("results", [])[:5]]
results = openwebui_search("latest openwebui release 2026")
for r in results:
print(f"{r["title"]}: {r["snippet"][:80]}")Ejemplo en JavaScript
const API_KEY = "your_scavio_api_key";
async function openwebuiSearch(query) {
try {
const res = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST",
headers: { "x-api-key": API_KEY, "content-type": "application/json" },
body: JSON.stringify({ platform: "google", query, ai_overview: true }),
});
if (!res.ok) throw new Error(`scavio ${res.status}`);
const data = await res.json();
const results = [];
if (data.ai_overview) results.push({ title: "AI Overview", snippet: data.ai_overview.text, link: "" });
for (const r of (data.organic ?? []).slice(0, 5)) results.push({ title: r.title ?? "", snippet: r.snippet ?? "", link: r.link ?? "" });
return results;
} catch {
const res = await fetch(`http://localhost:8888/search?q=${encodeURIComponent(query)}&format=json`);
const data = await res.json();
return (data.results ?? []).slice(0, 5).map((r) => ({ title: r.title, snippet: r.content ?? "", link: r.url }));
}
}
const results = await openwebuiSearch("latest openwebui release 2026");
results.forEach((r) => console.log(`${r.title}: ${r.snippet.slice(0, 80)}`));Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA