Files

873 lines
20 KiB
Markdown
Raw Permalink Normal View History

# 故障排除指南
本指南提供 Obsidian 智能日记整理 Agent 常见问题的解决方案和调试技巧。
## 快速诊断
运行以下命令进行快速系统检查:
```bash
# 检查依赖项状态
python -m journal_organizer check-deps
# 测试基本功能
python -m journal_organizer --help
# 验证配置文件
python -c "
import json
with open('config.yaml', 'r') as f:
print('配置文件存在且可读')
"
```
## 常见问题分类
### 🚀 启动问题
#### 问题 1: 模块导入错误
```
ImportError: attempted relative import with no known parent package
```
**解决方案**:
```bash
# ✅ 正确方式:作为模块运行
python -m journal_organizer --help
# ❌ 错误方式:直接运行脚本
python main.py
```
**原因**: 项目使用相对导入,必须作为 Python 包运行。
#### 问题 2: 找不到模块规范
```
ValueError: __main__.__spec__ is None
```
**解决方案**:
确保在项目根目录运行命令,并且 `__init__.py` 文件存在:
```bash
ls -la __init__.py
pwd # 确认在正确目录
```
### ⚙️ 配置问题
#### 问题 3: 配置文件不存在
```
ConfigurationError: Configuration file not found
```
**解决方案**:
1. 复制示例配置文件:
```bash
cp config.example.yaml config.yaml
```
2. 编辑配置文件,填入正确的值:
```yaml
obsidian:
vault_path: "/path/to/your/vault"
rest_api:
api_key: "your-obsidian-api-key"
claude:
api_key: "${ANTHROPIC_API_KEY}"
```
#### 问题 4: 环境变量未设置
```
EnvironmentVariableError: Environment variable 'ANTHROPIC_API_KEY' is not set
```
**解决方案**:
1. 设置必需的环境变量:
```bash
# 设置 Claude API 密钥(必需)
export ANTHROPIC_API_KEY="sk-ant-your-api-key-here"
# 设置 Obsidian API 密钥(必需)
export OBSIDIAN_API_KEY="your-obsidian-api-key"
# 设置可选的环境变量
export OBSIDIAN_VAULT_PATH="/path/to/your/vault"
export CLAUDE_API_URL="https://api.anthropic.com"
export CLAUDE_MODEL="claude-3-5-sonnet-20241022"
# 验证设置
echo $ANTHROPIC_API_KEY
echo $OBSIDIAN_API_KEY
```
2. 永久设置环境变量:
```bash
# 添加到 ~/.bashrc 或 ~/.zshrc
echo 'export ANTHROPIC_API_KEY="sk-ant-your-api-key-here"' >> ~/.bashrc
echo 'export OBSIDIAN_API_KEY="your-obsidian-api-key"' >> ~/.bashrc
# 重新加载配置
source ~/.bashrc
```
3. 使用 .env 文件(可选):
```bash
# 创建 .env 文件
cat > .env << EOF
ANTHROPIC_API_KEY=sk-ant-your-api-key-here
OBSIDIAN_API_KEY=your-obsidian-api-key
OBSIDIAN_VAULT_PATH=/path/to/your/vault
CLAUDE_API_URL=https://api.anthropic.com
CLAUDE_MODEL=claude-3-5-sonnet-20241022
EOF
# 加载 .env 文件
set -a; source .env; set +a
```
#### 问题 4a: 环境变量格式错误
```
EnvironmentVariableError: Environment variable expansion failed
```
**解决方案**:
检查配置文件中的环境变量语法:
```yaml
# ✅ 正确的环境变量语法
claude:
api_key: "${ANTHROPIC_API_KEY}" # 必需变量
api_url: "${CLAUDE_API_URL:-https://api.anthropic.com}" # 带默认值
model: "${CLAUDE_MODEL:?请设置 CLAUDE_MODEL 环境变量}" # 带错误消息
# ❌ 错误的语法
claude:
api_key: "$ANTHROPIC_API_KEY" # 缺少大括号
api_url: "${CLAUDE_API_URL-default}" # 错误的默认值语法
model: "${CLAUDE_MODEL?error}" # 错误的错误消息语法
```
#### 问题 5: 配置格式错误
```
yaml.scanner.ScannerError: mapping values are not allowed here
```
**解决方案**:
1. 检查 YAML 语法:
```bash
python -c "
import yaml
with open('config.yaml', 'r') as f:
yaml.safe_load(f)
print('YAML 格式正确')
"
```
2. 常见 YAML 错误:
```yaml
# ❌ 错误:缩进不一致
obsidian:
vault_path: "/path"
rest_api: # 缩进错误
api_key: "key"
# ✅ 正确:一致的缩进
obsidian:
vault_path: "/path"
rest_api:
api_key: "key"
```
### 🌐 API 连接问题
#### 问题 6: Claude API 连接失败
```
APIError: Failed to connect to Claude API
```
**诊断步骤**:
1. 验证 API 密钥格式:
```bash
echo $ANTHROPIC_API_KEY | grep -E "^sk-ant-"
```
2. 检查 API URL 配置:
```bash
# 检查配置文件中的 API URL
grep -A 5 "claude:" config.yaml
```
3. 测试网络连接:
```bash
# 测试默认 API 端点
curl -I https://api.anthropic.com
# 测试自定义端点(如果使用)
curl -I https://your-custom-endpoint.com
```
#### 问题 6a: Claude API URL 配置错误
```
ClaudeAPIURLError: Invalid URL format: not-a-url
```
**解决方案**:
1. 检查 API URL 格式:
```yaml
claude:
# ✅ 正确格式
api_url: "https://api.anthropic.com"
api_url: "https://proxy.example.com:8080"
api_url: "http://localhost:3128"
# ❌ 错误格式
api_url: "not-a-url"
api_url: "ftp://api.anthropic.com"
api_url: "api.anthropic.com" # 缺少协议
```
2. 常见 API URL 配置:
```yaml
# 官方 API
api_url: "https://api.anthropic.com"
# 代理服务器
api_url: "https://your-proxy.example.com"
api_url: "https://claude-proxy.internal:8080"
# 本地开发
api_url: "http://localhost:3128"
api_url: "https://localhost:8080"
```
#### 问题 6b: Claude 模型名称无效
```
ClaudeModelValidationError: Invalid model name: invalid-model
```
**解决方案**:
1. 使用支持的模型名称:
```yaml
claude:
# ✅ 当前支持的模型
model: "claude-3-5-sonnet-20241022" # 推荐
model: "claude-3-5-haiku-20241022" # 快速
model: "claude-3-opus-20240229" # 最强
model: "claude-3-sonnet-20240229" # 平衡
model: "claude-3-haiku-20240307" # 经济
# ✅ 最新别名
model: "claude-3-5-sonnet-latest"
model: "claude-3-5-haiku-latest"
# ❌ 无效模型名称
model: "gpt-4"
model: "claude-4"
model: "invalid-model"
```
2. 检查模型可用性:
```bash
# 查看配置中的模型
grep "model:" config.yaml
```
#### 问题 6c: Claude API 密钥格式错误
```
ClaudeAPIKeyError: Claude API key should start with 'sk-ant-'
```
**解决方案**:
1. 验证 API 密钥格式:
```bash
# 检查密钥格式
echo $ANTHROPIC_API_KEY | head -c 20
# 应该显示: sk-ant-api03-...
# 检查密钥长度
echo $ANTHROPIC_API_KEY | wc -c
# 应该大于 50 个字符
```
2. 获取正确的 API 密钥:
- 访问 https://console.anthropic.com/
- 创建新的 API 密钥
- 确保密钥以 `sk-ant-` 开头
#### 问题 6d: Claude API 连接超时或网络错误
```
ClaudeConnectionError: Connection error to https://api.anthropic.com
```
**解决方案**:
1. 检查网络连接:
```bash
# 测试基本连接
ping api.anthropic.com
# 测试 HTTPS 连接
curl -I https://api.anthropic.com
# 检查防火墙设置
telnet api.anthropic.com 443
```
2. 代理服务器配置:
```bash
# 如果使用代理,设置环境变量
export https_proxy=http://proxy.company.com:8080
export http_proxy=http://proxy.company.com:8080
```
3. 自定义端点配置:
```yaml
claude:
# 对于自定义端点,确保服务正在运行
api_url: "https://your-proxy.example.com"
# 对于本地端点,可能需要禁用 SSL 验证
api_url: "http://localhost:3128"
```
#### 问题 7: Obsidian API 连接失败
```
APIError: Failed to connect to Obsidian Local REST API
```
**解决方案**:
1. 确认 Obsidian Local REST API 插件已安装并启用
2. 检查 API 服务状态:
```bash
curl -k -H "Authorization: Bearer $OBSIDIAN_API_KEY" \
https://localhost:27123/
```
3. 验证配置:
```yaml
obsidian:
rest_api:
url: "https://localhost:27123" # 确认端口正确
verify_ssl: false # 本地开发时禁用 SSL 验证
```
### 📦 依赖项问题
#### 问题 8: 缺少依赖项
```
ModuleNotFoundError: No module named 'aiohttp'
```
**解决方案**:
```bash
# 安装所有依赖项
pip install -r requirements.txt
# 或单独安装缺失的包
pip install aiohttp pyyaml anthropic
# 检查安装状态
python -m journal_organizer check-deps
```
#### 问题 9: 版本冲突
```
ImportError: cannot import name 'xxx' from 'yyy'
```
**解决方案**:
```bash
# 升级到兼容版本
pip install --upgrade aiohttp anthropic
# 或使用虚拟环境
python -m venv venv
source venv/bin/activate # Linux/Mac
# 或 venv\Scripts\activate # Windows
pip install -r requirements.txt
```
### 🤖 Claude API 配置问题
#### 问题 12: Claude API 配置迁移
```
INFO: Migrated model 'claude-3-sonnet' to 'claude-3-sonnet-20240229'
```
**说明**: 这是正常的迁移信息,不是错误。系统自动将旧的模型名称迁移到新格式。
**常见迁移**:
- `claude-3-sonnet``claude-3-sonnet-20240229`
- `claude-3-opus``claude-3-opus-20240229`
- `claude-3-haiku``claude-3-haiku-20240307`
- `sonnet``claude-3-5-sonnet-20241022`
- `opus``claude-3-opus-20240229`
- `haiku``claude-3-haiku-20240307`
#### 问题 13: 自定义 API 端点配置
```
WARNING: Using custom API endpoint: https://proxy.example.com
```
**解决方案**:
1. 验证自定义端点:
```bash
# 测试端点可用性
curl -I https://proxy.example.com
# 测试 API 兼容性
curl -X POST https://proxy.example.com/v1/messages \
-H "Authorization: Bearer $ANTHROPIC_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"claude-3-5-sonnet-20241022","max_tokens":10,"messages":[{"role":"user","content":"test"}]}'
```
2. 常见自定义端点配置:
```yaml
# 企业代理服务器
claude:
api_url: "https://claude-proxy.company.com"
api_key: "${ANTHROPIC_API_KEY}"
# 本地开发环境
claude:
api_url: "http://localhost:8080"
api_key: "local-dev-key"
# 区域端点(如果可用)
claude:
api_url: "https://api-eu.anthropic.com"
api_key: "${ANTHROPIC_API_KEY}"
```
#### 问题 14: 配置验证失败
```
ConfigurationError: Claude configuration validation failed
```
**诊断步骤**:
1. 检查配置完整性:
```bash
# 验证配置文件语法
python -c "
import yaml
with open('config.yaml', 'r') as f:
config = yaml.safe_load(f)
claude_config = config.get('claude', {})
print('API Key:', 'present' if claude_config.get('api_key') else 'missing')
print('API URL:', claude_config.get('api_url', 'default'))
print('Model:', claude_config.get('model', 'default'))
"
```
2. 测试配置加载:
```python
# 测试配置验证
from config import Config
try:
config = Config('config.yaml')
print('配置加载成功')
print(f'Claude API URL: {config.claude.api_url}')
print(f'Claude Model: {config.claude.model}')
except Exception as e:
print(f'配置错误: {e}')
```
#### 问题 15: 向后兼容性问题
```
WARNING: Legacy configuration detected, migration applied
```
**说明**: 系统检测到旧版本的配置格式,自动进行了迁移。这是正常行为。
**迁移内容**:
- 添加缺失的 `api_url` 字段(默认为 `https://api.anthropic.com`
- 更新旧的模型名称格式
- 添加缺失的配置节(如 `journal``output` 等)
**验证迁移结果**:
```bash
# 查看迁移后的配置
python -c "
from config import Config
config = Config('config.yaml')
print('迁移后的配置:')
print(f' API URL: {config.claude.api_url}')
print(f' Model: {config.claude.model}')
print(f' Max Tokens: {config.claude.max_tokens}')
"
```
#### 问题 10: 文件权限错误
```
PermissionError: [Errno 13] Permission denied: 'config.yaml'
```
**解决方案**:
```bash
# 检查文件权限
ls -la config.yaml
# 修复权限
chmod 644 config.yaml
chmod 755 . # 目录权限
```
#### 问题 11: Vault 访问权限
```
PermissionError: Cannot access Obsidian vault
```
**解决方案**:
```bash
# 检查 vault 目录权限
ls -la /path/to/obsidian/vault
# 修复权限(谨慎操作)
chmod -R 755 /path/to/obsidian/vault
```
## 调试技巧
### 1. 启用详细日志
```bash
# 设置调试级别
python -m journal_organizer --log-level DEBUG organize
# 查看日志文件
tail -f logs/journal_organizer.log
```
### 2. 分步调试
```python
# 在代码中添加调试点
import logging
logger = logging.getLogger(__name__)
logger.debug(f"配置内容: {config}")
logger.debug(f"API 响应: {response}")
```
### 3. 测试单个组件
```python
# 测试配置加载
from journal_organizer.main import JournalOrganizerAgent
agent = JournalOrganizerAgent("config.yaml")
print(f"配置加载成功: {bool(agent.config)}")
# 测试 API 连接
import asyncio
from journal_organizer.skills.claude_skill import ClaudeAnalyzeSkill
async def test_claude():
skill = ClaudeAnalyzeSkill()
# 测试逻辑
asyncio.run(test_claude())
```
### 4. 网络诊断
```bash
# 检查网络连接
ping api.anthropic.com
ping localhost
# 检查端口占用
netstat -an | grep 27123
# 测试 SSL 连接
openssl s_client -connect api.anthropic.com:443
```
## 性能问题
### 内存使用过高
**诊断**:
```python
import psutil
import os
process = psutil.Process(os.getpid())
memory_mb = process.memory_info().rss / 1024 / 1024
print(f"内存使用: {memory_mb:.2f} MB")
```
**解决方案**:
- 检查是否有内存泄漏
- 限制并发操作数量
- 使用 `gc.collect()` 强制垃圾回收
### API 调用缓慢
**诊断**:
```python
import time
import asyncio
async def time_api_call():
start = time.time()
result = await api_call()
duration = time.time() - start
print(f"API 调用耗时: {duration:.2f} 秒")
return result
```
**解决方案**:
- 检查网络延迟
- 增加超时设置
- 实现重试机制
- 使用连接池
## 错误代码参考
| 错误代码 | 描述 | 常见原因 | 解决方案 |
|---------|------|----------|----------|
| CONFIG_001 | 配置文件不存在 | 未创建配置文件 | 复制 config.example.yaml |
| CONFIG_002 | 配置格式错误 | YAML 语法错误 | 检查缩进和语法 |
| CONFIG_003 | 缺少必需配置项 | 配置不完整 | 添加缺失的配置项 |
| CONFIG_004 | 环境变量未设置 | 环境变量缺失 | 设置相应的环境变量 |
| CONFIG_005 | 环境变量格式错误 | 语法错误 | 检查 ${VAR} 语法 |
| API_001 | API 密钥无效 | 密钥错误或过期 | 检查并更新 API 密钥 |
| API_002 | API 连接超时 | 网络问题 | 检查网络连接 |
| API_003 | API 限流 | 请求过于频繁 | 减少请求频率 |
| API_004 | SSL 证书错误 | 证书验证失败 | 禁用 SSL 验证(仅本地) |
| API_005 | API URL 格式错误 | URL 格式无效 | 使用正确的 URL 格式 |
| API_006 | 模型名称无效 | 不支持的模型 | 使用支持的模型名称 |
| API_007 | API 密钥格式错误 | 密钥格式不正确 | 使用 sk-ant- 开头的密钥 |
| CLAUDE_001 | Claude 配置错误 | Claude 特定配置问题 | 检查 Claude 配置节 |
| CLAUDE_002 | Claude 连接错误 | Claude API 连接失败 | 检查网络和端点 |
| CLAUDE_003 | Claude 模型错误 | 模型不可用 | 更换可用的模型 |
| CLAUDE_004 | Claude 迁移警告 | 配置需要迁移 | 允许自动迁移 |
| SKILL_001 | Skill 执行失败 | 输入参数错误 | 检查参数格式 |
| SKILL_002 | Skill 超时 | 操作耗时过长 | 增加超时设置 |
| IMPORT_001 | 模块导入错误 | 相对导入问题 | 使用模块方式运行 |
| IMPORT_002 | 依赖项缺失 | 包未安装 | 安装缺失的依赖项 |
| ENV_001 | 环境变量缺失 | 必需变量未设置 | 设置环境变量 |
| ENV_002 | 环境变量展开失败 | 语法或值错误 | 检查变量语法和值 |
## 日志分析
### 常见日志模式
```bash
# 查找错误
grep -i error logs/journal_organizer.log
# 查找 API 调用
grep -i "api" logs/journal_organizer.log
# 查找配置问题
grep -i "config" logs/journal_organizer.log
# 实时监控
tail -f logs/journal_organizer.log | grep -i error
```
### 日志级别说明
- **DEBUG**: 详细的调试信息
- **INFO**: 一般信息,正常操作
- **WARNING**: 警告信息,可能的问题
- **ERROR**: 错误信息,操作失败
- **CRITICAL**: 严重错误,系统无法继续
## 常见配置场景
### 企业环境配置
#### 使用代理服务器
```yaml
claude:
api_key: "${ANTHROPIC_API_KEY}"
api_url: "https://claude-proxy.company.com"
model: "claude-3-5-sonnet-20241022"
# 可能需要设置代理环境变量
# export https_proxy=http://proxy.company.com:8080
# export http_proxy=http://proxy.company.com:8080
```
#### 使用内部 API 网关
```yaml
claude:
api_key: "${COMPANY_CLAUDE_KEY}"
api_url: "https://api-gateway.internal:8443/claude"
model: "claude-3-5-sonnet-20241022"
```
### 开发环境配置
#### 本地开发设置
```yaml
claude:
api_key: "${ANTHROPIC_API_KEY}"
api_url: "${CLAUDE_API_URL:-https://api.anthropic.com}"
model: "${CLAUDE_MODEL:-claude-3-5-sonnet-20241022}"
max_tokens: 4096
temperature: 0.7
obsidian:
vault_path: "${OBSIDIAN_VAULT_PATH:-./test_vault}"
rest_api:
url: "${OBSIDIAN_API_URL:-https://localhost:27123}"
api_key: "${OBSIDIAN_API_KEY}"
verify_ssl: false
```
#### 测试环境配置
```yaml
claude:
api_key: "${TEST_CLAUDE_KEY}"
api_url: "https://test-api.example.com"
model: "claude-3-haiku-20240307" # 使用更便宜的模型进行测试
max_tokens: 1024
temperature: 0.0 # 确定性输出用于测试
```
### 多环境配置管理
#### 使用环境特定的配置文件
```bash
# 开发环境
cp config.example.yaml config.dev.yaml
# 编辑 config.dev.yaml
# 生产环境
cp config.example.yaml config.prod.yaml
# 编辑 config.prod.yaml
# 运行时指定配置文件
python -m journal_organizer --config config.dev.yaml organize
```
#### 使用环境变量切换配置
```bash
# 设置环境特定的变量
export ENV=development
export CLAUDE_API_URL="https://dev-api.example.com"
export CLAUDE_MODEL="claude-3-haiku-20240307"
# 或者生产环境
export ENV=production
export CLAUDE_API_URL="https://api.anthropic.com"
export CLAUDE_MODEL="claude-3-5-sonnet-20241022"
```
### 安全配置最佳实践
#### 1. 使用环境变量存储敏感信息
```yaml
# ✅ 推荐:使用环境变量
claude:
api_key: "${ANTHROPIC_API_KEY}"
obsidian:
rest_api:
api_key: "${OBSIDIAN_API_KEY}"
# ❌ 不推荐:直接在配置文件中存储密钥
claude:
api_key: "sk-ant-actual-key-here"
```
#### 2. 设置适当的文件权限
```bash
# 限制配置文件访问权限
chmod 600 config.yaml
# 确保日志目录权限正确
chmod 755 logs/
chmod 644 logs/*.log
```
#### 3. 使用 .gitignore 保护敏感文件
```bash
# 添加到 .gitignore
echo "config.yaml" >> .gitignore
echo ".env" >> .gitignore
echo "logs/*.log" >> .gitignore
```
### 性能优化配置
#### 高性能配置
```yaml
claude:
api_key: "${ANTHROPIC_API_KEY}"
api_url: "https://api.anthropic.com"
model: "claude-3-5-sonnet-20241022" # 最新最强模型
max_tokens: 8192 # 更大的输出空间
temperature: 0.7
# 启用详细日志以监控性能
logging:
level: "DEBUG"
file: "logs/performance.log"
```
#### 成本优化配置
```yaml
claude:
api_key: "${ANTHROPIC_API_KEY}"
api_url: "https://api.anthropic.com"
model: "claude-3-haiku-20240307" # 更经济的模型
max_tokens: 2048 # 限制输出长度
temperature: 0.5
# 减少日志输出
logging:
level: "WARNING"
file: "logs/journal_organizer.log"
```
### 自助诊断清单
在寻求帮助前,请完成以下检查:
- [ ] 运行 `python -m journal_organizer check-deps`
- [ ] 检查配置文件格式和内容
- [ ] 验证环境变量设置
- [ ] 查看日志文件中的错误信息
- [ ] 测试网络连接和 API 访问
- [ ] 确认文件和目录权限
### 报告问题时请提供
1. **错误信息**: 完整的错误堆栈跟踪
2. **配置文件**: 脱敏后的配置内容
3. **环境信息**: Python 版本、操作系统
4. **日志文件**: 相关的日志片段
5. **重现步骤**: 导致问题的具体操作
### 联系方式
- 查看项目文档
- 检查 GitHub Issues
- 运行内置诊断工具
## 预防措施
### 定期维护
```bash
# 定期更新依赖项
pip list --outdated
pip install --upgrade package_name
# 清理日志文件
find logs/ -name "*.log" -mtime +30 -delete
# 备份配置文件
cp config.yaml config.yaml.backup
```
### 监控建议
- 设置日志轮转
- 监控内存和 CPU 使用
- 定期测试 API 连接
- 备份重要配置和数据