hsliuping/TradingAgents-CN · critical · ValueError

API密钥未找到。请在 Web 界面配置 API Key (设置 -> 大模型厂家) 或设置 环境变量。

Error message

{provider_name} API密钥未找到。请在 Web 界面配置 API Key (设置 -> 大模型厂家) 或设置 {api_key_env_var} 环境变量。

What it means

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.

Solutions

  1. Set the env var named in the message (e.g. OPENROUTER_API_KEY) to a real key
  2. Or pass api_key explicitly when constructing the adapter — the DB-config path bypasses the env check
  3. Guard empty-string values: some setups define VAR= which still evaluates falsy and triggers this error

Example fix

# before
llm = MyProviderAdapter(model="m")  # MYPROVIDER_API_KEY unset

# after
# export MYPROVIDER_API_KEY=sk-...
llm = MyProviderAdapter(model="m", api_key=os.environ["MYPROVIDER_API_KEY"])
Defensive patterns

Strategy: validation

Validate before calling

import os
env_var = f"{provider.upper()}_API_KEY"
if not (kwargs.get("api_key") or (os.getenv(env_var) or '').strip()):
    raise SystemExit(f"Set {env_var} or pass api_key")

Type guard

def has_provider_key(provider: str, api_key: str | None) -> bool:
    return bool(api_key or (os.getenv(f"{provider.upper()}_API_KEY") or '').strip())

Try / catch

try:
    llm = MyProviderAdapter(model=m)
except ValueError as e:
    if "API密钥未找到" in str(e):
        raise SystemExit(f"Missing key: {e}") from e
    raise

Prevention

When it happens

Trigger: 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.

Common situations: 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.

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/df239aa272d912fc. Report an issue: GitHub.

Appendix: source

Thrown at tradingagents/llm_adapters/openai_compatible_base.py:107

            # 从环境变量读取 API Key
            env_api_key = os.getenv(api_key_env_var)
            logger.info(f"🔍 [{provider_name}初始化] 从环境变量读取 {api_key_env_var}: {'有值' if env_api_key else '空'}")

            # 验证环境变量中的 API Key 是否有效(排除占位符)
            if env_api_key and is_valid_api_key(env_api_key):
                logger.info(f"✅ [{provider_name}初始化] 环境变量中的 API Key 有效,长度: {len(env_api_key)}, 前10位: {env_api_key[:10]}...")
                api_key = env_api_key
            elif env_api_key:
                logger.warning(f"⚠️ [{provider_name}初始化] 环境变量中的 API Key 无效(可能是占位符),将被忽略")
                api_key = None
            else:
                logger.warning(f"⚠️ [{provider_name}初始化] {api_key_env_var} 环境变量为空")
                api_key = None

            if not api_key:
                logger.error(f"❌ [{provider_name}初始化] API Key 检查失败,即将抛出异常")
                raise ValueError(
                    f"{provider_name} API密钥未找到。"
                    f"请在 Web 界面配置 API Key (设置 -> 大模型厂家) 或设置 {api_key_env_var} 环境变量。"
                )
        else:
            logger.info(f"✅ [{provider_name}初始化] 使用传入的 API Key(来自数据库配置),长度: {len(api_key)}")
        
        # 设置OpenAI兼容参数
        # 注意:model参数会被Pydantic映射到model_name字段
        openai_kwargs = {
            "model": model,  # 这会被映射到model_name字段
            "temperature": temperature,
            "max_tokens": max_tokens,
            **kwargs
        }
        
        # 根据LangChain版本使用不同的参数名
        try:
            # 新版本LangChain

View on GitHub (pinned to 74783e8817)