Aperçu
Ce workflow encapsule la recherche de grounding Gemini avec un validateur de réponse. Lorsque Gemini renvoie un contexte de grounding vide (un problème intermittent connu depuis avril 2026), le workflow achemine la même requête vers la recherche Google de Scavio et fusionne les résultats dans le contexte de l'agent. L'agent se répare automatiquement sans dégradation visible pour l'utilisateur.
Déclencheur
Chaque requête d'agent utilisant la recherche de grounding Gemini
Planification
Par requête d'agent (déclenché par événement)
Étapes du workflow
Envoyer la requête à Gemini avec grounding activé
Appeler l'API Gemini avec la recherche de grounding activée. Capturer la réponse, y compris les citations de grounding et les résultats de recherche.
Valider la réponse de grounding
Vérifier que le tableau grounding_citations n'est pas vide et que les résultats de recherche contiennent du contenu réel. Un tableau vide ou un contexte de grounding manquant indique un échec silencieux.
Repli vers Scavio en cas de grounding vide
Si la validation échoue, envoyer la même requête au point de terminaison de recherche Google de Scavio. Extraire les résultats organiques avec titres, extraits et URL.
Fusionner les résultats dans le contexte de l'agent
Formater les résultats Scavio en tant que citations de grounding et les injecter dans le bloc de contexte de l'agent. L'agent procède comme si le grounding de Gemini avait réussi.
Enregistrer l'événement de repli
Enregistrer l'événement de repli avec l'horodatage, la requête et le statut de la réponse de Gemini pour le suivi. Surveiller la fréquence des replis pour évaluer la fiabilité de Gemini.
Implémentation 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}Implémentation 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 };
}Plateformes utilisées
Recherche web avec graphe de connaissances, PAA et aperçus IA