# 错误修复:LLM API URL 拼接导致的 404 错误
**修复时间**:2025-12-04
**错误级别**:High
## 问题详情
### 错误信息
```
[2025-12-04T08:04:14.015Z] [ERROR] LLM summarization failed {"error":"Request failed with status code 404"}
[2025-12-04T08:04:14.016Z] [ERROR] Tool execution failed {"name":"web_search","error":"LLM summarization failed: Request failed with status code 404"}
```
### 错误类型
- 类型:API/配置错误
- 状态码:404
- 影响功能:web_search 工具的 LLM 总结功能
## 解决方案
### 根本原因
代码中的 URL 拼接逻辑错误导致重复的路径段:
1. **配置文件**:`SUMMARY_BASE_URL=https://api.deepseek.com/v1`
2. **代码拼接**:`${this.config.baseUrl}/v1/chat/completions`
3. **实际请求 URL**:`https://api.deepseek.com/v1/v1/chat/completions`(双重 `/v1`)
4. **正确 URL**:`https://api.deepseek.com/v1/chat/completions`
### 修改文件
- `src/services/summarizer.ts`:修复 URL 拼接逻辑
### 代码变更
```typescript
// 修改前
`${this.config.baseUrl}/v1/chat/completions`
// 修改后
`${this.config.baseUrl}/chat/completions`
```
## 技术分析
### URL 构建问题
这类问题在 API 客户端开发中很常见:
1. **硬编码路径段**:代码中硬编码了 `/v1` 路径段
2. **配置与代码不一致**:配置中已包含路径段,但代码又重复添加
3. **缺乏 URL 标准化**:没有对构建的 URL 进行标准化处理
### 不同 API 服务的路径结构
不同 LLM 服务的 API 端点结构:
| 服务 | BASE_URL | 完整端点 | 说明 |
|------|----------|----------|------|
| DeepSeek | `https://api.deepseek.com/v1` | `/chat/completions` | 包含版本号 |
| OpenAI | `https://api.openai.com/v1` | `/chat/completions` | 包含版本号 |
| ModelScope | `https://dashscope.aliyuncs.com/compatible-mode` | `/v1/chat/completions` | 不包含版本号 |
### 最佳实践
1. **清晰的约定**:BASE_URL 应该明确定义是否包含版本号
2. **URL 标准化**:构建 URL 后进行标准化处理
3. **配置验证**:验证 BASE_URL 的格式是否符合预期
4. **单元测试**:为 URL 构建逻辑添加测试
## 验证结果
- [x] 代码检查通过(`npm run typecheck`)
- [x] URL 构建测试通过
- [x] API 调用测试成功(返回 200 状态码)
- [x] web_search 工具现在能正常工作
## 测试方法
### URL 构建验证
```bash
# 测试 URL 构建逻辑
node -e "
const baseUrl = 'https://api.deepseek.com/v1';
const fullUrl = \`\${baseUrl}/chat/completions\`;
console.log('构建的 URL:', fullUrl);
console.log('正确 URL: https://api.deepseek.com/v1/chat/completions');
console.log('匹配:', fullUrl === 'https://api.deepseek.com/v1/chat/completions');
"
```
### API 调用验证
```bash
# 直接测试 API 端点
curl -X POST "https://api.deepseek.com/v1/chat/completions" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"deepseek-chat","messages":[{"role":"user","content":"test"}],"max_tokens":5}'
```
## 注意事项
- 类似的 URL 拼接问题可能出现在其他 API 客户端中
- 不同的 LLM 服务提供商可能有不同的 URL 结构
- 建议为 URL 构建添加自动化测试以防止回归