Current collected state Current
Observed since 20 Oct, 21:28 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Web search tools with Google and DuckDuckGo support
Web search capabilities using Google (primary) and DuckDuckGo (fallback).
uv add tool-search-tools
| Tool | Description |
|---|---|
web_search | Search with automatic Google → DuckDuckGo fallback |
search_google | Google only (requires API credentials) |
search_duckduckgo | DuckDuckGo only (no credentials needed) |
Set environment variables for Google Programmable Search Engine:
export GOOGLE_API_KEY="your-api-key"
export GOOGLE_CSE_ID="your-cse-id"
Without these, web_search automatically falls back to DuckDuckGo.
export GOOGLE_SEARCH_RATE_LIMIT="1.0" # requests per second
export GOOGLE_SEARCH_TIMEOUT="30.0" # seconds
export DUCKDUCKGO_SEARCH_RATE_LIMIT="1.0"
export DUCKDUCKGO_SEARCH_TIMEOUT="30.0"
from search_tools import web_search
result = await web_search.ainvoke({"query": "python async tutorial", "num_results": 5})
print(result["provider"]) # "google" or "duckduckgo"
for r in result["results"]:
print(f"{r['title']}: {r['url']}")
from langchain_openai import ChatOpenAI
from langgraph.prebuilt import ToolNode
from search_tools import web_search
tools = [web_search]
llm = ChatOpenAI(model="gpt-4o-mini")
llm_with_tools = llm.bind_tools(tools)
tool_node = ToolNode(tools)
{
"results": [
{"title": "Page Title", "url": "https://...", "snippet": "Description..."},
...
],
"provider": "google", # or "duckduckgo"
"query": "original query",
"count": 5
}
| Tool | Use Case |
|---|---|
web_search | Default choice - automatic fallback |
search_google | Need Google specifically, handle errors yourself |
search_duckduckgo | Testing, or when Google quota exhausted |
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 1.0.2 | 1 Dec 2025 | 8 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 21:28 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:e7e5e162cfc030a4fad304542123aa1481bde39a13091002e564f4ccb1645de5