The Problem
LangGraph agents maintain session state across turns, which is powerful for multi-step tasks but dangerous for factual accuracy. The agent remembers a price from three conversations ago, a stock level from yesterday, or a competitor's feature list from last month. Because the memory feels authoritative to the model, it confidently cites stale data without re-checking. Users trust the agent because it sounds certain, but the facts have already changed. There is no built-in mechanism in LangGraph to expire or refresh factual claims stored in memory.
The Scavio Solution
Scavio provides a verification layer that your LangGraph agent calls before citing any memorized fact that has a time dimension. Prices, availability, rankings, news references, anything that could have changed gets a fresh search before the agent commits to an answer. The search is fast enough to fit inside a normal agent turn without noticeable latency. You add a single tool node that checks freshness, and the agent learns to verify before asserting.
Before
Before Scavio, LangGraph agents confidently cited prices and facts from memory that were hours or days stale. Users received authoritative-sounding wrong answers with no way to detect the drift.
After
After Scavio, the agent verifies time-sensitive facts with a live search before citing them. Stale memory gets refreshed in-line, and users get answers grounded in data from the last few minutes.
Who It Is For
LangGraph developers building multi-turn agents that maintain state across sessions. If your agent cites prices, availability, or time-sensitive facts from memory without re-checking, this prevents stale hallucinations.
Key Benefits
- Live verification of memorized facts before agent cites them
- Sub-two-second latency fits inside normal conversation turns
- Works as a standard LangGraph tool node with no custom infrastructure
- Covers prices, stock levels, rankings, and news recency
- Agent learns when to verify versus when to trust cached memory
Python Example
import requests
from langgraph.graph import StateGraph, END
from typing import TypedDict
API_KEY = "your_scavio_api_key"
class AgentState(TypedDict):
query: str
memory_claim: str
verified: bool
fresh_data: str
def verify_freshness(state: AgentState) -> AgentState:
"""Check if a memorized claim is still accurate."""
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": state["query"]},
timeout=10,
)
res.raise_for_status()
data = res.json()
top_results = data.get("organic", [])[:3]
fresh = " | ".join(r.get("snippet", "") for r in top_results)
return {
**state,
"verified": True,
"fresh_data": fresh,
}
def should_verify(state: AgentState) -> str:
stale_keywords = ["price", "cost", "stock", "available", "ranking", "latest"]
if any(kw in state["query"].lower() for kw in stale_keywords):
return "verify"
return "skip"
graph = StateGraph(AgentState)
graph.add_node("verify", verify_freshness)
graph.add_node("respond", lambda s: s)
graph.set_entry_point("verify")
graph.add_conditional_edges("verify", should_verify, {"verify": "verify", "skip": "respond"})
graph.add_edge("verify", "respond")
graph.add_edge("respond", END)
app = graph.compile()
result = app.invoke({"query": "macbook pro m4 price", "memory_claim": "$1999", "verified": False, "fresh_data": ""})
print(f"Fresh data: {result['fresh_data'][:200]}")JavaScript Example
const API_KEY = "your_scavio_api_key";
async function verifyFreshness(query, memoryClaim) {
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 }),
});
if (!res.ok) throw new Error(`scavio ${res.status}`);
const data = await res.json();
const topResults = (data.organic ?? []).slice(0, 3);
const freshSnippets = topResults.map((r) => r.snippet ?? "").join(" | ");
const claimStillValid = freshSnippets.toLowerCase().includes(
memoryClaim.toLowerCase().replace("$", "")
);
return {
verified: true,
claimStillValid,
freshData: freshSnippets,
source: topResults[0]?.link ?? null,
};
}
// Use in LangGraph.js tool node
const result = await verifyFreshness("macbook pro m4 price 2026", "$1999");
console.log(result.claimStillValid ? "Memory is current" : "Memory is stale");
console.log(`Fresh data: ${result.freshData.slice(0, 200)}`);Platforms Used
Web search with knowledge graph, PAA, and AI overviews
Amazon
Product search with prices, ratings, and reviews
YouTube
Video search with transcripts and metadata
Walmart
Product search with pricing and fulfillment data