TradingAgents/CHANGELOG.md

15 KiB

Changelog

All notable changes to the TradingAgents project will be documented in this file.

[Unreleased] - 2026-01-14

Added

  • Standalone HTML Reports: Refactored report generation to perform server-side Markdown-to-HTML rendering using Python.
    • Removed dependency on client-side marked.js and CDNs.
    • Reports are now fully offline-capable.
    • Cleaned up JSON keys to remove .md extensions for cleaner data structure.
  • Google News Adapter: Implemented get_google_global_news adapter in google.py to match the standard (curr_date, look_back_days) interface, adhering to the Adapter Pattern and fixing signature mismatches.
  • Robust Demo Script: Created run_agent.py (replacing demo scripts) with:
    • Automatic .env loading.
    • backend_url handling (clearing OpenAI defaults when using Anthropic).
    • Hardened configuration for "Deep Analysis" (Debate Rounds=2).
    • Pre-configured Google News vendor to bypass AlphaVantage rate limits.

Fixed

  • Rate Limit Crash: Fixed AlphaVantageRateLimitError by switching default news vendor to Google in run_agent.py.
  • Interface Mismatch: Fixed TypeError in get_global_news where string dates were passed to integer arguments.
  • Logi Crash: Fixed TypeError in TradingAgentsGraph.apply_trend_override caused by duplicate arguments in the method call.
  • Broken Entry Point: Updated startAgent.sh to point to the correct run_agent.py script instead of a non-existent file.

[Unreleased] - 2026-01-14 (Performance Update)

Changed

  • Parallel Architecture (AsyncIO): Refactored setup.py to implement a "Fan-Out / Fan-In" pattern using LangGraph.
    • Market Analyst now triggers Social, News, and Fundamentals analysts concurrently.
    • Added Analyst Sync node to synchronize parallel branches.
    • Added Analyst Sync node to synchronize parallel branches.
    • reduced total runtime by ~50% by overlapping heavy LLM/Tool operations.
  • Fail Fast Scraper: Optimized googlenews_utils.py to timeout after ~30s (down from 3m) when blocked, ensuring rapid failover to backup vendors.

Fixed

  • API Error 400 (Dangling Tool Use): Fixed crash in Fundamentals Analyst and others caused by unhandled tool exceptions (e.g. Rate Limits).
    • Wrapped all tools in fundamental_data_tools.py, news_data_tools.py, core_stock_tools.py, and technical_indicators_tools.py with try/except blocks.
    • Tools now return error strings instead of crashing, ensuring stricter API compliance and system resilience.

[Unreleased] - 2026-01-14 (Architecture Hardening)

Added

  • Subgraph Isolation (The Sandbox): Refactored Social, News, and Fundamentals analysts to run in their own isolated StateGraph containers.
    • Implemented Init_Clear node to wipe message history at the start of each subgraph.
    • Prevents cross-contamination of tool calls between parallel analysts (fixing "Dangling Tool Use" API Error 400).
  • Strict State Schemas (Type Safety): Defined SocialAnalystState, NewsAnalystState, and FundamentalsAnalystState in agent_states.py.
    • Restricts analyst subgraphs to only access necessary inputs (company, date) and write specific outputs (report).
    • Eliminates "global state leakage" risks.
  • Universal Notification System: Implemented a unified factory pattern (get_notifier) in notifications.py supporting:
    • CallMeBot: Free WhatsApp notifications (Personal Use).
    • Telegram: Free Bot API notifications (Reliable Alternative).
    • Twilio: Enterprise-grade WhatsApp notifications.
    • Zero-dependency implementation (using requests).

Fixed

  • Concurrent Write Conflict: Resolved InvalidUpdateError in LangGraph during parallel "Fan-In".
    • Implemented reduce_overwrite logic in AgentState.
    • Allows parallel subgraphs to return identical read-only inputs (company_of_interest) without triggering race condition errors.

[Released] - 2026-01-13

Added

  • Dynamic Parameter Tuning (The Learning Loop): Implemented full self-reflection cycle. The Reflector agent now parses its own advice into JSON (rsi_period, stop_loss_pct), persists it to data_cache/runtime_config.json, and the Market Analyst loads it to tune the Regime Detector in real-time.
  • Audit Archival: Every tuning event is now archived to results/{TICKER}/{DATE}/runtime_config.json for historical auditing, ensuring we can reproduce why parameters changed on any given day.
  • Atomic Persistence: Implemented agent_utils.write_json_atomic to prevent race conditions during config saves.
  • Centralized Config: Moved hardcoded paths to default_config.py (DRY principle).

Fixed

  • Reflector Logic Gap: The Reflector was previously "shouting into the void"—making suggestions but having no mechanism to apply them. This circuit is now closed.

