hsliuping/TradingAgents-CN · critical · ValueError

DashScope API key not found. Please configure API key in web

Error message

DashScope API key not found. Please configure API key in web interface (Settings -> LLM Providers) or set DASHSCOPE_API_KEY environment variable.

What it means

DashScopeOpenAIAdapter.__init__ (tradingagents/llm_adapters/dashscope_openai_adapter.py) raises this when no API key resolves from kwargs, config, or the DASHSCOPE_API_KEY environment variable. It is a fail-fast guard before super().__init__ builds the OpenAI-compatible client for Alibaba DashScope (Qwen).

Source

Thrown at tradingagents/llm_adapters/dashscope_openai_adapter.py:87

        else:
            logger.info(f"✅ [DashScope初始化] 使用 kwargs 中传入的 API Key(来自数据库配置)")

        # 设置 DashScope OpenAI 兼容接口的默认配置
        kwargs.setdefault("base_url", "https://dashscope.aliyuncs.com/compatible-mode/v1")
        kwargs["api_key"] = api_key_from_kwargs  # 🔥 使用验证后的 API Key
        kwargs.setdefault("model", "qwen-turbo")
        kwargs.setdefault("temperature", 0.1)
        kwargs.setdefault("max_tokens", 2000)

        # 检查 API 密钥和 base_url
        final_api_key = kwargs.get("api_key")
        final_base_url = kwargs.get("base_url")
        logger.info(f"🔍 [DashScope初始化] 最终使用的 API Key: {'有值' if final_api_key else '空'}")
        logger.info(f"🔍 [DashScope初始化] 最终使用的 base_url: {final_base_url}")

        if not final_api_key:
            logger.error(f"❌ [DashScope初始化] API Key 检查失败,即将抛出异常")
            raise ValueError(
                "DashScope API key not found. Please configure API key in web interface "
                "(Settings -> LLM Providers) or set DASHSCOPE_API_KEY environment variable."
            )

        # 调用父类初始化
        super().__init__(**kwargs)

        logger.info(f"✅ 阿里百炼 OpenAI 兼容适配器初始化成功")
        logger.info(f"   模型: {kwargs.get('model', 'qwen-turbo')}")

        # 兼容不同版本的属性名
        api_base = getattr(self, 'base_url', None) or getattr(self, 'openai_api_base', None) or kwargs.get('base_url', 'unknown')
        logger.info(f"   API Base: {api_base}")
    
    def _generate(self, *args, **kwargs):
        """重写生成方法,添加 token 使用量追踪"""
        
        # 调用父类的生成方法

View on GitHub (pinned to 74783e8817)

Solutions

  1. export DASHSCOPE_API_KEY=sk-... or pass api_key=... to the adapter/factory
  2. Configure the key in the web interface (Settings -> LLM Providers) if using the app's DB-backed path
  3. Ensure load_dotenv() runs before adapter creation and the value is non-empty

Example fix

# before
llm = create_llm_client(provider="dashscope", model="qwen-max")

# after
llm = create_llm_client(provider="dashscope", model="qwen-max", api_key=os.environ["DASHSCOPE_API_KEY"])
Defensive patterns

Strategy: validation

Validate before calling

import os
from dotenv import load_dotenv; load_dotenv()
if not (api_key or os.getenv("DASHSCOPE_API_KEY")):
    raise SystemExit("Configure DashScope key (web UI or DASHSCOPE_API_KEY)")

Type guard

def has_dashscope_key(api_key: str | None) -> bool:
    return bool(api_key or os.getenv("DASHSCOPE_API_KEY"))

Try / catch

try:
    llm = create_llm_client(provider="dashscope", model=m)
except ValueError as e:
    if "DashScope" in str(e):
        raise SystemExit("Set DASHSCOPE_API_KEY") from e
    raise

Prevention

When it happens

Trigger: Instantiating the DashScope adapter (directly or via create_llm_client with provider='dashscope') with no api_key kwarg while DASHSCOPE_API_KEY is unset.

Common situations: Fresh setup without .env; key configured in web UI but the script constructs the adapter directly; env var named DASHSCOPE_API_TOKEN instead of DASHSCOPE_API_KEY; blank-string key treated as missing.

Understand the failure class

Background: "API key is required" / "API key not found" / "No API key was set": the missing-api-key error family across 16 libraries — this error's family across 16 libraries.

Related errors


AI-assisted analysis of hsliuping/TradingAgents-CN@74783e8817 (2026-08-28). Data as JSON: /api/errors/51f1684c14accc7b. Report an issue: GitHub.