diff --git a/tests/test_alpha_vantage_hardening.py b/tests/test_alpha_vantage_hardening.py index 494f2bac644..9f1926a05ad 100644 --- a/tests/test_alpha_vantage_hardening.py +++ b/tests/test_alpha_vantage_hardening.py @@ -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 @@ -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"]) diff --git a/tradingagents/dataflows/alpha_vantage_news.py b/tradingagents/dataflows/alpha_vantage_news.py index f9c7cfc990b..bb1707d8e8b 100644 --- a/tradingagents/dataflows/alpha_vantage_news.py +++ b/tradingagents/dataflows/alpha_vantage_news.py @@ -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: @@ -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)