Files
journal_organizer/TROUBLESHOOTING.md
T
windyboy f7e54692a9 Initial project setup: Obsidian intelligent journal organizer
- Add core agent architecture with Command + Skill pattern
- Implement Claude API integration for content analysis
- Add Obsidian REST API integration for vault operations
- Create conversational interface (v2.0) with natural language processing
- Add comprehensive configuration management and validation
- Include project documentation and developer guides
- Set up testing framework with unit, integration, and property tests
- Add Kiro specs for Claude API configuration and code quality improvements
- Configure project steering files for development guidelines
2025-12-31 17:55:10 +08:00

873 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 故障排除指南
本指南提供 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 连接
- 备份重要配置和数据