Los hilos de r/OpenWebUI 2026 se quejan de que la herramienta de búsqueda web incorporada se activa en cada mensaje, quemando créditos y ralentizando las respuestas. La solución es una capa de búsqueda condicional: un clasificador liviano decide si la consulta necesita datos en tiempo real y solo entonces llama a Scavio. Este tutorial conecta el clasificador al marco de funciones de OpenWebUI.
Requisitos previos
- OpenWebUI 0.5+ autohospedado
- Una clave API de Scavio
- Python 3.10+
- Un pequeño LLM local o clasificador de expresiones regulares
Guia paso a paso
Paso 1: Crear una función OpenWebUI
Las funciones se encuentran en configuración de administrador > funciones > nuevo.
# File: conditional_search.py
from pydantic import BaseModel
import os, requests, rePaso 2: Escribe el clasificador de búsqueda de necesidades
Comience de manera simple: palabras clave de expresiones regulares que indiquen la necesidad de frescura.
NEEDS_SEARCH = re.compile(r'\b(today|latest|2026|news|price|current|right now|recent)\b', re.I)
def needs_search(prompt: str) -> bool:
return bool(NEEDS_SEARCH.search(prompt))Paso 3: Llame a Scavio sólo cuando sea necesario
Envuelva la interfaz de la herramienta OpenWebUI.
class Tools:
def search_web(self, query: str) -> str:
if not needs_search(query):
return ''
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': os.environ['SCAVIO_API_KEY']},
json={'query': query})
return str(r.json().get('organic_results', [])[:5])Paso 4: Regístrese como herramienta de búsqueda web predeterminada
En configuración de OpenWebUI > herramientas, establezca conditional_search como proveedor activo.
# Admin > Tools > Web Search > Provider: conditional_searchPaso 5: Monitorear los ahorros
Verifique el recuento de llamadas a la función antes y después. Espere una reducción de crédito del 60-80%.
# OpenWebUI > Admin > Usage > conditional_search.search_webEjemplo en Python
import os, requests, re
API_KEY = os.environ['SCAVIO_API_KEY']
NEEDS = re.compile(r'\b(today|latest|2026|news|price|current|recent)\b', re.I)
def maybe_search(prompt):
if not NEEDS.search(prompt):
return None
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'query': prompt})
return r.json().get('organic_results', [])[:5]
print(maybe_search('Explain quicksort'))
print(maybe_search('latest Claude 4.7 release notes'))Ejemplo en JavaScript
const API_KEY = process.env.SCAVIO_API_KEY;
const NEEDS = /\b(today|latest|2026|news|price|current|recent)\b/i;
export async function maybeSearch(prompt) {
if (!NEEDS.test(prompt)) return null;
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ query: prompt })
});
const data = await r.json();
return data.organic_results?.slice(0, 5);
}Salida esperada
Static prompts (math, code) skip the search call. Freshness-sensitive prompts trigger Scavio. Typical savings: 60-80% fewer API calls vs. unconditional search.