# ChatLab API 文件

ChatLab 提供本機 RESTful API 服務，允許外部工具、腳本和 MCP 等透過 HTTP 介面查詢聊天記錄、執行 SQL 查詢、匯入聊天資料。

## 快速開始

### 1. 啟用服務

打開 ChatLab → 設定 → ChatLab API → 開啟服務。

啟用後會自動產生 API Token，預設監聽埠號 `5200`。

### 2. 驗證服務狀態

```bash
curl http://127.0.0.1:5200/api/v1/status \
  -H "Authorization: Bearer YOUR_TOKEN"
```

回應範例：

```json
{
  "success": true,
  "data": {
    "name": "ChatLab API",
    "version": "1.0.0",
    "uptime": 3600,
    "sessionCount": 5
  },
  "meta": {
    "timestamp": 1711468800,
    "version": "0.0.2"
  }
}
```

## 基本資訊

| 項目     | 說明                      |
| -------- | ------------------------- |
| 基礎 URL | `http://127.0.0.1:5200`   |
| API 前綴 | `/api/v1`                 |
| 認證方式 | Bearer Token              |
| 資料格式 | JSON                      |
| 繫定位址 | `127.0.0.1`（僅本機存取） |

### 認證

所有請求必須攜帶 `Authorization` 請求標頭：

```
Authorization: Bearer clb_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

Token 可在 設定 → ChatLab API 頁面查看和重新產生。

### 統一回應格式

**成功回應：**

```json
{
  "success": true,
  "data": { ... },
  "meta": {
    "timestamp": 1711468800,
    "version": "0.0.2"
  }
}
```

**錯誤回應：**

```json
{
  "success": false,
  "error": {
    "code": "SESSION_NOT_FOUND",
    "message": "Session not found: abc123"
  }
}
```

---

## 端点列表

### 系统

| 方法 | 路径             | 说明                       |
| ---- | ---------------- | -------------------------- |
| GET  | `/api/v1/status` | 服务状态                   |
| GET  | `/api/v1/schema` | ChatLab Format JSON Schema |

### 数据查询（导出）

| 方法 | 路径                                  | 说明                     |
| ---- | ------------------------------------- | ------------------------ |
| GET  | `/api/v1/sessions`                    | 获取所有会话列表         |
| GET  | `/api/v1/sessions/:id`                | 获取单个会话详情         |
| GET  | `/api/v1/sessions/:id/messages`       | 查询消息（分页）         |
| GET  | `/api/v1/sessions/:id/members`        | 获取成员列表             |
| GET  | `/api/v1/sessions/:id/stats/overview` | 获取概览统计             |
| POST | `/api/v1/sessions/:id/sql`            | 执行自定义 SQL（只读）   |
| GET  | `/api/v1/sessions/:id/export`         | 导出 ChatLab Format JSON |

### 数据导入

| 方法 | 路径                          | 说明                     |
| ---- | ----------------------------- | ------------------------ |
| POST | `/api/v1/import`              | 导入聊天记录（新建会话） |
| POST | `/api/v1/sessions/:id/import` | 增量导入到指定会话       |

---

## 端点详细说明

### GET /api/v1/status

获取 API 服务的运行状态。

**响应：**

| 字段           | 类型   | 说明                      |
| -------------- | ------ | ------------------------- |
| `name`         | string | 服务名称（`ChatLab API`） |
| `version`      | string | ChatLab 应用版本          |
| `uptime`       | number | 服务运行时间（秒）        |
| `sessionCount` | number | 当前会话总数              |

---

### GET /api/v1/schema

获取 ChatLab Format 的 JSON Schema 定义，便于构建符合规范的导入数据。

---

### GET /api/v1/sessions

获取所有已导入的会话列表。

**响应示例：**

```json
{
  "success": true,
  "data": [
    {
      "id": "session_abc123",
      "name": "技术交流群",
      "platform": "qq",
      "type": "group",
      "messageCount": 58000,
      "memberCount": 120
    }
  ]
}
```

---

### GET /api/v1/sessions/:id

获取单个会话的详细信息。

**路径参数：**

| 参数 | 类型   | 说明    |
| ---- | ------ | ------- |
| `id` | string | 会话 ID |

---

### GET /api/v1/sessions/:id/messages

分页查询指定会话的消息列表，支持多种过滤条件。

**查询参数：**

| 参数        | 类型   | 默认值 | 说明                     |
| ----------- | ------ | ------ | ------------------------ |
| `page`      | number | 1      | 页码                     |
| `limit`     | number | 100    | 每页条数（最大 1000）    |
| `startTime` | number | -      | 起始时间戳（秒级 Unix）  |
| `endTime`   | number | -      | 结束时间戳（秒级 Unix）  |
| `keyword`   | string | -      | 关键词搜索               |
| `senderId`  | string | -      | 按发送者 platformId 筛选 |
| `type`      | number | -      | 按消息类型筛选           |

**请求示例：**

```bash
curl "http://127.0.0.1:5200/api/v1/sessions/abc123/messages?page=1&limit=50&keyword=你好" \
  -H "Authorization: Bearer YOUR_TOKEN"
