From 4d41dd60664e44302aba54c76339780422894924 Mon Sep 17 00:00:00 2001 From: MUmarJ Date: Fri, 16 Jan 2026 18:54:31 -0500 Subject: [PATCH] feat: add configuration validation for local LLM providers Warn when using local LLM with OpenAI-only data vendors, suggest alternatives --- tradingagents/dataflows/config.py | 33 +++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/tradingagents/dataflows/config.py b/tradingagents/dataflows/config.py index b8a8f8aa..d43402cd 100644 --- a/tradingagents/dataflows/config.py +++ b/tradingagents/dataflows/config.py @@ -5,6 +5,38 @@ from typing import Dict, Optional _config: Optional[Dict] = None DATA_DIR: Optional[str] = None +# Local LLM providers that don't support OpenAI's web_search_preview +LOCAL_LLM_PROVIDERS = ["ollama", "lm studio"] +# Methods that require OpenAI's web_search_preview tool +OPENAI_ONLY_METHODS = ["get_news", "get_global_news", "get_fundamentals"] + + +def validate_config(config: Dict): + """Validate configuration and warn about incompatible settings.""" + llm_provider = config.get("llm_provider", "").lower() + + if llm_provider in LOCAL_LLM_PROVIDERS: + # Check data vendors + data_vendors = config.get("data_vendors", {}) + tool_vendors = config.get("tool_vendors", {}) + + warnings = [] + if data_vendors.get("news_data") == "openai": + warnings.append("data_vendors.news_data") + if data_vendors.get("fundamental_data") == "openai": + warnings.append("data_vendors.fundamental_data") + + for method in OPENAI_ONLY_METHODS: + if tool_vendors.get(method) == "openai": + warnings.append(f"tool_vendors.{method}") + + if warnings: + print(f"WARNING: Using local LLM provider '{llm_provider}' with 'openai' data vendors.") + print(f" The following settings use OpenAI's web_search_preview which is not available locally:") + for w in warnings: + print(f" - {w}") + print(f" Recommendation: Change these to 'alpha_vantage', 'google', or 'local'.") + def initialize_config(): """Initialize the configuration with default values.""" @@ -21,6 +53,7 @@ def set_config(config: Dict): _config = default_config.DEFAULT_CONFIG.copy() _config.update(config) DATA_DIR = _config["data_dir"] + validate_config(_config) def get_config() -> Dict: