From b7e3e337b15344632541482f31f98c91441d024e Mon Sep 17 00:00:00 2001 From: Julian Castro Pulgarin Date: Thu, 30 Jan 2025 21:31:44 -0500 Subject: [PATCH] community: Fix YahooFinanceNewsTool to handle updated yfinance data structure (#29498) *Description:** Updates the YahooFinanceNewsTool to handle the current yfinance news data structure. The tool was failing with a KeyError due to changes in the yfinance API's response format. This PR updates the code to correctly extract news URLs from the new structure. **Issue:** #29495 **Dependencies:** No new dependencies required. Works with existing yfinance package. The changes maintain backwards compatibility while fixing the KeyError that users were experiencing. The modified code properly handles the new data structure where: - News type is now at `content.contentType` - News URL is now at `content.canonicalUrl.url` --------- Co-authored-by: Chester Curme --- .../tools/yahoo_finance_news.py | 22 +++++++++++++++---- .../tools/test_yahoo_finance_news.py | 2 +- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/libs/community/langchain_community/tools/yahoo_finance_news.py b/libs/community/langchain_community/tools/yahoo_finance_news.py index 7a4f7d7f7660a..e8b8f648e0914 100644 --- a/libs/community/langchain_community/tools/yahoo_finance_news.py +++ b/libs/community/langchain_community/tools/yahoo_finance_news.py @@ -36,7 +36,16 @@ def _run( query: str, run_manager: Optional[CallbackManagerForToolRun] = None, ) -> str: - """Use the Yahoo Finance News tool.""" + """ + Use the Yahoo Finance News tool. + + Args: + query: Company ticker symbol (e.g., 'AAPL' for Apple). + run_manager: Optional callback manager. + + Returns: + str: Formatted news results or error message. + """ try: import yfinance except ImportError: @@ -53,7 +62,11 @@ def _run( links = [] try: - links = [n["link"] for n in company.news if n["type"] == "STORY"] + links = [ + n["content"]["canonicalUrl"]["url"] + for n in company.news + if n["content"]["contentType"] == "STORY" + ] except (HTTPError, ReadTimeout, ConnectionError): if not links: return f"No news found for company that searched with {query} ticker." @@ -69,8 +82,9 @@ def _run( @staticmethod def _format_results(docs: Iterable[Document], query: str) -> str: doc_strings = [ - "\n".join([doc.metadata["title"], doc.metadata["description"]]) + "\n".join([doc.metadata["title"], doc.metadata.get("description", "")]) for doc in docs - if query in doc.metadata["description"] or query in doc.metadata["title"] + if query in doc.metadata.get("description", "") + or query in doc.metadata["title"] ] return "\n\n".join(doc_strings) diff --git a/libs/community/tests/integration_tests/tools/test_yahoo_finance_news.py b/libs/community/tests/integration_tests/tools/test_yahoo_finance_news.py index 608f1c355fbfd..164b7ce889bc8 100644 --- a/libs/community/tests/integration_tests/tools/test_yahoo_finance_news.py +++ b/libs/community/tests/integration_tests/tools/test_yahoo_finance_news.py @@ -9,7 +9,7 @@ def test_success() -> None: """Test that the tool runs successfully.""" tool = YahooFinanceNewsTool() - query = "Microsoft" + query = "AAPL" result = tool.run(query) assert result is not None assert f"Company ticker {query} not found." not in result