El problema
Un agente de soporte o investigacion responde las mismas preguntas una y otra vez. "Cual es su horario?", "como restablezco mi contrasena?", "X es compatible con Y?" llegan decenas de veces al dia, y cada una dispara una llamada nueva a la SERP de Google mas una nueva pasada de resumen por el modelo. Pagas dos veces: una en creditos de busqueda por un resultado que ya obtuviste hace una hora, y otra en tokens de entrada y salida para releer y resumir exactamente los mismos fragmentos. Con el endpoint de Google SERP de Scavio a 1 credito por llamada (2 creditos cuando light_request es false para knowledge graph, people also ask y busquedas relacionadas), un agente parlanchin agota sus 7.000 creditos mensuales mas rapido de lo que deberia, y la factura del modelo crece al mismo ritmo porque cada consulta repetida vuelve a resumir miles de tokens de contexto recuperado.
La solucion de Scavio
Pon una cache con clave delante de la llamada de busqueda para que las consultas repetidas salten tanto la peticion a la API en vivo como los tokens de re-resumen. Normaliza la intencion del usuario en una clave estable (minusculas, sin espacios, quiza un hash de la pregunta canonica) y consultala. En un acierto devuelves la respuesta almacenada directamente: cero creditos de Scavio, cero tokens del modelo en ese turno. En un fallo llamas a POST https://api.scavio.dev/api/v1/google con autenticacion Bearer, resumes una vez y guardas la respuesta terminada bajo la clave con un TTL. El compromiso honesto: la cache es incorrecta para todo lo que deba ser en tiempo real, como noticias de ultima hora, precios en vivo o resultados de bolsa y deportes. Para esas intenciones pon un TTL muy corto o evita la cache por completo para no servir nunca un numero obsoleto. Para preguntas tipo FAQ perennes, un TTL de horas o dias es seguro y es donde aparece el ahorro.
Antes
Sin cache, cada pregunta identica paga el precio completo dos veces. El agente dispara una llamada a Google de Scavio (1 credito, o 2 con SERP completa), espera el viaje de ida y vuelta, y luego pasa los fragmentos recuperados por el modelo, gastando tokens de entrada para leerlos y tokens de salida para resumirlos. Pregunta lo mismo cien veces y pagas cien creditos de busqueda y cien pasadas de resumen por una sola informacion.
Después
Con cache, la primera ocurrencia paga una vez y cada repeticion despues es casi gratis. Un acierto devuelve la respuesta almacenada sin llamada a Scavio y sin tokens de resumen del modelo en ese turno, asi que los creditos se gastan solo en consultas genuinamente nuevas y en entradas de cache que expiraron. Tus 7.000 creditos mensuales rinden para muchas mas preguntas unicas, y la factura del modelo baja porque dejas de resumir los mismos fragmentos.
Para quien es
Equipos que ejecutan agentes de soporte, FAQ o investigacion que reciben las mismas intenciones repetidas y ven subir tanto sus creditos de API de busqueda como su factura de tokens del modelo. Si tu agente responde preguntas "como hago..." todo el dia, una cache se paga sola.
Beneficios clave
- Un acierto de cache cuesta cero creditos de Scavio y cero tokens del modelo en ese turno
- Las consultas tipo FAQ repetidas dejan de pagar dos veces por busqueda y re-resumen
- El TTL por intencion mantiene frescas las consultas en tiempo real y cacheadas las perennes
- Un flag de bypass deja que noticias y precios en vivo salten la cache limpiamente
- Tus 7.000 creditos mensuales del plan Project cubren muchas mas preguntas unicas
Ejemplo en Python
import time, hashlib, requests
API_KEY = "your_scavio_api_key"
URL = "https://api.scavio.dev/api/v1/google"
_cache = {} # swap for Redis in production
def _key(query: str) -> str:
norm = query.strip().lower()
return hashlib.sha256(norm.encode()).hexdigest()
def cached_search(query: str, ttl: int = 3600, bypass: bool = False) -> dict:
k = _key(query)
now = time.time()
if not bypass and k in _cache:
value, expires = _cache[k]
if now < expires:
return value # hit: no Scavio call, no model tokens
resp = requests.post(
URL,
headers={"Authorization": f"Bearer {API_KEY}"},
json={"query": query, "light_request": False},
timeout=15,
)
resp.raise_for_status()
data = resp.json()
_cache[k] = (data, now + ttl)
return data
# Evergreen FAQ: cache for an hour. Live prices: ttl=0 or bypass=True
print(cached_search("how to reset password", ttl=3600))
print(cached_search("btc price right now", ttl=0, bypass=True))Ejemplo en JavaScript
import crypto from "node:crypto";
const API_KEY = "your_scavio_api_key";
const URL = "https://api.scavio.dev/api/v1/google";
const cache = new Map(); // swap for Redis in production
const keyFor = (query) =>
crypto.createHash("sha256").update(query.trim().toLowerCase()).digest("hex");
async function cachedSearch(query, { ttl = 3600, bypass = false } = {}) {
const k = keyFor(query);
const now = Date.now();
if (!bypass && cache.has(k)) {
const { value, expires } = cache.get(k);
if (now < expires) return value; // hit: no Scavio call, no model tokens
}
const res = await fetch(URL, {
method: "POST",
headers: {
Authorization: `Bearer ${API_KEY}`,
"content-type": "application/json",
},
body: JSON.stringify({ query, light_request: false }),
});
if (!res.ok) throw new Error(`scavio ${res.status}`);
const data = await res.json();
cache.set(k, { value: data, expires: now + ttl * 1000 });
return data;
}
// Evergreen FAQ: cache for an hour. Live prices: ttl 0 or bypass true
console.log(await cachedSearch("how to reset password", { ttl: 3600 }));
console.log(await cachedSearch("btc price right now", { ttl: 0, bypass: true }));