Les agents LangGraph ont besoin d'accéder à des données web en direct pour répondre aux questions actuelles, vérifier les faits et ancrer leurs réponses. Ajouter un outil de recherche à un graphe LangGraph donne à l'agent la capacité d'interroger Google, Reddit, YouTube et d'autres plateformes à la demande. Ce tutoriel montre comment définir un outil de recherche Scavio, l'enregistrer en tant que nœud d'outil LangGraph et l'intégrer dans votre graphe d'agent. L'agent pourra appeler l'outil de recherche pendant l'exécution et recevoir des résultats JSON structurés sur lesquels il pourra raisonner.
Prérequis
- Python 3.10+ installé
- Paquets langgraph et langchain-core installés
- Une clé API Scavio de scavio.dev
- Compréhension de base des graphes d'état LangGraph
Parcours
Étape 1: Définir la fonction de l'outil de recherche
Créez une fonction d'outil qui encapsule l'API Scavio et renvoie des résultats structurés.
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 for current information."""
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)Étape 2: Créer l'état de l'agent et le graphe
Configurez le graphe d'état LangGraph avec l'outil de recherche lié au nœud de l'agent.
from langgraph.graph import StateGraph, MessagesState
from langgraph.prebuilt import ToolNode
from langchain_openai import ChatOpenAI
tools = [web_search]
model = ChatOpenAI(model="gpt-4o-mini").bind_tools(tools)
def agent(state: MessagesState):
return {"messages": [model.invoke(state["messages"])]}
tool_node = ToolNode(tools)Étape 3: Câbler le graphe
Connectez les nœuds d'agent et d'outil avec un routage conditionnel basé sur les appels d'outils.
from langgraph.graph import END
def should_continue(state: MessagesState):
last = state["messages"][-1]
return "tools" if last.tool_calls else END
graph = StateGraph(MessagesState)
graph.add_node("agent", agent)
graph.add_node("tools", tool_node)
graph.set_entry_point("agent")
graph.add_conditional_edges("agent", should_continue)
graph.add_edge("tools", "agent")
app = graph.compile()Étape 4: Exécuter l'agent avec une requête de recherche
Invoquez l'agent avec une question qui nécessite des données web en direct.
from langchain_core.messages import HumanMessage
result = app.invoke({
"messages": [HumanMessage(content="What are the top CRM tools for startups in 2026?")]
})
print(result["messages"][-1].content)Exemple Python
import os, requests
from langchain_core.tools import tool
@tool
def web_search(query: str) -> str:
"""Search the web for current information."""
resp = requests.post("https://api.scavio.dev/api/v1/search",
headers={"x-api-key": os.environ["SCAVIO_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)
print(web_search.invoke("best CRM 2026"))Exemple JavaScript
const H = {"x-api-key": process.env.SCAVIO_API_KEY, "Content-Type": "application/json"};
async function webSearch(query) {
const r = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST", headers: H,
body: JSON.stringify({platform: "google", query})
});
const results = (await r.json()).organic_results || [];
return results.slice(0,5).map(r => r.title + ": " + (r.snippet||"")).join("\n");
}
console.log(await webSearch("best CRM 2026"));Sortie attendue
A LangGraph agent that can call a web search tool during execution, receiving structured search results and using them to answer questions with current data.