178 lines
4.1 KiB
Markdown
178 lines
4.1 KiB
Markdown
# API配置问题修复说明
|
||
|
||
## 问题描述
|
||
|
||
用户遇到股票分析API调用失败,提示:
|
||
```
|
||
API调用失败: Error code: 401 - {'error': {'message': 'Authentication Fails, Your api key: ****a7fc is invalid'}}
|
||
```
|
||
|
||
虽然`.env`文件中已配置了新的API key,但系统仍在使用旧的key(结尾为`a7fc`)。
|
||
|
||
## 问题原因
|
||
|
||
1. **PowerShell环境变量中存在旧的API key**
|
||
- 用户之前在系统环境变量中设置过旧的`DEEPSEEK_API_KEY`
|
||
- 旧key: `sk-b6c714570b9844f392aa3812f3f7a7fc`
|
||
|
||
2. **python-dotenv默认行为**
|
||
- `load_dotenv()`默认**不会覆盖**已存在的环境变量
|
||
- 导致系统读取的是环境变量中的旧key,而非`.env`文件中的新key
|
||
|
||
3. **调用链路**
|
||
```
|
||
.env文件 (新key) → load_dotenv() → 不覆盖环境变量 → config.py读取环境变量 (旧key) → deepseek_client使用旧key → API调用失败
|
||
```
|
||
|
||
## 修复方案
|
||
|
||
### 1. 修改 `config.py`
|
||
|
||
**修改前:**
|
||
```python
|
||
load_dotenv()
|
||
```
|
||
|
||
**修改后:**
|
||
```python
|
||
# 加载环境变量(override=True 强制覆盖已存在的环境变量)
|
||
load_dotenv(override=True)
|
||
```
|
||
|
||
### 2. 修改 `config_manager.py`
|
||
|
||
在`reload_config()`方法中也添加`override=True`:
|
||
```python
|
||
def reload_config(self):
|
||
"""重新加载配置(重新加载.env文件)"""
|
||
from dotenv import load_dotenv
|
||
# 强制覆盖已存在的环境变量
|
||
load_dotenv(override=True)
|
||
```
|
||
|
||
### 3. 清除Python缓存
|
||
|
||
```bash
|
||
Remove-Item -Recurse -Force __pycache__
|
||
```
|
||
|
||
## 修复验证
|
||
|
||
运行测试脚本验证修复:
|
||
```bash
|
||
.\venv\Scripts\python.exe test_api_config.py
|
||
```
|
||
|
||
测试结果:
|
||
```
|
||
✅ .env文件存在
|
||
.env中的API Key: sk-e32f5***********************2abe
|
||
|
||
⚠️ 环境变量中的API Key(加载前): sk-b6c71***********************a7fc
|
||
|
||
✅ config.py读取到的API Key: sk-e32f5***********************2abe
|
||
✅ 环境变量已被覆盖: sk-e32f5***********************2abe
|
||
✅ config.py读取的key与.env文件一致!
|
||
✅ API调用成功!
|
||
```
|
||
|
||
## 影响范围
|
||
|
||
此修复影响所有使用API的模块:
|
||
|
||
### 1. 股票分析模块
|
||
- ✅ `ai_agents.py` - 个股分析
|
||
- ✅ `deepseek_client.py` - API客户端
|
||
|
||
### 2. 智策板块模块
|
||
- ✅ `sector_strategy_agents.py` - 板块分析
|
||
- ✅ `sector_strategy_engine.py` - 策略引擎
|
||
|
||
### 3. 主力选股模块
|
||
- ✅ `main_force_analysis.py` - 主力资金分析
|
||
|
||
### 4. UI和服务模块
|
||
- ✅ `app.py` - 主应用
|
||
- ✅ `monitor_service.py` - 监测服务
|
||
|
||
## 验证步骤
|
||
|
||
修复后,所有模块都会从`.env`文件读取正确的API key:
|
||
|
||
1. **启动应用**
|
||
```bash
|
||
python run.py
|
||
```
|
||
|
||
2. **测试股票分析**
|
||
- 在Web界面输入股票代码
|
||
- 点击"开始分析"
|
||
- 确认API调用成功
|
||
|
||
3. **测试智策板块**
|
||
- 点击"智策板块"
|
||
- 开始板块分析
|
||
- 确认API调用成功
|
||
|
||
4. **测试主力选股**
|
||
- 点击"主力选股"
|
||
- 运行主力资金筛选
|
||
- 确认API调用成功
|
||
|
||
## 预防措施
|
||
|
||
为避免将来再次出现此问题:
|
||
|
||
1. **优先使用.env文件配置**
|
||
- 不要在系统环境变量中设置API key
|
||
- 统一在`.env`文件中管理所有配置
|
||
|
||
2. **清除旧的环境变量**
|
||
- Windows: 系统属性 → 高级 → 环境变量 → 删除`DEEPSEEK_API_KEY`
|
||
- PowerShell临时清除: `Remove-Item Env:DEEPSEEK_API_KEY`
|
||
|
||
3. **重启应用生效**
|
||
- 修改`.env`文件后,需要重启Streamlit应用
|
||
- 或使用环境配置界面的"保存并重新加载"功能
|
||
|
||
## 技术细节
|
||
|
||
### python-dotenv 的 override 参数
|
||
|
||
```python
|
||
load_dotenv(override=True)
|
||
```
|
||
|
||
- `override=False` (默认): 不覆盖已存在的环境变量,优先使用系统环境变量
|
||
- `override=True`: 强制覆盖环境变量,优先使用`.env`文件中的值
|
||
|
||
### 配置优先级
|
||
|
||
**修复前:**
|
||
1. 系统环境变量 (最高优先级)
|
||
2. .env文件
|
||
|
||
**修复后:**
|
||
1. .env文件 (最高优先级)
|
||
2. 系统环境变量 (作为默认值)
|
||
|
||
## 相关文件
|
||
|
||
- `config.py` - 主配置文件
|
||
- `config_manager.py` - 配置管理器
|
||
- `.env` - 环境变量配置文件
|
||
- `test_api_config.py` - API配置测试脚本
|
||
|
||
## 修复日期
|
||
|
||
2025-10-17
|
||
|
||
## 测试人员
|
||
|
||
AI Assistant
|
||
|
||
## 状态
|
||
|
||
✅ 已修复并验证通过
|
||
|