# 错误码与常见问题（HTTP 层）

本 API 的错误分两类：

1) **HTTP 层错误**：接口直接返回 `success=false`，并用 HTTP 状态码表达错误类型。  
2) **任务内错误**：接口本身 200，但轮询的 `events` 中出现 `type=error`，且任务状态变为 `failed`。

## 1. HTTP 状态码约定

| 状态码 | 何时出现 | 返回体示例 |
|---:|---|---|
| 200 | 成功（大多数 GET/POST） | `{ "success": true, ... }` |
| 202 | 成功但已进入后台执行（发送消息） | `{ "success": true, "task_id": "...", "status": "running", ... }` |
| 400 | 参数错误（缺字段/格式不对/路径非法） | `{ "success": false, "error": "..." }` |
| 401 | 未授权（缺 token 或 token 无效） | `{ "success": false, "error": "..." }` |
| 404 | 资源不存在（task/file/path 不存在） | `{ "success": false, "error": "..." }` |
| 409 | 并发冲突（已有 running/pending 任务） | `{ "success": false, "error": "已有运行中的任务，请稍后再试。" }` |
| 500 | 服务端内部错误（少见） | `{ "success": false, "error": "..." }` |
| 503 | 系统未初始化/资源繁忙（容器不可用等） | `{ "success": false, "error": "..." }` |

## 2. 常见错误与排查

### 2.1 401 Unauthorized

原因：

- 忘记带 `Authorization: Bearer ...`
- token 不存在或已被替换

排查：

- 检查 `data/api_users.json` 是否包含该 token 的 SHA256
- 修改 JSON 后是否重启服务（当前为启动时加载）

### 2.2 409 已有运行中的任务

原因：

- 同一个 API 用户在**同一个 workspace** 的任务未结束时再次调用 `/api/v1/workspaces/{workspace_id}/messages`

处理建议：

- 客户端 UI：禁用“发送”按钮，直到轮询显示 `status != running`
- 或先调用 `/api/v1/tasks/{task_id}/cancel` 再发送新任务

### 2.3 轮询一直 running，但没有 events

可能原因：

- 模型调用还没开始（排队/网络慢）
- 事件被缓冲上限丢弃（极少见，通常是轮询太慢）

建议：

- 将轮询间隔调小（0.5s~1s）
- 确保客户端从 `next_offset` 增量拉取，不要重复拉取导致 UI“看似卡住”

### 2.4 任务失败（轮询 events 里出现 type=error）

原因可能来自：

- 模型调用异常（上游 API/Key/网络）
- 工具执行异常（例如 web_search/extract_webpage 失败）
- 运行时资源问题

建议：

- 读取 `GET /api/v1/tasks/{task_id}` 返回的 `data.error`
- 同时遍历 `events` 中的 `type=error` 与 `system_message`，这些往往包含更具体原因