```

**响应：**

```json
{
  "success": true,
  "data": {
    "messages": [
      {
        "senderPlatformId": "123456",
        "senderName": "张三",
        "timestamp": 1703001600,
        "type": 0,
        "content": "你好！"
      }
    ],
    "total": 1500,
    "page": 1,
    "limit": 50,
    "totalPages": 30
  }
}
```

---

### GET /api/v1/sessions/:id/members

获取指定会话的所有成员列表。

---

### GET /api/v1/sessions/:id/stats/overview

获取指定会话的概览统计信息。

**响应：**

```json
{
  "success": true,
  "data": {
    "messageCount": 58000,
    "memberCount": 120,
    "timeRange": {
      "start": 1609459200,
      "end": 1703001600
    },
    "messageTypeDistribution": {
      "0": 45000,
      "1": 8000,
      "5": 3000,
      "80": 2000
    },
    "topMembers": [
      {
        "platformId": "123456",
        "name": "张三",
        "messageCount": 5800,
        "percentage": 10.0
      }
    ]
  }
}
```

| 字段                      | 说明                                                                             |
| ------------------------- | -------------------------------------------------------------------------------- |
| `messageCount`            | 总消息数                                                                         |
| `memberCount`             | 成员数                                                                           |
| `timeRange`               | 最早/最新消息时间戳（秒级 Unix）                                                 |
| `messageTypeDistribution` | 各消息类型的数量（key 为 [消息类型](./chatlab-format.md#消息类型对照表) 枚举值） |
| `topMembers`              | 前 10 活跃成员（按消息数降序）                                                   |

---

### POST /api/v1/sessions/:id/sql

对指定会话的数据库执行只读 SQL 查询。仅允许 `SELECT` 语句。

**请求体：**

```json
{
  "sql": "SELECT sender, COUNT(*) as count FROM messages GROUP BY sender ORDER BY count DESC LIMIT 10"
}
```

**响应：**

```json
{
  "success": true,
  "data": {
    "columns": ["sender", "count"],
    "rows": [
      ["123456", 5800],
      ["789012", 3200]
    ]
  }
}
```

> 关于数据库表结构，请参考 ChatLab 内部文档或使用 `SELECT * FROM sqlite_master WHERE type='table'` 查询。

---

### GET /api/v1/sessions/:id/export

导出完整会话数据，格式为 [ChatLab Format](./chatlab-format.md) JSON。

**限制：** 最多导出 **10 万条** 消息。如果会话消息数超过此限制，返回 `400 EXPORT_TOO_LARGE` 错误。超大会话建议使用 `/messages` 分页 API 逐页获取。

**响应：**

```json
{
  "success": true,
  "data": {
    "chatlab": {
      "version": "0.0.2",
      "exportedAt": 1711468800,
      "generator": "ChatLab API"
    },
    "meta": {
      "name": "技术交流群",
      "platform": "qq",
      "type": "group"
    },
    "members": [...],
    "messages": [...]
  }
}
```

---

### POST /api/v1/import

将聊天记录导入 ChatLab，**创建新会话**。

#### 支持的 Content-Type

| Content-Type           | 格式                | 适用场景                       | Body 限制  |
| ---------------------- | ------------------- | ------------------------------ | ---------- |
| `application/json`     | ChatLab Format JSON | 中小数据（快速测试、脚本集成） | **50MB**   |
| `application/x-ndjson` | ChatLab JSONL 格式  | 大规模数据（生产级集成）       | **无限制** |

#### JSON 模式示例

```bash
curl -X POST http://127.0.0.1:5200/api/v1/import \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "chatlab": {
      "version": "0.0.2",
      "exportedAt": 1711468800
    },
    "meta": {
      "name": "导入测试",
      "platform": "qq",
      "type": "group"
    },
    "members": [
      { "platformId": "123", "accountName": "测试用户" }
    ],
    "messages": [
      {
        "sender": "123",
        "accountName": "测试用户",
        "timestamp": 1711468800,
        "type": 0,
        "content": "Hello World"
      }
    ]
  }'
```

#### JSONL 模式示例

```bash
cat data.jsonl | curl -X POST http://127.0.0.1:5200/api/v1/import \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/x-ndjson" \
  --data-binary @-
```

**响应：**

```json
{
  "success": true,
  "data": {
    "mode": "new",
    "sessionId": "session_xyz789"
  }
}
```

> 关于 ChatLab Format 的详细规范，请参考 [ChatLab 标准化格式规范](./chatlab-format.md)。

---

### POST /api/v1/sessions/:id/import

将聊天记录**增量导入**到已存在的会话。支持去重，相同消息不会重复插入。

**去重规则：**

消息唯一键为 `timestamp + senderPlatformId + contentLength`。如果一条消息的时间戳、发送者和内容长度与已有消息完全相同，则视为重复并跳过。

**路径参数：**

| 参数 | 类型   | 说明        |
| ---- | ------ | ----------- |
| `id` | string | 目标会话 ID |

Content-Type 和请求体格式与 `POST /api/v1/import` 相同。

**响应：**

```json
{
  "success": true,
  "data": {
    "mode": "incremental",
    "sessionId": "session_abc123",
    "newMessageCount": 150
  }
}
```

---

## 并发与限制

| 限制项           | 值      | 说明                            |
| ---------------- | ------- | ------------------------------- |
| JSON 请求体大小  | 50MB    | `application/json` 模式         |
| JSONL 请求体大小 | 无限制  | `application/x-ndjson` 流式模式 |
| 导出消息上限     | 10 万条 | `/export` 端点                  |
| 分页最大每页     | 1000 条 | `/messages` 端点                |
| 导入并发         | 1       | 同一时刻仅允许一个导入操作      |

---

## 错误码

| 错误码                   | HTTP 状态码 | 说明                            |
| ------------------------ | ----------- | ------------------------------- |
| `UNAUTHORIZED`           | 401         | Token 无效或缺失                |
| `SESSION_NOT_FOUND`      | 404         | 会话不存在                      |
| `INVALID_FORMAT`         | 400         | 请求体不符合 ChatLab Format     |
| `SQL_READONLY_VIOLATION` | 400         | SQL 不是 SELECT 语句            |
| `SQL_EXECUTION_ERROR`    | 400         | SQL 执行出错                    |
| `EXPORT_TOO_LARGE`       | 400         | 消息数超过导出上限（10 万条）   |
| `BODY_TOO_LARGE`         | 413         | 请求体超过 50MB（仅 JSON 模式） |
| `IMPORT_IN_PROGRESS`     | 409         | 有其他导入正在进行              |
| `IMPORT_FAILED`          | 500         | 导入失败                        |
| `SERVER_ERROR`           | 500         | 服务内部错误                    |

---

## 安全说明

- **仅本机访问**：API 绑定 `127.0.0.1`，不对外暴露
- **Token 认证**：所有端点需携带有效 Bearer Token
- **SQL 只读限制**：`/sql` 端点仅允许 `SELECT` 查询
- **默认关闭**：API 服务需手动开启

---

## 使用场景

### 1. MCP 集成

将 ChatLab API 接入 Claude Desktop 等 AI 工具，实现 AI 对聊天记录的直接查询和分析。

### 2. 自动化脚本

编写脚本定期从其他平台导出聊天记录，转换为 ChatLab Format 后通过 Push API 自动导入。

### 3. 数据分析

通过 SQL 端点执行自定义查询，配合 Python/R 等工具进行高级数据分析。

### 4. 数据备份

通过 `/export` 端点定期导出重要会话数据作为 JSON 备份。

### 5. 定时拉取

在设置页配置外部数据源 URL，ChatLab 会按设定间隔自动拉取并导入新数据。

---

## 版本信息

| 版本 | 说明                                                                           |
| ---- | ------------------------------------------------------------------------------ |
| v1   | 初始版本，支持会话查询、消息搜索、SQL、导出、导入（JSON + JSONL）、Pull 调度器 |
