Los agentes de LangGraph sobresalen en el razonamiento de varios pasos, pero alucinan cuando no tienen acceso a la información actual. Agregar un nodo de herramienta de búsqueda web le brinda al agente una base de datos en vivo para que pueda verificar hechos, encontrar fuentes y generar resultados de investigación a partir de resultados de búsqueda reales. La API de Scavio se integra como un nodo de herramienta que devuelve JSON estructurado que incluye resultados orgánicos, descripciones generales de IA y datos de People Also Ask. Este tutorial muestra cómo definir una herramienta de búsqueda, conectarla a un gráfico LangGraph y crear un agente de investigación que consulte múltiples palabras clave y sintetice los hallazgos.
Requisitos previos
- Python 3.10+ instalado
- langgraph y langchain-core instalados
- Una clave API de Scavio de scavio.dev
- Familiaridad básica con las definiciones de gráficos LangGraph
Guia paso a paso
Paso 1: Definir la herramienta de búsqueda
Cree una función de herramienta que llame a la API de Scavio y devuelva resultados estructurados para el agente.
import os, requests
from langchain_core.tools import tool
API_KEY = os.environ["SCAVIO_API_KEY"]
@tool
def web_search(query: str) -> str:
"""Search the web and return top results."""
resp = requests.post("https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": query})
results = resp.json().get("organic_results", [])[:5]
return "\n".join(f"{r['title']}: {r.get('snippet','')}" for r in results)Paso 2: Construye el gráfico
Cree un LangGraph StateGraph con un nodo de agente y un nodo de herramienta para búsqueda.
from langgraph.graph import StateGraph, MessagesState
from langgraph.prebuilt import ToolNode
tools = [web_search]
tool_node = ToolNode(tools)
def agent(state: MessagesState):
# Your LLM call here with tools bound
# Returns messages with potential tool calls
pass
graph = StateGraph(MessagesState)
graph.add_node("agent", agent)
graph.add_node("tools", tool_node)
graph.add_edge("agent", "tools")
graph.add_edge("tools", "agent")
graph.set_entry_point("agent")Paso 3: Agregar lógica de investigación
Configure el agente para ejecutar múltiples búsquedas y sintetizar resultados.
def research(topic, num_queries=3):
app = graph.compile()
initial = {"messages": [{
"role": "user",
"content": f"Research '{topic}'. Search {num_queries} related queries, then summarize findings with sources."
}]}
result = app.invoke(initial)
return result["messages"][-1].content
findings = research("best vector databases 2026")
print(findings)Paso 4: Pruebe la herramienta de búsqueda de forma independiente
Verifique que la herramienta de búsqueda arroje buenos datos antes de ejecutar el gráfico completo.
result = web_search.invoke("best vector databases 2026")
print(result[:500])Ejemplo en Python
import os, requests
API_KEY = os.environ["SCAVIO_API_KEY"]
def search(query):
resp = requests.post("https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": query})
return resp.json().get("organic_results", [])[:5]
for r in search("best vector databases 2026"):
print(f"{r['title']}: {r.get('snippet','')[:80]}")Ejemplo en JavaScript
const H = {"x-api-key": process.env.SCAVIO_API_KEY, "Content-Type": "application/json"};
async function search(query) {
const r = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST", headers: H,
body: JSON.stringify({platform: "google", query})
});
return (await r.json()).organic_results || [];
}
search("best vector databases 2026").then(rs =>
rs.slice(0,5).forEach(r => console.log(r.title))
);Salida esperada
A LangGraph agent with a search tool node that queries live SERP data, runs multi-step research, and synthesizes findings with source citations.