[Unreleased] - 2026-01-11

Added

  • Insider Veto Protocol (Rule B): Hard-coded safety gate in trading_graph.py that blocks ALL buy signals if Net Insider Selling exceeds $50M while the stock is in a technical downtrend (Price < 50 SMA). This prevents "Falling Knife" catches.
  • Relative Strength Determinism: Upgraded market_analyst.py to calculate a mathematical risk_multiplier (0.0x - 1.5x) based on the Asset Regime vs. SPY Regime correlation, removing LLM "confidence" hallucinations from position sizing.
  • Portfolio Awareness (Rule 72): Implemented State Persistence (portfolio, cash_balance) and a hard-coded Stop Loss check in trading_graph.py. If a position's unrealized PnL drops below -10%, the system forces a "LIQUIDATE" order, bypassing all AI debate.
  • Self-Tuning Architecture: Updated reflection.py to output a structured JSON block (UPDATE_PARAMETERS) instead of prose advice, enabling future automated parameter optimization.
  • Gemini 2.0 & 3.0 Support: Updated cli/utils.py to support gemini-2.0-flash, gemini-2.5-flash-lite, gemini-2.5-pro, gemini-3-flash-preview and gemini-3-pro-preview models.
  • Console Debugging: Added explicit console print statements for critical "Smoking Gun" debug traces in market_analyst.py and trading_graph.py.

Changed

  • Mandatory Regime Detection: Modified graph/setup.py to Force-Execute the Market Analyst node as the first step in every workflow. This permanently fixes the "UNKNOWN Regime" bug by ensuring context is established before any fundamental analysis begins.
  • Data Robustness: Patched y_finance.py and alpha_vantage_news.py to accept **kwargs and curr_date, resolving crashes in the route_to_vendor pipeline when passing standardized arguments.

Fixed

  • Override Logic Mismatches: Fixed critical Enum-to-String type mismatch in apply_trend_override that was silencing the "Safety Valve" logic.
  • Data Pipeline Failures: Injected robust error handling and type checking in market_analyst.py to identify why RegimeDetector receives invalid data (causing "UNKNOWN" regimes).
  • Gemini 404 Errors: Removed invalid/deprecated model names causing 404s.
  • Reflector Regime Integration: Updated reflection.py to incorporate market regime context, ensuring post-trade analysis understands the 'Why' behind regime-based decisions.

[Unreleased] - 2026-01-10

Added

  • Global Market News: Implemented get_global_market_news in Alpha Vantage module to support generic market news (topics: economy_macro, financial_markets), fixing the lack of a primary vendor for global news.
  • Configurable Embeddings Truncation: Added EMBEDDING_TRUNCATION_LIMIT env var (default 1000) to prevent 413 Payload Too Large errors with local models.
  • Local Embedding Service Support: Added support for Anthropic to use local embedding service via URL
    • Anthropic doesn't provide embeddings API, so users can run Hugging Face Text Embeddings Inference (TEI) in Docker
    • Configure via EMBEDDING_API_URL environment variable (default: http://localhost:11434/v1)
    • Configure model via EMBEDDING_MODEL environment variable (default: all-MiniLM-L6-v2)
    • Keeps main application lightweight - heavy dependencies (PyTorch) isolated in separate container
  • Environment Variable Configuration: Added comprehensive environment variable support for all LLM providers and embedding configuration
    • OPENAI_API_URL - Custom OpenAI API endpoint
    • ANTHROPIC_API_URL - Custom Anthropic API endpoint
    • GOOGLE_API_URL - Custom Google API endpoint
    • OPENROUTER_API_URL - Custom OpenRouter API endpoint
    • OLLAMA_API_URL - Custom Ollama API endpoint
    • EMBEDDING_PROVIDER - Choose embedding provider: local, openai, google, ollama
    • EMBEDDING_API_URL - Custom embedding API endpoint (for Ollama or Docker service)
    • EMBEDDING_MODEL - Custom embedding model name
  • Anthropic Claude 4.5 Thinking Models: Added support for latest Anthropic thinking models
    • claude-sonnet-4-5-thinking - Advanced reasoning with extended thinking
    • claude-opus-4-5-thinking - Premier reasoning with extended thinking
    • Removed older Claude models (3.5, 3.7, 4.0) to focus on latest thinking models
  • Documentation: Created comprehensive guides and verification tools
    • docs/LOCAL_EMBEDDINGS.md - Complete guide for local embeddings setup
    • verify_local_embeddings.py - Verification script for sentence-transformers
    • verify_ollama_embeddings.py - Verification script for Ollama (optional)
    • Updated .env.example with all new configuration options

Changed

  • Dependency Cleanup: Removed sentence-transformers from requirements.txt to keep main application lightweight.
  • Virtual Environment: Recreated .venv to ensure a clean state without unused heavy dependencies.
  • Embedding Architecture: Refactored tradingagents/agents/utils/memory.py to support multiple embedding providers with clean separation of concerns
    • Automatic provider selection based on LLM provider
    • Local embeddings as default for Anthropic and Ollama providers
    • Maintained backward compatibility with existing API-based embeddings
  • CLI Provider Selection: Updated cli/utils.py to use environment variables for all LLM provider API URLs with sensible defaults
  • Configuration Documentation: Enhanced .env.example with detailed comments and examples for all configuration options

Fixed

  • Global News Failure: Resolved RuntimeError: All vendor implementations failed for get_global_news by correctly mapping Alpha Vantage and implementing the missing fallback logic.
  • Error Reporting: Improved interface.py to propagate detailed error messages from failed vendors to help debugging.
  • Embedding Crash: Fixed crashes when processing large documents with local embedding models by enforcing strict token limits via truncation.
  • Anthropic Embedding Error: Resolved 404 Not Found error when using Anthropic as LLM provider by implementing automatic fallback to local embeddings (Anthropic doesn't provide an embeddings API)

Technical Debt

  • None - All changes follow SOLID principles with proper separation of concerns

[Unreleased] - 2026-01-09

Added

  • Blindfire Protocol Activated: Fully integrated TickerAnonymizer into all analyst agents (Market, News, Fundamentals, Social) and data tools. The LLM now only sees "ASSET_XXX" in prompts, preventing data contamination.
  • Anonymization Middleware: Implemented transparent request interception in core_stock_tools.py and other tool files to deanonymize inputs and anonymize outputs automatically.
  • State Persistence: Added auto-persistence to TickerAnonymizer (ticker_map.json) to ensure consistent ticker mapping across isolated agent and tool instances.
  • API Key Verification: Added verify_google_key.py script to isolate and verify Google API Key functionality for embeddings.
  • Environment Management: Added load_dotenv to cli/main.py and verify_google_key.py to ensure .env variables are correctly loaded.
  • Start Script Enhancements: Updated start.sh to check for GOOGLE_API_KEY existence and warn the user.
  • Debug Logging: Added temporary debug logging (commented out) in memory.py for API key verification.

Fixed

  • Embedding Model Error: Fixed BadRequestError / 404 Not Found when using Google (Gemini) provider by explicitly setting text-embedding-004 and using the Google-compatible OpenAI endpoint (generativelanguage.googleapis.com).
  • Data Fetching Failure: Resolved RuntimeError: All vendor implementations failed for method 'get_fundamentals' by implementing a fallback to yfinance in tradingagents/dataflows/y_finance.py and registering it in interface.py.
  • Report Saving Crash: Fixed TypeError: write() argument must be str, not list in cli/main.py by converting structured list content to string before writing to files.
  • API Rate Limiting: Added max_retries handling (exponential backoff) to both ChatGoogleGenerativeAI (10 retries) and OpenAI embedding client (5 retries).
  • Import Errors: Fixed NameError: name 'tool' is not defined by restoring langchain_core imports in data tools that were accidentally removed during Blindfire integration.
  • Payload Size Error: Implemented input truncation (max 9000 chars) in memory.py.
  • Display Layer De-Anonymization: Added deanonymize_text to TickerAnonymizer and patched cli/main.py to reverse-map "ASSET_XXX" to real company names in the final report, effectively resolving "[Company Name]" placeholders for the user while keeping the internal system blind.
  • Alpaca Integration: Added tradingagents/dataflows/alpaca.py to support get_stock_data via Alpaca Data API v2. Registered as a vendor option in interface.py and default_config.py. Requires ALPACA_API_KEY and ALPACA_API_SECRET in .env.
  • CRITICAL FIX: Memory Leak: Implemented FinancialSituationMemory.clear() and TradingAgentsGraph.reset_memory() to wipe agent context between runs. This prevents hallucinations from bleeding across days in long simulations.
  • CRITICAL FIX: Blind Logs: Updated _log_state to explicitly capture market_regime and regime_metrics, ensuring we can audit decision logic relative to market conditions.
  • CRITICAL FIX: Crash Prevention: Added guard logic in propagate() to handle "Dead State" (Rejected Trades) gracefully, preventing crashes when process_signal tries to read non-existent buy prices.

Changed

  • LLM Configuration: Updated tradingagents/default_config.py and cli/utils.py to use valid Gemini model names (e.g., gemini-1.5-flash, gemini-1.5-pro) and gemini-pro.
  • Vendor Configuration: Updated default fundamental_data vendor to "alpha_vantage, yfinance" to ensure fallback availability.