Resumen
Este flujo de trabajo implementa un LangGraph-based generator-critic loop donde el generator produces contenido y el critic agent verifies factual claims by busqueda Scavio for actual datos. Cuando el critic encuentra claims ese contradict live resultados de busqueda, it envia el contenido back to el generator con correction instructions. El loop continues hasta todos factual claims pass verification o el maximo iteration conteo es reached.
Desencadenador
On cada contenido generation solicitud
Programación
On-demand per contenido generation solicitud
Pasos del flujo de trabajo
Generator produces initial contenido
El generator agent crea contenido basado on el user's prompt y initial context.
Critic extrae factual claims
El critic agent identifies especifico factual claims in el generado contenido (prices, dates, caracteristicas, etc.).
Verify claims via Scavio search
For cada factual claim, consulta Scavio to encontrar actual datos y comparar contra el claim.
Puntuacion y return retroalimentacion
Puntuacion cada claim as verified, contradicted, o unverifiable. Return retroalimentacion to generator if contradictions encontrado.
Generator revises o finalize
Si contradictions exist, generator revises. Si todos claims pass, salida el verified contenido.
Implementacion en Python
import requests
from datetime import datetime
API_KEY = "your_scavio_api_key"
def verify_claim(claim: str, search_query: str) -> dict:
"""Critic tool: verify a factual claim against live data."""
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": search_query, "ai_overview": True},
timeout=15,
)
res.raise_for_status()
data = res.json()
evidence = []
if data.get("ai_overview"):
evidence.append({"source": "ai_overview", "text": data["ai_overview"]["text"][:300]})
for r in data.get("organic", [])[:3]:
evidence.append({"source": r.get("link", ""), "text": r.get("snippet", "")})
return {"claim": claim, "query": search_query, "evidence": evidence}
def critic_loop(claims: list[dict], max_iterations: int = 3) -> dict:
"""Run critic verification loop on a list of claims."""
results = []
for claim in claims:
verification = verify_claim(claim["text"], claim["search_query"])
results.append(verification)
return {
"verified_at": datetime.utcnow().isoformat(),
"claims_checked": len(claims),
"results": results,
}
def run():
claims = [
{"text": "SerpAPI costs $50/month for 5,000 searches", "search_query": "SerpAPI pricing 2026"},
{"text": "Tavily offers 1,000 free searches per month", "search_query": "Tavily free tier 2026"},
{"text": "Scavio API costs $0.005 per query", "search_query": "Scavio API pricing 2026"},
]
result = critic_loop(claims)
print(f"Critic loop: {result['claims_checked']} claims checked")
for r in result["results"]:
print(f" Claim: {r['claim'][:60]}...")
print(f" Evidence: {len(r['evidence'])} sources found")
if __name__ == "__main__":
run()Implementacion en JavaScript
const API_KEY = "your_scavio_api_key";
async function verifyClaim(claim, searchQuery) {
const res = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST",
headers: { "x-api-key": API_KEY, "content-type": "application/json" },
body: JSON.stringify({ platform: "google", query: searchQuery, ai_overview: true }),
});
const data = await res.json();
const evidence = [];
if (data.ai_overview) evidence.push({ source: "ai_overview", text: data.ai_overview.text.slice(0, 300) });
for (const r of (data.organic ?? []).slice(0, 3)) evidence.push({ source: r.link ?? "", text: r.snippet ?? "" });
return { claim, evidence };
}
const claims = [
{ text: "SerpAPI costs $50/month", query: "SerpAPI pricing 2026" },
{ text: "Tavily offers 1,000 free searches", query: "Tavily free tier 2026" },
];
for (const c of claims) {
const r = await verifyClaim(c.text, c.query);
console.log(`Claim: ${r.claim} -> ${r.evidence.length} evidence sources`);
}Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA