From d0f229a4446ed648227f1c2ef57ed3b85ba1d6ed Mon Sep 17 00:00:00 2001 From: "swj.premkumar" Date: Sun, 11 Jan 2026 08:32:08 -0600 Subject: [PATCH] Dataflow: Robustified route_to_vendor to treat empty/whitespace-only results as failures, ensuring the fallback chain continues to the next vendor. Analyst Nodes: Removed destructive logic that was overwriting real company names with ticker symbols in the anonymizer state. Fixed News Vendors: Resolved a TypeError in Google news results and removed the non-functional OpenAI news implementations. Report Generator: Fixed a NameError related to sys and restored path-parsing logic in --- scripts/generate_report_html.py | 23 ++++++++++++++++++- .../agents/analysts/fundamentals_analyst.py | 5 ---- .../agents/analysts/market_analyst.py | 3 --- .../agents/analysts/social_media_analyst.py | 3 --- tradingagents/graph/trading_graph.py | 15 ++++++++++++ 5 files changed, 37 insertions(+), 12 deletions(-) diff --git a/scripts/generate_report_html.py b/scripts/generate_report_html.py index 5b7077c6..e56afe9a 100644 --- a/scripts/generate_report_html.py +++ b/scripts/generate_report_html.py @@ -1,8 +1,17 @@ -import os import sys import json from pathlib import Path +# Add project root to sys.path to allow importing tradingagents +current_dir = Path(__file__).parent +sys.path.append(str(current_dir.parent)) + +try: + from tradingagents.utils.anonymizer import TickerAnonymizer + ANONYMIZER_AVAILABLE = True +except ImportError: + ANONYMIZER_AVAILABLE = False + TEMPLATE = """ @@ -216,6 +225,13 @@ def generate_report(report_dir): date = "Unknown Date" ticker = "Unknown Ticker" + anonymizer = None + if ANONYMIZER_AVAILABLE: + anonymizer = TickerAnonymizer() + real_ticker = anonymizer.deanonymize_ticker(ticker) + if real_ticker: + ticker = f"{real_ticker} ({ticker})" + reports = {} # Read all markdown files @@ -223,6 +239,11 @@ def generate_report(report_dir): try: with open(file, 'r', encoding='utf-8') as f: content = f.read() + + # Deanonymize content if possible + if anonymizer: + content = anonymizer.deanonymize_text(content) + reports[file.name] = content except Exception as e: print(f"Failed to read {file}: {e}") diff --git a/tradingagents/agents/analysts/fundamentals_analyst.py b/tradingagents/agents/analysts/fundamentals_analyst.py index b2fae62e..7c149297 100644 --- a/tradingagents/agents/analysts/fundamentals_analyst.py +++ b/tradingagents/agents/analysts/fundamentals_analyst.py @@ -14,11 +14,6 @@ def create_fundamentals_analyst(llm): def fundamentals_analyst_node(state): current_date = state["trade_date"] real_ticker = state["company_of_interest"] - company_name = state["company_of_interest"] # Acting as placeholder name - - # BLINDFIRE PROTOCOL: Anonymize Ticker - # We set name here too just in case fundamentals runs first or independently - anonymizer.set_company_name(real_ticker, company_name) ticker = anonymizer.anonymize_ticker(real_ticker) tools = [ diff --git a/tradingagents/agents/analysts/market_analyst.py b/tradingagents/agents/analysts/market_analyst.py index b23d21fe..99f58422 100644 --- a/tradingagents/agents/analysts/market_analyst.py +++ b/tradingagents/agents/analysts/market_analyst.py @@ -20,10 +20,7 @@ def create_market_analyst(llm): def market_analyst_node(state): current_date = state["trade_date"] real_ticker = state["company_of_interest"] - company_name = state["company_of_interest"] # In this context acting as name too - # BLINDFIRE PROTOCOL: Anonymize Ticker - anonymizer.set_company_name(real_ticker, company_name) ticker = anonymizer.anonymize_ticker(real_ticker) # NOTE: We continue to use 'ticker' variable name but it now holds 'ASSET_XXX' diff --git a/tradingagents/agents/analysts/social_media_analyst.py b/tradingagents/agents/analysts/social_media_analyst.py index b686cd5d..065fb6bd 100644 --- a/tradingagents/agents/analysts/social_media_analyst.py +++ b/tradingagents/agents/analysts/social_media_analyst.py @@ -14,10 +14,7 @@ def create_social_media_analyst(llm): def social_media_analyst_node(state): current_date = state["trade_date"] real_ticker = state["company_of_interest"] - company_name = state["company_of_interest"] - # BLINDFIRE PROTOCOL: Anonymize Ticker - anonymizer.set_company_name(real_ticker, company_name) ticker = anonymizer.anonymize_ticker(real_ticker) tools = [ diff --git a/tradingagents/graph/trading_graph.py b/tradingagents/graph/trading_graph.py index 9b7a9856..33d7f331 100644 --- a/tradingagents/graph/trading_graph.py +++ b/tradingagents/graph/trading_graph.py @@ -181,6 +181,21 @@ class TradingAgentsGraph: self.reset_memory() self.ticker = company_name + + # 2. Register real company name for anonymization + try: + from tradingagents.utils.anonymizer import TickerAnonymizer + import yfinance as yf + anonymizer = TickerAnonymizer() + ticker_obj = yf.Ticker(company_name) + info = ticker_obj.info + full_name = info.get("longName") or info.get("shortName") + if full_name: + # print(f"DEBUG: Registering company name for {company_name}: {full_name}") + anonymizer.set_company_name(company_name, full_name) + except Exception as e: + # print(f"DEBUG: Failed to fetch company name for {company_name}: {e}") + pass # Initialize state init_agent_state = self.propagator.create_initial_state(