{"record":{"id":"914165e549bae392","repo":"datawhalechina/hello-agents","slug":"api-env-914165","errorCode":null,"errorMessage":"API密钥和服务地址必须被提供或在.env文件中定义。","messagePattern":"API密钥和服务地址必须被提供或在\\.env文件中定义。","errorType":"exception","errorClass":"HelloAgentsException","httpStatus":null,"severity":"critical","filePath":"Co-creation-projects/lcyting-StockSage-agent/HelloAgents Optimized/hello_agents/core/llm.py","lineNumber":84,"sourceCode":"        self.kwargs = kwargs\n\n        # 自动检测provider或使用指定的provider\n        requested_provider = (provider or \"\").lower() if provider else None\n        self.provider = provider or self._auto_detect_provider(api_key, base_url)\n\n        if requested_provider == \"custom\":\n            self.provider = \"custom\"\n            self.api_key = api_key or os.getenv(\"LLM_API_KEY\")\n            self.base_url = base_url or os.getenv(\"LLM_BASE_URL\")\n        else:\n            # 根据provider确定API密钥和base_url\n            self.api_key, self.base_url = self._resolve_credentials(api_key, base_url)\n\n        # 验证必要参数\n        if not self.model:\n            self.model = self._get_default_model()\n        if not all([self.api_key, self.base_url]):\n            raise HelloAgentsException(\n                \"API密钥和服务地址必须被提供或在.env文件中定义。\"\n            )\n\n        # 创建OpenAI客户端\n        self._client = self._create_client()\n\n    def _auto_detect_provider(\n        self, api_key: Optional[str], base_url: Optional[str]\n    ) -> str:\n        \"\"\"\n        自动检测LLM提供商\n\n        检测逻辑：\n        1. 优先检查特定提供商的环境变量\n        2. 根据API密钥格式判断\n        3. 根据base_url判断\n        4. 默认返回通用配置\n        \"\"\"","sourceCodeStart":66,"sourceCodeEnd":102,"githubUrl":"https://github.com/datawhalechina/hello-agents/blob/606a07d341a47be773fab7f4b71177f53f96b2c3/Co-creation-projects/lcyting-StockSage-agent/HelloAgents Optimized/hello_agents/core/llm.py#L66-L102","documentation":"HelloAgentsLLM's constructor raises HelloAgentsException when, after provider resolution (custom provider reads LLM_API_KEY/LLM_BASE_URL env vars; others go through _resolve_credentials), either api_key or base_url is falsy. The model gets a default if unset, but key and base URL have no defaults — they must come from arguments or environment.","triggerScenarios":"Instantiating HelloAgentsLLM() with no args and no .env / env vars set; custom provider with only LLM_API_KEY exported but not LLM_BASE_URL; a named provider whose expected env var (e.g. OPENAI_API_KEY) is absent so _resolve_credentials returns an empty base_url.","commonSituations":"Fresh clone without .env setup; python-dotenv load_dotenv() not called before construction; wrong provider string so credential resolution looks up the wrong env var names; CI runners without secrets configured.","solutions":["Set the provider-appropriate env vars: for provider=\"custom\" export both LLM_API_KEY and LLM_BASE_URL; for named providers export that provider's key env var.","Or pass api_key= and base_url= explicitly to the constructor.","Ensure load_dotenv() runs before creating the LLM if credentials live in .env.","Check LLM_PROVIDER — a wrong value routes credential resolution to the wrong env var names."],"exampleFix":"# before\nllm = HelloAgentsLLM(model=\"gpt-4o-mini\")  # raises if env unset\n\n# after\nfrom dotenv import load_dotenv\nload_dotenv()  # populates LLM_API_KEY / LLM_BASE_URL\nllm = HelloAgentsLLM(model=\"gpt-4o-mini\", api_key=..., base_url=...)  # or explicit args","handlingStrategy":"validation","validationCode":"from dotenv import load_dotenv\nload_dotenv()\nassert os.getenv(\"LLM_API_KEY\") and os.getenv(\"LLM_BASE_URL\"), (\n    \"LLM_API_KEY and LLM_BASE_URL must be set for provider 'custom'\")\nllm = HelloAgentsLLM()","typeGuard":"def llm_credentials_present(api_key: str | None, base_url: str | None) -> bool:\n    return bool(api_key and base_url)","tryCatchPattern":"try:\n    llm = HelloAgentsLLM(model=m, api_key=k, base_url=u)\nexcept HelloAgentsException as e:\n    raise SystemExit(f\"LLM init failed ({e}); check .env / provider env vars\") from e","preventionTips":["Call load_dotenv() at process entry before any LLM construction.","Preflight-check provider-specific env var names once at startup.","Keep provider strings consistent with the env vars they resolve from."],"tags":["configuration","env-vars","llm-client","python"],"backgroundTag":null,"analyzedSha":"606a07d341a47be773fab7f4b71177f53f96b2c3","analyzedAt":"2026-08-14T22:57:27.446Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}