Skip to content

Commit

Permalink
community: Fix YahooFinanceNewsTool to handle updated yfinance data s…
Browse files Browse the repository at this point in the history
…tructure (#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 <[email protected]>
  • Loading branch information
Jcasttrop and ccurme authored Jan 31, 2025
1 parent 22219ee commit b7e3e33
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 5 deletions.
22 changes: 18 additions & 4 deletions libs/community/langchain_community/tools/yahoo_finance_news.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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."
Expand All @@ -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)
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit b7e3e33

Please sign in to comment.