El problema
Los agentes que dependen de un único proveedor de búsqueda caen cuando ese proveedor tiene una interrupción o un evento de límite de velocidad. No hay conmutación por error integrada en LangChain, CrewAI ni en la mayoría de los marcos de agentes. Una interrupción de 15 minutos durante la ejecución de un agente programado significa que toda la ejecución falla.
La solucion de Scavio
Un contenedor de conmutación por error prueba el proveedor de búsqueda principal, recurre a un secundario y devuelve resultados almacenados en caché si ambos fallan. El agente continúa funcionando durante las interrupciones del proveedor.
Antes
El agente nocturno que se ejecuta a las 2 a.m. utiliza SerpAPI como único proveedor de búsqueda. SerpAPI tiene una interrupción de 12 minutos a las 2:07 a.m. El agente falla después de 5 reintentos. Falta el informe de la mañana. El ingeniero de guardia se despierta para arreglarlo.
Después
El agente utiliza el contenedor de conmutación por error. A las 2:07 am, Scavio se agota. El contenedor vuelve a intentarlo automáticamente con Brave. Valiente lo consigue. La ejecución del agente se completa normalmente. No hay alerta, no se necesita intervención manual.
Para quien es
Desarrolladores que ejecutan agentes programados o de producción que no pueden tolerar el tiempo de inactividad debido a interrupciones del proveedor de búsqueda o límites de velocidad.
Beneficios clave
- Cero tiempo de inactividad debido a interrupciones de un solo proveedor
- Resultados almacenados en caché como último recurso
- Retroceso exponencial antes de cambiar de proveedor
- Funciona con cualquier combinación de proveedores de búsqueda
Ejemplo en Python
import requests
import time
PROVIDERS = [
{"name": "scavio", "call": lambda q, n: requests.post(
"https://api.scavio.dev/api/v1/search",
json={"query": q, "num_results": n},
headers={"x-api-key": "your-scavio-key"}, timeout=8
).json().get("organic_results", [])},
{"name": "brave", "call": lambda q, n: requests.get(
"https://api.search.brave.com/res/v1/web/search",
params={"q": q, "count": n},
headers={"X-Subscription-Token": "your-brave-key"}, timeout=8
).json().get("web", {}).get("results", [])}
]
_CACHE = {}
def search(query: str, n: int = 5) -> list:
for provider in PROVIDERS:
for attempt in range(2):
try:
results = provider["call"](query, n)
if results:
_CACHE[query] = results
return results
except Exception:
time.sleep(2 ** attempt)
return _CACHE.get(query, [])
results = search("best AI tools 2026")
print(f"{len(results)} results")Ejemplo en JavaScript
const CACHE = new Map();
const PROVIDERS = [
{ name: 'scavio', call: async (q, n) => (await (await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', signal: AbortSignal.timeout(8000),
headers: { 'Content-Type': 'application/json', 'x-api-key': 'your-scavio-key' },
body: JSON.stringify({ query: q, num_results: n })
})).json()).organic_results ?? [] }
];
async function search(query, n = 5) {
for (const p of PROVIDERS) {
try { const r = await p.call(query, n); if (r.length) { CACHE.set(query, r); return r; } }
catch (e) { console.log(`${p.name} failed: ${e.message}`); }
}
return CACHE.get(query) ?? [];
}Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA