hsliuping/TradingAgents-CN · critical · ValueError
使用自定义厂家 {provider_name} 需要设置以下环境变量之一: - {provider_name.upp
Error message
使用自定义厂家 {provider_name} 需要设置以下环境变量之一:
- {provider_name.upper()}_API_KEY
- CUSTOM_OPENAI_API_KEY What it means
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.
Source
Thrown at tradingagents/graph/trading_graph.py:527
logger.info("✅ [智谱AI] 已通过 llm_clients 初始化成功并应用用户配置的模型参数")
else:
provider_name = self.config['llm_provider']
logger.info(f"🔧 使用统一 llm_clients 路径处理自定义厂家: {provider_name}")
api_key_candidates = [
f"{provider_name.upper()}_API_KEY", # 例如: KYX_API_KEY
f"{provider_name}_API_KEY", # 例如: kyx_API_KEY
"CUSTOM_OPENAI_API_KEY" # 通用环境变量
]
custom_api_key = None
for env_var in api_key_candidates:
custom_api_key = os.getenv(env_var)
if custom_api_key:
logger.info(f"✅ 从环境变量 {env_var} 获取到 API Key")
break
if not custom_api_key:
raise ValueError(
f"使用自定义厂家 {provider_name} 需要设置以下环境变量之一:\n"
f" - {provider_name.upper()}_API_KEY\n"
f" - CUSTOM_OPENAI_API_KEY"
)
# 获取 backend_url(从配置中获取)
backend_url = self.config.get("backend_url")
if not backend_url:
raise ValueError(
f"使用自定义厂家 {provider_name} 需要在数据库配置中设置 default_base_url"
)
logger.info(f"🔧 [自定义厂家 {provider_name}] 使用端点: {backend_url}")
# 🔧 从配置中读取模型参数
quick_config = self.config.get("quick_model_config", {})
deep_config = self.config.get("deep_model_config", {})
View on GitHub (pinned to 74783e8817)
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
Example fix
# before
# provider_name='my-llm', no env set
graph = TradingAgentsGraph(config={"llm_provider": "my-llm"})
# after
# export MY_LLM_API_KEY=... (matches provider_name.upper())
graph = TradingAgentsGraph(config={"llm_provider": "my-llm"}) Defensive patterns
Strategy: validation
Validate before calling
import os
candidates = [f"{provider_name.upper()}_API_KEY", "CUSTOM_OPENAI_API_KEY"]
if not any(os.getenv(v) for v in candidates):
raise SystemExit(f"Set one of: {candidates}") Type guard
def has_custom_provider_key(provider_name: str) -> bool:
return any(os.getenv(v) for v in (f"{provider_name.upper()}_API_KEY", "CUSTOM_OPENAI_API_KEY")) Try / catch
try:
graph = TradingAgentsGraph(config=cfg)
except ValueError as e:
if "自定义厂家" in str(e):
raise SystemExit("Set <PROVIDER>_API_KEY or CUSTOM_OPENAI_API_KEY") from e
raise Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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.
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
- 使用Google需要设置GOOGLE_API_KEY环境变量或在数据库中配置API Key
- 使用SiliconFlow需要设置SILICONFLOW_API_KEY环境变量
- 使用OpenRouter需要设置OPENROUTER_API_KEY或OPENAI_API_KEY环境变量
- 使用AiHubMix需要设置AIHUBMIX_API_KEY环境变量
- 使用Google AI需要在数据库中配置API Key或设置GOOGLE_API_KEY环境变量
AI-assisted analysis of hsliuping/TradingAgents-CN@74783e8817 (2026-08-28).
Data as JSON: /api/errors/70033dbabc6498fe.
Report an issue: GitHub.