Resumen
Este flujo de trabajo wraps Gemini grounding search con un respuesta validator. Cuando Gemini returns un empty grounding context (un conocido intermittent problema desde April 2026), el flujo de trabajo routes el same consulta to Scavio Google search y merges resultados en el agent's context. El agent self-heals sin user-visible degradation.
Desencadenador
Every agent consulta ese usa Gemini grounding search
Programación
Per agent consulta (event-driven)
Pasos del flujo de trabajo
Enviar consulta to Gemini con grounding enabled
Call Gemini API con grounding search enabled. Capture el respuesta including grounding citaciones y resultados de busqueda.
Validar grounding respuesta
Verificar if grounding_citations arreglo es non-empty y resultados de busqueda contiene actual contenido. An empty arreglo o missing grounding context indicates un silent failure.
Fallback to Scavio on empty grounding
Si validacion fails, enviar el same consulta to Scavio Google endpoint de busqueda. Extraer resultados organicos con titles, fragmentos, y URLs.
Fusionar resultados en agent context
Format Scavio resultados as grounding citaciones y inject them en el agent's context block. El agent proceeds as if Gemini grounding succeeded.
Log fallback evento
Record el fallback evento con marca de tiempo, consulta, y Gemini respuesta estado for monitoreo. Rastrear fallback frecuencia to assess Gemini confiabilidad.
Implementacion en Python
import requests, os, json, datetime
SCAVIO_KEY = os.environ["SCAVIO_API_KEY"]
def gemini_search_with_fallback(query: str, gemini_response: dict) -> dict:
citations = gemini_response.get("grounding_citations", [])
if citations:
return {"source": "gemini", "citations": citations}
# Gemini returned empty grounding — fallback
resp = requests.post("https://api.scavio.dev/api/v1/search",
headers={"x-api-key": SCAVIO_KEY},
json={"platform": "google", "query": query}, timeout=10)
data = resp.json()
fallback_citations = [
{"title": r["title"], "snippet": r["snippet"], "url": r["link"]}
for r in data.get("organic", [])[:5]
]
# Log fallback event
with open("fallback_log.jsonl", "a") as f:
f.write(json.dumps({"ts": datetime.datetime.utcnow().isoformat(),
"query": query, "gemini_status": "empty_grounding"}) + "\n")
return {"source": "scavio_fallback", "citations": fallback_citations}Implementacion en JavaScript
async function geminiSearchWithFallback(query, geminiResponse) {
const citations = geminiResponse.grounding_citations || [];
if (citations.length > 0) return { source: "gemini", citations };
const resp = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST",
headers: { "x-api-key": process.env.SCAVIO_API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ platform: "google", query })
});
const data = await resp.json();
const fallbackCitations = (data.organic || []).slice(0, 5).map(r => ({
title: r.title, snippet: r.snippet, url: r.link
}));
console.log(JSON.stringify({ ts: new Date().toISOString(), query, gemini_status: "empty_grounding" }));
return { source: "scavio_fallback", citations: fallbackCitations };
}Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA