LangGraph 代理需要访问实时网络数据来回答当前问题、验证事实并确定其响应。在 LangGraph 图中添加搜索工具使代理能够按需查询 Google、Reddit、YouTube 和其他平台。本教程演示如何定义 Scadio 搜索工具、将其注册为 LangGraph 工具节点,并将其连接到代理图中。代理将能够在执行期间调用搜索工具并接收可以推理的结构化 JSON 结果。
前置条件
- 已安装 Python 3.10+
- 已安装 langgraph 和 langchain-core 软件包
- 来自 scavio.dev 的 Scavio API 密钥
- LangGraph状态图的基本理解
操作指南
步骤 1: 定义搜索工具功能
创建一个包装 Scavio API 并返回结构化结果的工具函数。
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)步骤 2: 创建代理状态和图
使用绑定到代理节点的搜索工具设置 LangGraph 状态图。
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)步骤 3: 连接图表
通过基于工具调用的条件路由连接代理和工具节点。
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()步骤 4: 使用搜索查询运行代理
调用代理并提出需要实时 Web 数据的问题。
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)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"))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"));预期输出
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.