{"record":{"id":"df239aa272d912fc","repo":"hsliuping/TradingAgents-CN","slug":"provider-name-api-web-api-key","errorCode":null,"errorMessage":"{provider_name} API密钥未找到。请在 Web 界面配置 API Key (设置 -> 大模型厂家) 或设置 {api_key_env_var} 环境变量。","messagePattern":"(.+?) API密钥未找到。请在 Web 界面配置 API Key \\(设置 -> 大模型厂家\\) 或设置 (.+?) 环境变量。","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"critical","filePath":"tradingagents/llm_adapters/openai_compatible_base.py","lineNumber":107,"sourceCode":"\n            # 从环境变量读取 API Key\n            env_api_key = os.getenv(api_key_env_var)\n            logger.info(f\"🔍 [{provider_name}初始化] 从环境变量读取 {api_key_env_var}: {'有值' if env_api_key else '空'}\")\n\n            # 验证环境变量中的 API Key 是否有效（排除占位符）\n            if env_api_key and is_valid_api_key(env_api_key):\n                logger.info(f\"✅ [{provider_name}初始化] 环境变量中的 API Key 有效，长度: {len(env_api_key)}, 前10位: {env_api_key[:10]}...\")\n                api_key = env_api_key\n            elif env_api_key:\n                logger.warning(f\"⚠️ [{provider_name}初始化] 环境变量中的 API Key 无效（可能是占位符），将被忽略\")\n                api_key = None\n            else:\n                logger.warning(f\"⚠️ [{provider_name}初始化] {api_key_env_var} 环境变量为空\")\n                api_key = None\n\n            if not api_key:\n                logger.error(f\"❌ [{provider_name}初始化] API Key 检查失败，即将抛出异常\")\n                raise ValueError(\n                    f\"{provider_name} API密钥未找到。\"\n                    f\"请在 Web 界面配置 API Key (设置 -> 大模型厂家) 或设置 {api_key_env_var} 环境变量。\"\n                )\n        else:\n            logger.info(f\"✅ [{provider_name}初始化] 使用传入的 API Key（来自数据库配置），长度: {len(api_key)}\")\n        \n        # 设置OpenAI兼容参数\n        # 注意：model参数会被Pydantic映射到model_name字段\n        openai_kwargs = {\n            \"model\": model,  # 这会被映射到model_name字段\n            \"temperature\": temperature,\n            \"max_tokens\": max_tokens,\n            **kwargs\n        }\n        \n        # 根据LangChain版本使用不同的参数名\n        try:\n            # 新版本LangChain","sourceCodeStart":89,"sourceCodeEnd":125,"githubUrl":"https://github.com/hsliuping/TradingAgents-CN/blob/74783e8817d6cf6de29867880631cc555153f36b/tradingagents/llm_adapters/openai_compatible_base.py#L89-L125","documentation":"OpenAICompatibleBase.__init__ raises this generic guard for any OpenAI-compatible provider when the api_key kwarg is falsy and the provider's expected environment variable (api_key_env_var) is unset or empty. The message interpolates the provider display name and env var name. Thrown before the underlying OpenAI client is built.","triggerScenarios":"Instantiating any subclass of OpenAICompatibleBase (e.g. OpenRouter, AiHubMix, custom providers) without api_key while its *_API_KEY env var is missing or empty-string.","commonSituations":"Adding a new provider class and forgetting to define/export its env var; .env loaded but the variable is empty (VAR= with no value); secret manager injection failing silently in k8s; running tests without a mocked key.","solutions":["Set the env var named in the message (e.g. OPENROUTER_API_KEY) to a real key","Or pass api_key explicitly when constructing the adapter — the DB-config path bypasses the env check","Guard empty-string values: some setups define VAR= which still evaluates falsy and triggers this error"],"exampleFix":"# before\nllm = MyProviderAdapter(model=\"m\")  # MYPROVIDER_API_KEY unset\n\n# after\n# export MYPROVIDER_API_KEY=sk-...\nllm = MyProviderAdapter(model=\"m\", api_key=os.environ[\"MYPROVIDER_API_KEY\"])","handlingStrategy":"validation","validationCode":"import os\nenv_var = f\"{provider.upper()}_API_KEY\"\nif not (kwargs.get(\"api_key\") or (os.getenv(env_var) or '').strip()):\n    raise SystemExit(f\"Set {env_var} or pass api_key\")","typeGuard":"def has_provider_key(provider: str, api_key: str | None) -> bool:\n    return bool(api_key or (os.getenv(f\"{provider.upper()}_API_KEY\") or '').strip())","tryCatchPattern":"try:\n    llm = MyProviderAdapter(model=m)\nexcept ValueError as e:\n    if \"API密钥未找到\" in str(e):\n        raise SystemExit(f\"Missing key: {e}\") from e\n    raise","preventionTips":["Define each provider's env var in one registry and preflight it","Treat empty-string secrets as missing during deployment checks","Pass api_key from DB config whenever the web UI is the source of truth"],"tags":["api-key","missing-env-var","openai-compatible","llm","adapter"],"backgroundTag":"missing-api-key","analyzedSha":"74783e8817d6cf6de29867880631cc555153f36b","analyzedAt":"2026-08-28T11:39:07.729Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}