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 <chester.curme@gmail.com>
This commit is contained in:
Julian Castro Pulgarin 2025-01-30 21:31:44 -05:00 committed by GitHub
parent 22219eefaf
commit b7e3e337b1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 19 additions and 5 deletions

View File

@ -36,7 +36,16 @@ class YahooFinanceNewsTool(BaseTool): # type: ignore[override, override]
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 @@ class YahooFinanceNewsTool(BaseTool): # type: ignore[override, override]
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 @@ class YahooFinanceNewsTool(BaseTool): # type: ignore[override, override]
@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)

View File

@ -9,7 +9,7 @@ yfinance = pytest.importorskip("yfinance")
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