hsliuping/TradingAgents-CN · critical · ValueError
{provider_name} 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.
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:
# 新版本LangChainView on GitHub (pinned to 74783e8817)
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
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
- 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
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
- 使用自定义OpenAI端点需要设置CUSTOM_OPENAI_API_KEY环境变量
- 使用Google需要设置GOOGLE_API_KEY环境变量或在数据库中配置API Key
- 使用SiliconFlow需要设置SILICONFLOW_API_KEY环境变量
- 使用OpenRouter需要设置OPENROUTER_API_KEY或OPENAI_API_KEY环境变量
- 使用AiHubMix需要设置AIHUBMIX_API_KEY环境变量
AI-assisted analysis of hsliuping/TradingAgents-CN@74783e8817 (2026-08-28).
Data as JSON: /api/errors/df239aa272d912fc.
Report an issue: GitHub.