Resumen
AI agents ese depend on search herramientas for grounding fail silently cuando el search API degrades. Respuesta times creep up, esquemas cambio, o resultados go empty, y your agent inicia hallucinating porque it obtiene no web datos. Este flujo de trabajo ejecuta cada hora, envia probar consultas to your search API, measures respuesta latencia contra your SLA, valida el respuesta esquema matches que your agent expects, y alertas inmediatamente cuando cualquier verificar fails. Catch search herramienta degradation antes de your usuarios notice el agent giving stale answers.
Desencadenador
Cron programar (cada hora)
Programación
Hourly
Pasos del flujo de trabajo
Enviar probar search call
Ejecutar un known-good consulta contra el Scavio search API. Use un consulta ese deberia always return resultados.
Measure latencia
Record el tiempo de respuesta. Comparar contra your SLA umbral (e.g., bajo 2 segundos for P95).
Validar respuesta esquema
Verificar ese el respuesta contiene expected campos: organic arreglo, resultado conteo, AI resumen. Marcar missing o empty campos.
Verificar resultado calidad
Verify ese resultados organicos son non-empty, URLs son valid, y fragmentos contiene expected palabras clave.
Alert on failure
Si cualquier verificar fails, enviar un alerta con el especifico failure reason, marca de tiempo, y raw respuesta for depuracion.
Implementacion en Python
import requests, os, json, time
from datetime import datetime
H = {"x-api-key": os.environ["SCAVIO_API_KEY"]}
# Test queries that should always return results
TEST_QUERIES = [
{"query": "python programming", "platform": "google", "min_results": 5},
{"query": "javascript tutorial", "platform": "google", "min_results": 5},
{"query": "best headphones 2026", "platform": "amazon", "min_results": 3},
]
SLA_LATENCY_MS = 2000 # 2 second SLA
def run_health_check(test):
"""Run a single health check against the search API."""
start = time.time()
try:
r = requests.post("https://api.scavio.dev/api/v1/search", headers=H,
json={"platform": test["platform"], "query": test["query"]},
timeout=10).json()
latency_ms = round((time.time() - start) * 1000)
except Exception as e:
return {"status": "ERROR", "query": test["query"], "error": str(e), "latency_ms": None}
organic = r.get("organic", [])
checks = {
"has_organic": len(organic) > 0,
"meets_min_results": len(organic) >= test["min_results"],
"has_titles": all(o.get("title") for o in organic[:3]),
"has_links": all(o.get("link") for o in organic[:3]),
"under_sla": latency_ms < SLA_LATENCY_MS,
}
all_passed = all(checks.values())
return {
"status": "OK" if all_passed else "DEGRADED",
"query": test["query"],
"platform": test["platform"],
"latency_ms": latency_ms,
"result_count": len(organic),
"checks": checks,
"checked_at": datetime.utcnow().isoformat()
}
results = []
for test in TEST_QUERIES:
result = run_health_check(test)
results.append(result)
print(f"[{result['status']}] {result['platform']}/{result['query']} | {result.get('latency_ms', 'N/A')}ms | {result.get('result_count', 0)} results")
if result["status"] != "OK":
failed = [k for k, v in result.get("checks", {}).items() if not v]
print(f" Failed checks: {', '.join(failed)}")
healthy = sum(1 for r in results if r["status"] == "OK")
print(f"\nHealth: {healthy}/{len(results)} checks passed")Implementacion en JavaScript
const H = {"x-api-key": process.env.SCAVIO_API_KEY, "Content-Type": "application/json"};
const TEST_QUERIES = [
{query: "python programming", platform: "google", minResults: 5},
{query: "javascript tutorial", platform: "google", minResults: 5},
{query: "best headphones 2026", platform: "amazon", minResults: 3},
];
const SLA_LATENCY_MS = 2000;
async function runHealthCheck(test) {
const start = Date.now();
try {
const r = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST", headers: H,
body: JSON.stringify({platform: test.platform, query: test.query})
}).then(r => r.json());
const latencyMs = Date.now() - start;
const organic = r.organic || [];
const checks = {
hasOrganic: organic.length > 0,
meetsMinResults: organic.length >= test.minResults,
hasTitles: organic.slice(0, 3).every(o => o.title),
hasLinks: organic.slice(0, 3).every(o => o.link),
underSla: latencyMs < SLA_LATENCY_MS,
};
const allPassed = Object.values(checks).every(Boolean);
return {
status: allPassed ? "OK" : "DEGRADED",
query: test.query, platform: test.platform,
latencyMs, resultCount: organic.length, checks,
checkedAt: new Date().toISOString()
};
} catch (e) {
return {status: "ERROR", query: test.query, error: e.message, latencyMs: null};
}
}
(async () => {
const results = [];
for (const test of TEST_QUERIES) {
const result = await runHealthCheck(test);
results.push(result);
console.log(`[${result.status}] ${result.platform}/${result.query} | ${result.latencyMs ?? "N/A"}ms | ${result.resultCount || 0} results`);
if (result.status !== "OK") {
const failed = Object.entries(result.checks || {}).filter(([,v]) => !v).map(([k]) => k);
console.log(` Failed: ${failed.join(", ")}`);
}
}
const healthy = results.filter(r => r.status === "OK").length;
console.log(`\nHealth: ${healthy}/${results.length} checks passed`);
})();Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA
Amazon
Búsqueda de productos con precios, calificaciones y reseñas