Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions tests/test_alpha_vantage_hardening.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

import tradingagents.dataflows.alpha_vantage_common as av
import tradingagents.dataflows.alpha_vantage_fundamentals as avf
import tradingagents.dataflows.alpha_vantage_news as avn
import tradingagents.dataflows.alpha_vantage_stock as avs


Expand Down Expand Up @@ -133,3 +134,18 @@ def test_unparseable_body_is_never_served_untrimmed(monkeypatch):
def test_empty_body_still_passes_through(monkeypatch):
monkeypatch.setattr(avs, "_make_api_request", lambda *a, **k: "")
assert avs.get_stock("IBM", "2024-05-09", "2024-05-10") == ""


@pytest.mark.unit
def test_global_news_none_args_use_config_defaults(monkeypatch):
# #1326: the LLM tool call passes look_back_days=None / limit=None
# explicitly (rather than omitting them), which used to bypass the
# function's literal defaults and crash inside timedelta(days=None).
captured = {}
monkeypatch.setattr(
avn, "_make_api_request", lambda fn, params: captured.update(params) or "{}"
)
config = avn.get_config()
result = avn.get_global_news("2024-05-10", look_back_days=None, limit=None)
assert result == "{}"
assert captured["limit"] == str(config["global_news_article_limit"])
17 changes: 14 additions & 3 deletions tradingagents/dataflows/alpha_vantage_news.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from .alpha_vantage_common import _make_api_request, format_datetime_for_api
from .config import get_config


def get_news(ticker, start_date, end_date) -> dict[str, str] | str:
Expand All @@ -23,21 +24,31 @@ def get_news(ticker, start_date, end_date) -> dict[str, str] | str:

return _make_api_request("NEWS_SENTIMENT", params)

def get_global_news(curr_date, look_back_days: int = 7, limit: int = 50) -> dict[str, str] | str:
def get_global_news(
curr_date, look_back_days: int | None = None, limit: int | None = None
) -> dict[str, str] | str:
"""Returns global market news & sentiment data without ticker-specific filtering.

Covers broad market topics like financial markets, economy, and more.

Args:
curr_date: Current date in yyyy-mm-dd format.
look_back_days: Number of days to look back (default 7).
limit: Maximum number of articles (default 50).
look_back_days: Number of days to look back. ``None`` falls back to
``global_news_lookback_days`` from the active config.
limit: Maximum number of articles. ``None`` falls back to
``global_news_article_limit`` from the active config.

Returns:
Dictionary containing global news sentiment data or JSON string.
"""
from datetime import datetime, timedelta

config = get_config()
if look_back_days is None:
look_back_days = config["global_news_lookback_days"]
if limit is None:
limit = config["global_news_article_limit"]

# Calculate start date
curr_dt = datetime.strptime(curr_date, "%Y-%m-%d")
start_dt = curr_dt - timedelta(days=look_back_days)
Expand Down