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

  1. Set the provider-specific env var: export <PROVIDER_NAME_UPPER>_API_KEY=... (e.g. MYLLM_API_KEY)
  2. Alternatively set CUSTOM_OPENAI_API_KEY as a shared fallback for all custom providers
  3. 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

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


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