{"record":{"id":"51f1684c14accc7b","repo":"hsliuping/TradingAgents-CN","slug":"dashscope-api-key-not-found-please-configure-api","errorCode":null,"errorMessage":"DashScope API key not found. Please configure API key in web interface (Settings -> LLM Providers) or set DASHSCOPE_API_KEY environment variable.","messagePattern":"DashScope API key not found\\. Please configure API key in web interface \\(Settings -> LLM Providers\\) or set DASHSCOPE_API_KEY environment variable\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"critical","filePath":"tradingagents/llm_adapters/dashscope_openai_adapter.py","lineNumber":87,"sourceCode":"        else:\n            logger.info(f\"✅ [DashScope初始化] 使用 kwargs 中传入的 API Key（来自数据库配置）\")\n\n        # 设置 DashScope OpenAI 兼容接口的默认配置\n        kwargs.setdefault(\"base_url\", \"https://dashscope.aliyuncs.com/compatible-mode/v1\")\n        kwargs[\"api_key\"] = api_key_from_kwargs  # 🔥 使用验证后的 API Key\n        kwargs.setdefault(\"model\", \"qwen-turbo\")\n        kwargs.setdefault(\"temperature\", 0.1)\n        kwargs.setdefault(\"max_tokens\", 2000)\n\n        # 检查 API 密钥和 base_url\n        final_api_key = kwargs.get(\"api_key\")\n        final_base_url = kwargs.get(\"base_url\")\n        logger.info(f\"🔍 [DashScope初始化] 最终使用的 API Key: {'有值' if final_api_key else '空'}\")\n        logger.info(f\"🔍 [DashScope初始化] 最终使用的 base_url: {final_base_url}\")\n\n        if not final_api_key:\n            logger.error(f\"❌ [DashScope初始化] API Key 检查失败，即将抛出异常\")\n            raise ValueError(\n                \"DashScope API key not found. Please configure API key in web interface \"\n                \"(Settings -> LLM Providers) or set DASHSCOPE_API_KEY environment variable.\"\n            )\n\n        # 调用父类初始化\n        super().__init__(**kwargs)\n\n        logger.info(f\"✅ 阿里百炼 OpenAI 兼容适配器初始化成功\")\n        logger.info(f\"   模型: {kwargs.get('model', 'qwen-turbo')}\")\n\n        # 兼容不同版本的属性名\n        api_base = getattr(self, 'base_url', None) or getattr(self, 'openai_api_base', None) or kwargs.get('base_url', 'unknown')\n        logger.info(f\"   API Base: {api_base}\")\n    \n    def _generate(self, *args, **kwargs):\n        \"\"\"重写生成方法，添加 token 使用量追踪\"\"\"\n        \n        # 调用父类的生成方法","sourceCodeStart":69,"sourceCodeEnd":105,"githubUrl":"https://github.com/hsliuping/TradingAgents-CN/blob/74783e8817d6cf6de29867880631cc555153f36b/tradingagents/llm_adapters/dashscope_openai_adapter.py#L69-L105","documentation":"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).","triggerScenarios":"Instantiating the DashScope adapter (directly or via create_llm_client with provider='dashscope') with no api_key kwarg while DASHSCOPE_API_KEY is unset.","commonSituations":"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.","solutions":["export DASHSCOPE_API_KEY=sk-... or pass api_key=... to the adapter/factory","Configure the key in the web interface (Settings -> LLM Providers) if using the app's DB-backed path","Ensure load_dotenv() runs before adapter creation and the value is non-empty"],"exampleFix":"# before\nllm = create_llm_client(provider=\"dashscope\", model=\"qwen-max\")\n\n# after\nllm = create_llm_client(provider=\"dashscope\", model=\"qwen-max\", api_key=os.environ[\"DASHSCOPE_API_KEY\"])","handlingStrategy":"validation","validationCode":"import os\nfrom dotenv import load_dotenv; load_dotenv()\nif not (api_key or os.getenv(\"DASHSCOPE_API_KEY\")):\n    raise SystemExit(\"Configure DashScope key (web UI or DASHSCOPE_API_KEY)\")","typeGuard":"def has_dashscope_key(api_key: str | None) -> bool:\n    return bool(api_key or os.getenv(\"DASHSCOPE_API_KEY\"))","tryCatchPattern":"try:\n    llm = create_llm_client(provider=\"dashscope\", model=m)\nexcept ValueError as e:\n    if \"DashScope\" in str(e):\n        raise SystemExit(\"Set DASHSCOPE_API_KEY\") from e\n    raise","preventionTips":["Load dotenv before creating adapters","Save keys via web UI so the DB path supplies api_key","Beware empty-string env values — they still fail the check"],"tags":["api-key","missing-env-var","dashscope","qwen","llm"],"backgroundTag":"missing-api-key","analyzedSha":"74783e8817d6cf6de29867880631cc555153f36b","analyzedAt":"2026-08-28T11:39:07.729Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}