{"record":{"id":"70033dbabc6498fe","repo":"hsliuping/TradingAgents-CN","slug":"provider-name-provide","errorCode":null,"errorMessage":"使用自定义厂家 {provider_name} 需要设置以下环境变量之一:\n  - {provider_name.upper()}_API_KEY\n  - CUSTOM_OPENAI_API_KEY","messagePattern":"使用自定义厂家 (.+?) 需要设置以下环境变量之一:\n  - (.+?)_API_KEY\n  - CUSTOM_OPENAI_API_KEY","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"critical","filePath":"tradingagents/graph/trading_graph.py","lineNumber":527,"sourceCode":"            logger.info(\"✅ [智谱AI] 已通过 llm_clients 初始化成功并应用用户配置的模型参数\")\n        else:\n            provider_name = self.config['llm_provider']\n            logger.info(f\"🔧 使用统一 llm_clients 路径处理自定义厂家: {provider_name}\")\n            api_key_candidates = [\n                f\"{provider_name.upper()}_API_KEY\",  # 例如: KYX_API_KEY\n                f\"{provider_name}_API_KEY\",          # 例如: kyx_API_KEY\n                \"CUSTOM_OPENAI_API_KEY\"              # 通用环境变量\n            ]\n\n            custom_api_key = None\n            for env_var in api_key_candidates:\n                custom_api_key = os.getenv(env_var)\n                if custom_api_key:\n                    logger.info(f\"✅ 从环境变量 {env_var} 获取到 API Key\")\n                    break\n\n            if not custom_api_key:\n                raise ValueError(\n                    f\"使用自定义厂家 {provider_name} 需要设置以下环境变量之一:\\n\"\n                    f\"  - {provider_name.upper()}_API_KEY\\n\"\n                    f\"  - CUSTOM_OPENAI_API_KEY\"\n                )\n\n            # 获取 backend_url（从配置中获取）\n            backend_url = self.config.get(\"backend_url\")\n            if not backend_url:\n                raise ValueError(\n                    f\"使用自定义厂家 {provider_name} 需要在数据库配置中设置 default_base_url\"\n                )\n\n            logger.info(f\"🔧 [自定义厂家 {provider_name}] 使用端点: {backend_url}\")\n\n            # 🔧 从配置中读取模型参数\n            quick_config = self.config.get(\"quick_model_config\", {})\n            deep_config = self.config.get(\"deep_model_config\", {})\n","sourceCodeStart":509,"sourceCodeEnd":545,"githubUrl":"https://github.com/hsliuping/TradingAgents-CN/blob/74783e8817d6cf6de29867880631cc555153f36b/tradingagents/graph/trading_graph.py#L509-L545","documentation":"TradingAgentsGraph.__init__ raises this for user-defined providers (custom provider records) when no API key is found among candidate env vars: PROVIDER_API_KEY (provider name uppercased) and CUSTOM_OPENAI_API_KEY. The loop breaks on the first non-empty hit; if all are empty the formatted message lists the accepted names. Thrown before base-url resolution.","triggerScenarios":"Configuring a custom provider (e.g. 'myllm') in the web UI and constructing the graph without setting MYLLM_API_KEY or CUSTOM_OPENAI_API_KEY in the environment.","commonSituations":"Adding a bespoke OpenAI-compatible provider and forgetting its env var; name normalization surprises (dashes/spaces in provider name produce unexpected env var names); key saved only in DB while this path checks env only.","solutions":["Set the provider-specific env var: export <PROVIDER_NAME_UPPER>_API_KEY=... (e.g. MYLLM_API_KEY)","Alternatively set CUSTOM_OPENAI_API_KEY as a shared fallback for all custom providers","Sanitize the provider name (no spaces/dashes) so the derived env var name is predictable"],"exampleFix":"# before\n# provider_name='my-llm', no env set\ngraph = TradingAgentsGraph(config={\"llm_provider\": \"my-llm\"})\n\n# after\n# export MY_LLM_API_KEY=...  (matches provider_name.upper())\ngraph = TradingAgentsGraph(config={\"llm_provider\": \"my-llm\"})","handlingStrategy":"validation","validationCode":"import os\ncandidates = [f\"{provider_name.upper()}_API_KEY\", \"CUSTOM_OPENAI_API_KEY\"]\nif not any(os.getenv(v) for v in candidates):\n    raise SystemExit(f\"Set one of: {candidates}\")","typeGuard":"def has_custom_provider_key(provider_name: str) -> bool:\n    return any(os.getenv(v) for v in (f\"{provider_name.upper()}_API_KEY\", \"CUSTOM_OPENAI_API_KEY\"))","tryCatchPattern":"try:\n    graph = TradingAgentsGraph(config=cfg)\nexcept ValueError as e:\n    if \"自定义厂家\" in str(e):\n        raise SystemExit(\"Set <PROVIDER>_API_KEY or CUSTOM_OPENAI_API_KEY\") from e\n    raise","preventionTips":["Derive and document the env var name from the provider slug at creation time","Use CUSTOM_OPENAI_API_KEY as a universal fallback for custom providers","Keep provider slugs alphanumeric so upper-casing is predictable"],"tags":["api-key","missing-env-var","custom-provider","llm","configuration"],"backgroundTag":"missing-api-key","analyzedSha":"74783e8817d6cf6de29867880631cc555153f36b","analyzedAt":"2026-08-28T11:39:07.729Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}