From 83c7da751761d3329cd5f2cced80473ef30831c2 Mon Sep 17 00:00:00 2001 From: panda <1415243231@qq.com> Date: Thu, 21 May 2026 22:36:43 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20system=20env=20vars=20silently=20overrid?= =?UTF-8?q?ing=20.env=20=E2=80=94=20load=5Fdotenv(override=3DTrue)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root cause: load_dotenv() default override=False meant system-level ANTHROPIC_BASE_URL (https://api.deepseek.com/anthropic) took precedence over .env's OPENAI_BASE_URL (https://api.minimaxi.com/anthropic). All Anthropic API calls went to DeepSeek with a MiniMax key, causing 401. Changes: - backend/llm.py: load_dotenv(override=True) — .env always wins - .env.example: add explicit ANTHROPIC_API_KEY + ANTHROPIC_BASE_URL - CLAUDE.md: document env var priority pitfall --- .env.example | 11 ++++++++--- CLAUDE.md | 1 + backend/llm.py | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.env.example b/.env.example index 84e8ed7..5fa95f1 100644 --- a/.env.example +++ b/.env.example @@ -2,12 +2,17 @@ LLM_BACKEND=cloud # 云端提供商:openai 或 anthropic -LLM_PROVIDER=openai +LLM_PROVIDER=anthropic -# 云端配置(OpenAI 兼容) +# Anthropic 兼容 API(MiniMax 等,优先使用) +ANTHROPIC_API_KEY=sk-xxxx +ANTHROPIC_BASE_URL=https://api.minimaxi.com/anthropic + +# OpenAI 兼容 API(fallback,当 ANTHROPIC_* 未设置时使用) OPENAI_API_KEY=sk-xxxx OPENAI_BASE_URL=https://api.openai.com/v1 -LLM_MODEL=gpt-4o + +LLM_MODEL=MiniMax-M2.7 # 本地大语言模型(Ollama) LOCAL_LLM_MODEL=qwen2.5-coder:7b diff --git a/CLAUDE.md b/CLAUDE.md index 39a4868..bc6c48c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -223,6 +223,7 @@ validation_service/ (FastAPI, 端口 8001) — 不变 ## 已知注意点 +- **环境变量优先级**: `backend/llm.py` 使用 `load_dotenv(override=True)` 确保 `.env` 值**始终覆盖**系统环境变量。曾因系统级 `ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic` 覆盖 `.env` 中的 MiniMax URL,导致 401 认证失败。新增 LLM 相关环境变量时,必须在 `.env` 中显式设置 `ANTHROPIC_*` 变量(而非仅设 `OPENAI_*` fallback),否则残留的系统环境变量会污染请求目标。 - **Anthropic SDK**: 使用原始 `anthropic` 包(非 `langchain-anthropic`),因为需要直连 MiniMax 兼容端点。API Key 优先读 `ANTHROPIC_API_KEY`,fallback `OPENAI_API_KEY`。Anthropic SDK 会自动将 key 放入 `x-api-key` header。 - **MiniMax 模型名称**: `MiniMax-M2.7`(不是 `minimax-2.7`),大小写敏感。 - **Streamlit headless**: Windows 下必须设 `STREAMLIT_SERVER_HEADLESS=true` 跳过邮箱采集提示。 diff --git a/backend/llm.py b/backend/llm.py index fc4e960..de171fa 100644 --- a/backend/llm.py +++ b/backend/llm.py @@ -8,7 +8,7 @@ from dotenv import load_dotenv from backend.logger import get_logger -load_dotenv() +load_dotenv(override=True) _llm_log = get_logger("llm")