from langchain_community.document_loaders import ArxivLoader, WikipediaLoader
from langchain_core.tools import tool
from langchain_tavily import TavilySearch
@tool(description="search-web-tool", parse_docstring=True)
async def search_web(query: str, max_results: int = 5) -> str:
"""Searches the web for a query and return formatted results.
Args:
query (str): The search query.
max_results (int, optional): Maximum number of results to return.
Defaults to 5.
Returns:
str: A string containing the formatted search results. Each result
includes a document source, page information, and content.
"""
# Configure tavily search tool
tavily_search_tool = TavilySearch(
max_results=max_results,
topic="general",
search_depth="advanced"
)
# Execute the search
search_docs = await tavily_search_tool.arun(query)
# Format results
formatted_search_docs = "\n\n---\n\n".join(
[
(f''
f'{doc.get("title", "No Title")}\n'
f'{doc.get("content", "")}\n')
for doc in search_docs.get('results', [])
]
)
return formatted_search_docs
@tool("search-wikipedia-tool", parse_docstring=True)
async def search_wikipedia(query: str, max_results: int = 5) -> str:
"""Search Wikipedia for articles matching the query and
return formatted results.
Args:
query (str): The search query.
max_results (int, optional): Maximum number of results to return.
Defaults to 5.
Returns:
str: A string containing the formatted search results. Each result
includes a document source, page information, and content.
"""
search_docs = await WikipediaLoader(
query=query,
load_max_docs=max_results,
load_all_available_meta=True,
doc_content_chars_max=100000
).aload()
formatted_search_docs = "\n\n---\n\n".join(
[
(f''
f'\n{doc.page_content}\n')
for doc in search_docs
]
)
return formatted_search_docs
@tool("search-arxiv-tool", parse_docstring=True)
async def search_arxiv(query: str, max_results: int = 5) -> str:
"""Search arXiv for academic papers matching the query and
return formatted results.
Args:
query (str): The search query.
max_results (int, optional): Maximum number of results to return.
Defaults to 5.
Returns:
str: A string containing the formatted search results. Each result
includes a document source, page information, and content.
"""
search_docs = await ArxivLoader(
query=query,
load_max_docs=max_results
).aload()
formatted_search_docs = "\n\n---\n\n".join(
[
(f''
f'\n{doc.page_content}\n')
for doc in search_docs
]
)
return formatted_search_docs