mirror of
https://github.com/hwchase17/langchain
synced 2024-11-06 03:20:49 +00:00
54adcd9e82
We add a tool and retriever for the [AskNews](https://asknews.app) platform with example notebooks. The retriever can be invoked with: ```py from langchain_community.retrievers import AskNewsRetriever retriever = AskNewsRetriever(k=3) retriever.invoke("impact of fed policy on the tech sector") ``` To retrieve 3 documents in then news related to fed policy impacts on the tech sector. The included notebook also includes deeper details about controlling filters such as category and time, as well as including the retriever in a chain. The tool is quite interesting, as it allows the agent to decide how to obtain the news by forming a query and deciding how far back in time to look for the news: ```py from langchain_community.tools.asknews import AskNewsSearch from langchain import hub from langchain.agents import AgentExecutor, create_openai_functions_agent from langchain_openai import ChatOpenAI tool = AskNewsSearch() instructions = """You are an assistant.""" base_prompt = hub.pull("langchain-ai/openai-functions-template") prompt = base_prompt.partial(instructions=instructions) llm = ChatOpenAI(temperature=0) asknews_tool = AskNewsSearch() tools = [asknews_tool] agent = create_openai_functions_agent(llm, tools, prompt) agent_executor = AgentExecutor( agent=agent, tools=tools, verbose=True, ) agent_executor.invoke({"input": "How is the tech sector being affected by fed policy?"}) ``` --------- Co-authored-by: Emre <e@emre.pm>
81 lines
2.5 KiB
Python
81 lines
2.5 KiB
Python
"""
|
|
Tool for the AskNews API.
|
|
|
|
To use this tool, you must first set your credentials as environment variables:
|
|
ASKNEWS_CLIENT_ID
|
|
ASKNEWS_CLIENT_SECRET
|
|
"""
|
|
|
|
from typing import Optional, Type
|
|
|
|
from langchain_core.callbacks import (
|
|
AsyncCallbackManagerForToolRun,
|
|
CallbackManagerForToolRun,
|
|
)
|
|
from langchain_core.pydantic_v1 import BaseModel, Field
|
|
from langchain_core.tools import BaseTool
|
|
|
|
from langchain_community.utilities.asknews import AskNewsAPIWrapper
|
|
|
|
|
|
class SearchInput(BaseModel):
|
|
"""Input for the AskNews Search tool."""
|
|
|
|
query: str = Field(
|
|
description="Search query to be used for finding real-time or historical news "
|
|
"information."
|
|
)
|
|
hours_back: Optional[int] = Field(
|
|
0,
|
|
description="If the Assistant deems that the event may have occurred more "
|
|
"than 48 hours ago, it estimates the number of hours back to search. For "
|
|
"example, if the event was one month ago, the Assistant may set this to 720. "
|
|
"One week would be 168. The Assistant can estimate up to on year back (8760).",
|
|
)
|
|
|
|
|
|
class AskNewsSearch(BaseTool):
|
|
"""Tool that searches the AskNews API."""
|
|
|
|
name: str = "asknews_search"
|
|
description: str = (
|
|
"This tool allows you to perform a search on up-to-date news and historical "
|
|
"news. If you needs news from more than 48 hours ago, you can estimate the "
|
|
"number of hours back to search."
|
|
)
|
|
api_wrapper: AskNewsAPIWrapper = Field(default_factory=AskNewsAPIWrapper) # type: ignore[arg-type]
|
|
max_results: int = 10
|
|
args_schema: Type[BaseModel] = SearchInput
|
|
|
|
def _run(
|
|
self,
|
|
query: str,
|
|
hours_back: int = 0,
|
|
run_manager: Optional[CallbackManagerForToolRun] = None,
|
|
) -> str:
|
|
"""Use the tool."""
|
|
try:
|
|
return self.api_wrapper.search_news(
|
|
query,
|
|
hours_back=hours_back,
|
|
max_results=self.max_results,
|
|
)
|
|
except Exception as e:
|
|
return repr(e)
|
|
|
|
async def _arun(
|
|
self,
|
|
query: str,
|
|
hours_back: int = 0,
|
|
run_manager: Optional[AsyncCallbackManagerForToolRun] = None,
|
|
) -> str:
|
|
"""Use the tool asynchronously."""
|
|
try:
|
|
return await self.api_wrapper.asearch_news(
|
|
query,
|
|
hours_back=hours_back,
|
|
max_results=self.max_results,
|
|
)
|
|
except Exception as e:
|
|
return repr(e)
|